Modbus Test Tool
During writing a flow to control my Battery (https://flows.nodered.org/flow/3ab454d11d2a327aec6f092f30dbe7fc) with modbus TCP I found that testing the registers write and read Often requires the flow to be restarted. To prevent this I made this tool and can now write and read different registers without restarting the flow. Just fill in the correct values in the UI and press write and/or read to test the register values.
The flow makes use of the "node-red-contrib-modbus" nodes.
Added for the Marstek venus A a firmware readout section.
Added Reboot function and switch to toggle LAN network switch via tuya & homeassistant, to reset modbus.
[{"id":"a01a6ad43ae20262","type":"tab","label":"Modbus Test Tool","disabled":false,"info":"","env":[]},{"id":"5d69c190c353e51a","type":"group","z":"a01a6ad43ae20262","name":"M1","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["182d4d960b405847","5086b6eae1ccacc4","b6a8eccaf337f147","29a01819eceaa285","95b4acecc6e9cff9","b7d0091b14c7ded2","733d3778f5c99241","765415e47a1224e7","878dccbe61442ac8"],"x":94,"y":99,"w":932,"h":308},{"id":"718de6ecef9b5913","type":"group","z":"a01a6ad43ae20262","name":"M2","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["b135b4f2e365efde","d892c482c668b03b","6ec88f5851ef4936","3a8f42f974406599","eee0b0503e3fdd61","732e04067bdd364e","f04a3ea99aaf3365","cff3516646823e42","4628e546ccc63a18"],"x":94,"y":819,"w":932,"h":308},{"id":"239956c7c2d8d669","type":"group","z":"a01a6ad43ae20262","name":"M1b","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["a505e24b96af8838","f119ae5377172698","83bdae9d8f2a6b5b","8ec8e96db83ee170","195cc89363ce5051","c0343fce4d628dea","9a844a883ca245f5","e0541c74ad29b168","d0bb375e75984094"],"x":94,"y":469,"w":932,"h":308},{"id":"25597664dd01656b","type":"group","z":"a01a6ad43ae20262","name":"Read firmware version","style":{"fill":"#bfdbef","label":true,"color":"#000000"},"nodes":["55f54e3e41cf6eeb","0119dd777d5008be","860e4a9718526df3","04f0275a9577d057","e65491e9cb09f59a","53d9b5bec625a7a9","ede2f2acea56c368","fcd62c92df2adbcc","179ef287d781ac9f","e0d526c695465ea7","c07dd1d02ceea20d","4118c8cd44394ce2","610ad89a519f6dea","38e97ec0d8b4f15f","2401a806464361bd","928fc0d249208017","aa5f92467835099b","7d061dff5246ae08","8aac838b8209e6bf","faa35974dfbefbe2","8cef7f0cb3c76b72","2aea6d97845f719f","0f755ec9da96ab70","d649eedb20aeb086","1de232ccbe3a6627","0ac1595261c51afa","202cab74b518d38a","27db4f2a7394de43","9b34d7b4a2d6f534"],"x":94,"y":1189,"w":952,"h":652},{"id":"878dccbe61442ac8","type":"group","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"","style":{"fill":"#bfdbef","label":true},"nodes":["0dd7041848a984bc","6d226c2b34164c7d","90707b2196df987a"],"x":534,"y":169,"w":252,"h":212},{"id":"4628e546ccc63a18","type":"group","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"","style":{"fill":"#bfdbef","label":true},"nodes":["351beeb8be151fd0","75fb991b1ba710d4","2a623b0763cd3bfc"],"x":534,"y":889,"w":252,"h":212},{"id":"d0bb375e75984094","type":"group","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"","style":{"fill":"#bfdbef","label":true},"nodes":["2447f58a2ce79df4","7aa9a5e1227e3f25","e7101213d52639bb"],"x":534,"y":539,"w":252,"h":212},{"id":"49899ceb8de2b9cf","type":"group","z":"a01a6ad43ae20262","name":"Toggle Lan Switch to reset modbus","style":{"stroke":"#000000","label":true,"color":"#000000","fill":"#ffC000"},"nodes":["51297deab6c3defd","607843ec48028f5e","1b0380988bf0e44a"],"x":184,"y":1889,"w":632,"h":82},{"id":"182d4d960b405847","type":"function","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"store values","func":"flow.set(\"Address\",msg.payload.address) ;\nflow.set(\"Value\",msg.payload.value) ;\nflow.set(\"Unitid\",msg.payload.unitid) ;\nflow.set(\"Quantity\",msg.payload.quantity) ;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":140,"wires":[[]]},{"id":"5086b6eae1ccacc4","type":"function","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"prepare read","func":"var Address = flow.get(\"Address\") ;\nvar Unitid = flow.get(\"Unitid\") ;\nvar Quantity = flow.get(\"Quantity\") ;\nvar fc = 3 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\n\nmsg1.payload = { \"fc\": fc, \"unitid\": Unitid, \"address\": Address, \"quantity\": Quantity } //read\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":260,"wires":[["0dd7041848a984bc"]]},{"id":"b6a8eccaf337f147","type":"ui_form","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"","label":"","group":"bbc7c21fa70f301e","order":4,"width":0,"height":0,"options":[{"label":"address","value":"address","type":"number","required":false,"rows":null},{"label":"quantity","value":"quantity","type":"number","required":false,"rows":null},{"label":"unitid","value":"unitid","type":"number","required":false,"rows":null},{"label":"value","value":"value","type":"number","required":false,"rows":null}],"formValue":{"address":"","quantity":"","unitid":"","value":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":false,"className":"","x":370,"y":140,"wires":[["182d4d960b405847","765415e47a1224e7"]]},{"id":"0dd7041848a984bc","type":"modbus-flex-getter","z":"a01a6ad43ae20262","g":"878dccbe61442ac8","name":"Read modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"server":"67aa8a7899544f4d","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":660,"y":260,"wires":[["29a01819eceaa285"],[]]},{"id":"29a01819eceaa285","type":"ui_text","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","group":"bbc7c21fa70f301e","order":1,"width":6,"height":1,"name":"","label":"Register value","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":260,"wires":[]},{"id":"95b4acecc6e9cff9","type":"ui_button","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"","group":"bbc7c21fa70f301e","order":3,"width":3,"height":1,"passthru":false,"label":"Read register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":260,"wires":[["5086b6eae1ccacc4"]]},{"id":"6d226c2b34164c7d","type":"modbus-flex-write","z":"a01a6ad43ae20262","g":"878dccbe61442ac8","name":"Write modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"server":"67aa8a7899544f4d","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":660,"y":340,"wires":[[],[]]},{"id":"b7d0091b14c7ded2","type":"function","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"prepare write","func":"var Address = flow.get(\"Address\") ;\nvar Value = flow.get(\"Value\") ;\nvar Unitid = flow.get(\"Unitid\") ;\nvar Quantity = flow.get(\"Quantity\") ;\nvar fc = 6 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\nmsg1.payload = {\"value\": Value, \"fc\": fc, \"unitid\": Unitid, \"address\": Address, \"quantity\": Quantity } //write\n\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":340,"wires":[["6d226c2b34164c7d"]]},{"id":"733d3778f5c99241","type":"ui_button","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"","group":"bbc7c21fa70f301e","order":2,"width":3,"height":1,"passthru":false,"label":"Write register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":340,"wires":[["b7d0091b14c7ded2"]]},{"id":"765415e47a1224e7","type":"change","z":"a01a6ad43ae20262","g":"5d69c190c353e51a","name":"last","rules":[{"t":"set","p":"form","pt":"flow","to":"payload.form","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":170,"wires":[["b6a8eccaf337f147"]]},{"id":"90707b2196df987a","type":"comment","z":"a01a6ad43ae20262","g":"878dccbe61442ac8","name":"readme","info":"Select a modbus server:\nip nummer of the device and add port number 502\nexample: 192.168.178.55:502\n\nDo this for the modbus read node and for the \nmodbus write node.\n\nAlso change in the prepare nodes if necessary\nthe fc value for special registers.","x":640,"y":210,"wires":[]},{"id":"b135b4f2e365efde","type":"function","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"store values","func":"flow.set(\"Address2\",msg.payload.address) ;\nflow.set(\"Value2\",msg.payload.value) ;\nflow.set(\"Unitid2\",msg.payload.unitid) ;\nflow.set(\"Quantity2\",msg.payload.quantity) ;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":860,"wires":[[]]},{"id":"d892c482c668b03b","type":"function","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"prepare read","func":"var Address2 = flow.get(\"Address2\") ;\nvar Unitid2 = flow.get(\"Unitid2\") ;\nvar Quantity2 = flow.get(\"Quantity2\") ;\nvar fc = 3 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\n\nmsg1.payload = { \"fc\": fc, \"unitid\": Unitid2, \"address\": Address2, \"quantity\": Quantity2 } //read\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":980,"wires":[["351beeb8be151fd0"]]},{"id":"6ec88f5851ef4936","type":"ui_form","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"","label":"","group":"7667c6660a73ce8b","order":4,"width":0,"height":0,"options":[{"label":"address","value":"address","type":"number","required":false,"rows":null},{"label":"quantity","value":"quantity","type":"number","required":false,"rows":null},{"label":"unitid","value":"unitid","type":"number","required":false,"rows":null},{"label":"value","value":"value","type":"number","required":false,"rows":null}],"formValue":{"address":"","quantity":"","unitid":"","value":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":false,"className":"","x":370,"y":860,"wires":[["b135b4f2e365efde","cff3516646823e42"]]},{"id":"3a8f42f974406599","type":"ui_text","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","group":"7667c6660a73ce8b","order":1,"width":6,"height":1,"name":"","label":"Register value","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":980,"wires":[]},{"id":"eee0b0503e3fdd61","type":"ui_button","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"","group":"7667c6660a73ce8b","order":3,"width":3,"height":1,"passthru":false,"label":"Read register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":980,"wires":[["d892c482c668b03b"]]},{"id":"732e04067bdd364e","type":"function","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"prepare write","func":"var Address2 = flow.get(\"Address2\") ;\nvar Value2 = flow.get(\"Value2\") ;\nvar Unitid2 = flow.get(\"Unitid2\") ;\nvar Quantity2 = flow.get(\"Quantity2\") ;\nvar fc = 6 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\nmsg1.payload = {\"value\": Value2, \"fc\": fc, \"unitid\": Unitid2, \"address\": Address2, \"quantity\": Quantity2 } //write\n\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":1060,"wires":[["75fb991b1ba710d4"]]},{"id":"f04a3ea99aaf3365","type":"ui_button","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"","group":"7667c6660a73ce8b","order":2,"width":3,"height":1,"passthru":false,"label":"Write register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":1060,"wires":[["732e04067bdd364e"]]},{"id":"cff3516646823e42","type":"change","z":"a01a6ad43ae20262","g":"718de6ecef9b5913","name":"last","rules":[{"t":"set","p":"form2","pt":"flow","to":"payload.form2","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":890,"wires":[["6ec88f5851ef4936"]]},{"id":"351beeb8be151fd0","type":"modbus-flex-getter","z":"a01a6ad43ae20262","g":"4628e546ccc63a18","name":"Read modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"server":"f821200b3de634c4","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":660,"y":980,"wires":[["3a8f42f974406599"],[]]},{"id":"75fb991b1ba710d4","type":"modbus-flex-write","z":"a01a6ad43ae20262","g":"4628e546ccc63a18","name":"Write modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"server":"f821200b3de634c4","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":660,"y":1060,"wires":[[],[]]},{"id":"2a623b0763cd3bfc","type":"comment","z":"a01a6ad43ae20262","g":"4628e546ccc63a18","name":"readme","info":"Select a modbus server:\nip nummer of the device and add port number 502\nexample: 192.168.178.55:502\n\nDo this for the modbus read node and for the \nmodbus write node.\n\nAlso change in the prepare nodes if necessary\nthe fc value for special registers.","x":640,"y":930,"wires":[]},{"id":"a505e24b96af8838","type":"function","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"store values","func":"flow.set(\"Address1b\",msg.payload.address) ;\nflow.set(\"Value1b\",msg.payload.value) ;\nflow.set(\"Unitid1b\",msg.payload.unitid) ;\nflow.set(\"Quantity1b\",msg.payload.quantity) ;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":510,"wires":[[]]},{"id":"f119ae5377172698","type":"function","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"prepare read","func":"var Address1b = flow.get(\"Address1b\") ;\nvar Unitid1b = flow.get(\"Unitid1b\") ;\nvar Quantity1b = flow.get(\"Quantity1b\") ;\nvar fc = 3 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\n\nmsg1.payload = { \"fc\": fc, \"unitid\": Unitid1b, \"address\": Address1b, \"quantity\": Quantity1b } //read\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":630,"wires":[["2447f58a2ce79df4"]]},{"id":"83bdae9d8f2a6b5b","type":"ui_form","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"","label":"","group":"03b65d071c6d10e4","order":4,"width":0,"height":0,"options":[{"label":"address","value":"address","type":"number","required":false,"rows":null},{"label":"quantity","value":"quantity","type":"number","required":false,"rows":null},{"label":"unitid","value":"unitid","type":"number","required":false,"rows":null},{"label":"value","value":"value","type":"number","required":false,"rows":null}],"formValue":{"address":"","quantity":"","unitid":"","value":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":false,"className":"","x":370,"y":510,"wires":[["a505e24b96af8838","e0541c74ad29b168"]]},{"id":"8ec8e96db83ee170","type":"ui_text","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","group":"03b65d071c6d10e4","order":1,"width":6,"height":1,"name":"","label":"Register value","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":630,"wires":[]},{"id":"195cc89363ce5051","type":"ui_button","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"","group":"03b65d071c6d10e4","order":3,"width":3,"height":1,"passthru":false,"label":"Read register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":630,"wires":[["f119ae5377172698"]]},{"id":"c0343fce4d628dea","type":"function","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"prepare write","func":"var Address1b = flow.get(\"Address1b\") ;\nvar Value1b = flow.get(\"Value1b\") ;\nvar Unitid1b = flow.get(\"Unitid1b\") ;\nvar Quantity1b = flow.get(\"Quantity1b\") ;\nvar fc = 6 ; //read =3 write is 6 \n\n\n\nvar msg1 = {};\nmsg1.payload = {\"value\": Value1b, \"fc\": fc, \"unitid\": Unitid1b, \"address\": Address1b, \"quantity\": Quantity1b } //write\n\n\n\nreturn [[msg1]];\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":710,"wires":[["7aa9a5e1227e3f25"]]},{"id":"9a844a883ca245f5","type":"ui_button","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"","group":"03b65d071c6d10e4","order":2,"width":3,"height":1,"passthru":false,"label":"Write register","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":710,"wires":[["c0343fce4d628dea"]]},{"id":"e0541c74ad29b168","type":"change","z":"a01a6ad43ae20262","g":"239956c7c2d8d669","name":"last","rules":[{"t":"set","p":"form1b","pt":"flow","to":"payload.form1b","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":540,"wires":[["83bdae9d8f2a6b5b"]]},{"id":"2447f58a2ce79df4","type":"modbus-flex-getter","z":"a01a6ad43ae20262","g":"d0bb375e75984094","name":"Read modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"server":"67aa8a7899544f4d","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":660,"y":630,"wires":[["8ec8e96db83ee170"],[]]},{"id":"7aa9a5e1227e3f25","type":"modbus-flex-write","z":"a01a6ad43ae20262","g":"d0bb375e75984094","name":"Write modbus register","showStatusActivities":false,"showErrors":false,"showWarnings":true,"server":"67aa8a7899544f4d","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":660,"y":710,"wires":[[],[]]},{"id":"e7101213d52639bb","type":"comment","z":"a01a6ad43ae20262","g":"d0bb375e75984094","name":"readme","info":"Select a modbus server:\nip nummer of the device and add port number 502\nexample: 192.168.178.55:502\n\nDo this for the modbus read node and for the \nmodbus write node.\n\nAlso change in the prepare nodes if necessary\nthe fc value for special registers.","x":640,"y":580,"wires":[]},{"id":"55f54e3e41cf6eeb","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 1 Fw EMS 30200","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"1","dataType":"HoldingRegister","adr":"30200","quantity":"1","server":"67aa8a7899544f4d","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":590,"y":1240,"wires":[["0119dd777d5008be"],[]]},{"id":"0119dd777d5008be","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"ems","func":"var ems1 = msg.payload ;\n\n\nreturn [{ payload: ems1}]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1230,"wires":[["04f0275a9577d057"]]},{"id":"860e4a9718526df3","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 1 vns 30202","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"1","dataType":"HoldingRegister","adr":"30202","quantity":"1","server":"67aa8a7899544f4d","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":600,"y":1380,"wires":[["179ef287d781ac9f"],[]]},{"id":"04f0275a9577d057","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":1,"width":2,"height":1,"name":"ems1","label":"ems m1","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":960,"y":1230,"wires":[]},{"id":"e65491e9cb09f59a","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 2 Fw EMS 30200","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"2","dataType":"HoldingRegister","adr":"30200","quantity":"1","server":"f821200b3de634c4","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":590,"y":1290,"wires":[["53d9b5bec625a7a9"],[]]},{"id":"53d9b5bec625a7a9","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"ems","func":"var ems2 = msg.payload ;\n\n\nreturn [{ payload:ems2}]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1280,"wires":[["ede2f2acea56c368"]]},{"id":"ede2f2acea56c368","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":4,"width":2,"height":1,"name":"ems2","label":"ems m2","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":960,"y":1270,"wires":[]},{"id":"fcd62c92df2adbcc","type":"delay","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":1380,"wires":[["860e4a9718526df3","928fc0d249208017"]]},{"id":"179ef287d781ac9f","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"vns","func":"var vns1 = msg.payload ;\n\n\nreturn [{ payload: vns1 }]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1370,"wires":[["e0d526c695465ea7"]]},{"id":"e0d526c695465ea7","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":2,"width":2,"height":1,"name":"vns1","label":"vns m1","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":960,"y":1370,"wires":[]},{"id":"c07dd1d02ceea20d","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 2 vns 30202","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"2","dataType":"HoldingRegister","adr":"30202","quantity":"1","server":"f821200b3de634c4","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":600,"y":1450,"wires":[["610ad89a519f6dea"],[]]},{"id":"4118c8cd44394ce2","type":"delay","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":1450,"wires":[["c07dd1d02ceea20d","faa35974dfbefbe2"]]},{"id":"610ad89a519f6dea","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"vns","func":"var vns2 = msg.payload ;\n\n\nreturn [{ payload: vns2 }]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1440,"wires":[["38e97ec0d8b4f15f"]]},{"id":"38e97ec0d8b4f15f","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":5,"width":2,"height":1,"name":"vns2","label":"vns m2","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":960,"y":1440,"wires":[]},{"id":"2401a806464361bd","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 1 bms 30204","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"1","dataType":"HoldingRegister","adr":"30204","quantity":"1","server":"67aa8a7899544f4d","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":610,"y":1540,"wires":[["aa5f92467835099b"],[]]},{"id":"928fc0d249208017","type":"delay","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":400,"y":1540,"wires":[["2401a806464361bd"]]},{"id":"aa5f92467835099b","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"bms","func":"var bms1 = msg.payload ;\n\n\nreturn [{ payload: bms1 }]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1540,"wires":[["7d061dff5246ae08"]]},{"id":"7d061dff5246ae08","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":3,"width":2,"height":1,"name":"bms1","label":"bms m1","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":970,"y":1540,"wires":[]},{"id":"8aac838b8209e6bf","type":"modbus-getter","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Marstek 2 bms 30204","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"unitid":"2","dataType":"HoldingRegister","adr":"30204","quantity":"1","server":"f821200b3de634c4","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":600,"y":1610,"wires":[["8cef7f0cb3c76b72"],[]]},{"id":"faa35974dfbefbe2","type":"delay","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":1610,"wires":[["8aac838b8209e6bf"]]},{"id":"8cef7f0cb3c76b72","type":"function","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"bms","func":"var bms2 = msg.payload ;\n\n\nreturn [{ payload: bms2 }]\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1610,"wires":[["2aea6d97845f719f"]]},{"id":"2aea6d97845f719f","type":"ui_text","z":"a01a6ad43ae20262","g":"25597664dd01656b","group":"fdfbcd5b55b1a3c1","order":6,"width":2,"height":1,"name":"bms2","label":"bms m2","format":"{{msg.payload}}","layout":"row-left","className":"","style":true,"font":"","fontSize":"12","color":"#64c832","x":970,"y":1610,"wires":[]},{"id":"0f755ec9da96ab70","type":"inject","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":"3","topic":"","payload":"","payloadType":"date","x":210,"y":1240,"wires":[["55f54e3e41cf6eeb","e65491e9cb09f59a","fcd62c92df2adbcc","4118c8cd44394ce2"]]},{"id":"1de232ccbe3a6627","type":"ui_button","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","group":"fdfbcd5b55b1a3c1","order":8,"width":3,"height":1,"passthru":false,"label":"Reboot M1","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"21930","payloadType":"num","topic":"topic","topicType":"msg","x":270,"y":1740,"wires":[["27db4f2a7394de43"]]},{"id":"0ac1595261c51afa","type":"ui_button","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","group":"fdfbcd5b55b1a3c1","order":9,"width":3,"height":1,"passthru":false,"label":"Reboot M2","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"21930","payloadType":"num","topic":"topic","topicType":"msg","x":270,"y":1800,"wires":[["9b34d7b4a2d6f534"]]},{"id":"d649eedb20aeb086","type":"modbus-write","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Modbus Write 41000 ( reboot, M1)","showStatusActivities":false,"showErrors":false,"showWarnings":true,"unitid":"1","dataType":"HoldingRegister","adr":"41000","quantity":"1","server":"67aa8a7899544f4d","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":750,"y":1740,"wires":[[],[]]},{"id":"202cab74b518d38a","type":"modbus-write","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"Modbus Write 41000 ( reboot, M2)","showStatusActivities":false,"showErrors":false,"showWarnings":true,"unitid":"2","dataType":"HoldingRegister","adr":"41000","quantity":"1","server":"f821200b3de634c4","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":750,"y":1800,"wires":[[],[]]},{"id":"27db4f2a7394de43","type":"ui_are_you_sure","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","group":"fdfbcd5b55b1a3c1","iconColor":"#ffcc00","textColor":"#fa0505","backgroundColor":"#19e119","icon":"fa fa-exclamation-triangle","title":"Are You Sure?","description":"Reboot?","timeoutSec":"8","x":460,"y":1740,"wires":[["d649eedb20aeb086"],[]]},{"id":"9b34d7b4a2d6f534","type":"ui_are_you_sure","z":"a01a6ad43ae20262","g":"25597664dd01656b","name":"","group":"fdfbcd5b55b1a3c1","iconColor":"#ffcc00","textColor":"#fa0505","backgroundColor":"#19e119","icon":"fa fa-exclamation-triangle","title":"Are You Sure?","description":"Reboot?","timeoutSec":"8","x":460,"y":1800,"wires":[["202cab74b518d38a"],[]]},{"id":"51297deab6c3defd","type":"api-call-service","z":"a01a6ad43ae20262","g":"49899ceb8de2b9cf","name":"Network Marstek","server":"6ad6bd245c78b95a","version":7,"debugenabled":false,"action":"switch.toggle","floorId":[],"areaId":[],"deviceId":["bd64baf2c09c8856d7b9fbfee5161b2f"],"entityId":[],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"switch","service":"toggle","x":700,"y":1930,"wires":[[]]},{"id":"607843ec48028f5e","type":"ui_switch","z":"a01a6ad43ae20262","g":"49899ceb8de2b9cf","name":"Network Switch","label":"Network Switch","tooltip":"reset modbus","group":"fdfbcd5b55b1a3c1","order":13,"width":6,"height":1,"passthru":true,"decouple":"false","topic":"payload","topicType":"msg","style":"","onvalue":"1","onvalueType":"num","onicon":"","oncolor":"","offvalue":"0","offvalueType":"num","officon":"","offcolor":"","animate":false,"className":"","x":430,"y":1930,"wires":[["51297deab6c3defd"]]},{"id":"1b0380988bf0e44a","type":"inject","z":"a01a6ad43ae20262","g":"49899ceb8de2b9cf","name":"init","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"1","payloadType":"num","x":280,"y":1930,"wires":[["607843ec48028f5e"]]},{"id":"19ebdd118bf759c6","type":"ui_spacer","z":"a01a6ad43ae20262","name":"spacer","group":"fdfbcd5b55b1a3c1","order":7,"width":6,"height":1},{"id":"bfd344d4d0d07b33","type":"ui_spacer","z":"a01a6ad43ae20262","name":"spacer","group":"fdfbcd5b55b1a3c1","order":12,"width":"6","height":"1"},{"id":"bbc7c21fa70f301e","type":"ui_group","name":"Modbus test tool M1","tab":"ba2cf45331ca6172","order":1,"disp":true,"width":6,"collapse":true,"className":""},{"id":"67aa8a7899544f4d","type":"modbus-client","name":"Marstek 1","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.178.7","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":3,"commandDelay":1,"clientTimeout":1000,"reconnectOnTimeout":true,"reconnectTimeout":2000,"parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true},{"id":"7667c6660a73ce8b","type":"ui_group","name":"Modbus test tool M2","tab":"ba2cf45331ca6172","order":3,"disp":true,"width":6,"collapse":true,"className":""},{"id":"f821200b3de634c4","type":"modbus-client","name":"Marstek 2","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.178.8","tcpPort":502,"tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":9600,"serialDatabits":8,"serialStopbits":1,"serialParity":"none","serialConnectionDelay":100,"serialAsciiResponseStartDelimiter":"0x3A","unit_id":2,"commandDelay":1,"clientTimeout":1000,"reconnectOnTimeout":true,"reconnectTimeout":2000,"parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true},{"id":"03b65d071c6d10e4","type":"ui_group","name":"Modbus test tool M1b","tab":"ba2cf45331ca6172","order":2,"disp":true,"width":6,"collapse":true,"className":""},{"id":"fdfbcd5b55b1a3c1","type":"ui_group","name":"Firmware info","tab":"ba2cf45331ca6172","order":4,"disp":true,"width":6,"collapse":true,"className":""},{"id":"6ad6bd245c78b95a","type":"server","name":"Home Assistant","version":6,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":["y","yes","true","on","home","open"],"connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false},{"id":"ba2cf45331ca6172","type":"ui_tab","name":"Tools","icon":"dashboard","order":3,"disabled":false,"hidden":false},{"id":"1ee2228749bd77e5","type":"global-config","env":[],"modules":{"node-red-dashboard":"3.6.6","node-red-contrib-modbus":"5.45.2","node-red-contrib-ui-areyousure":"0.1.0","node-red-contrib-home-assistant-websocket":"0.80.3"}}]