Closed Finn0811 closed 1 year ago
Hi @Finn0811, the problem here is that the registers you are trying to read out are not subsequently ordered:
BatteryEquipmentRegister.SOC has address 37760 and consists of 1 register (2 bytes) BatteryEquipmentRegister.RunningStatus has address 37762 and consists of 1 register (2 bytes)
Between those two registers there is some kind of a 1 register (2 bytes) gap, so if you are reading the byte array byte by byte you will get a shift of 2 bytes. Thus the 782.9 A seem to be the value of the BatteryEquipmentRegister.BusVoltage in volts.
Please also note that as already stated above each register has the size of 2 bytes. Especially for the BatteryEquipmentRegister.ChargeDischargePower register that is important because it consists of 2 registers => 4 bytes must be read.
Thanks for pointing that out! Looks like I got it now.
battery_registers = [
{'quantity': 1, 'register': registers.BatteryEquipmentRegister.SOC, 'field': 'soc'},
{'quantity': 1, 'skip': True},
{'quantity': 1, 'register': registers.BatteryEquipmentRegister.RunningStatus, 'field': 'running_status'},
{'quantity': 1, 'register': registers.BatteryEquipmentRegister.BusVoltage, 'field': 'bus_voltage'},
{'quantity': 1, 'register': registers.BatteryEquipmentRegister.BusCurrent, 'field': 'bus_current'},
{'quantity': 2, 'register': registers.BatteryEquipmentRegister.ChargeDischargePower, 'field': 'charge_discharge_power'}
]
range_register = inverter.read_range(37760, end_address=37766)
print(range_register)
i = 0
for reg in battery_registers:
if 'skip' in reg and reg['skip']:
i += reg['quantity'] * 2
continue
register_value = range_register[i:i + reg['quantity'] * 2]
v = datatypes.decode(register_value, reg['register'].value.data_type)
v = (v / reg['register'].value.gain) if reg['register'].value.gain else v
print(f'{v} {reg["register"].value.unit}')
i += reg['quantity'] * 2
print("#########################")
print(" ")
17.0 %
#########################
2.0 None
#########################
767.2 V
#########################
-0.7 A
#########################
-447.0 W
#########################
These are valid numbers. :)
@Finn0811 Perfect, can this ticket be closed?
Yes, thanks again 👍
@Finn0811 I try to replace the reading of 12 single values with the range function. With the default timeouts/waits, I often get a connection error when reading a range. This does not happen when reading the values one-by-one. Did you adjust those values and can share what is working for you?
Hi,
thanks for providing this library. Reading a single register works pretty well but I'm having issues to propery read a range of registers and parsing the return bytestring.
This example code seems to work:
Output:
However, reading battery registers seems to produce wrong numbers like 782.9A BusCurrent.
Output:
What am I doing wrong?