-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunction-node-read-write.json
More file actions
1 lines (1 loc) · 20.6 KB
/
Copy pathfunction-node-read-write.json
File metadata and controls
1 lines (1 loc) · 20.6 KB
1
[{"id":"08d10a88d5d71c08","type":"comment","z":"cea9f6bd1ddc7fa4","name":"data from mppt Victron / SET / GET values - read me inside","info":"mppt ON\n:8000200014A\n\nmppt OFF\n:80002000447\n\nget device mode\n:70002004C\n>receive\n:7000200014B ON\n:70002000448 OFF\n\n10A\nWRITE :8F0ED0064000C\nREAD :8F0ED0064000C\n\n40A\nWRITE :8F0ED009001DF\nREAD :8F0ED009001DF\n\n50A\nWRITE :8F0ED00F4017B\nREAD :8F0ED00F4017B\n\n60A\nWRITE :8F0ED00580216\nREAD :8F0ED00580216\n\n70A\nWRITE :8F0ED00BC02B2\nREAD :8F0ED00BC02B2\n\nbulk\n55.7v :8F7ED00C21592 ??\n54.7v :8F7ED005E15F6\n54.5v :8F7ED004A150A\n\nfloat\n55.7v :8F6ED00C21593 ??\n54.7v :8F6ED005E15F7\n54.5v :8F6ED004A150B\n\nget current\n:7F0ED0071\n\nget float\n:7F6ED006B\n\nget absorb\n:7F7ED006A","x":770,"y":180,"wires":[]},{"id":"4ebae5301064fd8b","type":"group","z":"cea9f6bd1ddc7fa4","name":"","style":{"label":true},"nodes":["1f119c5dd966c84f","4cfc0cb5364b6fce","70dcbeb7a54022e9","18ae0065c3790f1f","ce96a006f9ed956f","07fef5d5eeb7287c","a073a14f3ce2ff14","6dc865eeb2cffa41","f73fe2ae90ea81f2","513aea2a82bb92a5","50c3221098cd8ac4","0f0c4d3a85e8a2d8","277fd77f30428769","a2931da7f7c81d44","5f4bf781beece81d","175d5cc87f393732","af879b1e8a85cf2b","66bbba5a981541f3","6b71b23fe3e69631","a92593f7f0516b82","a34967661c0bbcbe","2ea256bd38c66873","1bb8eeaef3821f1e","500daf794ac24c5f","fb9e55b973661079","e58bdb356d0b8756","89236bf186c579f2","a5abe7f67a3f51d9","e9d9f4f06ad89ed1","df18e78ce3e9c431","83d0bcdf365c4d5e","f8829adbf7c9de16","9fd2cf0f8ba8b94c","2371e4d42d04b589","7be828593af305f3","d2d6b702e6430fbe"],"x":313,"y":219,"w":833,"h":1272},{"id":"1f119c5dd966c84f","type":"serial out","z":"cea9f6bd1ddc7fa4","d":true,"g":"4ebae5301064fd8b","name":"","serial":"","x":1010,"y":1000,"wires":[]},{"id":"4cfc0cb5364b6fce","type":"serial in","z":"cea9f6bd1ddc7fa4","d":true,"g":"4ebae5301064fd8b","name":"","serial":"","x":450,"y":340,"wires":[["70dcbeb7a54022e9","07fef5d5eeb7287c"]]},{"id":"70dcbeb7a54022e9","type":"function","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"ASCII / HEX","func":"let s=(msg.payload||'').toString().trim();\nif(s.startsWith(':')) return [msg,null];\nreturn [null,msg];","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":280,"wires":[["18ae0065c3790f1f"],["ce96a006f9ed956f"]]},{"id":"18ae0065c3790f1f","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"HEX RX","active":false,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1000,"y":260,"wires":[]},{"id":"ce96a006f9ed956f","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"ASCII RX","active":false,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1002,"y":320,"wires":[]},{"id":"07fef5d5eeb7287c","type":"function","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"filter ve.direct","func":"//====================================================\n// VE.Direct Parser (ASCII + HEX)\n//====================================================\n\nlet lines = String(msg.payload).split(/\\r?\\n/);\n// GET readings\nconst REGISTERS = {\n \"EDF0\": { topic: \"charge_current\", scale: 10 },\n \"EDF6\": { topic: \"float_voltage\", scale: 100 },\n \"EDF7\": { topic: \"absorption_voltage\", scale: 100 },\n \"0200\": { topic: \"device_mode\", scale: 1 }\n};\n\n// buffer values\nlet buffer = context.get(\"buffer\") || {\n V: [],\n I: [],\n VPV: [],\n PPV: [],\n MPPT: [],\n CS: [],\n ERR: [],\n H19: [],\n H20: [],\n H21: [],\n H22: [],\n H23: [],\n HSDS: []\n};\n\nfunction average(arr) {\n if (arr.length === 0) return 0;\n return arr.reduce((a,b)=>a+b,0)/arr.length;\n}\n\nfor (let line of lines) {\n\n line = line.trim();\n\n if (line === \"\")\n continue;\n\n //------------------------------------------------\n // HEX FRAME\n //------------------------------------------------\n\n if (line.startsWith(\":\")) {\n\n switch(line[1]) {\n\n //----------------------------------------\n // GET RESPONSE\n //----------------------------------------\n case \"7\":\n\n let s = line.substring(1);\n\n let reg = s.substr(1,4);\n reg = reg.substr(2,2) + reg.substr(0,2);\n\n let cfg = REGISTERS[reg];\n\n if (reg === \"0200\") {\n\n let value = parseInt(s.substr(7,2),16);\n \n const deviceMode = {\n 1: \"ON\",\n 4: \"OFF\"\n };\n \n node.send({\n topic: cfg.topic,\n payload: deviceMode[value] || \"UNKNOWN\"\n });\n \n } else {\n \n let lsb = parseInt(s.substr(7,2),16);\n let msb = parseInt(s.substr(9,2),16);\n \n node.send({\n topic: cfg.topic,\n payload: ((msb << 8) | lsb) / cfg.scale\n });\n }\n\n break;\n\n //----------------------------------------\n // SET ACK\n //----------------------------------------\n case \"8\":\n break;\n\n //----------------------------------------\n // ASYNC\n //----------------------------------------\n case \"A\":\n break;\n }\n\n continue;\n }\n\n //------------------------------------------------\n // ASCII VE.Direct\n //------------------------------------------------\n\n let parts = line.split(\"\\t\");\n\n if (parts.length < 2)\n continue;\n\n let key = parts[0].trim();\n let value = parseInt(parts[1]);\n\n switch(key) {\n\n case \"V\":\n buffer.V.push(value/1000.0);\n if(buffer.V.length>10) buffer.V.shift();\n node.send({topic:\"battery_voltage\",payload:Number(average(buffer.V).toFixed(2))});\n break;\n\n case \"I\":\n buffer.I.push(value/1000.0);\n if(buffer.I.length>10) buffer.I.shift();\n node.send({topic:\"battery_current\",payload:Number(average(buffer.I).toFixed(2))});\n break;\n\n case \"VPV\":\n buffer.VPV.push(value/1000.0);\n if(buffer.VPV.length>10) buffer.VPV.shift();\n node.send({topic:\"pv_voltage\",payload:Number(average(buffer.VPV).toFixed(2))});\n break;\n\n case \"PPV\":\n buffer.PPV.push(value);\n if(buffer.PPV.length>10) buffer.PPV.shift();\n node.send({topic:\"pv_power\",payload:Number(average(buffer.PPV).toFixed(0))});\n break;\n\n case \"MPPT\":\n const trackingMode = {\n 0: \"OFF\",\n 1: \"Limited\",\n 2: \"Active\"\n };\n node.send({\n topic: \"tracking_mode\",\n payload: trackingMode[value] || \"unknown\"\n });\n break;\n\n case \"CS\":\n const chargeMode = {\n 0: \"OFF\",\n 2: \"Fault\",\n 3: \"Bulk\",\n 4: \"Absorption\",\n 5: \"Float\"\n };\n node.send({\n topic: \"charging_mode\",\n payload: chargeMode[value] || \"unknown\"\n });\n break;\n\n case \"ERR\":\n node.send({topic:\"error\",payload:value});\n break;\n\n case \"H19\":\n node.send({topic:\"yield_total\",payload:value*10});\n break;\n\n case \"H20\":\n node.send({topic:\"yield_today\",payload:value*10});\n break;\n\n case \"H21\":\n node.send({topic:\"maxPower_today\",payload:value});\n break;\n\n case \"H22\":\n node.send({topic:\"yield_yesterday\",payload:value*10});\n break;\n\n case \"H23\":\n node.send({topic:\"maxPower_yesterday\",payload:value});\n break;\n\n case \"HSDS\":\n\n node.send({topic:\"day_number\",payload:value});\n\n let pvv = average(buffer.VPV);\n let pvp = average(buffer.PPV);\n\n if(pvv>0){\n node.send({\n topic:\"pv_current\",\n payload:Number((pvp/pvv).toFixed(2))\n });\n }\n\n break;\n }\n\n}\n\ncontext.set(\"buffer\",buffer);\n\nreturn null;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":380,"wires":[["a073a14f3ce2ff14","fb9e55b973661079"]]},{"id":"a073a14f3ce2ff14","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"debug 63","active":false,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1005,"y":380,"wires":[]},{"id":"6dc865eeb2cffa41","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"10","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"10","payloadType":"num","x":430,"y":598.6666666666665,"wires":[["d2d6b702e6430fbe"]]},{"id":"f73fe2ae90ea81f2","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"20","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"20","payloadType":"num","x":430,"y":643.9999999999998,"wires":[["d2d6b702e6430fbe"]]},{"id":"513aea2a82bb92a5","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"40","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"40","payloadType":"num","x":430,"y":689.333333333333,"wires":[["d2d6b702e6430fbe"]]},{"id":"50c3221098cd8ac4","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"0","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"0","payloadType":"num","x":430,"y":553.3333333333333,"wires":[["d2d6b702e6430fbe"]]},{"id":"0f0c4d3a85e8a2d8","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"60","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"60","payloadType":"num","x":430,"y":734.6666666666663,"wires":[["d2d6b702e6430fbe"]]},{"id":"277fd77f30428769","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"70","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_charge_current","payload":"70","payloadType":"num","x":430,"y":780,"wires":[["d2d6b702e6430fbe"]]},{"id":"a2931da7f7c81d44","type":"function","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"set - ve.direct","func":"// msg.topic = \"set_charge_current\"\n// msg.payload = 0...70\n\n// msg.topic = \"set_device_mode\"\n// msg.payload = 1-ON 4-OFF\n\n\nconst REGISTERS = {\n\n set_charge_current: {\n reg: 0xEDF0,\n min: 0,\n max: 70,\n scale: 10,\n bytes: 2\n },\n\n set_absorption_voltage: {\n reg: 0xEDF7,\n min: 50.0,\n max: 55.5,\n scale: 100,\n bytes: 2\n },\n\n set_float_voltage: {\n reg: 0xEDF6,\n min: 50.0,\n max: 55.5,\n scale: 100,\n bytes: 2\n },\n\n set_device_mode: {\n reg: 0x0200,\n values: [1, 4],\n scale: 1,\n bytes: 1\n }\n\n};\n\nlet cfg = REGISTERS[msg.topic];\n\nif (!cfg) {\n node.warn(\"Unknown topic: \" + msg.topic);\n return null;\n}\n\nlet value = Number(msg.payload);\n\nif (isNaN(value))\n return null;\n\n// valid\nif (cfg.values) {\n\n if (!cfg.values.includes(value)) {\n node.warn(\"Invalid value: \" + value);\n return null;\n }\n\n} else {\n\n if (cfg.min !== undefined && value < cfg.min)\n value = cfg.min;\n\n if (cfg.max !== undefined && value > cfg.max)\n value = cfg.max;\n}\n\n// conversion\nvalue = Math.round(value * cfg.scale);\n\n// reg\nlet regL = cfg.reg & 0xFF;\nlet regH = (cfg.reg >> 8) & 0xFF;\n\n// command\nlet cmd = 0x08;\nlet flags = 0x00;\n\nlet checksum;\n\nfunction hexByte(v) {\n return v.toString(16).toUpperCase().padStart(2, \"0\");\n}\n\nfunction hexCmd(v) {\n return v.toString(16).toUpperCase();\n}\n\n//======================================================\n// Reg 1 byte (Device Mode)\n//======================================================\n\nif (cfg.bytes === 1) {\n\n let sum =\n cmd +\n regL +\n regH +\n flags +\n value;\n\n checksum = (0x55 - (sum & 0xFF)) & 0xFF;\n\n msg.payload =\n \":\" +\n hexCmd(cmd) +\n hexByte(regL) +\n hexByte(regH) +\n hexByte(flags) +\n hexByte(value) +\n hexByte(checksum) +\n \"\\n\";\n\n}\n//======================================================\n// Reg 2 bytes\n//======================================================\nelse {\n\n let valL = value & 0xFF;\n let valH = (value >> 8) & 0xFF;\n\n let sum =\n cmd +\n regL +\n regH +\n flags +\n valL +\n valH;\n\n checksum = (0x55 - (sum & 0xFF)) & 0xFF;\n\n msg.payload =\n \":\" +\n hexCmd(cmd) +\n hexByte(regL) +\n hexByte(regH) +\n hexByte(flags) +\n hexByte(valL) +\n hexByte(valH) +\n hexByte(checksum) +\n \"\\n\";\n}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":760,"y":860,"wires":[["5f4bf781beece81d","1f119c5dd966c84f"]]},{"id":"5f4bf781beece81d","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"debug 64","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1030,"y":1060,"wires":[]},{"id":"175d5cc87f393732","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"54.5 absorb","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_absorption_voltage","payload":"54.5","payloadType":"num","x":450,"y":977.6666666666665,"wires":[["d2d6b702e6430fbe"]]},{"id":"af879b1e8a85cf2b","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"54.5 float","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_float_voltage","payload":"54.5","payloadType":"num","x":440,"y":893,"wires":[["d2d6b702e6430fbe"]]},{"id":"66bbba5a981541f3","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"55.2 float","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_float_voltage","payload":"55.2","payloadType":"num","x":437.8833312988281,"y":935.3333333333333,"wires":[["d2d6b702e6430fbe"]]},{"id":"6b71b23fe3e69631","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"55.2 absorb","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_absorption_voltage","payload":"55.2","payloadType":"num","x":450,"y":1020,"wires":[["d2d6b702e6430fbe"]]},{"id":"a92593f7f0516b82","type":"function","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get - ve.direct","func":"// msg.topic = \"get_charge_current\".....\n\nconst REGISTERS = {\n\n get_charge_current: {\n reg: 0xEDF0\n },\n\n get_absorption_voltage: {\n reg: 0xEDF7\n },\n\n get_float_voltage: {\n reg: 0xEDF6\n },\n\n get_device_mode: {\n reg: 0x0200\n }\n\n};\n\nlet cfg = REGISTERS[msg.topic];\n\nif (!cfg) {\n node.warn(\"Unknown topic: \" + msg.topic);\n return null;\n}\n\n// little-endian reg\nlet regL = cfg.reg & 0xFF;\nlet regH = (cfg.reg >> 8) & 0xFF;\n\n// GET frame\nlet cmd = 0x07;\n\n// checksum\nlet checksum = (0x55 - ((cmd + regL + regH) & 0xFF)) & 0xFF;\n\nfunction hex(v) {\n return v.toString(16).toUpperCase().padStart(2, \"0\");\n}\n\nmsg.payload =\n \":\\n\"+ // line to init. mppt\n \":\" +\n \"7\" +\n hex(regL) +\n hex(regH) +\n \"00\" +\n hex(checksum) +\n \"\\n\";\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":760,"y":1220,"wires":[["5f4bf781beece81d","1f119c5dd966c84f"]]},{"id":"a34967661c0bbcbe","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get current","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"get_charge_current","x":440,"y":1316,"wires":[["a92593f7f0516b82"]]},{"id":"2ea256bd38c66873","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get float voltage","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"get_float_voltage","x":460,"y":1360,"wires":[["a92593f7f0516b82"]]},{"id":"1bb8eeaef3821f1e","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get absorb voltage","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"get_absorption_voltage","x":470,"y":1405,"wires":[["a92593f7f0516b82"]]},{"id":"500daf794ac24c5f","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"curent","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1000,"y":460,"wires":[]},{"id":"fb9e55b973661079","type":"switch","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"charge_current","vt":"str"},{"t":"eq","v":"float_voltage","vt":"str"},{"t":"eq","v":"absorption_voltage","vt":"str"},{"t":"eq","v":"device_mode","vt":"str"}],"checkall":"true","repair":false,"outputs":4,"x":770,"y":480,"wires":[["500daf794ac24c5f"],["e58bdb356d0b8756"],["89236bf186c579f2"],["a5abe7f67a3f51d9"]]},{"id":"e58bdb356d0b8756","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"float","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":990,"y":511,"wires":[]},{"id":"89236bf186c579f2","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"bulk","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":990,"y":560,"wires":[]},{"id":"a5abe7f67a3f51d9","type":"debug","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"mode","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1002,"y":610,"wires":[]},{"id":"e9d9f4f06ad89ed1","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get device mode","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"get_device_mode","x":459,"y":1450,"wires":[["a92593f7f0516b82"]]},{"id":"df18e78ce3e9c431","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"device ON","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_device_mode","payload":"1","payloadType":"num","x":440,"y":1134,"wires":[["d2d6b702e6430fbe"]]},{"id":"83d0bcdf365c4d5e","type":"inject","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"device OFF","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"set_device_mode","payload":"4","payloadType":"num","x":450,"y":1179,"wires":[["d2d6b702e6430fbe"]]},{"id":"f8829adbf7c9de16","type":"comment","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"set charge current","info":"","x":429,"y":507,"wires":[]},{"id":"9fd2cf0f8ba8b94c","type":"comment","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"set stage voltage","info":"","x":431,"y":851,"wires":[]},{"id":"2371e4d42d04b589","type":"comment","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"set ON/OFF device","info":"","x":434,"y":1092,"wires":[]},{"id":"7be828593af305f3","type":"comment","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","name":"get values","info":"","x":420,"y":1265,"wires":[]},{"id":"d2d6b702e6430fbe","type":"junction","z":"cea9f6bd1ddc7fa4","g":"4ebae5301064fd8b","x":640,"y":860,"wires":[["a2931da7f7c81d44"]]}]