EM115 Energy Monitoring - Modbus to MQTT

This flow uses a USB-RS485 adaptor to connect to an EM115 (https://meters.co.uk/wp-content/uploads/2018/07/EM115-MOD.pdf) using the Modbus protocol and then publishes the energy stats to an MQTT broker.

[{"id":"d57c883f.c8bda8","type":"tab","label":"EM115 to MQTT","disabled":false,"info":""},{"id":"db1634ba.ca7e48","type":"modbus-read","z":"d57c883f.c8bda8","name":"Voltage","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"2","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":290,"y":160,"wires":[["92ec00f7.75207"],[]]},{"id":"92ec00f7.75207","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"voltage\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":160,"wires":[["9e63ec73.44ab7"]]},{"id":"a00c8ab1.2584c8","type":"modbus-read","z":"d57c883f.c8bda8","name":"Current","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"6","quantity":"2","rate":"5","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":290,"y":220,"wires":[["4934ada1.3959c4"],[]]},{"id":"4934ada1.3959c4","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"Current\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":220,"wires":[["4fed4c65.3a6e84"]]},{"id":"92824022.f42","type":"modbus-read","z":"d57c883f.c8bda8","name":"Import Energy","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"352","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":310,"y":380,"wires":[["21d4c11c.4616ce"],[]]},{"id":"21d4c11c.4616ce","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"Import\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":380,"wires":[["bde343e9.3ebe9"]]},{"id":"c60702ea.ddade","type":"modbus-read","z":"d57c883f.c8bda8","name":"Export Energy","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"358","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":310,"y":440,"wires":[["31bcb5ad.ac4e4a"],[]]},{"id":"31bcb5ad.ac4e4a","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"Export Energy\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":440,"wires":[["ac4b0630.047c08"]]},{"id":"b247c253.18d9a","type":"modbus-read","z":"d57c883f.c8bda8","name":"Power Factor","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"14","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":310,"y":100,"wires":[["c039ae3.463055"],[]]},{"id":"c039ae3.463055","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = \"Power Factor\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":100,"wires":[["c685eabc.2315a8"]]},{"id":"ba926356.16f32","type":"modbus-read","z":"d57c883f.c8bda8","name":"Power","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"1","dataType":"HoldingRegister","adr":"10","quantity":"2","rate":"5","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"b7297497.6c1b28","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":290,"y":300,"wires":[["9ccb20c8.baa01"],[]]},{"id":"9ccb20c8.baa01","type":"function","z":"d57c883f.c8bda8","name":"","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\nvar import_w=0;\nvar export_w=0;\nvar gridPower=0;\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\ngridPower = parseFloat(fltView[0].toFixed(1));\n\n/////////////////// Calculate Import and Export //////////////\nif (gridPower>0) \n{\n    export_w=parseFloat(0);\n    import_w=Math.abs(parseFloat(gridPower));\n}\nif (gridPower<0) \n{\n    import_w=parseFloat(0);\n    export_w=Math.abs(parseFloat(gridPower));\n}\n\nmsg.payload=gridPower;\nmsg.import=import_w;\nmsg.export=export_w;\nmsg.topic = \"Power\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload});    \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":300,"wires":[["6707bb0.f6f6544","d6476217.0c041","97421632.63d088"]]},{"id":"c685eabc.2315a8","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/powerfactor","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":650,"y":100,"wires":[]},{"id":"9e63ec73.44ab7","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/voltage","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":640,"y":160,"wires":[]},{"id":"4fed4c65.3a6e84","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/current","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":640,"y":220,"wires":[]},{"id":"6707bb0.f6f6544","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/power","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":920,"y":260,"wires":[]},{"id":"bde343e9.3ebe9","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/importenergy","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":660,"y":380,"wires":[]},{"id":"ac4b0630.047c08","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/exportenergy","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":660,"y":440,"wires":[]},{"id":"6d35c6c7.8da168","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/import","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":920,"y":300,"wires":[]},{"id":"efc546c.06fafb8","type":"mqtt out","z":"d57c883f.c8bda8","name":"","topic":"EM115/export","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"62e93776.014a08","x":920,"y":340,"wires":[]},{"id":"d6476217.0c041","type":"switch","z":"d57c883f.c8bda8","name":"import","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"import","vt":"msg"}],"checkall":"true","repair":false,"outputs":1,"x":710,"y":300,"wires":[["6d35c6c7.8da168"]]},{"id":"97421632.63d088","type":"switch","z":"d57c883f.c8bda8","name":"export","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"export","vt":"msg"}],"checkall":"true","repair":false,"outputs":1,"x":710,"y":340,"wires":[["efc546c.06fafb8"]]},{"id":"b7297497.6c1b28","type":"modbus-client","name":"EM115","clienttype":"simpleser","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB0","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"1","commandDelay":"1","clientTimeout":"1250","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true},{"id":"62e93776.014a08","type":"mqtt-broker","name":"","broker":"1.1.1.1","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":""}]

Flow Info

Created 4 years, 9 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • function (x6)
  • mqtt out (x8)
  • mqtt-broker (x1)
  • switch (x2)
Other
  • modbus-client (x1)
  • modbus-read (x6)
  • tab (x1)

Tags

Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option