This guide provides instructions for configuring a BBB to read a GPIO through Node-RED.
Steps
1. Flash the BBB EMMC with the latest image.
2. Construct a simple circuit.

3. Start the BBB.
4. Connect to the BBB.
5. Configure Node-RED to make the Bonescript module available.
4. Start Node-RED on the BBB (http://192.168.7.2:1880).
6. Import the flow into Node-RED (text at the bottom of the page).
If you’d like to publish MQTT messages to a broker, configure the mqtt out node appropriately.
Node-RED should appear as follows:

7. Operate the circuit.
When the switch is opened and closed messages will be published to the Node-RED debug window, and the state of the switch will be displayed in the palette under the Determine State node.
8. Enjoy.
Node-RED Flow
[
{
"id":"33ee3bd0.4d1de4",
"type":"tab",
"label":"Flow 1",
"disabled":false,
"info":""
},
{
"id":"bd649397.deb7f",
"type":"gpio in",
"z":"33ee3bd0.4d1de4",
"name":"P9_14 GPIO_50",
"state":"INPUT",
"pin":"P9_14",
"board":"b22bcb60.11a438",
"x":160,
"y":240,
"wires":[
[
"22adbf69.6c292"
]
]
},
{
"id":"68d09258.ded4bc",
"type":"debug",
"z":"33ee3bd0.4d1de4",
"name":"",
"active":true,
"tosidebar":true,
"console":false,
"tostatus":false,
"complete":"false",
"x":490,
"y":340,
"wires":[
]
},
{
"id":"22adbf69.6c292",
"type":"function",
"z":"33ee3bd0.4d1de4",
"name":"Determine State",
"func":"// Determine last value\nvar lastValue = context.get('lastValue')||0;\n\n// If new value is same as last value, do nothing.\nif(msg.payload == lastValue) {\n return null;\n}\nelse {\n context.set('lastValue', msg.payload)\n \n if(msg.payload === 1 ){\n node.status({fill:\"green\",shape:\"dot\",text:\"Switch closed\"});\n }\n else {\n node.status({fill:\"red\",shape:\"dot\",text:\"Switch open\"});\n }\n return msg;\n}",
"outputs":1,
"noerr":0,
"initialize":"",
"finalize":"",
"x":400,
"y":240,
"wires":[
[
"9ec6af7f.bb055"
]
]
},
{
"id":"9ec6af7f.bb055",
"type":"function",
"z":"33ee3bd0.4d1de4",
"name":"Generate Message",
"func":"var now = new Date();\nvar assetId = global.get(\"assetId\")\nvar dataItemId = \"EquipmentChangeState\"\nvar topic = \"Asset/\" + assetId + \"/\" + dataItemId\n\nif (msg.payload === 1){\n node.status({fill:\"green\", shape:\"dot\", text:\"Last true: \" + now.toISOString()});\n payload = {}\n payload[\"assetId\"] = assetId;\n payload[\"dataItemId\"] = dataItemId;\n payload[\"dateTime\"] = now.toISOString();\n payload[\"value\"] = \"READY-PROCESSING-EXECUTING\"\n return {\"topic\": topic, \"payload\": payload}\n} else {\n node.status({fill:\"green\", shape:\"dot\", text:\"Last true: \" + now.toISOString()});\n payload = {}\n payload[\"assetId\"] = assetId;\n payload[\"dataItemId\"] = dataItemId;\n payload[\"dateTime\"] = now.toISOString();\n payload[\"value\"] = \"OFF\"\n return {\"topic\": topic, \"payload\": payload}\n}",
"outputs":1,
"noerr":0,
"initialize":"",
"finalize":"",
"x":240,
"y":380,
"wires":[
[
"68d09258.ded4bc",
"f6e1fab6.7f1cf8"
]
]
},
{
"id":"2cdae9bf.714a56",
"type":"inject",
"z":"33ee3bd0.4d1de4",
"name":"Trigger on Start",
"props":[
{
"p":"payload"
},
{
"p":"topic",
"vt":"str"
}
],
"repeat":"",
"crontab":"",
"once":false,
"onceDelay":0.1,
"topic":"",
"payload":"true",
"payloadType":"bool",
"x":170,
"y":100,
"wires":[
[
"a41bd290.62927"
]
]
},
{
"id":"a41bd290.62927",
"type":"function",
"z":"33ee3bd0.4d1de4",
"name":"Set Global ",
"func":"global.set(\"assetId\", \"ANT1000\")\n\nreturn msg;",
"outputs":1,
"noerr":0,
"initialize":"",
"finalize":"",
"x":440,
"y":100,
"wires":[
[
"840531c8.a1b5a"
]
]
},
{
"id":"540d4cfa.09ebe4",
"type":"comment",
"z":"33ee3bd0.4d1de4",
"name":"Sets global variables on start.",
"info":"",
"x":220,
"y":140,
"wires":[
]
},
{
"id":"83496baf.e86db8",
"type":"comment",
"z":"33ee3bd0.4d1de4",
"name":"Publish messages based upon GPIO changes.",
"info":"",
"x":280,
"y":440,
"wires":[
]
},
{
"id":"f6e1fab6.7f1cf8",
"type":"mqtt out",
"z":"33ee3bd0.4d1de4",
"name":"mb.iotfm.org",
"topic":"",
"qos":"",
"retain":"",
"broker":"7adab055.da5c2",
"x":490,
"y":380,
"wires":[
]
},
{
"id":"840531c8.a1b5a",
"type":"debug",
"z":"33ee3bd0.4d1de4",
"name":"",
"active":true,
"tosidebar":true,
"console":false,
"tostatus":false,
"complete":"false",
"statusVal":"",
"statusType":"auto",
"x":690,
"y":100,
"wires":[
]
},
{
"id":"b22bcb60.11a438",
"type":"ioplugin",
"z":"",
"name":"Beaglebone",
"username":"",
"password":"",
"boardType":"beaglebone-io",
"serialportName":"",
"connectionType":"local",
"mqttServer":"",
"pubTopic":"",
"subTopic":"",
"tcpHost":"",
"tcpPort":"",
"sparkId":"",
"sparkToken":"",
"beanId":"",
"impId":"",
"uuid":"",
"token":"",
"sendUuid":"",
"samplingInterval":"500"
},
{
"id":"7adab055.da5c2",
"type":"mqtt-broker",
"z":"",
"name":"mb.iotfm.org",
"broker":"mb.iotfm.org",
"port":"1883",
"clientid":"",
"usetls":false,
"compatmode":false,
"keepalive":"60",
"cleansession":true,
"birthTopic":"",
"birthQos":"0",
"birthPayload":"",
"closeTopic":"",
"closeQos":"0",
"closePayload":"",
"willTopic":"",
"willQos":"0",
"willPayload":""
}
]