Modbus RTU read data from SDM120 Energy Meter [Node Red]

SDM120 Energy Meter หาซื้อได้จาก aliexpress คลิกที่นี่ 


USB to RS485 ก็จาก aliexpress คลิกที่นี่ 



นำมาใช้งานกับ RPi ได้อย่างดี


ใช้คำสั่ง เพื่อหาว่ามี usb to serail port ต่ออยู่หรือไม่

$ lsusb


ค้นหาว่า usb-serial ของเราต่อกับ tty ไหน จากคำสั่ง 

dmesg | grep tty 

เราจะเจอ usb to serial port ที่ /dev/ttyUSB0


หลังจากนั้นก็จะทำการต่อสายการสื่อสารชนิด RS485 Modbus ไปยัง SDM120 Energy Meter ลาก flow modbus มาวางนะครับ ส่วน  วิธีการติดตั้ง modbus flow คลิก 


กำหนดค่าใน modbus ดังนี้ โดยผมจะเลือก FC-4 เพื่ออ่านค่าจาก Input Register ส่วนตำแหน่งของ Register ของ SDM120 ก็ดังนี้นะครับ 


การกำหนด Register เลือกอ่านค่า Volts ที่ address 0 [30000] เลือก Quantity 2 เนื่องจาก format เป็น IEEE754 float ใช้ 4 bytes  


กลับไปกำหนดค่า Buad rate ที่ 2400 bps นะครับ เพราะเป็นค่าเริ่มต้นของ SDM120 





ต่อ DHT-22 เพื่อใช้วัดอุณหภูมิและความชื้นสัมพัทธ์ วิธีการใช้งานคลิก 



ส่วน Node มีอะไรบ้างก็ลอง Copy Code บางส่วนไปวางดูตาม code ข้างล่างครับ


[{"id":"85510ca.9052af","type":"tab","label":"SDM120 Energy Meter"},{"id":"5e56284e.858668","type":"function","z":"85510ca.9052af","name":"Voltage","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,"x":404.00001525878906,"y":21.000001907348633,"wires":[["1716619.613939e"]]},{"id":"4176070.7a5cdf8","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"0","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":151.55967712402344,"y":29.204532623291016,"wires":[["5e56284e.858668"],[]]},{"id":"addc97cc.7d3548","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"6","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":152.7926254272461,"y":124.21020221710205,"wires":[["adf281ed.27c85"],[]]},{"id":"adf281ed.27c85","type":"function","z":"85510ca.9052af","name":"Ampare","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(3));\nmsg.topic =\"Ampare\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":404.7926330566406,"y":126.21014976501465,"wires":[["f5b0affc.e0fd5"]]},{"id":"8b13daf0.3e8c58","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"12","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":137.79264450073242,"y":267.11927223205566,"wires":[["23079d50.bff4b2"],[]]},{"id":"23079d50.bff4b2","type":"function","z":"85510ca.9052af","name":"Watt","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(3));\nmsg.topic =\"Watts\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":378.7926559448242,"y":267.11927604675293,"wires":[["e3caebd4.f9b268","3e3284d6.0b284c"]]},{"id":"e3fbc0e8.34149","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"70","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":144.79265213012695,"y":550.1192569732666,"wires":[["3b093b73.4e1914"],[]]},{"id":"3b093b73.4e1914","type":"function","z":"85510ca.9052af","name":"Frequency","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(2));\nmsg.topic =\"Frequency\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":387.7926445007324,"y":544.1193084716797,"wires":[["e512e786.443d48"]]},{"id":"97b09676.fe8108","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"342","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":139.79266738891602,"y":430.1192111968994,"wires":[["aa634520.f4d0f8"],[]]},{"id":"aa634520.f4d0f8","type":"function","z":"85510ca.9052af","name":"kWh","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(3));\nmsg.topic =\"kWh\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":372.7926483154297,"y":434.1192264556885,"wires":[["dbd577a2.4c0468"]]},{"id":"f0d3606.f116fa","type":"modbus-read","z":"85510ca.9052af","name":"SDM120 PF","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"30","quantity":"2","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":147.79266357421875,"y":484.93746185302734,"wires":[["6845145.3c4bbec"],[]]},{"id":"6845145.3c4bbec","type":"function","z":"85510ca.9052af","name":"PF","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 =\"PF\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":374.7926597595215,"y":486.9374599456787,"wires":[["8f58ccdb.18d22"]]},{"id":"1716619.613939e","type":"ui_gauge","z":"85510ca.9052af","name":"Volts","group":"45627eb6.92681","order":1,"width":"0","height":"0","gtype":"gage","title":"Volts","label":"units","format":"{{value}}","min":0,"max":"500","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":615.5653915405273,"y":24.545454025268555,"wires":[]},{"id":"f5b0affc.e0fd5","type":"ui_gauge","z":"85510ca.9052af","name":"Amp","group":"45627eb6.92681","order":2,"width":"0","height":"0","gtype":"gage","title":"Amp","label":"units","format":"{{value}}","min":0,"max":"2","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":613.7926216125488,"y":125.21022415161133,"wires":[]},{"id":"e3caebd4.f9b268","type":"ui_gauge","z":"85510ca.9052af","name":"Watts","group":"a473a9b9.35d958","order":2,"width":"0","height":"0","gtype":"gage","title":"Watts","label":"units","format":"{{value}}","min":0,"max":"300","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":593.7927322387695,"y":262.21021270751953,"wires":[]},{"id":"dbd577a2.4c0468","type":"ui_gauge","z":"85510ca.9052af","name":"kWh","group":"18ce6310.d3e1cd","order":3,"width":"0","height":"0","gtype":"gage","title":"kWh","label":"units","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":596.7926597595215,"y":431.0284004211426,"wires":[]},{"id":"8f58ccdb.18d22","type":"ui_gauge","z":"85510ca.9052af","name":"PF","group":"18ce6310.d3e1cd","order":1,"width":"3","height":"4","gtype":"gage","title":"PF","label":"units","format":"{{value}}","min":"-1","max":"1","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":594.7926902770996,"y":499.02837562561035,"wires":[]},{"id":"31071305.3df0ec","type":"modbus-read","z":"85510ca.9052af","name":"ModbusSlave02","showStatusActivities":true,"showErrors":true,"unitid":"2","dataType":"InputRegister","adr":"0","quantity":"1","rate":"5","rateUnit":"s","server":"433ac110.603ab","x":163.7926788330078,"y":633.9375,"wires":[["3e129878.a78868"],[]]},{"id":"3e129878.a78868","type":"function","z":"85510ca.9052af","name":"ADC0","func":"var rawData = new ArrayBuffer(2);\nvar intView = new Uint16Array(rawData);\n//var fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[0]; //low\n//intView[1] = msg.payload[0]; //high\n\nmsg.payload =intView;\n//msg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic =\"ADC0\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":370.792724609375,"y":634.846435546875,"wires":[[]]},{"id":"3e3284d6.0b284c","type":"ui_chart","z":"85510ca.9052af","name":"watt","group":"a473a9b9.35d958","order":0,"width":"0","height":"0","label":"Watts","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","ymin":"0","ymax":"300","removeOlder":"12","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":592.5681457519531,"y":314.6619234085083,"wires":[[],[]]},{"id":"f73a26c8.1448f8","type":"modbus-read","z":"85510ca.9052af","name":"SDM120Watts","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"12","quantity":"2","rate":"10","rateUnit":"m","server":"433ac110.603ab","x":146.79267501831055,"y":325.0283966064453,"wires":[["e9946936.fa9028"],[]]},{"id":"e9946936.fa9028","type":"function","z":"85510ca.9052af","name":"WattTweet","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 = \"PV Power = \" + parseFloat(fltView[0].toFixed(3)) + \" Watts\";\nmsg.topic =\"Watts\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":382.7926445007324,"y":321.0283851623535,"wires":[["3e505989.f9d666"]]},{"id":"7c90bf71.a080e","type":"rpi-dht22","z":"85510ca.9052af","name":"TempHumid","topic":"DHT22","dht":"22","pintype":"0","pin":4,"x":318.0000305175781,"y":818.0000171661377,"wires":[["4cc97377.551dcc"]]},{"id":"ec8b6b7e.f562a8","type":"inject","z":"85510ca.9052af","name":"Trigger","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"x":134.00000762939453,"y":824.0000066757202,"wires":[["7c90bf71.a080e"]]},{"id":"3062e018.2623a","type":"ui_gauge","z":"85510ca.9052af","name":"Temp","group":"b750226f.77c2d","order":4,"width":"3","height":"3","gtype":"gage","title":"Temp","label":"units","format":"{{value}}°C","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":726.0000610351562,"y":698.000244140625,"wires":[]},{"id":"4858e408.a40abc","type":"ui_gauge","z":"85510ca.9052af","name":"Humid","group":"b750226f.77c2d","order":4,"width":"3","height":"3","gtype":"gage","title":"Humid","label":"units","format":"{{value}}%","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":733.0000190734863,"y":796.0001983642578,"wires":[]},{"id":"4cc97377.551dcc","type":"function","z":"85510ca.9052af","name":"SplitData","func":"var msg1 = {};\nvar msg2 = {};\n\nmsg1.payload = msg.payload;\nmsg1.topic='Temp';\nmsg2.payload=msg.humidity;\nmsg2.topic='Humid';\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload + \":\" + msg.humidity}); \n\nreturn [msg1,msg2];","outputs":"2","noerr":0,"x":483.8333740234375,"y":816.7223796844482,"wires":[["3062e018.2623a","63f30fd1.a9816"],["4858e408.a40abc","63f30fd1.a9816"]]},{"id":"63f30fd1.a9816","type":"ui_chart","z":"85510ca.9052af","name":"TempHumidity","group":"b750226f.77c2d","order":0,"width":"6","height":"5","label":"Temperature and Humidity ","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","ymin":"0","ymax":"100","removeOlder":"12","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"colors":["#7a6858","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":753.8958225250244,"y":848.7777919769287,"wires":[[],[]]},{"id":"8fb921c4.f9438","type":"twitter out","z":"85510ca.9052af","twitter":"","name":"Tweet","x":929.8369312286377,"y":437.0105276107788,"wires":[]},{"id":"378f556b.3265ca","type":"modbus-read","z":"85510ca.9052af","name":"SDM120kWh","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"342","quantity":"2","rate":"10","rateUnit":"m","server":"433ac110.603ab","x":143.8958625793457,"y":381.888876914978,"wires":[["ba3a9cfd.4d1cf"],[]]},{"id":"ba3a9cfd.4d1cf","type":"function","z":"85510ca.9052af","name":"kWhTweet","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 = \"Total Energy = \" + parseFloat(fltView[0].toFixed(3)) + \" kWh\";\nmsg.topic =\"kWh\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":381.8958549499512,"y":377.8888759613037,"wires":[["3e505989.f9d666"]]},{"id":"3e505989.f9d666","type":"join","z":"85510ca.9052af","name":"","mode":"custom","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"5","x":786.837028503418,"y":436.69101905822754,"wires":[["8fb921c4.f9438"]]},{"id":"8fa33959.e43288","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"0","quantity":"2","rate":"10","rateUnit":"m","server":"433ac110.603ab","x":153.89583587646484,"y":78.88888931274414,"wires":[["2e748ce3.e297c4"],[]]},{"id":"2e748ce3.e297c4","type":"function","z":"85510ca.9052af","name":"VoltsTweet","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(3)) + \" V.\";\nmsg.topic =\"Volts\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":402.89581298828125,"y":78.88888549804688,"wires":[["3e505989.f9d666"]]},{"id":"9f0187d3.50dbd8","type":"modbus-read","z":"85510ca.9052af","name":"SDM120","showStatusActivities":false,"showErrors":false,"unitid":"1","dataType":"InputRegister","adr":"6","quantity":"2","rate":"10","rateUnit":"m","server":"433ac110.603ab","x":154.8958282470703,"y":187.88888549804688,"wires":[["4b24212f.245f1"],[]]},{"id":"4b24212f.245f1","type":"function","z":"85510ca.9052af","name":"AmpTweet","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(3)) + \" A.\";\nmsg.topic =\"Amp\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"x":401.8958282470703,"y":183.8888874053955,"wires":[["3e505989.f9d666"]]},{"id":"4682f801.5a2dc8","type":"function","z":"85510ca.9052af","name":"SplitData","func":"msg.payload = msg.payload +\"°C \" + msg.humidity + \"%\";\n\nnode.status({fill:\"blue\",shape:\"ring\",text:msg.topic + \":\" + msg.payload + \":\" + msg.humidity}); \n\nreturn msg;","outputs":"1","noerr":0,"x":484.89581298828125,"y":724.3333129882812,"wires":[["3e505989.f9d666"]]},{"id":"185784e3.a0715b","type":"rpi-dht22","z":"85510ca.9052af","name":"TempHumid","topic":"DHT22","dht":"22","pintype":"0","pin":4,"x":314.0000228881836,"y":743.2222290039062,"wires":[["4682f801.5a2dc8"]]},{"id":"36c9ca25.7616b6","type":"inject","z":"85510ca.9052af","name":"Trigger","topic":"","payload":"","payloadType":"date","repeat":"600","crontab":"","once":false,"x":130,"y":749.2222185134888,"wires":[["185784e3.a0715b"]]},{"id":"e512e786.443d48","type":"ui_gauge","z":"85510ca.9052af","name":"F","group":"18ce6310.d3e1cd","order":2,"width":"3","height":"4","gtype":"gage","title":"F","label":"units","format":"{{value}}","min":"45","max":"55","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":589,"y":557,"wires":[]},{"id":"433ac110.603ab","type":"modbus-client","z":"","name":"Modbus","clienttype":"serial","bufferCommands":true,"stateLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB0","serialType":"RTU-BUFFERD","serialBaudrate":"2400","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectTimeout":"5000"},{"id":"45627eb6.92681","type":"ui_group","z":"","name":"Volts & Amp","tab":"9fcb7b53.17ee58","order":2,"disp":true,"width":"6"},{"id":"a473a9b9.35d958","type":"ui_group","z":"","name":"Power & Energy","tab":"9fcb7b53.17ee58","order":3,"disp":true,"width":"6"},{"id":"18ce6310.d3e1cd","type":"ui_group","z":"85510ca.9052af","name":"Power Factor","tab":"9fcb7b53.17ee58","order":4,"disp":true,"width":"6"},{"id":"b750226f.77c2d","type":"ui_group","z":"","name":"Temp & Humid","tab":"9fcb7b53.17ee58","order":1,"disp":true,"width":"6"},{"id":"9fcb7b53.17ee58","type":"ui_tab","z":"85510ca.9052af","name":"PV300W Energy Meter","icon":"dashboard","order":"1"}]
view raw gistfile1.txt hosted with ❤ by GitHub






Comments