Growatt SPH 5000 query data and upload to pvoutput

This flow queries the Growatt SPH 5000 via the RS232 port (thats were the WIFI stick is plugged into) and uploads the data to pvoutput. I'm using a "DIGITUS USB auf Seriell Adapter - RS232 Konverter - USB 2.0 Typ-A zu DSUB 9M". Like this one: https://www.amazon.de/DIGITUS-70156-Typ-Konverter-Verl%C3%A4ngerungskabel/dp/B0030IT780

You have to modify the API key and the sid.

Looks like, the power that is loaded into the batery is substracted from the uploaded energy generation data.

[{"id":"6d6dd9509764806c","type":"function","z":"063e7c0389103ca3","name":"prepare pvoutput upload","func":"if (msg.skip)\n    return;\n\nlet myDate = new Date();\n\nlet currdate = myDate.\n  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).\n  replace(/(\\d+)\\/(\\d+)\\/(\\d+)/, '$3$1$2');\n\nlet currtime = myDate.getHours()+ ':' + myDate.getMinutes();\n\nlet generationCurrent = msg.gro.PVInputPower;\n//let consumptionCurrent = msg.ax.outputActivePower;\nlet pvVoltage = msg.gro.PV1Voltage + msg.gro.PV2Voltage;\nlet batteryVoltage = msg.gro.BatteryVoltage;\nlet BatteryChargePower = msg.gro.BatteryChargePower;\nlet BatteryDischargePower = msg.gro.BatteryDischargePower;\n\nmsg.payload = {\n    d: currdate,\n    t: currtime,\n    v2: generationCurrent,\n    //v4: consumptionCurrent,\n    v6: pvVoltage,\n    v7: batteryVoltage,\n    v8: BatteryChargePower,\n    v9: BatteryDischargePower\n};\n\nmsg.requestTimeout = 5000;\nreturn msg;\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1210,"y":500,"wires":[["6f67a4ff8c841ecc"]]},{"id":"6f67a4ff8c841ecc","type":"http request","z":"063e7c0389103ca3","name":"pvoutput addstatus","method":"GET","ret":"txt","paytoqs":"query","url":"https://pvoutput.org/service/r2/addstatus.jsp?key=yourapiukey&sid=yoursid","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"credentials":{"user":"","password":""},"x":1450,"y":500,"wires":[["6f40cf58a2a77ba2"]]},{"id":"6f40cf58a2a77ba2","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1790,"y":500,"wires":[]},{"id":"4851e1729d0e8b38","type":"modbus-getter","z":"063e7c0389103ca3","name":"","showStatusActivities":false,"showErrors":false,"logIOActivities":false,"unitid":"1","dataType":"InputRegister","adr":"0","quantity":"100","server":"95054d4d2328829e","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":true,"x":1400,"y":160,"wires":[[],["0c186b7152b485bd","c588dc659cbe5051"]]},{"id":"0c186b7152b485bd","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1610,"y":120,"wires":[]},{"id":"c588dc659cbe5051","type":"function","z":"063e7c0389103ca3","name":"","func":"msg.gro = {};\n\nlet buff = msg.payload.buffer;\nlet data = msg.payload.data;\nlet high, low, result;\n//o Status\nmsg.gro.status = data [0];\nmsg.gro.PVInputPower = ((data[1] << 16) +  data[2]) / 10;\nmsg.gro.PV1Voltage = data[3] / 10;\nmsg.gro.PV1InputCurrent = data[4] / 10;\nmsg.gro.PV1InputWatt = ((data[5] << 16) +  data[6]) / 10;\nmsg.gro.PV2Voltage = data[7] / 10;\nmsg.gro.PV2InputCurrent = data[8] / 10;\nmsg.gro.PV2InputWatt = ((data[9] << 16) +  data[10]) / 10;\nmsg.gro.OutputPower = ((data[35] << 16) +  data[36]) / 10;\nmsg.gro.GridFrequency = data[37] / 100;\nmsg.gro.GridVoltage = data[38] / 10;\nmsg.gro.GridOutputCurrent = data[39] / 10;\nmsg.gro.GridOutputWatt = ((data[40] << 16) +  data[41]) / 10;\nmsg.gro.EnergyToday = ((data[53] << 16) +  data[54]) / 10;\nmsg.gro.EnergyTotal = ((data[55] << 16) +  data[56]) / 10;\nmsg.gro.WorkTimeTotal  = ((data[57] << 16) +  data[58]) / 2 / 60 / 60;\nmsg.gro.PV1EnergyToday = ((data[59] << 16) +  data[60]) / 10;\nmsg.gro.PV1EnergyTotal = ((data[61] << 16) +  data[62]) / 10;\nmsg.gro.PV2EnergyToday = ((data[63] << 16) +  data[64]) / 10;\nmsg.gro.PV2EnergyTotal = ((data[65] << 16) +  data[66]) / 10;\nmsg.gro.InverterTemperature = data[93] / 10;\nmsg.gro.PVEnergyTotal = ((data[91] << 16) +  data[92]) / 10;\n\nreturn msg;\n\n\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":160,"wires":[["55abc2e06a95e780","cdc64a7f6289326d"]]},{"id":"55abc2e06a95e780","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1790,"y":160,"wires":[]},{"id":"fb43296614595c3c","type":"modbus-getter","z":"063e7c0389103ca3","name":"","showStatusActivities":false,"showErrors":false,"logIOActivities":false,"unitid":"1","dataType":"InputRegister","adr":"284","quantity":"100","server":"95054d4d2328829e","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":true,"x":1420,"y":320,"wires":[[],["f344f851890c8a13","9a79a2051e536b58"]]},{"id":"f344f851890c8a13","type":"function","z":"063e7c0389103ca3","name":"","func":"\nlet buff = msg.payload.buffer;\nlet data = msg.payload.data;\nlet high, low, result;\n\nmsg.gro.EnergyHourlyOfThisDay00 = ((data[284-284] << 16) +  data[285-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay01 = ((data[286-284] << 16) +  data[287-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay02 = ((data[288-284] << 16) +  data[289-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay03 = ((data[290-284] << 16) +  data[291-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay04 = ((data[292-284] << 16) +  data[293-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay05 = ((data[294-284] << 16) +  data[295-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay06 = ((data[296-284] << 16) +  data[297-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay07 = ((data[298-284] << 16) +  data[299-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay08 = ((data[300-284] << 16) +  data[301-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay09 = ((data[302-284] << 16) +  data[303-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay10 = ((data[304-284] << 16) +  data[305-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay11 = ((data[306-284] << 16) +  data[307-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay12 = ((data[308-284] << 16) +  data[309-284]) / 10;\nmsg.gro.EnergyHourlyOfThisDay13 = ((data[310-284] << 16) +  data[311-284]) / 10;\n\nmsg.gro.EnergyOfLatestDay = ((data[332-284] << 16) +  data[333-284]) / 10;\nmsg.gro.EnergyOfLatestDay1 = ((data[334-284] << 16) +  data[335-284]) / 10;\n\nreturn msg;\n\n\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":320,"wires":[["2e5e9db5eab00a7f","f5ab81529b245ac4"]]},{"id":"2e5e9db5eab00a7f","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1790,"y":320,"wires":[]},{"id":"cdc64a7f6289326d","type":"delay","z":"063e7c0389103ca3","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1200,"y":320,"wires":[["fb43296614595c3c"]]},{"id":"9a79a2051e536b58","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1610,"y":280,"wires":[]},{"id":"8205c72ad78144f9","type":"inject","z":"063e7c0389103ca3","name":"every 5 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/5 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1190,"y":160,"wires":[["4851e1729d0e8b38"]]},{"id":"17e049320e86e3d6","type":"inject","z":"063e7c0389103ca3","name":"skip upload","props":[{"p":"skip","v":"skip","vt":"str"},{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1170,"y":120,"wires":[["4851e1729d0e8b38"]]},{"id":"dcafcc7adda1e332","type":"modbus-getter","z":"063e7c0389103ca3","name":"","showStatusActivities":false,"showErrors":false,"logIOActivities":false,"unitid":"1","dataType":"InputRegister","adr":"1000","quantity":"41","server":"95054d4d2328829e","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":true,"x":1420,"y":420,"wires":[[],["9e3d82a4d63fb1ee","629385a895d43cda"]]},{"id":"9e3d82a4d63fb1ee","type":"function","z":"063e7c0389103ca3","name":"","func":"\nlet buff = msg.payload.buffer;\nlet data = msg.payload.data;\nlet high, low, result;\n\nif (typeof msg.gro == 'undefined') {\n    msg.gro = {};\n}\n\nmsg.gro.uwSysWorkMode = data[1000-1000];\nmsg.gro.SystemFaultWord67 = ((data[1007-1000] << 16) +  data[1008-1000]) / 10;\nmsg.gro.BatteryDischargePower = ((data[1009-1000] << 16) +  data[1010-1000]) / 10;\nmsg.gro.BatteryChargePower = ((data[1011-1000] << 16) +  data[1012-1000]) / 10;\nmsg.gro.BatteryVoltage = data[1013-1000] / 10;\nmsg.gro.StateOfChargeCapacity = data[1014-1000];\nmsg.gro.ACPowerToUser = ((data[1015-1000] << 16) +  data[1016-1000]) / 10;\nmsg.gro.BatteryTemperature = data[1040-1000] / 10;\nmsg.gro.EnergyToUserToday = ((data[1044-1000] << 16) +  data[1045-1000]) / 10;\nmsg.gro.EnergyToUserTotal = ((data[1046-1000] << 16) +  data[1047-1000]) / 10;\nmsg.gro.EnergyToGridToday = ((data[1048-1000] << 16) +  data[1049-1000]) / 10;\nmsg.gro.EnergyToGridTotal = ((data[1050-1000] << 16) +  data[1051-1000]) / 10;\nmsg.gro.EnergyDischargeToday = ((data[1052-1000] << 16) +  data[1053-1000]) / 10;\nmsg.gro.EnergyDischargeTotal = ((data[1054-1000] << 16) +  data[1055-1000]) / 10;\nmsg.gro.EnergyChargeToday = ((data[1056-1000] << 16) +  data[1057-1000]) / 10;\nmsg.gro.EnergyChargeTotal = ((data[1058-1000] << 16) +  data[1059-1000]) / 10;\nreturn msg;\n\n\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1620,"y":420,"wires":[["c544dcb11f4d3fd8","6d6dd9509764806c"]]},{"id":"c544dcb11f4d3fd8","type":"debug","z":"063e7c0389103ca3","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1790,"y":420,"wires":[]},{"id":"f5ab81529b245ac4","type":"delay","z":"063e7c0389103ca3","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1200,"y":420,"wires":[["dcafcc7adda1e332"]]},{"id":"629385a895d43cda","type":"debug","z":"063e7c0389103ca3","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1610,"y":380,"wires":[]},{"id":"b40e0b37fe0a53e0","type":"inject","z":"063e7c0389103ca3","name":"","props":[{"p":"skip","v":"skip","vt":"str"},{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1180,"y":380,"wires":[["dcafcc7adda1e332"]]},{"id":"95054d4d2328829e","type":"modbus-client","name":"Growatt","clienttype":"simpleser","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/serial/by-id/usb-FTDI_USB_Serial_Converter_FTDVLRNM-if00-port0","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}]

Flow Info

Created 3 years, 1 month ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • debug (x7)
  • delay (x2)
  • function (x4)
  • http request (x1)
  • inject (x3)
Other
  • modbus-client (x1)
  • modbus-getter (x3)

Tags

  • GROWATT
  • SPH
  • RS232
  • PVOUPUT
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option