Solis inverter Ginlong import for Node-Red

This will listen for the output of the Ginlong Wifi stick, connected to a Solis inverter. It will then extract and format the data from the received string and output it to a text file, but you can change the output to go to a database of your choice.

Please note this works for firmware version: H4.01.51Y4.0.02W1.0.57(2017-07-261-D) on a Solis 4G inverter.

You can send the output of the wifi stick to alternative locations under Advanced -> Remote server in the stick's wifi interface.

[{"id":"6b44baba.560034","type":"tcp in","z":"8c56c38a.2444a","name":"Ginlong","server":"server","host":"","port":"9999","datamode":"stream","datatype":"buffer","newline":"","topic":"ginlong","base64":false,"x":452,"y":564,"wires":[["df850b3d.b82ca8","f1f17eb.fbc558","513d7a41.3093a4"]]},{"id":"513d7a41.3093a4","type":"function","z":"8c56c38a.2444a","name":"Convert datastring","func":"function hex2a(hexx) {\n    var hex = hexx.toString();//force conversion\n    var str = '';\n    for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)\n        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));\n    return str;\n}\n\nvar rawhexdata = msg.payload.toString('hex');\nif (rawhexdata.length == 276) \n{\nvar serial = hex2a(rawhexdata.substr(30,30));\nvar vpv1 = parseInt(((rawhexdata.substr(66,4)).toString(16)), 16)/10;\nvar vpv2 = parseInt(((rawhexdata.substr(70,4)).toString(16)), 16)/10;\nvar vpv3 = parseInt(((rawhexdata.substr(74,4)).toString(16)), 16)/10;\nvar ipv1 = parseInt(((rawhexdata.substr(78,4)).toString(16)), 16)/10;\nvar ipv2 = parseInt(((rawhexdata.substr(82,4)).toString(16)), 16)/10;\nvar ipv3 = parseInt(((rawhexdata.substr(86,4)).toString(16)), 16)/10;\nvar Vac1 = parseInt(((rawhexdata.substr(102,4)).toString(16)), 16)/10;\nvar Vac2 = parseInt(((rawhexdata.substr(106,4)).toString(16)), 16)/10;\nvar Vac3 = parseInt(((rawhexdata.substr(110,4)).toString(16)), 16)/10;\nvar Iac1 = parseInt(((rawhexdata.substr(90,4)).toString(16)), 16)/10;\nvar Iac2 = parseInt(((rawhexdata.substr(94,4)).toString(16)), 16)/10;\nvar Iac3 = parseInt(((rawhexdata.substr(98,4)).toString(16)), 16)/10;\nvar Pac = parseInt(((rawhexdata.substr(118,4)).toString(16)), 16);\nvar Fac = parseInt(((rawhexdata.substr(114,4)).toString(16)), 16)/100;\nvar Temp = parseInt(((rawhexdata.substr(62,4)).toString(16)), 16)/10;\nvar kWhToday = parseInt(((rawhexdata.substr(138,4)).toString(16)), 16)/100;\nvar kWhYesterday = parseInt(((rawhexdata.substr(134,4)).toString(16)), 16)/100;\nvar kWhMonth = parseInt(((rawhexdata.substr(174,4)).toString(16)), 16);\nvar kWhlastMonth = parseInt(((rawhexdata.substr(182,4)).toString(16)), 16);\nvar kWhTotal = parseInt(((rawhexdata.substr(146,4)).toString(16)), 16)/10;\nvar unk1 = parseInt(((rawhexdata.substr(122,4)).toString(16)), 16)/10;\nvar unk2 = parseInt(((rawhexdata.substr(126,4)).toString(16)), 16)/10;\nvar Firmware = parseInt(((rawhexdata.substr(130,4)).toString(16)), 16);\nvar unk3 = parseInt(((rawhexdata.substr(158,4)).toString(16)), 16)/10;\nvar unk4 = parseInt(((rawhexdata.substr(166,4)).toString(16)), 16)/10;\nvar unk5 = parseInt(((rawhexdata.substr(170,4)).toString(16)), 16)/10;\nvar unk6 = parseInt(((rawhexdata.substr(182,4)).toString(16)), 16)/10;\nvar unk7 = parseInt(((rawhexdata.substr(142,4)).toString(16)), 16)/10;\n\nmsg.payload = {\n    serial: serial,\n    vpv1: vpv1,\n    vpv2: vpv2,\n    vpv3: vpv3,\n    Vac1: Vac1,\n    Vac2: Vac2,\n    Vac3: Vac3,\n    Iac1: Iac1,\n    Iac2: Iac2,\n    Iac3: Iac3,\n    Pac: Pac,\n    Fac: Fac,\n    Temp: Temp,\n    kWhToday: kWhToday,\n    kWhYesterday: kWhYesterday,\n    kWhMonth: kWhMonth,\n    kWhlastMonth: kWhlastMonth,\n    kWhTotal: kWhTotal,\n    Firmware: Firmware,\n    unk1: unk1,\n    unk2: unk2,\n    unk3: unk3,\n    unk4: unk4,\n    unk5: unk5,\n    unk6: unk6,\n    unk7: unk7\n    };\n} else\n{\n    msg.payload = \"\";\n}\nreturn msg;\n\n","outputs":1,"noerr":0,"x":732,"y":690,"wires":[["fef6a3e8.44287","6e096f21.ad97e","38f302d.f0fb37e"]]},{"id":"38f302d.f0fb37e","type":"file","z":"8c56c38a.2444a","name":"","filename":"/data/solis.txt","appendNewline":true,"createDir":false,"overwriteFile":"false","x":1064,"y":790,"wires":[]}]

Flow Info

Created 8 years, 7 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • file (x1)
  • function (x1)
  • tcp in (x1)

Tags

  • ginlong
  • solis
  • function
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option