From dbe09b8e8f92ebd3fe4452938ff6e4a199b89200 Mon Sep 17 00:00:00 2001 From: mle Date: Tue, 9 Apr 2024 20:42:00 +0200 Subject: [PATCH] Fix decoding of power (2b) values Power sensors are encoded both as signed and unsigned values. Switch former Power sensor to unsigned and create new signed PowerS. --- goodwe/es.py | 2 +- goodwe/et.py | 34 +++++++++++++++++----------------- goodwe/sensor.py | 12 +++++++++++- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/goodwe/es.py b/goodwe/es.py index d9f73c8..8cbf8bb 100644 --- a/goodwe/es.py +++ b/goodwe/es.py @@ -87,7 +87,7 @@ class ES(Inverter): Energy("e_day", 67, "Today's PV Generation", Kind.PV), Energy("e_load_day", 69, "Today's Load", Kind.AC), Energy4("e_load_total", 71, "Total Load", Kind.AC), - Power("total_power", 75, "Total Power", Kind.AC), # modbus 0x52c + PowerS("total_power", 75, "Total Power", Kind.AC), # modbus 0x52c Byte("effective_work_mode", 77, "Effective Work Mode code"), Integer("effective_relay_control", 78, "Effective Relay Control", "", None), Byte("grid_in_out", 80, "On-grid Mode code", "", Kind.GRID), diff --git a/goodwe/et.py b/goodwe/et.py index 60e0b2f..b30cb98 100644 --- a/goodwe/et.py +++ b/goodwe/et.py @@ -52,23 +52,23 @@ class ET(Inverter): Current("igrid", 35122, "On-grid L1 Current", Kind.AC), Frequency("fgrid", 35123, "On-grid L1 Frequency", Kind.AC), # 35124 reserved - Power("pgrid", 35125, "On-grid L1 Power", Kind.AC), + PowerS("pgrid", 35125, "On-grid L1 Power", Kind.AC), Voltage("vgrid2", 35126, "On-grid L2 Voltage", Kind.AC), Current("igrid2", 35127, "On-grid L2 Current", Kind.AC), Frequency("fgrid2", 35128, "On-grid L2 Frequency", Kind.AC), # 35129 reserved - Power("pgrid2", 35130, "On-grid L2 Power", Kind.AC), + PowerS("pgrid2", 35130, "On-grid L2 Power", Kind.AC), Voltage("vgrid3", 35131, "On-grid L3 Voltage", Kind.AC), Current("igrid3", 35132, "On-grid L3 Current", Kind.AC), Frequency("fgrid3", 35133, "On-grid L3 Frequency", Kind.AC), # 35134 reserved - Power("pgrid3", 35135, "On-grid L3 Power", Kind.AC), + PowerS("pgrid3", 35135, "On-grid L3 Power", Kind.AC), Integer("grid_mode", 35136, "Grid Mode code", "", Kind.PV), Enum2("grid_mode_label", 35136, GRID_MODES, "Grid Mode", Kind.PV), # 35137 reserved - Power("total_inverter_power", 35138, "Total Power", Kind.AC), + PowerS("total_inverter_power", 35138, "Total Power", Kind.AC), # 35139 reserved - Power("active_power", 35140, "Active Power", Kind.GRID), + PowerS("active_power", 35140, "Active Power", Kind.GRID), Calculated("grid_in_out", lambda data: read_grid_mode(data, 35140), "On-grid Mode code", "", Kind.GRID), @@ -84,29 +84,29 @@ class ET(Inverter): Frequency("backup_f1", 35147, "Back-up L1 Frequency", Kind.UPS), Integer("load_mode1", 35148, "Load Mode L1"), # 35149 reserved - Power("backup_p1", 35150, "Back-up L1 Power", Kind.UPS), + PowerS("backup_p1", 35150, "Back-up L1 Power", Kind.UPS), Voltage("backup_v2", 35151, "Back-up L2 Voltage", Kind.UPS), Current("backup_i2", 35152, "Back-up L2 Current", Kind.UPS), Frequency("backup_f2", 35153, "Back-up L2 Frequency", Kind.UPS), Integer("load_mode2", 35154, "Load Mode L2"), # 35155 reserved - Power("backup_p2", 35156, "Back-up L2 Power", Kind.UPS), + PowerS("backup_p2", 35156, "Back-up L2 Power", Kind.UPS), Voltage("backup_v3", 35157, "Back-up L3 Voltage", Kind.UPS), Current("backup_i3", 35158, "Back-up L3 Current", Kind.UPS), Frequency("backup_f3", 35159, "Back-up L3 Frequency", Kind.UPS), Integer("load_mode3", 35160, "Load Mode L3"), # 35161 reserved - Power("backup_p3", 35162, "Back-up L3 Power", Kind.UPS), + PowerS("backup_p3", 35162, "Back-up L3 Power", Kind.UPS), # 35163 reserved - Power("load_p1", 35164, "Load L1", Kind.AC), + PowerS("load_p1", 35164, "Load L1", Kind.AC), # 35165 reserved - Power("load_p2", 35166, "Load L2", Kind.AC), + PowerS("load_p2", 35166, "Load L2", Kind.AC), # 35167 reserved - Power("load_p3", 35168, "Load L3", Kind.AC), + PowerS("load_p3", 35168, "Load L3", Kind.AC), # 35169 reserved - Power("backup_ptotal", 35170, "Back-up Load", Kind.UPS), + PowerS("backup_ptotal", 35170, "Back-up Load", Kind.UPS), # 35171 reserved - Power("load_ptotal", 35172, "Load", Kind.AC), + PowerS("load_ptotal", 35172, "Load", Kind.AC), Integer("ups_load", 35173, "Ups Load", "%", Kind.UPS), Temp("temperature_air", 35174, "Inverter Temperature (Air)", Kind.AC), Temp("temperature_module", 35175, "Inverter Temperature (Module)"), @@ -226,10 +226,10 @@ class ET(Inverter): Integer("manufacture_code", 36002, "Manufacture Code"), Integer("meter_test_status", 36003, "Meter Test Status"), # 1: correct,2: reverse,3: incorrect,0: not checked Integer("meter_comm_status", 36004, "Meter Communication Status"), # 1 OK, 0 NotOK - Power("active_power1", 36005, "Active Power L1", Kind.GRID), - Power("active_power2", 36006, "Active Power L2", Kind.GRID), - Power("active_power3", 36007, "Active Power L3", Kind.GRID), - Power("active_power_total", 36008, "Active Power Total", Kind.GRID), + PowerS("active_power1", 36005, "Active Power L1", Kind.GRID), + PowerS("active_power2", 36006, "Active Power L2", Kind.GRID), + PowerS("active_power3", 36007, "Active Power L3", Kind.GRID), + PowerS("active_power_total", 36008, "Active Power Total", Kind.GRID), Reactive("reactive_power_total", 36009, "Reactive Power Total", Kind.GRID), Decimal("meter_power_factor1", 36010, 1000, "Meter Power Factor L1", "", Kind.GRID), Decimal("meter_power_factor2", 36011, 1000, "Meter Power Factor L2", "", Kind.GRID), diff --git a/goodwe/sensor.py b/goodwe/sensor.py index 061afd6..03459ea 100644 --- a/goodwe/sensor.py +++ b/goodwe/sensor.py @@ -132,7 +132,17 @@ def read_value(self, data: ProtocolResponse): class Power(Sensor): - """Sensor representing power [W] value encoded in 2 bytes""" + """Sensor representing power [W] value encoded in 2 (unsigned) bytes""" + + def __init__(self, id_: str, offset: int, name: str, kind: Optional[SensorKind]): + super().__init__(id_, offset, name, 2, "W", kind) + + def read_value(self, data: ProtocolResponse): + return read_bytes2(data) + + +class PowerS(Sensor): + """Sensor representing power [W] value encoded in 2 (signed) bytes""" def __init__(self, id_: str, offset: int, name: str, kind: Optional[SensorKind]): super().__init__(id_, offset, name, 2, "W", kind)