Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Controllers
  3. Node-RED
  4. nodered "injected" between domoticz and mysensors

nodered "injected" between domoticz and mysensors

Scheduled Pinned Locked Moved Node-RED
21 Posts 9 Posters 15.6k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • tbowmoT Offline
    tbowmoT Offline
    tbowmo
    Admin
    wrote on last edited by
    #11

    ok, my stab at a couple of nodes for this, should be install-able with the following command

    npm install -g node-red-contrib-mysensors

    This will add two extra nodes, that can be used with mysensors serial GW API.

    1 Reply Last reply
    0
    • tbowmoT Offline
      tbowmoT Offline
      tbowmo
      Admin
      wrote on last edited by
      #12

      a small example that I made, using my node-red-contrib-mysensors nodes (needs to be installed for this to work)

      This routes data from a mysensors GW, to both domoticz and pidome. It filters out node-id request, so they are not sent to pidome (domoticz is the one that hands out id's to mysensors nodes).

      I have a pulse counting arduino on my utility meter, this outputs strings as <watts>;<wh>\n, which I split into two different messages with a function, and dumps into mysensor serial protocol

      To connect with domoticz / pidome, the following pipes are made with socat

      socat PTY,link=/dev/ttyS80,mode=666,group=dialout,raw PTY,link=/dev/ttyUSB20,mode=666,group=dialout,raw &
      socat PTY,link=/dev/ttyS81,mode=666,group=dialout,raw PTY,link=/dev/ttyUSB21,mode=666,group=dialout,raw &
      socat PTY,link=/dev/ttyS82,mode=666,group=dialout,raw PTY,link=/dev/ttyUSB22,mode=666,group=dialout,raw &
      

      It makes 3 virtual serial ports that I can use to attach pidome etc. to domoticz. I put it in /etc/rc.local

      domoticz is using /dev/ttyUSB20 as a mysensors serial GW.

      node-red2.png

      [{"id":"acfe3226.5301d","type":"serial-port","serialport":"/dev/ttyACM0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true},{"id":"66f437ac.990bc8","type":"serial-port","serialport":"/dev/ttyS81","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true},{"id":"b5105521.4aefa8","type":"serial-port","serialport":"/dev/ttyS80","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true},{"id":"821a7286.7de59","type":"serial-port","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true},{"id":"5b8bba4c.a47444","type":"serial in","name":"From Mysensors","serial":"821a7286.7de59","x":257,"y":196,"z":"67deb464.98214c","wires":[["1656727d.e9a98e","4755dfb8.b8aa2"]]},{"id":"47b5936e.b84a6c","type":"serial out","name":"To Mysensors","serial":"821a7286.7de59","x":1166,"y":305,"z":"67deb464.98214c","wires":[]},{"id":"602db35f.9fd24c","type":"serial in","name":"From Domoticz","serial":"b5105521.4aefa8","x":248,"y":348,"z":"67deb464.98214c","wires":[["47b5936e.b84a6c","f58d12f9.0a72f"]]},{"id":"4755dfb8.b8aa2","type":"serial out","name":"To Domoticz","serial":"b5105521.4aefa8","x":1164,"y":213,"z":"67deb464.98214c","wires":[]},{"id":"1656727d.e9a98e","type":"mysdecenc","name":"","x":560,"y":157,"z":"67deb464.98214c","wires":[["5dbdeccd.a24214"]]},{"id":"3094c378.cf6b3c","type":"debug","name":"","active":true,"console":"false","complete":"true","x":1033,"y":468,"z":"67deb464.98214c","wires":[]},{"id":"5dbdeccd.a24214","type":"function","name":"Filter ID requests","func":"if (msg.messageType != 3 &\n    msg.subType != 3) {\n    return msg;\n}","outputs":1,"noerr":0,"x":738,"y":157,"z":"67deb464.98214c","wires":[["2ce8f789.d31708"]]},{"id":"293de58.fd6c21a","type":"serial in","name":"From PiDome","serial":"66f437ac.990bc8","x":246,"y":266,"z":"67deb464.98214c","wires":[["47b5936e.b84a6c","4755dfb8.b8aa2"]]},{"id":"f58d12f9.0a72f","type":"serial out","name":"To PiDome","serial":"66f437ac.990bc8","x":1162,"y":386,"z":"67deb464.98214c","wires":[]},{"id":"2ce8f789.d31708","type":"mysdecenc","name":"","x":915,"y":156,"z":"67deb464.98214c","wires":[["f58d12f9.0a72f"]]},{"id":"ff3ea1e4.00c16","type":"serial in","name":"Meter input","serial":"acfe3226.5301d","x":229,"y":475,"z":"67deb464.98214c","wires":[["3c7fe6d9.c3801a"]]},{"id":"3c7fe6d9.c3801a","type":"function","name":"Split meter data","func":"var pl = msg.payload.split(';');\n\nmsg1 = {payload : parseFloat(pl[0])*1000};\nmsg2 = {payload : parseFloat(pl[1])/1000};\nreturn [msg1, msg2];","outputs":"2","noerr":0,"x":427,"y":475,"z":"67deb464.98214c","wires":[["e1a7231a.1e58e"],["b06687e3.4f9978"]]},{"id":"e1a7231a.1e58e","type":"mysencap","name":"V_WATT node 99","nodeid":"99","childid":"1","subtype":"17","x":642,"y":445,"z":"67deb464.98214c","wires":[["ede87fe8.12178"]]},{"id":"b06687e3.4f9978","type":"mysencap","name":"V_KWM node 99","nodeid":"99","childid":"2","subtype":"18","x":640,"y":488,"z":"67deb464.98214c","wires":[["ede87fe8.12178"]]},{"id":"ede87fe8.12178","type":"mysdecenc","name":"","x":868,"y":468,"z":"67deb464.98214c","wires":[["3094c378.cf6b3c","4755dfb8.b8aa2","f58d12f9.0a72f"]]}]```
      1 Reply Last reply
      1
      • tbowmoT Offline
        tbowmoT Offline
        tbowmo
        Admin
        wrote on last edited by
        #13

        one word of caution, using the above scenario..

        You need to have something picking up the "serial port data" in the other end of the socat pipes, otherwise nodered clog up, and start to use 100% cpu. I discovered that the "hard way".

        As long as the socat pipe is emptied, node-red is running happily :)

        1 Reply Last reply
        1
        • tbowmoT Offline
          tbowmoT Offline
          tbowmo
          Admin
          wrote on last edited by
          #14

          just updated the plugin to node-red, so it now can send presentation messages as well (and internal messages, if you want), when using the "mysencap" node.

          The presentation message is sent 1 second after a flow is deployed, or when node-red is started..

          1 Reply Last reply
          0
          • JohnJ Offline
            JohnJ Offline
            John
            Plugin Developer
            wrote on last edited by
            #15

            This looks really cool! What is PiDome's role in this picture?

            My Domotica project: http://www.pidome.org

            1 Reply Last reply
            0
            • tbowmoT Offline
              tbowmoT Offline
              tbowmo
              Admin
              wrote on last edited by
              #16

              @John

              It would just be a proof of concept. However I haven't succeeded in bringing in Pidome, as it relies on USB device descriptors for the serial port, and so I can't choose the socat pipe from nodered.

              One could use it for testing new sensor types, mock them up in nodered and inject messages to the controller (pidome, domoticz etc)

              1 Reply Last reply
              0
              • JohnJ Offline
                JohnJ Offline
                John
                Plugin Developer
                wrote on last edited by
                #17

                Yep, that's correct, to make sure the correct interface is loaded (serial/hid/etc..). If you would get it to trigger udev with a serial description it should catch it.

                Nonetheless in about a week or two, three i think the fixed udev triggered mechanism will be supplemented with an user selectable list of available ports as i'm quite interested in this mockup.

                My Domotica project: http://www.pidome.org

                1 Reply Last reply
                0
                • tbowmoT Offline
                  tbowmoT Offline
                  tbowmo
                  Admin
                  wrote on last edited by tbowmo
                  #18

                  just made a small update, so it now can create a more full presentation round, to another controller, with both sketch name, and version strings..

                  Use the following to update your plugin..

                  npm update node-red-contrib-mysensors
                  
                  bpairB 1 Reply Last reply
                  0
                  • tbowmoT tbowmo

                    just made a small update, so it now can create a more full presentation round, to another controller, with both sketch name, and version strings..

                    Use the following to update your plugin..

                    npm update node-red-contrib-mysensors
                    
                    bpairB Offline
                    bpairB Offline
                    bpair
                    wrote on last edited by
                    #19

                    @tbowmo Thanks for the update. I hope to try using socat as a way to test different controllers easily. I am frustrated with the controller options and I feel like as my project progresses being able to easily change controllers might be very desirable. This architecture makes that possible.

                    I have a function in my node-red flow that enriches the messages from MySensors. I realize this begins to do what a controller might do, but I need a simple way to translate "Node:20, Child:1" to "Tank 1 - Water Temperature" so that I can publish that to a database or dweet.io or easily display in a graph. I might know what a graph of Node:20:Child1=25.6 means but nobody else will.

                    I am new to json but am attempting to use that. Ideally node-red would allow for easily manage this mapping information via a web page and store it. I am setting this globally:

                    [{"id":"d5d724ec.cba8c","type":"subflow","name":"On Startup","in":[],"out":[{"x":454,"y":160,"wires":[{"id":"dcd80855.bc4688","port":0}]}]},{"id":"c7328a87.d34f28","type":"inject","name":"On Startup","topic":"server-startup","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":148,"y":160,"z":"d5d724ec.cba8c","wires":[["dcd80855.bc4688"]]},{"id":"dcd80855.bc4688","type":"function","name":"Save startup date","func":"msg.startupDate = msg.payload;\nmsg.payload = \"\";\nreturn msg;","outputs":1,"noerr":0,"x":318,"y":160,"z":"d5d724ec.cba8c","wires":[[]]},{"id":"302ddf01.cbf0b8","type":"subflow:d5d724ec.cba8c","name":"","x":127,"y":214,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]},{"id":"841c3e7c.b41288","type":"function","name":"SetGlobalVars","func":"node.log(\"Add sensorNodes to global context\");\n\nvar sNodes = [   \n        {nodeId:30, nodeLabel:\"Greenhouse\", \n            sensors:[\n                {childSensorId:1, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:2, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:130, childSensorLabel:\"AirBattery\", sensorTypeLabel:\"Voltage\"}\n            ] \n        }, \n        {nodeId:50, nodeLabel:\"Aquaponics\", \n            sensors:[\n                {childSensorId:0, childSensorLabel:\"Water\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:20, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:21, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:30, childSensorLabel:\"Light\", sensorTypeLabel:\"Lux\"}\n            ]\n        }\n    ];\n\ncontext.global.sensorNodes = sNodes;\n\n    \nmsg.payload = context.global.sensorNodes;\n\nreturn msg;","outputs":1,"noerr":0,"x":357,"y":213,"z":"5791498e.8d6878","wires":[[]]},{"id":"8ad9f121.3ea3b","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":127,"y":135,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]}]
                    

                    and then using it:

                    [{"id":"d14e00ff.cc9f7","type":"function","name":"MySensorIdInfo","func":"var sensorNode = getByNodeId(context.global.sensorNodes, \"\"+msg.nodeId);\nif (sensorNode != null) {\n    console.log(\"NodeLabel = \" + sensorNode.nodeLabel);\n    msg.nodeLabel = sensorNode.nodeLabel;\n        \n    var childNode = getByChildId(sensorNode.sensors, \"\"+msg.childSensorId);\n    if (childNode != null) {\n        console.log(\"ChildNodeLabel = \" + childNode.childSensorLabel);\n        msg.childSensorLabel = childNode.childSensorLabel;\n        msg.sensorTypeLabel = childNode.sensorTypeLabel;\n    } else {\n        msg.childSensorLabel = msg.childSensorId;\n        msg.sensorTypeLabel = \"undefined\";\n    }\n} else {\n    node.error(\"No sensor match found in sensorNodes\");\n    msg.nodeLabel = msg.nodeId;\n    msg.childSensorLabel = msg.childSensorId;\n    msg.sensorTypeLabel = \"undefined\";   \n}\n\nif (msg.sensorTypeLabel == \"undefined\") {\n    return null;\n}\n\n//debug\nnode.log(\"nodeId = \" + msg.nodeId + \" :--: \" + \n\"nodeLabel = \" + msg.nodeLabel + \" :--: \" + \n\"childSensorId = \" + msg.childSensorId + \" :--: \" + \n\"childSensorLabel = \" + msg.childSensorLabel + \" :--: \" + \n\"sensorTypeLabel = \" + msg.sensorTypeLabel);\n\nreturn msg;\n\n//------- Helper Functions ----------//\n\nfunction getByNodeId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].nodeId == value) return arr[i];\n  }\n}\n\nfunction getByChildId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].childSensorId == value) return arr[i];\n  }\n}","outputs":1,"noerr":0,"x":614,"y":390,"z":"c3095d41.89f1e8","wires":[["6e57151f.370ffc","ae35a271.90c3b"]]}]
                    

                    The one other piece I added was a response to the MetricOrImperial question. Maybe some of this is useful. Thanks for your work.

                    F 1 Reply Last reply
                    0
                    • bpairB bpair

                      @tbowmo Thanks for the update. I hope to try using socat as a way to test different controllers easily. I am frustrated with the controller options and I feel like as my project progresses being able to easily change controllers might be very desirable. This architecture makes that possible.

                      I have a function in my node-red flow that enriches the messages from MySensors. I realize this begins to do what a controller might do, but I need a simple way to translate "Node:20, Child:1" to "Tank 1 - Water Temperature" so that I can publish that to a database or dweet.io or easily display in a graph. I might know what a graph of Node:20:Child1=25.6 means but nobody else will.

                      I am new to json but am attempting to use that. Ideally node-red would allow for easily manage this mapping information via a web page and store it. I am setting this globally:

                      [{"id":"d5d724ec.cba8c","type":"subflow","name":"On Startup","in":[],"out":[{"x":454,"y":160,"wires":[{"id":"dcd80855.bc4688","port":0}]}]},{"id":"c7328a87.d34f28","type":"inject","name":"On Startup","topic":"server-startup","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":148,"y":160,"z":"d5d724ec.cba8c","wires":[["dcd80855.bc4688"]]},{"id":"dcd80855.bc4688","type":"function","name":"Save startup date","func":"msg.startupDate = msg.payload;\nmsg.payload = \"\";\nreturn msg;","outputs":1,"noerr":0,"x":318,"y":160,"z":"d5d724ec.cba8c","wires":[[]]},{"id":"302ddf01.cbf0b8","type":"subflow:d5d724ec.cba8c","name":"","x":127,"y":214,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]},{"id":"841c3e7c.b41288","type":"function","name":"SetGlobalVars","func":"node.log(\"Add sensorNodes to global context\");\n\nvar sNodes = [   \n        {nodeId:30, nodeLabel:\"Greenhouse\", \n            sensors:[\n                {childSensorId:1, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:2, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:130, childSensorLabel:\"AirBattery\", sensorTypeLabel:\"Voltage\"}\n            ] \n        }, \n        {nodeId:50, nodeLabel:\"Aquaponics\", \n            sensors:[\n                {childSensorId:0, childSensorLabel:\"Water\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:20, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:21, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:30, childSensorLabel:\"Light\", sensorTypeLabel:\"Lux\"}\n            ]\n        }\n    ];\n\ncontext.global.sensorNodes = sNodes;\n\n    \nmsg.payload = context.global.sensorNodes;\n\nreturn msg;","outputs":1,"noerr":0,"x":357,"y":213,"z":"5791498e.8d6878","wires":[[]]},{"id":"8ad9f121.3ea3b","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":127,"y":135,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]}]
                      

                      and then using it:

                      [{"id":"d14e00ff.cc9f7","type":"function","name":"MySensorIdInfo","func":"var sensorNode = getByNodeId(context.global.sensorNodes, \"\"+msg.nodeId);\nif (sensorNode != null) {\n    console.log(\"NodeLabel = \" + sensorNode.nodeLabel);\n    msg.nodeLabel = sensorNode.nodeLabel;\n        \n    var childNode = getByChildId(sensorNode.sensors, \"\"+msg.childSensorId);\n    if (childNode != null) {\n        console.log(\"ChildNodeLabel = \" + childNode.childSensorLabel);\n        msg.childSensorLabel = childNode.childSensorLabel;\n        msg.sensorTypeLabel = childNode.sensorTypeLabel;\n    } else {\n        msg.childSensorLabel = msg.childSensorId;\n        msg.sensorTypeLabel = \"undefined\";\n    }\n} else {\n    node.error(\"No sensor match found in sensorNodes\");\n    msg.nodeLabel = msg.nodeId;\n    msg.childSensorLabel = msg.childSensorId;\n    msg.sensorTypeLabel = \"undefined\";   \n}\n\nif (msg.sensorTypeLabel == \"undefined\") {\n    return null;\n}\n\n//debug\nnode.log(\"nodeId = \" + msg.nodeId + \" :--: \" + \n\"nodeLabel = \" + msg.nodeLabel + \" :--: \" + \n\"childSensorId = \" + msg.childSensorId + \" :--: \" + \n\"childSensorLabel = \" + msg.childSensorLabel + \" :--: \" + \n\"sensorTypeLabel = \" + msg.sensorTypeLabel);\n\nreturn msg;\n\n//------- Helper Functions ----------//\n\nfunction getByNodeId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].nodeId == value) return arr[i];\n  }\n}\n\nfunction getByChildId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].childSensorId == value) return arr[i];\n  }\n}","outputs":1,"noerr":0,"x":614,"y":390,"z":"c3095d41.89f1e8","wires":[["6e57151f.370ffc","ae35a271.90c3b"]]}]
                      

                      The one other piece I added was a response to the MetricOrImperial question. Maybe some of this is useful. Thanks for your work.

                      F Offline
                      F Offline
                      Fabien
                      wrote on last edited by
                      #20

                      @bpair said:

                      @tbowmo Thanks for the update. I hope to try using socat as a way to test different controllers easily. I am frustrated with the controller options and I feel like as my project progresses being able to easily change controllers might be very desirable. This architecture makes that possible.

                      I have a function in my node-red flow that enriches the messages from MySensors. I realize this begins to do what a controller might do, but I need a simple way to translate "Node:20, Child:1" to "Tank 1 - Water Temperature" so that I can publish that to a database or dweet.io or easily display in a graph. I might know what a graph of Node:20:Child1=25.6 means but nobody else will.

                      I am new to json but am attempting to use that. Ideally node-red would allow for easily manage this mapping information via a web page and store it. I am setting this globally:

                      [{"id":"d5d724ec.cba8c","type":"subflow","name":"On Startup","in":[],"out":[{"x":454,"y":160,"wires":[{"id":"dcd80855.bc4688","port":0}]}]},{"id":"c7328a87.d34f28","type":"inject","name":"On Startup","topic":"server-startup","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":148,"y":160,"z":"d5d724ec.cba8c","wires":[["dcd80855.bc4688"]]},{"id":"dcd80855.bc4688","type":"function","name":"Save startup date","func":"msg.startupDate = msg.payload;\nmsg.payload = \"\";\nreturn msg;","outputs":1,"noerr":0,"x":318,"y":160,"z":"d5d724ec.cba8c","wires":[[]]},{"id":"302ddf01.cbf0b8","type":"subflow:d5d724ec.cba8c","name":"","x":127,"y":214,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]},{"id":"841c3e7c.b41288","type":"function","name":"SetGlobalVars","func":"node.log(\"Add sensorNodes to global context\");\n\nvar sNodes = [   \n        {nodeId:30, nodeLabel:\"Greenhouse\", \n            sensors:[\n                {childSensorId:1, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:2, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:130, childSensorLabel:\"AirBattery\", sensorTypeLabel:\"Voltage\"}\n            ] \n        }, \n        {nodeId:50, nodeLabel:\"Aquaponics\", \n            sensors:[\n                {childSensorId:0, childSensorLabel:\"Water\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:20, childSensorLabel:\"Air\", sensorTypeLabel:\"Humidity\"},\n                {childSensorId:21, childSensorLabel:\"Air\", sensorTypeLabel:\"Temperature\"},\n                {childSensorId:30, childSensorLabel:\"Light\", sensorTypeLabel:\"Lux\"}\n            ]\n        }\n    ];\n\ncontext.global.sensorNodes = sNodes;\n\n    \nmsg.payload = context.global.sensorNodes;\n\nreturn msg;","outputs":1,"noerr":0,"x":357,"y":213,"z":"5791498e.8d6878","wires":[[]]},{"id":"8ad9f121.3ea3b","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":127,"y":135,"z":"5791498e.8d6878","wires":[["841c3e7c.b41288"]]}]
                      

                      and then using it:

                      [{"id":"d14e00ff.cc9f7","type":"function","name":"MySensorIdInfo","func":"var sensorNode = getByNodeId(context.global.sensorNodes, \"\"+msg.nodeId);\nif (sensorNode != null) {\n    console.log(\"NodeLabel = \" + sensorNode.nodeLabel);\n    msg.nodeLabel = sensorNode.nodeLabel;\n        \n    var childNode = getByChildId(sensorNode.sensors, \"\"+msg.childSensorId);\n    if (childNode != null) {\n        console.log(\"ChildNodeLabel = \" + childNode.childSensorLabel);\n        msg.childSensorLabel = childNode.childSensorLabel;\n        msg.sensorTypeLabel = childNode.sensorTypeLabel;\n    } else {\n        msg.childSensorLabel = msg.childSensorId;\n        msg.sensorTypeLabel = \"undefined\";\n    }\n} else {\n    node.error(\"No sensor match found in sensorNodes\");\n    msg.nodeLabel = msg.nodeId;\n    msg.childSensorLabel = msg.childSensorId;\n    msg.sensorTypeLabel = \"undefined\";   \n}\n\nif (msg.sensorTypeLabel == \"undefined\") {\n    return null;\n}\n\n//debug\nnode.log(\"nodeId = \" + msg.nodeId + \" :--: \" + \n\"nodeLabel = \" + msg.nodeLabel + \" :--: \" + \n\"childSensorId = \" + msg.childSensorId + \" :--: \" + \n\"childSensorLabel = \" + msg.childSensorLabel + \" :--: \" + \n\"sensorTypeLabel = \" + msg.sensorTypeLabel);\n\nreturn msg;\n\n//------- Helper Functions ----------//\n\nfunction getByNodeId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].nodeId == value) return arr[i];\n  }\n}\n\nfunction getByChildId(arr, value) {\n  for (var i=0, iLen=arr.length; i<iLen; i++) {\n    if (arr[i].childSensorId == value) return arr[i];\n  }\n}","outputs":1,"noerr":0,"x":614,"y":390,"z":"c3095d41.89f1e8","wires":[["6e57151f.370ffc","ae35a271.90c3b"]]}]
                      

                      The one other piece I added was a response to the MetricOrImperial question. Maybe some of this is useful. Thanks for your work.

                      Thank you, it's very usefull !

                      1 Reply Last reply
                      0
                      • V Offline
                        V Offline
                        vickey
                        wrote on last edited by
                        #21

                        @tbowmo May you please share your node-red set up by exporting your setup as flow? If feasible for you

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        13

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.0k

                        Posts


                        Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • MySensors
                        • OpenHardware.io
                        • Categories
                        • Recent
                        • Tags
                        • Popular