Advertisement
Guest User

InWRte, OutWRte, StorCtl_Mod or ChaGriSet

a guest
Oct 13th, 2023
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 53.06 KB | None | 0 0
  1. [
  2. {
  3. "id": "d58633d8f43e4d04",
  4. "type": "group",
  5. "z": "8374a4bec102ef8d",
  6. "name": "Data-gathering",
  7. "style": {
  8. "stroke": "#000000",
  9. "fill": "#92d04f",
  10. "label": true,
  11. "color": "#000000"
  12. },
  13. "nodes": [
  14. "4c03a994923a47a9",
  15. "99aa9f92658b733b",
  16. "fc8d8f5e52f438ee",
  17. "0d54f866ec2c725b",
  18. "cb0915fb28990b96",
  19. "8a04bfdfd0ba123a",
  20. "7161a2c760cc5d84",
  21. "cc6d6e8ab5a6c724",
  22. "7f71fdf6b4f53484",
  23. "5bbc33c0de05e344",
  24. "9e6aada96935f86a"
  25. ],
  26. "x": 28,
  27. "y": 73,
  28. "w": 1904,
  29. "h": 674
  30. },
  31. {
  32. "id": "4c03a994923a47a9",
  33. "type": "group",
  34. "z": "8374a4bec102ef8d",
  35. "g": "d58633d8f43e4d04",
  36. "name": "NAMEPLATE (120) 40123-40148 - 12h",
  37. "style": {
  38. "stroke": "#000000",
  39. "fill-opacity": "0",
  40. "label": true,
  41. "color": "#000000"
  42. },
  43. "nodes": [
  44. "3a25f683d27d7e56",
  45. "6878c4108ce55f89",
  46. "d4500e2a8c0fbd4d",
  47. "2601d36dbc94e4fa"
  48. ],
  49. "x": 54,
  50. "y": 199,
  51. "w": 652,
  52. "h": 82
  53. },
  54. {
  55. "id": "3a25f683d27d7e56",
  56. "type": "function",
  57. "z": "8374a4bec102ef8d",
  58. "g": "4c03a994923a47a9",
  59. "name": "RAW to JSON",
  60. "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}",
  61. "outputs": 1,
  62. "noerr": 0,
  63. "initialize": "",
  64. "finalize": "",
  65. "libs": [],
  66. "x": 600,
  67. "y": 240,
  68. "wires": [
  69. []
  70. ]
  71. },
  72. {
  73. "id": "6878c4108ce55f89",
  74. "type": "modbus-getter",
  75. "z": "8374a4bec102ef8d",
  76. "g": "4c03a994923a47a9",
  77. "name": "Nameplate - 40123",
  78. "showStatusActivities": false,
  79. "showErrors": false,
  80. "showWarnings": true,
  81. "logIOActivities": false,
  82. "unitid": "1",
  83. "dataType": "HoldingRegister",
  84. "adr": "40123",
  85. "quantity": "26",
  86. "server": "b96da7d4da3bbd9e",
  87. "useIOFile": false,
  88. "ioFile": "",
  89. "useIOForPayload": false,
  90. "emptyMsgOnFail": false,
  91. "keepMsgProperties": false,
  92. "delayOnStart": false,
  93. "startDelayTime": "",
  94. "x": 370,
  95. "y": 240,
  96. "wires": [
  97. [
  98. "3a25f683d27d7e56"
  99. ],
  100. []
  101. ]
  102. },
  103. {
  104. "id": "d4500e2a8c0fbd4d",
  105. "type": "inject",
  106. "z": "8374a4bec102ef8d",
  107. "g": "4c03a994923a47a9",
  108. "name": "",
  109. "props": [
  110. {
  111. "p": "payload"
  112. },
  113. {
  114. "p": "topic",
  115. "vt": "str"
  116. }
  117. ],
  118. "repeat": "43200",
  119. "crontab": "",
  120. "once": true,
  121. "onceDelay": "5",
  122. "topic": "",
  123. "payload": "",
  124. "payloadType": "date",
  125. "x": 170,
  126. "y": 240,
  127. "wires": [
  128. [
  129. "6878c4108ce55f89"
  130. ]
  131. ]
  132. },
  133. {
  134. "id": "2601d36dbc94e4fa",
  135. "type": "link in",
  136. "z": "8374a4bec102ef8d",
  137. "g": "4c03a994923a47a9",
  138. "name": "link in 1",
  139. "links": [
  140. "f182559423876113",
  141. "8f14ee3cb8deb59c"
  142. ],
  143. "x": 225,
  144. "y": 240,
  145. "wires": [
  146. [
  147. "6878c4108ce55f89"
  148. ]
  149. ]
  150. },
  151. {
  152. "id": "b96da7d4da3bbd9e",
  153. "type": "modbus-client",
  154. "name": "Fronius Symo GEN24 10.0",
  155. "clienttype": "tcp",
  156. "bufferCommands": true,
  157. "stateLogEnabled": false,
  158. "queueLogEnabled": false,
  159. "failureLogEnabled": true,
  160. "tcpHost": "10.0.1.155",
  161. "tcpPort": "502",
  162. "tcpType": "DEFAULT",
  163. "serialPort": "/dev/ttyUSB",
  164. "serialType": "RTU-BUFFERD",
  165. "serialBaudrate": "9600",
  166. "serialDatabits": "8",
  167. "serialStopbits": "1",
  168. "serialParity": "none",
  169. "serialConnectionDelay": "100",
  170. "serialAsciiResponseStartDelimiter": "0x3A",
  171. "unit_id": "1",
  172. "commandDelay": "1",
  173. "clientTimeout": "1000",
  174. "reconnectOnTimeout": true,
  175. "reconnectTimeout": "2000",
  176. "parallelUnitIdsAllowed": true,
  177. "showWarnings": true,
  178. "showLogs": true
  179. },
  180. {
  181. "id": "99aa9f92658b733b",
  182. "type": "group",
  183. "z": "8374a4bec102ef8d",
  184. "g": "d58633d8f43e4d04",
  185. "name": "COMMON (1) 40004-40068 - 12h",
  186. "style": {
  187. "stroke": "#000000",
  188. "label": true,
  189. "color": "#000000"
  190. },
  191. "nodes": [
  192. "c595a1fcd8455300",
  193. "2039aa6b184bc401",
  194. "41dc34d07cc7d50e",
  195. "59671ea1e14f4eda",
  196. "cf7eb41cd5e03eee"
  197. ],
  198. "x": 54,
  199. "y": 99,
  200. "w": 852,
  201. "h": 82
  202. },
  203. {
  204. "id": "c595a1fcd8455300",
  205. "type": "inject",
  206. "z": "8374a4bec102ef8d",
  207. "g": "99aa9f92658b733b",
  208. "name": "",
  209. "props": [
  210. {
  211. "p": "payload"
  212. },
  213. {
  214. "p": "topic",
  215. "vt": "str"
  216. }
  217. ],
  218. "repeat": "43200",
  219. "crontab": "",
  220. "once": true,
  221. "onceDelay": "5",
  222. "topic": "",
  223. "payload": "",
  224. "payloadType": "date",
  225. "x": 170,
  226. "y": 140,
  227. "wires": [
  228. [
  229. "2039aa6b184bc401"
  230. ]
  231. ]
  232. },
  233. {
  234. "id": "2039aa6b184bc401",
  235. "type": "modbus-getter",
  236. "z": "8374a4bec102ef8d",
  237. "g": "99aa9f92658b733b",
  238. "name": "Common - 40004",
  239. "showStatusActivities": false,
  240. "showErrors": false,
  241. "showWarnings": true,
  242. "logIOActivities": false,
  243. "unitid": "1",
  244. "dataType": "HoldingRegister",
  245. "adr": "40004",
  246. "quantity": "65",
  247. "server": "b96da7d4da3bbd9e",
  248. "useIOFile": false,
  249. "ioFile": "",
  250. "useIOForPayload": false,
  251. "emptyMsgOnFail": false,
  252. "keepMsgProperties": false,
  253. "delayOnStart": false,
  254. "startDelayTime": "",
  255. "x": 370,
  256. "y": 140,
  257. "wires": [
  258. [
  259. "41dc34d07cc7d50e"
  260. ],
  261. []
  262. ]
  263. },
  264. {
  265. "id": "41dc34d07cc7d50e",
  266. "type": "function",
  267. "z": "8374a4bec102ef8d",
  268. "g": "99aa9f92658b733b",
  269. "name": "RAW to JSON",
  270. "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}",
  271. "outputs": 1,
  272. "noerr": 0,
  273. "initialize": "",
  274. "finalize": "",
  275. "libs": [],
  276. "x": 600,
  277. "y": 140,
  278. "wires": [
  279. []
  280. ]
  281. },
  282. {
  283. "id": "59671ea1e14f4eda",
  284. "type": "change",
  285. "z": "8374a4bec102ef8d",
  286. "g": "99aa9f92658b733b",
  287. "name": "",
  288. "rules": [
  289. {
  290. "t": "set",
  291. "p": "solar.Mn",
  292. "pt": "flow",
  293. "to": "payload.raw.Mn",
  294. "tot": "msg"
  295. },
  296. {
  297. "t": "set",
  298. "p": "solar.Md",
  299. "pt": "flow",
  300. "to": "payload.raw.Md",
  301. "tot": "msg"
  302. },
  303. {
  304. "t": "set",
  305. "p": "solar.Vr",
  306. "pt": "flow",
  307. "to": "payload.raw.Vr",
  308. "tot": "msg"
  309. },
  310. {
  311. "t": "set",
  312. "p": "solar.SN",
  313. "pt": "flow",
  314. "to": "payload.raw.SN",
  315. "tot": "msg"
  316. },
  317. {
  318. "t": "set",
  319. "p": "solar.DA",
  320. "pt": "flow",
  321. "to": "payload.raw.DA",
  322. "tot": "msg"
  323. }
  324. ],
  325. "action": "",
  326. "property": "",
  327. "from": "",
  328. "to": "",
  329. "reg": false,
  330. "x": 800,
  331. "y": 140,
  332. "wires": [
  333. []
  334. ]
  335. },
  336. {
  337. "id": "cf7eb41cd5e03eee",
  338. "type": "link in",
  339. "z": "8374a4bec102ef8d",
  340. "g": "99aa9f92658b733b",
  341. "name": "link in 2",
  342. "links": [
  343. "f182559423876113",
  344. "8f14ee3cb8deb59c"
  345. ],
  346. "x": 225,
  347. "y": 140,
  348. "wires": [
  349. [
  350. "2039aa6b184bc401"
  351. ]
  352. ]
  353. },
  354. {
  355. "id": "fc8d8f5e52f438ee",
  356. "type": "group",
  357. "z": "8374a4bec102ef8d",
  358. "g": "d58633d8f43e4d04",
  359. "name": "CONTROLS (123) 40229-40252 -5m",
  360. "style": {
  361. "stroke": "#000000",
  362. "label": true,
  363. "color": "#000000"
  364. },
  365. "nodes": [
  366. "6d6938be7c783c2c",
  367. "fb7f78718650b29e",
  368. "c3813b048184317e",
  369. "6b618e9ab118d336",
  370. "789f47cb5b416aa4",
  371. "f4489817a9ea38f6"
  372. ],
  373. "x": 934,
  374. "y": 99,
  375. "w": 972,
  376. "h": 122
  377. },
  378. {
  379. "id": "6d6938be7c783c2c",
  380. "type": "function",
  381. "z": "8374a4bec102ef8d",
  382. "g": "fc8d8f5e52f438ee",
  383. "name": "RAW to JSON",
  384. "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}",
  385. "outputs": 1,
  386. "noerr": 0,
  387. "initialize": "",
  388. "finalize": "",
  389. "libs": [],
  390. "x": 1480,
  391. "y": 180,
  392. "wires": [
  393. [
  394. "c3813b048184317e",
  395. "f4489817a9ea38f6"
  396. ]
  397. ]
  398. },
  399. {
  400. "id": "fb7f78718650b29e",
  401. "type": "modbus-getter",
  402. "z": "8374a4bec102ef8d",
  403. "g": "fc8d8f5e52f438ee",
  404. "name": "CONTROLS (R) - 40229",
  405. "showStatusActivities": false,
  406. "showErrors": false,
  407. "showWarnings": true,
  408. "logIOActivities": false,
  409. "unitid": "1",
  410. "dataType": "HoldingRegister",
  411. "adr": "40229",
  412. "quantity": "24",
  413. "server": "b96da7d4da3bbd9e",
  414. "useIOFile": false,
  415. "ioFile": "",
  416. "useIOForPayload": false,
  417. "emptyMsgOnFail": false,
  418. "keepMsgProperties": false,
  419. "delayOnStart": false,
  420. "startDelayTime": "",
  421. "x": 1270,
  422. "y": 180,
  423. "wires": [
  424. [
  425. "6d6938be7c783c2c"
  426. ],
  427. []
  428. ]
  429. },
  430. {
  431. "id": "c3813b048184317e",
  432. "type": "change",
  433. "z": "8374a4bec102ef8d",
  434. "g": "fc8d8f5e52f438ee",
  435. "name": "",
  436. "rules": [
  437. {
  438. "t": "set",
  439. "p": "inverter.WMaxLim_Ena",
  440. "pt": "flow",
  441. "to": "payload.raw.WMaxLim_Ena",
  442. "tot": "msg"
  443. }
  444. ],
  445. "action": "",
  446. "property": "",
  447. "from": "",
  448. "to": "",
  449. "reg": false,
  450. "x": 1750,
  451. "y": 180,
  452. "wires": [
  453. []
  454. ]
  455. },
  456. {
  457. "id": "6b618e9ab118d336",
  458. "type": "inject",
  459. "z": "8374a4bec102ef8d",
  460. "g": "fc8d8f5e52f438ee",
  461. "name": "",
  462. "props": [
  463. {
  464. "p": "payload"
  465. },
  466. {
  467. "p": "topic",
  468. "vt": "str"
  469. }
  470. ],
  471. "repeat": "15",
  472. "crontab": "",
  473. "once": true,
  474. "onceDelay": "5",
  475. "topic": "",
  476. "payload": "",
  477. "payloadType": "date",
  478. "x": 1050,
  479. "y": 180,
  480. "wires": [
  481. [
  482. "fb7f78718650b29e"
  483. ]
  484. ]
  485. },
  486. {
  487. "id": "789f47cb5b416aa4",
  488. "type": "link in",
  489. "z": "8374a4bec102ef8d",
  490. "g": "fc8d8f5e52f438ee",
  491. "name": "link in 5",
  492. "links": [
  493. "f182559423876113",
  494. "8f14ee3cb8deb59c",
  495. "8c4eac66ac4d4be9"
  496. ],
  497. "x": 1105,
  498. "y": 180,
  499. "wires": [
  500. [
  501. "fb7f78718650b29e"
  502. ]
  503. ]
  504. },
  505. {
  506. "id": "f4489817a9ea38f6",
  507. "type": "debug",
  508. "z": "8374a4bec102ef8d",
  509. "g": "fc8d8f5e52f438ee",
  510. "name": "debug 28",
  511. "active": false,
  512. "tosidebar": true,
  513. "console": false,
  514. "tostatus": false,
  515. "complete": "false",
  516. "statusVal": "",
  517. "statusType": "auto",
  518. "x": 1800,
  519. "y": 140,
  520. "wires": []
  521. },
  522. {
  523. "id": "0d54f866ec2c725b",
  524. "type": "group",
  525. "z": "8374a4bec102ef8d",
  526. "g": "d58633d8f43e4d04",
  527. "name": "MPPT (160) - 40255-40341 -15s",
  528. "style": {
  529. "stroke": "#000000",
  530. "label": true,
  531. "color": "#000000"
  532. },
  533. "nodes": [
  534. "5a163d02ed8c54cc",
  535. "44bf894e76476f3c",
  536. "c1f5aee84c3d655c",
  537. "67e266696b10bfbe",
  538. "e658f167de8ede6e"
  539. ],
  540. "x": 934,
  541. "y": 279,
  542. "w": 972,
  543. "h": 82
  544. },
  545. {
  546. "id": "5a163d02ed8c54cc",
  547. "type": "modbus-getter",
  548. "z": "8374a4bec102ef8d",
  549. "g": "0d54f866ec2c725b",
  550. "name": "MPPT - 40255",
  551. "showStatusActivities": false,
  552. "showErrors": false,
  553. "showWarnings": true,
  554. "logIOActivities": false,
  555. "unitid": "1",
  556. "dataType": "HoldingRegister",
  557. "adr": "40255",
  558. "quantity": "88",
  559. "server": "b96da7d4da3bbd9e",
  560. "useIOFile": false,
  561. "ioFile": "",
  562. "useIOForPayload": false,
  563. "emptyMsgOnFail": false,
  564. "keepMsgProperties": false,
  565. "delayOnStart": false,
  566. "startDelayTime": "",
  567. "x": 1240,
  568. "y": 320,
  569. "wires": [
  570. [
  571. "c1f5aee84c3d655c"
  572. ],
  573. []
  574. ]
  575. },
  576. {
  577. "id": "44bf894e76476f3c",
  578. "type": "inject",
  579. "z": "8374a4bec102ef8d",
  580. "g": "0d54f866ec2c725b",
  581. "name": "",
  582. "props": [
  583. {
  584. "p": "payload"
  585. },
  586. {
  587. "p": "topic",
  588. "vt": "str"
  589. }
  590. ],
  591. "repeat": "15",
  592. "crontab": "",
  593. "once": true,
  594. "onceDelay": "5",
  595. "topic": "",
  596. "payload": "",
  597. "payloadType": "date",
  598. "x": 1050,
  599. "y": 320,
  600. "wires": [
  601. [
  602. "5a163d02ed8c54cc"
  603. ]
  604. ]
  605. },
  606. {
  607. "id": "c1f5aee84c3d655c",
  608. "type": "function",
  609. "z": "8374a4bec102ef8d",
  610. "g": "0d54f866ec2c725b",
  611. "name": "RAW to JSON",
  612. "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}",
  613. "outputs": 1,
  614. "noerr": 0,
  615. "initialize": "",
  616. "finalize": "",
  617. "libs": [],
  618. "x": 1480,
  619. "y": 320,
  620. "wires": [
  621. []
  622. ]
  623. },
  624. {
  625. "id": "67e266696b10bfbe",
  626. "type": "comment",
  627. "z": "8374a4bec102ef8d",
  628. "g": "0d54f866ec2c725b",
  629. "name": "FIX 32BIT ARRAY HERUNDER",
  630. "info": "Bit 0: Connected \nBit 1: Available\nBit 2: Operating\"\n",
  631. "x": 1750,
  632. "y": 320,
  633. "wires": []
  634. },
  635. {
  636. "id": "e658f167de8ede6e",
  637. "type": "link in",
  638. "z": "8374a4bec102ef8d",
  639. "g": "0d54f866ec2c725b",
  640. "name": "link in 6",
  641. "links": [
  642. "f182559423876113",
  643. "8f14ee3cb8deb59c",
  644. "8c4eac66ac4d4be9"
  645. ],
  646. "x": 1105,
  647. "y": 320,
  648. "wires": [
  649. [
  650. "5a163d02ed8c54cc"
  651. ]
  652. ]
  653. },
  654. {
  655. "id": "cb0915fb28990b96",
  656. "type": "group",
  657. "z": "8374a4bec102ef8d",
  658. "g": "d58633d8f43e4d04",
  659. "name": "STORAGE (124) - 40345-40368 -5s",
  660. "style": {
  661. "stroke": "#000000",
  662. "label": true,
  663. "color": "#000000"
  664. },
  665. "nodes": [
  666. "717ac778fa97f90e",
  667. "49381b3c4c0466b8",
  668. "9517c9e0665ca055",
  669. "2e81da53e1fb37e8",
  670. "0571fd0320a81954"
  671. ],
  672. "x": 934,
  673. "y": 439,
  674. "w": 972,
  675. "h": 82
  676. },
  677. {
  678. "id": "717ac778fa97f90e",
  679. "type": "modbus-getter",
  680. "z": "8374a4bec102ef8d",
  681. "g": "cb0915fb28990b96",
  682. "name": "Storage - 40345",
  683. "showStatusActivities": false,
  684. "showErrors": false,
  685. "showWarnings": true,
  686. "logIOActivities": false,
  687. "unitid": "1",
  688. "dataType": "HoldingRegister",
  689. "adr": "40345",
  690. "quantity": "24",
  691. "server": "b96da7d4da3bbd9e",
  692. "useIOFile": false,
  693. "ioFile": "",
  694. "useIOForPayload": false,
  695. "emptyMsgOnFail": false,
  696. "keepMsgProperties": false,
  697. "delayOnStart": false,
  698. "startDelayTime": "",
  699. "x": 1240,
  700. "y": 480,
  701. "wires": [
  702. [
  703. "9517c9e0665ca055"
  704. ],
  705. []
  706. ]
  707. },
  708. {
  709. "id": "49381b3c4c0466b8",
  710. "type": "inject",
  711. "z": "8374a4bec102ef8d",
  712. "g": "cb0915fb28990b96",
  713. "name": "",
  714. "props": [
  715. {
  716. "p": "payload"
  717. },
  718. {
  719. "p": "topic",
  720. "vt": "str"
  721. }
  722. ],
  723. "repeat": "3",
  724. "crontab": "",
  725. "once": true,
  726. "onceDelay": "5",
  727. "topic": "",
  728. "payload": "",
  729. "payloadType": "date",
  730. "x": 1050,
  731. "y": 480,
  732. "wires": [
  733. [
  734. "717ac778fa97f90e"
  735. ]
  736. ]
  737. },
  738. {
  739. "id": "9517c9e0665ca055",
  740. "type": "function",
  741. "z": "8374a4bec102ef8d",
  742. "g": "cb0915fb28990b96",
  743. "name": "RAW to JSON",
  744. "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}",
  745. "outputs": 1,
  746. "noerr": 0,
  747. "initialize": "",
  748. "finalize": "",
  749. "libs": [],
  750. "x": 1480,
  751. "y": 480,
  752. "wires": [
  753. [
  754. "7161a2c760cc5d84",
  755. "2e81da53e1fb37e8"
  756. ]
  757. ]
  758. },
  759. {
  760. "id": "2e81da53e1fb37e8",
  761. "type": "change",
  762. "z": "8374a4bec102ef8d",
  763. "g": "cb0915fb28990b96",
  764. "name": "",
  765. "rules": [
  766. {
  767. "t": "set",
  768. "p": "battery.chargelimits",
  769. "pt": "flow",
  770. "to": "payload.raw.StorageChargeLimits",
  771. "tot": "msg"
  772. },
  773. {
  774. "t": "set",
  775. "p": "battery.dischargelimits",
  776. "pt": "flow",
  777. "to": "payload.raw.StorageDischargeLimits",
  778. "tot": "msg"
  779. },
  780. {
  781. "t": "set",
  782. "p": "battery.chargestatus",
  783. "pt": "flow",
  784. "to": "payload.raw.ChaSt",
  785. "tot": "msg"
  786. },
  787. {
  788. "t": "set",
  789. "p": "battery.chargefromgrid",
  790. "pt": "flow",
  791. "to": "payload.raw.ChaGriSet",
  792. "tot": "msg"
  793. },
  794. {
  795. "t": "set",
  796. "p": "battery.StorCtl_Mod",
  797. "pt": "flow",
  798. "to": "payload.raw.StorCtl_Mod",
  799. "tot": "msg"
  800. }
  801. ],
  802. "action": "",
  803. "property": "",
  804. "from": "",
  805. "to": "",
  806. "reg": false,
  807. "x": 1800,
  808. "y": 480,
  809. "wires": [
  810. []
  811. ]
  812. },
  813. {
  814. "id": "0571fd0320a81954",
  815. "type": "link in",
  816. "z": "8374a4bec102ef8d",
  817. "g": "cb0915fb28990b96",
  818. "name": "link in 7",
  819. "links": [
  820. "f182559423876113",
  821. "8f14ee3cb8deb59c"
  822. ],
  823. "x": 1105,
  824. "y": 480,
  825. "wires": [
  826. [
  827. "717ac778fa97f90e"
  828. ]
  829. ]
  830. },
  831. {
  832. "id": "8a04bfdfd0ba123a",
  833. "type": "group",
  834. "z": "8374a4bec102ef8d",
  835. "g": "d58633d8f43e4d04",
  836. "name": "STATUS (122) 40183-40226 -1m",
  837. "style": {
  838. "stroke": "#000000",
  839. "label": true,
  840. "color": "#000000"
  841. },
  842. "nodes": [
  843. "4b1b8b1d0475b4ba",
  844. "dd555279f28a1a47",
  845. "3a877b9ed107ab4a",
  846. "ed22da177f245273",
  847. "83cc4b15e00997ec"
  848. ],
  849. "x": 54,
  850. "y": 639,
  851. "w": 852,
  852. "h": 82
  853. },
  854. {
  855. "id": "4b1b8b1d0475b4ba",
  856. "type": "function",
  857. "z": "8374a4bec102ef8d",
  858. "g": "8a04bfdfd0ba123a",
  859. "name": "RAW to JSON",
  860. "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}",
  861. "outputs": 1,
  862. "noerr": 0,
  863. "initialize": "",
  864. "finalize": "",
  865. "libs": [],
  866. "x": 600,
  867. "y": 680,
  868. "wires": [
  869. [
  870. "83cc4b15e00997ec"
  871. ]
  872. ]
  873. },
  874. {
  875. "id": "dd555279f28a1a47",
  876. "type": "modbus-getter",
  877. "z": "8374a4bec102ef8d",
  878. "g": "8a04bfdfd0ba123a",
  879. "name": "STATUS - 40183",
  880. "showStatusActivities": false,
  881. "showErrors": false,
  882. "showWarnings": true,
  883. "logIOActivities": false,
  884. "unitid": "1",
  885. "dataType": "HoldingRegister",
  886. "adr": "40183",
  887. "quantity": "44",
  888. "server": "b96da7d4da3bbd9e",
  889. "useIOFile": false,
  890. "ioFile": "",
  891. "useIOForPayload": false,
  892. "emptyMsgOnFail": false,
  893. "keepMsgProperties": false,
  894. "delayOnStart": false,
  895. "startDelayTime": "",
  896. "x": 370,
  897. "y": 680,
  898. "wires": [
  899. [
  900. "4b1b8b1d0475b4ba"
  901. ],
  902. []
  903. ]
  904. },
  905. {
  906. "id": "3a877b9ed107ab4a",
  907. "type": "inject",
  908. "z": "8374a4bec102ef8d",
  909. "g": "8a04bfdfd0ba123a",
  910. "name": "",
  911. "props": [
  912. {
  913. "p": "payload"
  914. },
  915. {
  916. "p": "topic",
  917. "vt": "str"
  918. }
  919. ],
  920. "repeat": "60",
  921. "crontab": "",
  922. "once": true,
  923. "onceDelay": "5",
  924. "topic": "",
  925. "payload": "",
  926. "payloadType": "date",
  927. "x": 170,
  928. "y": 680,
  929. "wires": [
  930. [
  931. "dd555279f28a1a47"
  932. ]
  933. ]
  934. },
  935. {
  936. "id": "ed22da177f245273",
  937. "type": "link in",
  938. "z": "8374a4bec102ef8d",
  939. "g": "8a04bfdfd0ba123a",
  940. "name": "link in 4",
  941. "links": [
  942. "f182559423876113",
  943. "8f14ee3cb8deb59c"
  944. ],
  945. "x": 225,
  946. "y": 680,
  947. "wires": [
  948. [
  949. "dd555279f28a1a47"
  950. ]
  951. ]
  952. },
  953. {
  954. "id": "83cc4b15e00997ec",
  955. "type": "change",
  956. "z": "8374a4bec102ef8d",
  957. "g": "8a04bfdfd0ba123a",
  958. "name": "",
  959. "rules": [
  960. {
  961. "t": "set",
  962. "p": "inverter.PVConn",
  963. "pt": "flow",
  964. "to": "payload.raw.PVConn",
  965. "tot": "msg"
  966. },
  967. {
  968. "t": "set",
  969. "p": "inverter.StorConn",
  970. "pt": "flow",
  971. "to": "payload.raw.StorConn",
  972. "tot": "msg"
  973. },
  974. {
  975. "t": "set",
  976. "p": "inverter.ECPConn",
  977. "pt": "flow",
  978. "to": "payload.raw.ECPConn",
  979. "tot": "msg"
  980. },
  981. {
  982. "t": "set",
  983. "p": "inverter.isolationlevel",
  984. "pt": "flow",
  985. "to": "payload.scaled.Ris_scaled",
  986. "tot": "msg"
  987. }
  988. ],
  989. "action": "",
  990. "property": "",
  991. "from": "",
  992. "to": "",
  993. "reg": false,
  994. "x": 800,
  995. "y": 680,
  996. "wires": [
  997. []
  998. ]
  999. },
  1000. {
  1001. "id": "7161a2c760cc5d84",
  1002. "type": "debug",
  1003. "z": "8374a4bec102ef8d",
  1004. "g": "d58633d8f43e4d04",
  1005. "name": "debug 16",
  1006. "active": true,
  1007. "tosidebar": false,
  1008. "console": false,
  1009. "tostatus": true,
  1010. "complete": "payload.raw.StorCtl_Mod",
  1011. "targetType": "msg",
  1012. "statusVal": "payload.raw.StorCtl_Mod",
  1013. "statusType": "auto",
  1014. "x": 1680,
  1015. "y": 460,
  1016. "wires": []
  1017. },
  1018. {
  1019. "id": "cc6d6e8ab5a6c724",
  1020. "type": "group",
  1021. "z": "8374a4bec102ef8d",
  1022. "g": "d58633d8f43e4d04",
  1023. "name": "SETTINGS (121) 40151-40180 -12h",
  1024. "style": {
  1025. "stroke": "#000000",
  1026. "label": true,
  1027. "color": "#000000"
  1028. },
  1029. "nodes": [
  1030. "4fa997ec30d0d8dd",
  1031. "bb82fe35a13369c5",
  1032. "a44332213a95ac61",
  1033. "ef7a7bf02c2176f0"
  1034. ],
  1035. "x": 54,
  1036. "y": 399,
  1037. "w": 652,
  1038. "h": 82
  1039. },
  1040. {
  1041. "id": "4fa997ec30d0d8dd",
  1042. "type": "modbus-getter",
  1043. "z": "8374a4bec102ef8d",
  1044. "g": "cc6d6e8ab5a6c724",
  1045. "name": "Settings - 40151",
  1046. "showStatusActivities": false,
  1047. "showErrors": false,
  1048. "showWarnings": true,
  1049. "logIOActivities": false,
  1050. "unitid": "1",
  1051. "dataType": "HoldingRegister",
  1052. "adr": "40151",
  1053. "quantity": "30",
  1054. "server": "b96da7d4da3bbd9e",
  1055. "useIOFile": false,
  1056. "ioFile": "",
  1057. "useIOForPayload": false,
  1058. "emptyMsgOnFail": false,
  1059. "keepMsgProperties": false,
  1060. "delayOnStart": false,
  1061. "startDelayTime": "",
  1062. "x": 360,
  1063. "y": 440,
  1064. "wires": [
  1065. [
  1066. "a44332213a95ac61"
  1067. ],
  1068. []
  1069. ]
  1070. },
  1071. {
  1072. "id": "bb82fe35a13369c5",
  1073. "type": "inject",
  1074. "z": "8374a4bec102ef8d",
  1075. "g": "cc6d6e8ab5a6c724",
  1076. "name": "",
  1077. "props": [
  1078. {
  1079. "p": "payload"
  1080. },
  1081. {
  1082. "p": "topic",
  1083. "vt": "str"
  1084. }
  1085. ],
  1086. "repeat": "43200",
  1087. "crontab": "",
  1088. "once": true,
  1089. "onceDelay": "5",
  1090. "topic": "",
  1091. "payload": "",
  1092. "payloadType": "date",
  1093. "x": 170,
  1094. "y": 440,
  1095. "wires": [
  1096. [
  1097. "4fa997ec30d0d8dd"
  1098. ]
  1099. ]
  1100. },
  1101. {
  1102. "id": "a44332213a95ac61",
  1103. "type": "function",
  1104. "z": "8374a4bec102ef8d",
  1105. "g": "cc6d6e8ab5a6c724",
  1106. "name": "RAW to JSON",
  1107. "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",
  1108. "outputs": 1,
  1109. "noerr": 0,
  1110. "initialize": "",
  1111. "finalize": "",
  1112. "libs": [],
  1113. "x": 600,
  1114. "y": 440,
  1115. "wires": [
  1116. []
  1117. ]
  1118. },
  1119. {
  1120. "id": "ef7a7bf02c2176f0",
  1121. "type": "link in",
  1122. "z": "8374a4bec102ef8d",
  1123. "g": "cc6d6e8ab5a6c724",
  1124. "name": "link in 3",
  1125. "links": [
  1126. "f182559423876113"
  1127. ],
  1128. "x": 225,
  1129. "y": 440,
  1130. "wires": [
  1131. [
  1132. "4fa997ec30d0d8dd"
  1133. ]
  1134. ]
  1135. },
  1136. {
  1137. "id": "7f71fdf6b4f53484",
  1138. "type": "group",
  1139. "z": "8374a4bec102ef8d",
  1140. "g": "d58633d8f43e4d04",
  1141. "name": "INVERTER (10x) 40071-40119 - 2min",
  1142. "style": {
  1143. "stroke": "#000000",
  1144. "label": true,
  1145. "color": "#000000"
  1146. },
  1147. "nodes": [
  1148. "f91c5e2542815979",
  1149. "672776856bc2ae75",
  1150. "dd5aed4079c369f5",
  1151. "a070be3b3a7ad259"
  1152. ],
  1153. "x": 54,
  1154. "y": 299,
  1155. "w": 652,
  1156. "h": 82
  1157. },
  1158. {
  1159. "id": "f91c5e2542815979",
  1160. "type": "modbus-getter",
  1161. "z": "8374a4bec102ef8d",
  1162. "g": "7f71fdf6b4f53484",
  1163. "name": "Inverter - 40071",
  1164. "showStatusActivities": false,
  1165. "showErrors": false,
  1166. "showWarnings": true,
  1167. "logIOActivities": false,
  1168. "unitid": "1",
  1169. "dataType": "HoldingRegister",
  1170. "adr": "40071",
  1171. "quantity": "50",
  1172. "server": "b96da7d4da3bbd9e",
  1173. "useIOFile": false,
  1174. "ioFile": "",
  1175. "useIOForPayload": false,
  1176. "emptyMsgOnFail": false,
  1177. "keepMsgProperties": false,
  1178. "delayOnStart": false,
  1179. "startDelayTime": "",
  1180. "x": 360,
  1181. "y": 340,
  1182. "wires": [
  1183. [
  1184. "a070be3b3a7ad259"
  1185. ],
  1186. []
  1187. ]
  1188. },
  1189. {
  1190. "id": "672776856bc2ae75",
  1191. "type": "inject",
  1192. "z": "8374a4bec102ef8d",
  1193. "g": "7f71fdf6b4f53484",
  1194. "name": "",
  1195. "props": [
  1196. {
  1197. "p": "payload"
  1198. },
  1199. {
  1200. "p": "topic",
  1201. "vt": "str"
  1202. }
  1203. ],
  1204. "repeat": "120",
  1205. "crontab": "",
  1206. "once": true,
  1207. "onceDelay": "5",
  1208. "topic": "",
  1209. "payload": "",
  1210. "payloadType": "date",
  1211. "x": 170,
  1212. "y": 340,
  1213. "wires": [
  1214. [
  1215. "f91c5e2542815979"
  1216. ]
  1217. ]
  1218. },
  1219. {
  1220. "id": "dd5aed4079c369f5",
  1221. "type": "link in",
  1222. "z": "8374a4bec102ef8d",
  1223. "g": "7f71fdf6b4f53484",
  1224. "name": "link in 10",
  1225. "links": [
  1226. "f182559423876113",
  1227. "8f14ee3cb8deb59c"
  1228. ],
  1229. "x": 225,
  1230. "y": 340,
  1231. "wires": [
  1232. [
  1233. "f91c5e2542815979"
  1234. ]
  1235. ]
  1236. },
  1237. {
  1238. "id": "a070be3b3a7ad259",
  1239. "type": "function",
  1240. "z": "8374a4bec102ef8d",
  1241. "g": "7f71fdf6b4f53484",
  1242. "name": "RAW to JSON",
  1243. "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",
  1244. "outputs": 1,
  1245. "noerr": 0,
  1246. "initialize": "",
  1247. "finalize": "",
  1248. "libs": [],
  1249. "x": 600,
  1250. "y": 340,
  1251. "wires": [
  1252. []
  1253. ]
  1254. },
  1255. {
  1256. "id": "5bbc33c0de05e344",
  1257. "type": "inject",
  1258. "z": "8374a4bec102ef8d",
  1259. "g": "d58633d8f43e4d04",
  1260. "name": "3 sec interval",
  1261. "props": [
  1262. {
  1263. "p": "payload"
  1264. },
  1265. {
  1266. "p": "topic",
  1267. "vt": "str"
  1268. }
  1269. ],
  1270. "repeat": "",
  1271. "crontab": "",
  1272. "once": false,
  1273. "onceDelay": "5",
  1274. "topic": "",
  1275. "payload": "",
  1276. "payloadType": "date",
  1277. "x": 1050,
  1278. "y": 420,
  1279. "wires": [
  1280. [
  1281. "717ac778fa97f90e",
  1282. "9e6aada96935f86a"
  1283. ]
  1284. ]
  1285. },
  1286. {
  1287. "id": "9e6aada96935f86a",
  1288. "type": "delay",
  1289. "z": "8374a4bec102ef8d",
  1290. "g": "d58633d8f43e4d04",
  1291. "name": "1s",
  1292. "pauseType": "delay",
  1293. "timeout": "1",
  1294. "timeoutUnits": "seconds",
  1295. "rate": "1",
  1296. "nbRateUnits": "1",
  1297. "rateUnits": "second",
  1298. "randomFirst": "1",
  1299. "randomLast": "5",
  1300. "randomUnits": "seconds",
  1301. "drop": false,
  1302. "allowrate": false,
  1303. "outputs": 1,
  1304. "x": 1230,
  1305. "y": 440,
  1306. "wires": [
  1307. [
  1308. "5a163d02ed8c54cc"
  1309. ]
  1310. ]
  1311. }
  1312. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement