Hello! I am very new to all of this - got my Home Assistant Blue last week and just today finally up and running with my Solis Inverter data logging stick inputting data via Node-Red.
Had a new Solis hybrid inverter and Pylontech batteries installed last October - have been trying to get connected to them since! Project 1 - read from Pylontech (done via software on console port). Project 2 - read from Solis Inverter via data logging stick (now done). Project 3 - directly read Pylontech into Home Assistant (ongoing). Project 4 - connect to inverter via Modbus. Project 5 pull together display and control on house display (this where Home Assistant comes in). Project 6 - automate.
For the Solis Hybrid Inverter, proof of concept was done on a Raspberry Pi using Node-Red, and the hard part has been decoding the data message. For anyone interested, here is my current take on the data format. I have a LAN stick (which indeed exposes internal server B in the ‘manual setting’ page). I am using UDP not TPC to avoid timeout locking up the ports. Pointing the secondary server B to my Home Assistant IP/port with a Node Red listener, the messages can be read and parsed. Decoding was ‘Bletchley Park’ time and effort, fortunately over the year end so I could see the year totals and month totals roll over. After much checking back and forth, I believe I have 45 data values identified, with another 17 values to go, and lots more ‘holes’ out of a possible 100 missing.
Data messages for me are: - 14 bytes (probably a handshake with the cloud), 130 bytes (some data but almost incomprehensible at the moment). This may tie up with the 135 byte “communication” display on the inverter advanced information screen. Any ideas anyone? And - the valuable 250 byte message as follows:
Solis Inverter data logger message (for hybrid model with LAN data logging stick)
Message length 250 bytes: (message 14 bytes, message 130 bytes still to decode!)
Start:
<1byte 0xA5>
Header (13 bytes):
<1byte data length> <3byte flags> <2byte counter> <4byte logger serial number> <3byte flags>
Time data fields:
<4byte datestamp1 (running seconds)> <2byte data logger seconds> <2byte null> <3byte datastamp2 (‘restart’)> <2byte ?> <2byte message counter> <2byte null>
Inverter:
<16byte serial number ASCI + " ">
Data:
100 x 2byte values. Mostly unsigned integer little endian, with factor determined by inspection
offset / value
48: Inverter operating temperature
50: PV 1 voltage
52: PV 2 voltage
54: PV 1 current
56: PV 2 current
58: Inverter AC bus current (phase 1 - assume ph2/3 follow)
64: Inverter AC voltage (phase 1 - assume ph2/3 follow)
70: AC frequency (assume inverter, not meter)
72: ?unknown
74: ?signed integer flag (0/-1)
76: Yield today
78: Total Yield
88: ?
108: Solar Power watts
112: Yield this month
116: Yield last month
120: Yield yesterday
122: Yield this year
126: ?
130: ?
134: ?
138: ? - max inverter current? my model is 4.6kW so 100 amps?
140: date YY
142: date MM
144: date DD
146: time hh
148: time mm
150: time ss
152: Meter grid voltage
154: Meter grid current (don’t believe this value)
156: signed integer - power from/to grid (import is -ve)
158: signed integer flag 0/-1 (import is -1)
160: ?
162: Inverter Battery Voltage
164: Inverter Battery Current (I find this is incorrect - use BMS values)
166: ?
168: Voltage (think this is backup critical load)?
170: Current (ditto)?
172: BMS reported battery SOC
174: BMS SOH
176: BMS battery voltage
178: BMS battery current (agrees with what Pylontech is pushing out)
180: BMS recommended charge current
182: BMS recommended discharge current
188: Load power watts
190: ?
192: Total energy to battery
196: Energy to battery today
198: Energy to battery this month
200: Total energy from battery
204: Energy from battery today
206: ?
208: Total energy imported
212: Energy imported today
214: Total energy exported?
218: Energy exported today?
220: Total energy consumed (load)
224: Energy consumed today (load)
226: ?
229: Model number <1byte read as Hex>
230: Firmware version <3byte read as little endian Hex>
234: ?
244: ?
Ending: <1byte check digit?> <1byte 0x15>
I am missing:
- any fields for phase 2 and 3 (U/V/W) as this is only domestic 1phase
- most of the export values - only pushed out 1kWh for testing purposes so far as I have batteries!
- any error/status fields - no problems with battery or inverter (so far…) so I assume error flags are all ‘0’
- power meter values for apparent power/reactive power/ power factor etc. Solis cloud has them, so how are they getting from my inverter to the cloud?
Note:
- almost all data items are little endian. eg the data logger serial number is 32 byte unsigned integer (read 4 bytes backwards, concatenate to hex, turn into decimal - bingo!)
- the two timestamps are seconds from 1 Jan 1970. Adding both gives “now”, but I am finding that the ‘running time’ is actually going slow and loosing a few seconds every day, suggesting that the running time field is being incremented, and the ‘last reset’ date is actually back-calculated from now-running. Strange.
Hope this is of use to someone - and if anyone can fill in more of the blanks for me, great!