Set and Get Variables & Time from Arduino Projects to Node-Red

You can save variables in Node-red Flow/Storage Data using Arduino based boards like ESP8266 , ESP32, and so on.

Concept:

Send message to node/variable to store
publish to TOPIC + /$get to get stored data

Example:

To Set data, send mqtt messages like : Topic: "home/sensor1/variable1" -> Payload: "1"
To Get data, subscribe to "home/sensor1/variable1"
and publish message "home/sensor1/variable1/$get" -> Payload : "ANY"
The data will come in subscribed topic.

You can also get TIMESTAMP using same function just replace "variable1" with "time" using same method written above.

add a mqtt in (with your sensor root topic like "home/sensor1/#") and mqtt out (without topic) to output

Note:
The Time is in IST. To convert to Your Host Time Remove This Part : " + IST_offset;"

The Function Node Code :


var topic = msg.topic;
var payload = msg.payload;
var isget = false;

//IS  GET REQUEST    
if (topic.endsWith("/$get")) {
    topic = topic.replace("/$get", "");
    isget = true;
}

//Extract sensor_var
var topicParts = topic.split('/');
var nodename = topicParts[1];

var command = topicParts[topicParts.length - 1];
var variablename = nodename + "_" + command;



//GET REQUEST
if (isget) {

    if (topic.endsWith("/time")) {
        var date = new Date();
        var IST_offset = 5.5 * 60 * 60 * 1000;
        var IST_timestamp_ms = date.getTime() + IST_offset;
        var IST_timestamp_sec = Math.floor(IST_timestamp_ms / 1000); // Convert to seconds (32-bit Unix timestamp)
        msg.topic = topic;
        msg.payload = IST_timestamp_sec;
        return msg;
    } else if (topic.endsWith("status") || topic.startsWith("reboot")) {
        //STATUS OR REBOOT
        //IGNORE
    } else {
        //TIME



        // ALL TOPICS
        let da = flow.get(variablename);
        if (da == undefined) da = 0;
        msg.topic = topic;
        msg.payload = da;
        return msg;

    }

} else {


    //SAVE
    if (topic.endsWith("status") || topic.endsWith("/time") || topic.startsWith("reboot")) {
    //STATUS TIME OR REBOOT
    //IGNORE
    } else {
    //ALL OTHER
        flow.set(variablename, payload);
    }
}

@ajaybnl

Please don't use tags, that are not associated to your content.

node-red-dashboard removed

Thank you

Thanks for sharing that @ajaybnl

I am confused which end of the Arduino - Node-red link is sending which message and when.

Can you share a screen capture which includes your mqtt-in and mqtt-out nodes to make it clearer?

From Node-red

From ESP8266 Arduino
Using Library EspMqttClient

Publish Get Variable from Node-Red

Timer for incremental responsemode after 2 seconds (to get a window for receiving a mqtt message)


  if ((((millis() - timer3))) >= 2000)
    {
      timer3 = millis();

      if (client.isConnected())
      {

        if (responsemode == 0)
        {

        // Get variable1 from Node-Red
          client.publish("home/sensor/variable1/$get", "0");

        //to increment the queue        
         responsemode++;

        }
        else if (responsemode == 1)
        {

        // Get Time from Node-Red
         client.publish("home/sensor/time/$get", "0");

          responsemode++;
        }
      }
}

Subscribing Mqtt code


  client.subscribe("home/sensor/variable1", [](const String &payload){
    
    if (payload.length() > 0) {

      int val = payload.toInt();

     //Global variable
      variable1 = val;

    
    } });

  //----------
  // Time

  client.subscribe("home/sensor/time", [](const String &payload){

      if (payload.length() > 0) {
   
        unsigned long timestamp = payload.toInt();

        //TimeLib (Set Timestamp)

        setTime(timestamp);
       
      } });
}
1 Like