Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [
- {
- "id": "d58633d8f43e4d04",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "name": "Data-gathering",
- "style": {
- "stroke": "#000000",
- "fill": "#92d04f",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "4c03a994923a47a9",
- "99aa9f92658b733b",
- "fc8d8f5e52f438ee",
- "0d54f866ec2c725b",
- "cb0915fb28990b96",
- "8a04bfdfd0ba123a",
- "7161a2c760cc5d84",
- "cc6d6e8ab5a6c724",
- "7f71fdf6b4f53484",
- "5bbc33c0de05e344",
- "9e6aada96935f86a"
- ],
- "x": 28,
- "y": 73,
- "w": 1904,
- "h": 674
- },
- {
- "id": "4c03a994923a47a9",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "NAMEPLATE (120) 40123-40148 - 12h",
- "style": {
- "stroke": "#000000",
- "fill-opacity": "0",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "3a25f683d27d7e56",
- "6878c4108ce55f89",
- "d4500e2a8c0fbd4d",
- "2601d36dbc94e4fa"
- ],
- "x": 54,
- "y": 199,
- "w": 652,
- "h": 82
- },
- {
- "id": "3a25f683d27d7e56",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "4c03a994923a47a9",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'WRtg': data[1],\n 'WRtg_SF': scale_factor(data[2]),\n 'VARtg': data[3],\n 'VARtg_SF': scale_factor(data[4]),\n 'VArRtgQ1': data[5],\n 'VArRtg_SF': scale_factor(data[9]),\n 'ARtg': data[10],\n 'ARtg_SF': scale_factor(data[11]),\n 'WHRtg': data[17],\n 'WHRtg_SF': scale_factor(data[18]),\n 'MaxChaRte': data[21],\n 'MaxChaRte_SF': scale_factor(data[22]),\n 'MaxDisChaRte': data[23],\n 'MaxDisChaRte_SF': scale_factor(data[24])\n}\n\n\n\nlet scaled = {\n 'WRtg_scaled': scale_value(data[1], data[2]),\n 'VARtg_scaled': scale_value(data[3], data[4]),\n 'VArRtgQ1_scaled': scale_value(data[5], data[9]),\n 'ARtg_scaled': scale_value(data[10], data[11]),\n 'WHRtg_scaled': scale_value(data[17], data[18]),\n 'MaxChaRte_scaled': scale_value(data[21], data[22]),\n 'MaxDisChaRte_scaled': scale_value(data[23], data[24])\n}\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n\nlet context_data = {\n ...flow.get(\"battery\"),\n ...raw,\n ...scaled\n}\n\nflow.set(\"battery\", context_data)\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\n\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 240,
- "wires": [
- []
- ]
- },
- {
- "id": "6878c4108ce55f89",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "4c03a994923a47a9",
- "name": "Nameplate - 40123",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40123",
- "quantity": "26",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 370,
- "y": 240,
- "wires": [
- [
- "3a25f683d27d7e56"
- ],
- []
- ]
- },
- {
- "id": "d4500e2a8c0fbd4d",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "4c03a994923a47a9",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "43200",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 240,
- "wires": [
- [
- "6878c4108ce55f89"
- ]
- ]
- },
- {
- "id": "2601d36dbc94e4fa",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "4c03a994923a47a9",
- "name": "link in 1",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c"
- ],
- "x": 225,
- "y": 240,
- "wires": [
- [
- "6878c4108ce55f89"
- ]
- ]
- },
- {
- "id": "b96da7d4da3bbd9e",
- "type": "modbus-client",
- "name": "Fronius Symo GEN24 10.0",
- "clienttype": "tcp",
- "bufferCommands": true,
- "stateLogEnabled": false,
- "queueLogEnabled": false,
- "failureLogEnabled": true,
- "tcpHost": "10.0.1.155",
- "tcpPort": "502",
- "tcpType": "DEFAULT",
- "serialPort": "/dev/ttyUSB",
- "serialType": "RTU-BUFFERD",
- "serialBaudrate": "9600",
- "serialDatabits": "8",
- "serialStopbits": "1",
- "serialParity": "none",
- "serialConnectionDelay": "100",
- "serialAsciiResponseStartDelimiter": "0x3A",
- "unit_id": "1",
- "commandDelay": "1",
- "clientTimeout": "1000",
- "reconnectOnTimeout": true,
- "reconnectTimeout": "2000",
- "parallelUnitIdsAllowed": true,
- "showWarnings": true,
- "showLogs": true
- },
- {
- "id": "99aa9f92658b733b",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "COMMON (1) 40004-40068 - 12h",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "c595a1fcd8455300",
- "2039aa6b184bc401",
- "41dc34d07cc7d50e",
- "59671ea1e14f4eda",
- "cf7eb41cd5e03eee"
- ],
- "x": 54,
- "y": 99,
- "w": 852,
- "h": 82
- },
- {
- "id": "c595a1fcd8455300",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "99aa9f92658b733b",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "43200",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 140,
- "wires": [
- [
- "2039aa6b184bc401"
- ]
- ]
- },
- {
- "id": "2039aa6b184bc401",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "99aa9f92658b733b",
- "name": "Common - 40004",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40004",
- "quantity": "65",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 370,
- "y": 140,
- "wires": [
- [
- "41dc34d07cc7d50e"
- ],
- []
- ]
- },
- {
- "id": "41dc34d07cc7d50e",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "99aa9f92658b733b",
- "name": "RAW to JSON",
- "func": "var buffer = msg.responseBuffer.buffer\nlet data = msg.payload\n\nlet raw = {\n 'Mn': buffer.slice(0, 31).toString(),\n 'Md': buffer.slice(32, 63).toString(), //64, 79\n 'Vr': buffer.slice(80, 95).toString(),\n 'SN': buffer.slice(96, 127).toString(),\n 'DA': data[64],\n}\n\nmsg.payload = {\n data: data,\n buffer: buffer,\n raw: raw\n}\n//node.warn(msg)\n\nlet context_data = {\n ...flow.get(\"inverter\"),\n ...raw\n}\n\n\nflow.set(\"inverter\", context_data)\nreturn msg\n\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 140,
- "wires": [
- []
- ]
- },
- {
- "id": "59671ea1e14f4eda",
- "type": "change",
- "z": "8374a4bec102ef8d",
- "g": "99aa9f92658b733b",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "solar.Mn",
- "pt": "flow",
- "to": "payload.raw.Mn",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "solar.Md",
- "pt": "flow",
- "to": "payload.raw.Md",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "solar.Vr",
- "pt": "flow",
- "to": "payload.raw.Vr",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "solar.SN",
- "pt": "flow",
- "to": "payload.raw.SN",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "solar.DA",
- "pt": "flow",
- "to": "payload.raw.DA",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 800,
- "y": 140,
- "wires": [
- []
- ]
- },
- {
- "id": "cf7eb41cd5e03eee",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "99aa9f92658b733b",
- "name": "link in 2",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c"
- ],
- "x": 225,
- "y": 140,
- "wires": [
- [
- "2039aa6b184bc401"
- ]
- ]
- },
- {
- "id": "fc8d8f5e52f438ee",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "CONTROLS (123) 40229-40252 -5m",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "6d6938be7c783c2c",
- "fb7f78718650b29e",
- "c3813b048184317e",
- "6b618e9ab118d336",
- "789f47cb5b416aa4",
- "f4489817a9ea38f6"
- ],
- "x": 934,
- "y": 99,
- "w": 972,
- "h": 122
- },
- {
- "id": "6d6938be7c783c2c",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'WMaxLimPct': data[3],\n 'WMaxLim_Ena': data[7],\n 'WMaxLimPct_SF': scale_factor(data[21]) \n}\n\nlet scaled = {\n 'WMaxLimPct_scaled': scale_value(data[3], data[21]),\n}\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\nlet context_data = {\n ...flow.get(\"inverter\"),\n ...raw,\n ...scaled\n}\nflow.set(\"inverter\", context_data)\n//flow.set(\"inverter.raw\", raw)\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1480,
- "y": 180,
- "wires": [
- [
- "c3813b048184317e",
- "f4489817a9ea38f6"
- ]
- ]
- },
- {
- "id": "fb7f78718650b29e",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "CONTROLS (R) - 40229",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40229",
- "quantity": "24",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 1270,
- "y": 180,
- "wires": [
- [
- "6d6938be7c783c2c"
- ],
- []
- ]
- },
- {
- "id": "c3813b048184317e",
- "type": "change",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "inverter.WMaxLim_Ena",
- "pt": "flow",
- "to": "payload.raw.WMaxLim_Ena",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1750,
- "y": 180,
- "wires": [
- []
- ]
- },
- {
- "id": "6b618e9ab118d336",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "15",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 1050,
- "y": 180,
- "wires": [
- [
- "fb7f78718650b29e"
- ]
- ]
- },
- {
- "id": "789f47cb5b416aa4",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "link in 5",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c",
- "8c4eac66ac4d4be9"
- ],
- "x": 1105,
- "y": 180,
- "wires": [
- [
- "fb7f78718650b29e"
- ]
- ]
- },
- {
- "id": "f4489817a9ea38f6",
- "type": "debug",
- "z": "8374a4bec102ef8d",
- "g": "fc8d8f5e52f438ee",
- "name": "debug 28",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 1800,
- "y": 140,
- "wires": []
- },
- {
- "id": "0d54f866ec2c725b",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "MPPT (160) - 40255-40341 -15s",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "5a163d02ed8c54cc",
- "44bf894e76476f3c",
- "c1f5aee84c3d655c",
- "67e266696b10bfbe",
- "e658f167de8ede6e"
- ],
- "x": 934,
- "y": 279,
- "w": 972,
- "h": 82
- },
- {
- "id": "5a163d02ed8c54cc",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "0d54f866ec2c725b",
- "name": "MPPT - 40255",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40255",
- "quantity": "88",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 1240,
- "y": 320,
- "wires": [
- [
- "c1f5aee84c3d655c"
- ],
- []
- ]
- },
- {
- "id": "44bf894e76476f3c",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "0d54f866ec2c725b",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "15",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 1050,
- "y": 320,
- "wires": [
- [
- "5a163d02ed8c54cc"
- ]
- ]
- },
- {
- "id": "c1f5aee84c3d655c",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "0d54f866ec2c725b",
- "name": "RAW to JSON",
- "func": "var buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'DCA_SF': scale_factor(data[0]),\n 'DCV_SF': scale_factor(data[1]),\n 'DCW_SF': scale_factor(data[2]),\n 'DCWH_SF': scale_factor(data[3]),\n 'module/1/ID': data[8],\n 'module/1/IDStr': buffer.slice(18, 33).toString(),\n 'module/1/DCA': data[17],\n 'module/1/DCV': data[18],\n 'module/1/DCW': data[19],\n 'module/1/DCWH': two16BitToOne32Bit(\"MPTT1\", data[20], data[21]),\n 'module/1/DCWH_test': bufferTo32Bit(\"MPTT1\", buffer.slice(40, 44)), //'module/1/DCWH': buffer.slice(40,43),\n 'module/2/ID': data[28],\n 'module/2/IDStr': buffer.slice(58, 73).toString(),\n 'module/2/DCA': data[37],\n 'module/2/DCV': data[38],\n 'module/2/DCW': data[39],\n 'module/2/DCWH': two16BitToOne32Bit(\"MPTT2\", data[40], data[41]),\n 'module/2/DCWH_test': \"\", //bufferTo32Bit(buffer.slice(80, 84)), //'module/1/DCWH': buffer.slice(40,43),\n 'module/3/ID': data[48],\n 'module/3/IDStr': buffer.slice(98, 113).toString(),\n 'module/3/DCA': data[57],\n 'module/3/DCV': data[58],\n 'module/3/DCW': data[59],\n 'module/3/DCWH': two16BitToOne32Bit(\"Charge\", data[60], data[61]),\n 'module/3/DCWH_test': \"\", //bufferTo32Bit(buffer.slice(40, 43)), //'module/1/DCWH': buffer.slice(40,43),\n 'module/4/ID': data[68],\n 'module/4/IDStr': buffer.slice(138, 153).toString(),\n 'module/4/DCA': data[77],\n 'module/4/DCV': data[78],\n 'module/4/DCW': two16BitToOne32Bit(\"Discharge\", data[80], data[81]),\n 'module/4/DCWH': data[81],\n 'module/4/DCWH_test': \"\", //bufferTo32Bit(buffer.slice(160, 164)), //'module/1/DCWH': buffer.slice(40,43)\n}\n\n\nlet scaled = {\n 'module/1/DCA_scaled': scale_value(data[17], data[0]),\n 'module/1/DCV_scaled': scale_value(data[18], data[1]),\n 'module/1/DCW_scaled': scale_value(data[19], data[2]),\n 'module/1/DCWH_scaled': scale_value(two16BitToOne32Bit(\"MPTT1\", data[20], data[21]), data[3]),\n 'module/2/DCA_scaled': scale_value(data[37], data[0]),\n 'module/2/DCV_scaled': scale_value(data[38], data[1]),\n 'module/2/DCW_scaled': scale_value(data[39], data[2]),\n 'module/2/DCWH_scaled': scale_value(two16BitToOne32Bit(\"MPTT2\", data[40], data[41]), data[3]),\n 'module/3/DCA_scaled': scale_value(data[57], data[0]),\n 'module/3/DCV_scaled': scale_value(data[58], data[1]),\n 'module/3/DCW_scaled': scale_value(data[59], data[2]),\n 'module/3/DCWH_scaled': scale_value(two16BitToOne32Bit(\"Charge\", data[60], data[61]), data[3]),\n 'module/4/DCA_scaled': scale_value(data[77], data[0]),\n 'module/4/DCV_scaled': scale_value(data[78], data[1]),\n 'module/4/DCW_scaled': scale_value(data[79], data[2]),\n 'module/4/DCWH_scaled': scale_value(two16BitToOne32Bit(\"Discharge\", data[80], data[81]), data[3])\n}\n\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\nlet context_data = {\n ...flow.get(\"solar\"),\n ...raw,\n ...scaled\n}\nflow.set(\"solar\", context_data)\n\n//node.warn(msg.payload)\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) {scaled_value = 0}\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}\n\n/**\n* @param {string} name\n* @param {number} high\n* @param {number} low\n*/\nfunction two16BitToOne32Bit(name, high, low) {\n\n let high_bin = dec2bin(name, high)\n let low_bin = dec2bin(name, low)\n\n \n\n let combined = (high_bin + low_bin)\n //let combined = (high_bin + \"0\" + low_bin)\n //node.warn(name + \": \" + parseInt(high_bin + low_bin, 2))\n\n\n if (name == \"MPTT1\") {\n /*node.warn(\"high: \" + parseInt(high))\n node.warn(\"low: \" + parseInt(low))\n node.warn(\"high_bin: \" + parseInt(high_bin))\n node.warn(\"low_bin: \" + parseInt(low_bin))*/\n //node.warn(name + \" D: \" + combined)\n }\n\n let result = parseInt(combined, 2)\n\n if (name == \"Discharge\") {\n /*\n node.warn(high + \" int > bin \" + high_bin + \" high: \" + high_bin.length)\n node.warn(low + \" int > bin \" + low_bin + \" low: \" + low_bin.length)\n node.warn(result)\n */\n }\n\n\n return result \n}\n\n/**\n* @param {string} name\n* @param {array} buffer\n*/\nfunction bufferTo32Bit(name, buffer) {\n //node.warn(buffer)\n //buffer = buffer.reverse()\n //node.warn(buffer)\n let combined = \"\"\n for (let i = 0; i < buffer.length; i++) {\n combined = combined + hex2bin(buffer[i])\n //node.warn(\"[\" + i + \"]\" + hex2bin(buffer[i]) + \" hex: \"+ buffer[i])\n }\n if (name == \"MPTT1\") {\n //node.warn(name + \" B: \" + combined)\n }\n\n let result = parseInt(combined, 2)\n\n return result\n}\n\n/**\n* @param {number} dec\n*/\nfunction dec2bin(name, dec) {\n let binary = (dec >>> 0).toString(2)\n for (let i = binary.length; i < 16; i++) {\n binary = \"0\" + binary\n if (name == \"Discharge\") {\n //node.warn(binary) \n }\n }\n \n return binary\n}\n\n/**\n* @param {any} hex\n*/\nfunction hex2bin(hex) {\n return (parseInt(hex, 16).toString(2)) //.padStart(8, '0') <-- removed pad-start to debug!\n //return (\"00000000\" + (parseInt(hex, 16)).toString(2)).substr(-8);\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1480,
- "y": 320,
- "wires": [
- []
- ]
- },
- {
- "id": "67e266696b10bfbe",
- "type": "comment",
- "z": "8374a4bec102ef8d",
- "g": "0d54f866ec2c725b",
- "name": "FIX 32BIT ARRAY HERUNDER",
- "info": "Bit 0: Connected \nBit 1: Available\nBit 2: Operating\"\n",
- "x": 1750,
- "y": 320,
- "wires": []
- },
- {
- "id": "e658f167de8ede6e",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "0d54f866ec2c725b",
- "name": "link in 6",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c",
- "8c4eac66ac4d4be9"
- ],
- "x": 1105,
- "y": 320,
- "wires": [
- [
- "5a163d02ed8c54cc"
- ]
- ]
- },
- {
- "id": "cb0915fb28990b96",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "STORAGE (124) - 40345-40368 -5s",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "717ac778fa97f90e",
- "49381b3c4c0466b8",
- "9517c9e0665ca055",
- "2e81da53e1fb37e8",
- "0571fd0320a81954"
- ],
- "x": 934,
- "y": 439,
- "w": 972,
- "h": 82
- },
- {
- "id": "717ac778fa97f90e",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "cb0915fb28990b96",
- "name": "Storage - 40345",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40345",
- "quantity": "24",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 1240,
- "y": 480,
- "wires": [
- [
- "9517c9e0665ca055"
- ],
- []
- ]
- },
- {
- "id": "49381b3c4c0466b8",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "cb0915fb28990b96",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "3",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 1050,
- "y": 480,
- "wires": [
- [
- "717ac778fa97f90e"
- ]
- ]
- },
- {
- "id": "9517c9e0665ca055",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "cb0915fb28990b96",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\n\nlet raw = {\n 'WChaMax': data[0],\n 'WChaGra': data[1],\n 'WDisChaGra': data[2],\n 'StorCtl_Mod': data[3], //KONVERTERES UD FRA BITWISE!\n 'StorCtl_Mod_bitwise': createBinaryString(data[3]),\n 'StorageChargeLimits': storage_control_state(data[3])[0],\n 'StorageDischargeLimits': storage_control_state(data[3])[1],\n 'MinRsvPct': data[5],\n 'ChaState': data[6],\n 'ChaSt': battery_status(data[9]),\n 'OutWRte': signed_values(data[10]) * -1,\n 'InWRte': signed_values(data[11]),\n 'InOutWRte_RvrtTms': data[13],\n 'ChaGriSet': data[15],\n 'WChaMax_SF': scale_factor(data[16]),\n 'WChaDisChaGra_SF': scale_factor(data[17]),\n 'MinRsvPct_SF': scale_factor(data[19]),\n 'ChaState_SF': scale_factor(data[20]),\n 'InOutWRte_SF': scale_factor(data[23])\n}\n\nlet scaled = {\n 'WChaMax_scaled': scale_value(data[0], data[16]),\n 'WChaDisChaGra_scaled': scale_value(data[1], data[17]),\n 'WDisChaGra_scaled': scale_value(data[2], data[17]),\n 'MinRsvPct_scaled': scale_value(data[5], data[19]),\n 'ChaState_scaled': scale_value(data[6], data[20]),\n 'OutWRte_scaled': scale_value(signed_values(data[10]), data[23]),\n 'InWRte_scaled': scale_value(signed_values(data[11]), data[23])\n}\n\n/*\n\nvar rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\n\nmsg.payload = fltView[0];\nreturn msg;\n\n*/\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\nlet context_data = {\n ...flow.get(\"battery\"),\n ...raw,\n ...scaled\n}\n\nflow.set(\"battery\", context_data)\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n //node.warn(unscaled_value + \" - \" + scale_factor + \" = \" + scaled_value)\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction signed_values(value) {\n if (value > 32768) {\n value = value - 65534\n } else {\n value = value\n }\n return value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}\n\n/**\n* @param {number} high\n* @param {number} low\n*/\nfunction two16BitToOne32Bit(high, low) { //https://groups.google.com/g/node-red/c/9xl1ZrsSTVQ\n let data = []\n data[0] = high\n data[1] = low\n let array = new Float32Array(data)\n\n //node.warn(array)\n\n return array \n}\n\n/**\n* @param {number} value\n*/\nfunction battery_status(value) {\n let text\n switch (value) {\n case 1:\n text = \"Off\"\n break\n case 2:\n text = \"Empty\"\n break\n case 3:\n text = \"Discharging\"\n break\n case 4:\n text = \"Charging\"\n break\n case 5:\n text = \"Full\"\n break\n case 6:\n text = \"Holding\"\n break\n case 7:\n text = \"Testing\"\n break\n default:\n text = \"State error\"\n break\n }\n return text\n}\n\n\n/**\n* @param {number} value\n*/\nfunction storage_control_state(value) {\n let text\n let discharge\n let charge\n switch (value) {\n case 0:\n charge = \"Disabled\"\n discharge = \"Disabled\"\n break\n case 1:\n charge = \"Enabled\"\n discharge = \"Disabled\"\n break\n case 2:\n charge = \"Disabled\"\n discharge = \"Enabled\"\n break\n case 3:\n charge = \"Enabled\"\n discharge = \"Enabled\"\n break\n default:\n charge = \"Error\"\n discharge = \"Error\"\n break\n }\n return [charge, discharge]\n}\n\n/**\n* @param {number} dec\n*/\nfunction dec2bin(dec) {\n return (dec >>> 0).toString(2);\n}\n\n/**\n* @param {nMask} nMask\n*/\n// @ts-ignore\nfunction createBinaryString(nMask) { //31 changed to 15 for 16bit\n // nMask must be between -2147483648 and 2147483647\n if (nMask > 2 ** 15 - 1)\n throw \"number too large. number shouldn't be > 2**15-1\"; //added\n if (nMask < -1 * (2 ** 15))\n throw \"number too far negative, number shouldn't be < -(2**15)\" //added\n for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 16;\n nFlag++, sMask += String(nShifted >>> 15), nShifted <<= 1);\n sMask = sMask.replace(/\\B(?=(.{8})+(?!.))/g, \" \") // added\n return sMask;\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1480,
- "y": 480,
- "wires": [
- [
- "7161a2c760cc5d84",
- "2e81da53e1fb37e8"
- ]
- ]
- },
- {
- "id": "2e81da53e1fb37e8",
- "type": "change",
- "z": "8374a4bec102ef8d",
- "g": "cb0915fb28990b96",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "battery.chargelimits",
- "pt": "flow",
- "to": "payload.raw.StorageChargeLimits",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "battery.dischargelimits",
- "pt": "flow",
- "to": "payload.raw.StorageDischargeLimits",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "battery.chargestatus",
- "pt": "flow",
- "to": "payload.raw.ChaSt",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "battery.chargefromgrid",
- "pt": "flow",
- "to": "payload.raw.ChaGriSet",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "battery.StorCtl_Mod",
- "pt": "flow",
- "to": "payload.raw.StorCtl_Mod",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1800,
- "y": 480,
- "wires": [
- []
- ]
- },
- {
- "id": "0571fd0320a81954",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "cb0915fb28990b96",
- "name": "link in 7",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c"
- ],
- "x": 1105,
- "y": 480,
- "wires": [
- [
- "717ac778fa97f90e"
- ]
- ]
- },
- {
- "id": "8a04bfdfd0ba123a",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "STATUS (122) 40183-40226 -1m",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "4b1b8b1d0475b4ba",
- "dd555279f28a1a47",
- "3a877b9ed107ab4a",
- "ed22da177f245273",
- "83cc4b15e00997ec"
- ],
- "x": 54,
- "y": 639,
- "w": 852,
- "h": 82
- },
- {
- "id": "4b1b8b1d0475b4ba",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "8a04bfdfd0ba123a",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'PVConn': conn_status(data[0]),\n 'StorConn': conn_status(data[1]),\n 'ECPConn': conntwo_status(data[2]),\n 'ActWh': two16BitToOne32Bit(data[3], data[4]),\n 'StActCtl': two16BitToOne32Bit(data[33], data[34]),\n 'Ris': data[42],\n 'Ris_SF': scale_factor(data[43])\n}\n\nlet scaled = {\n 'Ris_scaled': scale_value(data[42], data[43]),\n}\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\n\nlet context_data = {\n ...flow.get(\"inverter\"),\n ...raw,\n ...scaled\n}\n\nflow.set(\"inverter\", context_data)\n//flow.set(\"inverter.raw\", raw)\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n return scaled_value\n}\n\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}\n\n/**\n* @param {number} value\n*/\nfunction conn_status(value) {\n let text\n switch (value) {\n case 0:\n text = \"Connected\"\n break\n case 1:\n text = \"Available\"\n break\n case 2:\n text = \"Operating - feeding energy\"\n break\n case 3:\n text = \"Available & operating - feeding energy\" \n break\n default:\n text = \"State error\"\n break\n }\n return text\n}\n\n/**\n* @param {number} value\n*/\nfunction conntwo_status(value) {\n let text\n switch (value) {\n case 0:\n text = \"Feeding power to grid\"\n break\n case 1:\n text = \"Not feeding power to grid\"\n break\n default:\n text = \"State error\"\n break\n }\n return text\n}\n\n/**\n* @param {number} high\n* @param {number} low\n*/\nfunction two16BitToOne32Bit(high, low) {\n high = dec2bin(high)\n low = dec2bin(low)\n let combined = (high + low)\n let result = parseInt(combined, 2)\n\n return result\n}\n\n/**\n* @param {number} dec\n*/\nfunction dec2bin(dec) {\n return (dec >>> 0).toString(2);\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 680,
- "wires": [
- [
- "83cc4b15e00997ec"
- ]
- ]
- },
- {
- "id": "dd555279f28a1a47",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "8a04bfdfd0ba123a",
- "name": "STATUS - 40183",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40183",
- "quantity": "44",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 370,
- "y": 680,
- "wires": [
- [
- "4b1b8b1d0475b4ba"
- ],
- []
- ]
- },
- {
- "id": "3a877b9ed107ab4a",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "8a04bfdfd0ba123a",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "60",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 680,
- "wires": [
- [
- "dd555279f28a1a47"
- ]
- ]
- },
- {
- "id": "ed22da177f245273",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "8a04bfdfd0ba123a",
- "name": "link in 4",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c"
- ],
- "x": 225,
- "y": 680,
- "wires": [
- [
- "dd555279f28a1a47"
- ]
- ]
- },
- {
- "id": "83cc4b15e00997ec",
- "type": "change",
- "z": "8374a4bec102ef8d",
- "g": "8a04bfdfd0ba123a",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "inverter.PVConn",
- "pt": "flow",
- "to": "payload.raw.PVConn",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "inverter.StorConn",
- "pt": "flow",
- "to": "payload.raw.StorConn",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "inverter.ECPConn",
- "pt": "flow",
- "to": "payload.raw.ECPConn",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "inverter.isolationlevel",
- "pt": "flow",
- "to": "payload.scaled.Ris_scaled",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 800,
- "y": 680,
- "wires": [
- []
- ]
- },
- {
- "id": "7161a2c760cc5d84",
- "type": "debug",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "debug 16",
- "active": true,
- "tosidebar": false,
- "console": false,
- "tostatus": true,
- "complete": "payload.raw.StorCtl_Mod",
- "targetType": "msg",
- "statusVal": "payload.raw.StorCtl_Mod",
- "statusType": "auto",
- "x": 1680,
- "y": 460,
- "wires": []
- },
- {
- "id": "cc6d6e8ab5a6c724",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "SETTINGS (121) 40151-40180 -12h",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "4fa997ec30d0d8dd",
- "bb82fe35a13369c5",
- "a44332213a95ac61",
- "ef7a7bf02c2176f0"
- ],
- "x": 54,
- "y": 399,
- "w": 652,
- "h": 82
- },
- {
- "id": "4fa997ec30d0d8dd",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "cc6d6e8ab5a6c724",
- "name": "Settings - 40151",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40151",
- "quantity": "30",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 360,
- "y": 440,
- "wires": [
- [
- "a44332213a95ac61"
- ],
- []
- ]
- },
- {
- "id": "bb82fe35a13369c5",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "cc6d6e8ab5a6c724",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "43200",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 440,
- "wires": [
- [
- "4fa997ec30d0d8dd"
- ]
- ]
- },
- {
- "id": "a44332213a95ac61",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "cc6d6e8ab5a6c724",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'WMax': data[0], \n 'WMax_SF': scale_factor(data[20])\n}\n\nlet scaled = {\n 'WMax_scaled': scale_value(data[0], data[20]),\n}\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n\nlet context_data = {\n ...flow.get(\"inverter\"),\n ...raw,\n ...scaled\n}\n\nflow.set(\"inverter\", context_data)\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\n\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 440,
- "wires": [
- []
- ]
- },
- {
- "id": "ef7a7bf02c2176f0",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "cc6d6e8ab5a6c724",
- "name": "link in 3",
- "links": [
- "f182559423876113"
- ],
- "x": 225,
- "y": 440,
- "wires": [
- [
- "4fa997ec30d0d8dd"
- ]
- ]
- },
- {
- "id": "7f71fdf6b4f53484",
- "type": "group",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "INVERTER (10x) 40071-40119 - 2min",
- "style": {
- "stroke": "#000000",
- "label": true,
- "color": "#000000"
- },
- "nodes": [
- "f91c5e2542815979",
- "672776856bc2ae75",
- "dd5aed4079c369f5",
- "a070be3b3a7ad259"
- ],
- "x": 54,
- "y": 299,
- "w": 652,
- "h": 82
- },
- {
- "id": "f91c5e2542815979",
- "type": "modbus-getter",
- "z": "8374a4bec102ef8d",
- "g": "7f71fdf6b4f53484",
- "name": "Inverter - 40071",
- "showStatusActivities": false,
- "showErrors": false,
- "showWarnings": true,
- "logIOActivities": false,
- "unitid": "1",
- "dataType": "HoldingRegister",
- "adr": "40071",
- "quantity": "50",
- "server": "b96da7d4da3bbd9e",
- "useIOFile": false,
- "ioFile": "",
- "useIOForPayload": false,
- "emptyMsgOnFail": false,
- "keepMsgProperties": false,
- "delayOnStart": false,
- "startDelayTime": "",
- "x": 360,
- "y": 340,
- "wires": [
- [
- "a070be3b3a7ad259"
- ],
- []
- ]
- },
- {
- "id": "672776856bc2ae75",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "7f71fdf6b4f53484",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "120",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 340,
- "wires": [
- [
- "f91c5e2542815979"
- ]
- ]
- },
- {
- "id": "dd5aed4079c369f5",
- "type": "link in",
- "z": "8374a4bec102ef8d",
- "g": "7f71fdf6b4f53484",
- "name": "link in 10",
- "links": [
- "f182559423876113",
- "8f14ee3cb8deb59c"
- ],
- "x": 225,
- "y": 340,
- "wires": [
- [
- "f91c5e2542815979"
- ]
- ]
- },
- {
- "id": "a070be3b3a7ad259",
- "type": "function",
- "z": "8374a4bec102ef8d",
- "g": "7f71fdf6b4f53484",
- "name": "RAW to JSON",
- "func": "// @ts-check\n\nvar buffer = msg.responseBuffer.buffer;\nlet data = msg.payload\n\nlet raw = {\n 'TmpCab': data[31],\n 'Tmp_SF': scale_factor(data[35])\n}\n\nlet scaled = {\n 'TmpCab_scaled': scale_value(data[31], data[35]),\n}\n\nmsg.payload = {\n scaled : scaled,\n data : data,\n buffer: buffer,\n raw : raw\n}\n\n //let status = {}\n //status.payload = ({ fill: \"green\", shape: \"ring\", text: data + \" >> \" + factor })\n\n\nlet context_data = {\n ...flow.get(\"inverter\"),\n ...raw,\n ...scaled\n}\n\nflow.set(\"inverter\", context_data)\n//flow.set(\"inverter.raw\", raw)\n\nreturn msg;\n\n/**\n* @param {number} unscaled_value\n* @param {number} scale_factor\n*/\nfunction scale_value(unscaled_value, scale_factor) {\n if (scale_factor == 32768) {\n scale_factor = 0\n } else {\n if (scale_factor > 100) {\n scale_factor = scale_factor - 65536\n }\n scale_factor = 10 ** scale_factor\n }\n let scaled_value = +(unscaled_value * scale_factor).toFixed(3)\n if (unscaled_value == 65535) { scaled_value = 0 }\n return scaled_value\n}\n\n/**\n* @param {number} value\n*/\nfunction scale_factor(value) {\n let scale_factor\n if (value == 32768) {\n value = 0\n } else {\n if (value > 100) {\n value = value - 65536\n }\n scale_factor = 10 ** value\n }\n return scale_factor\n}\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 340,
- "wires": [
- []
- ]
- },
- {
- "id": "5bbc33c0de05e344",
- "type": "inject",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "3 sec interval",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": false,
- "onceDelay": "5",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 1050,
- "y": 420,
- "wires": [
- [
- "717ac778fa97f90e",
- "9e6aada96935f86a"
- ]
- ]
- },
- {
- "id": "9e6aada96935f86a",
- "type": "delay",
- "z": "8374a4bec102ef8d",
- "g": "d58633d8f43e4d04",
- "name": "1s",
- "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": 1230,
- "y": 440,
- "wires": [
- [
- "5a163d02ed8c54cc"
- ]
- ]
- }
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement