Temperature sensor data visualisation with Node-RED: Difference between revisions
Jump to navigation
Jump to search
| Line 137: | Line 137: | ||
* The code has been reproduced below. | * The code has been reproduced below. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="Java"> | ||
var time = msg.mytime.concat(" " + (msg.myymd)); | var time = msg.mytime.concat(" " + (msg.myymd)); | ||
var battery; // battery voltage data | var battery; // battery voltage data | ||
var humidity; // humidity data from within the sensor housing | var humidity; // humidity data from within the sensor housing | ||
var | var onewire_temp; // onewire temperature data | ||
var temperature; // temperature data from within the sensor housing | var temperature; // temperature data from within the sensor housing | ||
battery = msg.payload.uplink_message.decoded_payload.bat; | battery = msg.payload.uplink_message.decoded_payload.bat; | ||
humidity = msg.payload.uplink_message.decoded_payload.humid; | humidity = msg.payload.uplink_message.decoded_payload.humid; | ||
onewire_temp = msg.payload.uplink_message.decoded_payload.onewire_temp; | |||
temperature = msg.payload.uplink_message.decoded_payload.temp; | temperature = msg.payload.uplink_message.decoded_payload.temp; | ||
| Line 153: | Line 153: | ||
+ "bat=" + String(battery) + " " | + "bat=" + String(battery) + " " | ||
+ "humid=" + String(humidity) + " " | + "humid=" + String(humidity) + " " | ||
+ " | + "onewire_temp=" + String(onewire_temp) + " " | ||
+ "temp=" + String(temperature); | + "temp=" + String(temperature); | ||
return msg; | return msg; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 02:54, 22 September 2023
Overview
This lesson assumes that a temperature sensor is sending data to The Things Network. In this lesson we will use the MQTT protocol to subscribe to data transmission events. We will create a program in Node-RED to subscribe to the data transmissions and to graph the data coming from the sensor using the in-built Dashboard function in Node-RED.
Learning Objectives
- Learn how to subscribe to a MQTT using the Node-RED MQTT-in node
- Learn how to extract specific sensor data using the Node-RED function node.
- Learn how to create a Dashboard in Node-RED to monitor live data.
Subscribe to MQTT
Open Node-RED
- Click on the Raspberry Pi main drop down menu.
- Select Programming > Node-RED
- Node-RED will automatically open the Terminal on the Raspberry Pi.
- It takes approximately ten seconds for Node-RED to initialise itself.
- To actually use Node-RED you need to open the web browser on the Raspberry Pi.
- Click on the default web browser.
- In the search bar enter localhost:1880
- Localhost is the address of the local or host machine.
- In this example the host address is 192.168.1.168, but your computer will have a different address.
- The number at the end of the URL (1880) is the port number for the Node-RED application.
- Different ports are assigned to different applications using HTTP protocols.
- Note - if you are using UFW (uncomplicated firewall) you may need to open this port otherwise Node-RED will not work.
Subscribing to MQTT
- To subscribe to MQTT we need the 'mqtt in node.
- Find the mqtt in node and drag it onto the Flow 1
- You will notice that the node has both a blue circle and a red triangle.
- The red triangle indicates that the node requires further configuration before it will work
Configuring the mqtt in node
- Double click on the mqtt in node.
- In Properties > Server > select Add new mqtt-broker
- Click on the Edit button to the right - which looks like a pencil
- Enter the following details:
- Properties > Name > pycom-temperature-1
- Connection > Server > au1.cloud.thethings.network
- Connection > Port > 1883
- Leave all other details as shown in the example below.
- Click on the Security tab
- The Username is whi-seedling-1-pycom@ttn
- The Password is NNSXS.Z625CQKKEWAPSQK467JRSAFFYINH7LTHSUC5CYY.MHEVWHKKLPWXQWESSCALZFVHA6EKUNISQH4IVHKAOXYZRMOH6D7A
- If copying these fields from mediawiki or another computer use right mouse button click copy
- Click on the red Add button to commit the changes.
- You will be asked to complete some final configuration settings.
- Update the following fields:
- Topic # - The hash symbol means subscribe to all topics
- QoS 0 - quality of service. A value of zero equates to a low quality. Data losses are acceptable.
- Output a Parsed JSON Object - JSON format output for all data
- Name pycom-temperature-1
- Then click on Done to commit all the edits.
- The finished mqtt in node should now appear in the main flow window.
- It will still have a blue circle because the flow has not been Deployed.
Add a Debug Node
- Before we Deploy this first flow we will need to add a Debug node.
- Drag a Debug node from the pallet and connect it to the output of the mqtt in node (pycom-temperature-1).
Set the Debug Window
- The Debug node will show us all the JSON data output coming from mqtt in node.
- To see the Debug output click on the Debug messages tab.
- Click on the Deploy button to make the flow active.
- Message should appear indicating that the flow has been successfully Deployed.
- The mqtt in node will also show a green connected status message underneath the node.
Receiving mqtt data
- When data arrives from the temperature sensor (approximately every 30 minutes) it will appear in the Debug window on the right of the screen.
- The data is presented in a compacted form.
- By clicking on the drop down arrows in the message the different sections of the message can be expanded.
- Expand the uplink_message and the decoded_payload to see the sensor data.
Extracting specific sensor data
- We can extract specific sensor data using the Node-RED function node.
Obtaining battery data using the function node
- In this example we will prepare a function node to extract the battery data.
- Drag a function node into the Edit window.
- Then drag a Debug node and wire up all nodes as shown.
Editing the Function node
- Double click on the Function node to bring up the edit window.
- Enter the following code to extract just the battery data.
- Then click on Done to commit the edits.
- The code has been reproduced below.
var time = msg.mytime.concat(" " + (msg.myymd));
var battery; // battery voltage data
var humidity; // humidity data from within the sensor housing
var onewire_temp; // onewire temperature data
var temperature; // temperature data from within the sensor housing
battery = msg.payload.uplink_message.decoded_payload.bat;
humidity = msg.payload.uplink_message.decoded_payload.humid;
onewire_temp = msg.payload.uplink_message.decoded_payload.onewire_temp;
temperature = msg.payload.uplink_message.decoded_payload.temp;
msg.payload = "time=" + String(time) + " "
+ "bat=" + String(battery) + " "
+ "humid=" + String(humidity) + " "
+ "onewire_temp=" + String(onewire_temp) + " "
+ "temp=" + String(temperature);
return msg;
- The complete nodes should appear as in the image below.
- Click on Deploy to make the flow active.
- Click on the Clear log button to clear the Debug window.
- When new messages arrive they can be more clearly seen in the Debug window.
- In this case the voltage of the battery is 4 (4.00 V).
Appendix
- Node-RED code
[
{
"id": "79ec9068.0e03",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "89fbf612.be32e8",
"type": "mqtt in",
"z": "79ec9068.0e03",
"name": "pycom-temperature-1",
"topic": "#",
"qos": "0",
"datatype": "json",
"broker": "770475c1.8593ac",
"nl": false,
"rap": true,
"rh": 0,
"x": 170,
"y": 100,
"wires": [
[
"4b6b348d.47990c",
"dbc45c13.5f904"
]
]
},
{
"id": "4b6b348d.47990c",
"type": "debug",
"z": "79ec9068.0e03",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 420,
"y": 100,
"wires": []
},
{
"id": "dbc45c13.5f904",
"type": "function",
"z": "79ec9068.0e03",
"name": "battery",
"func": "var battery; // battery voltage data\nvar humidity; // humidity data from within the sensor housing\nvar soil_temp; // soil temperature data\nvar temperature; // temperature data from within the sensor housing\n\nbattery = msg.payload.uplink_message.decoded_payload.bat;\nhumidity = msg.payload.uplink_message.decoded_payload.humid;\nsoil_temp = msg.payload.uplink_message.decoded_payload.soil;\ntemperature = msg.payload.uplink_message.decoded_payload.temp;\n\nmsg.payload = battery; //only the battery voltage data\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 420,
"y": 180,
"wires": [
[
"a904005e.54aa6"
]
]
},
{
"id": "a904005e.54aa6",
"type": "debug",
"z": "79ec9068.0e03",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 610,
"y": 160,
"wires": []
},
{
"id": "770475c1.8593ac",
"type": "mqtt-broker",
"name": "pycom-temperature-1",
"broker": "au1.cloud.thethings.network",
"port": "1883",
"clientid": "",
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
}
]


