Saving temperature data with Node-RED: Difference between revisions

From Sensors in Schools
Jump to navigation Jump to search
Line 75: Line 75:
[[File:Screen Shot 2022-04-13 at 6.31.49 am.png | 900px]]
[[File:Screen Shot 2022-04-13 at 6.31.49 am.png | 900px]]


* The finished mqtt in node should now appear in the main flow window.
* The finished mqtt in node should now appear in the main flow window without the orange triangle.
* It will still have a blue circle because the flow has not been Deployed.
* It will still have a blue circle because the flow has not been Deployed.



Revision as of 05:38, 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 and the blue circle indicates that the flow has not been deployed

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 without the orange triangle.
  • 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 battery; // battery voltage data
var humidity; // humidity data from within the sensor housing
var soil_temp; // soil 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;
soil_temp = msg.payload.uplink_message.decoded_payload.soil;
temperature = msg.payload.uplink_message.decoded_payload.temp;

msg.payload = battery; //only the battery voltage data

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": ""
    }
]