Skip to content

Commit ace8f9e

Browse files
pravussummletenay
authored andcommitted
Add Battery 2 power and mode sensors for ET models
1 parent ee5f141 commit ace8f9e

4 files changed

Lines changed: 30 additions & 5 deletions

File tree

goodwe/et.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,8 @@ class ET(Inverter):
153153
read_bytes2_signed(data, 35140),
154154
"House Consumption", "W", Kind.AC),
155155

156-
# Power4S("pbattery2", 35264, "Battery2 Power", Kind.BAT),
157-
# Integer("battery2_mode", 35266, "Battery2 Mode code", "", Kind.BAT),
158-
# Enum2("battery2_mode_label", 35184, BATTERY_MODES, "Battery2 Mode", Kind.BAT),
156+
# Voltage("vbattery2", 47924, "Battery2 Voltage", Kind.BAT),
157+
# Enum2("battery2_mode_label", 35184, BATTERY_MODES, "Battery2 Mode", Kind.BAT),
159158
)
160159

161160
# Modbus registers from offset 0x9088 (37000)
@@ -222,6 +221,13 @@ class ET(Inverter):
222221
# String8("battery2_sn", 39058, "Battery 2 S/N", Kind.BAT),
223222
)
224223

224+
# Modbus registers from offset 0x89be (35262)
225+
__all_sensors_battery2_extended: tuple[Sensor, ...] = (
226+
Power4S("pbattery2", 35264, "Battery2 Power", Kind.BAT),
227+
Integer("battery2_mode", 35266, "Battery2 Mode code", "", Kind.BAT),
228+
Enum2("battery2_mode_label", 35266, BATTERY_MODES, "Battery2 Mode", Kind.BAT)
229+
)
230+
225231
# Inverter's meter data
226232
# Modbus registers from offset 0x8ca0 (36000)
227233
__all_sensors_meter: tuple[Sensor, ...] = (
@@ -479,6 +485,7 @@ def __init__(self, host: str, port: int, comm_addr: int = 0, timeout: int = 1, r
479485
self._READ_BATTERY_INFO: ProtocolCommand = self._read_command(0x9088, 0x0018)
480486
self._READ_BATTERY2_INFO: ProtocolCommand = self._read_command(0x9858, 0x0016)
481487
self._READ_MPPT_DATA: ProtocolCommand = self._read_command(0x89e5, 0x3d)
488+
self._READ_BATTERY2_INFO_EXTENDED = self._read_command(0x89be, 0x06)
482489
self._has_eco_mode_v2: bool = True
483490
self._has_peak_shaving: bool = True
484491
self._has_battery: bool = True
@@ -489,6 +496,7 @@ def __init__(self, host: str, port: int, comm_addr: int = 0, timeout: int = 1, r
489496
self._sensors = self.__all_sensors
490497
self._sensors_battery = self.__all_sensors_battery
491498
self._sensors_battery2 = self.__all_sensors_battery2
499+
self._sensors_battery2_extended = self.__all_sensors_battery2_extended
492500
self._sensors_meter = self.__all_sensors_meter
493501
self._sensors_mppt = self.__all_sensors_mppt
494502
self._settings: dict[str, Sensor] = {s.id_: s for s in self.__all_settings}
@@ -590,6 +598,9 @@ async def read_runtime_data(self) -> dict[str, Any]:
590598
response = await self._read_from_socket(self._READ_BATTERY2_INFO)
591599
data.update(
592600
self._map_response(response, self._sensors_battery2))
601+
response = await self._read_from_socket(self._READ_BATTERY2_INFO_EXTENDED)
602+
data.update(
603+
self._map_response(response, self._sensors_battery2_extended))
593604
except RequestRejectedException as ex:
594605
if ex.message == ILLEGAL_DATA_ADDRESS:
595606
logger.info("Battery 2 values not supported, disabling further attempts.")
@@ -820,6 +831,7 @@ def sensors(self) -> tuple[Sensor, ...]:
820831
result = result + self._sensors_battery
821832
if self._has_battery2:
822833
result = result + self._sensors_battery2
834+
result = result + self._sensors_battery2_extended
823835
if self._has_mppt:
824836
result = result + self._sensors_mppt
825837
return result
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
aa55f7030c1052ffe2fffffb1a0003000836a3
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
aa55f7030c1052ffe2fffffb1a0003000836a3

tests/test_et.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,7 @@ def __init__(self, methodName='runTest'):
767767
self.mock_response(self._READ_METER_DATA_EXTENDED, 'GW25K-ET_meter_data.hex')
768768
self.mock_response(self._READ_BATTERY_INFO, 'GW25K-ET_battery_info.hex')
769769
self.mock_response(self._READ_MPPT_DATA, 'GW25K-ET_mppt_data.hex')
770+
self.mock_response(self._READ_BATTERY2_INFO_EXTENDED, 'GW25K-ET_battery2_info_extended.hex')
770771

771772
def test_GW25K_ET_device_info(self):
772773
self.loop.run_until_complete(self.read_device_info())
@@ -788,7 +789,7 @@ def test_GW25K_ET_runtime_data(self):
788789
self.loop.run_until_complete(self.read_device_info())
789790

790791
data = self.loop.run_until_complete(self.read_runtime_data())
791-
self.assertEqual(237, len(data))
792+
self.assertEqual(240, len(data))
792793

793794
self.sensor_map = {s.id_: s for s in self.sensors()}
794795

@@ -1033,6 +1034,9 @@ def test_GW25K_ET_runtime_data(self):
10331034
self.assertSensor('apparent_power1', 0, 'VA', data)
10341035
self.assertSensor('apparent_power2', 0, 'VA', data)
10351036
self.assertSensor('apparent_power3', 0, 'VA', data)
1037+
self.assertSensor('pbattery2', -1254, 'W', data)
1038+
self.assertSensor('battery2_mode', 3, '', data)
1039+
self.assertSensor('battery2_mode_label', 'Charge', '', data)
10361040

10371041
self.assertFalse(self.sensor_map, f"Some sensors were not tested {self.sensor_map}")
10381042

@@ -1048,6 +1052,7 @@ def __init__(self, methodName='runTest'):
10481052
self.mock_response(self._READ_BATTERY_INFO, 'GW29K9-ET_battery_info.hex')
10491053
self.mock_response(self._READ_BATTERY2_INFO, 'GW29K9-ET_battery2_info.hex')
10501054
self.mock_response(self._READ_MPPT_DATA, 'GW29K9-ET_mppt_data.hex')
1055+
self.mock_response(self._READ_BATTERY2_INFO_EXTENDED, 'GW29K9-ET_battery2_info_extended.hex')
10511056

10521057
def test_GW29K9_ET_device_info(self):
10531058
self.loop.run_until_complete(self.read_device_info())
@@ -1068,8 +1073,10 @@ def test_GW29K9_ET_runtime_data(self):
10681073
# Reset sensors
10691074
self.loop.run_until_complete(self.read_device_info())
10701075

1076+
self.sensor_map = {s.id_: s for s in self.sensors()}
1077+
10711078
data = self.loop.run_until_complete(self.read_runtime_data())
1072-
self.assertEqual(211, len(data))
1079+
self.assertEqual(214, len(data))
10731080

10741081
self.sensor_map = {s.id_: s for s in self.sensors()}
10751082

@@ -1287,6 +1294,10 @@ def test_GW29K9_ET_runtime_data(self):
12871294
self.assertSensor('apparent_power1', 0, 'VA', data)
12881295
self.assertSensor('apparent_power2', 0, 'VA', data)
12891296
self.assertSensor('apparent_power3', 0, 'VA', data)
1297+
self.assertSensor('pbattery2', -1254, 'W', data)
1298+
self.assertSensor('battery2_mode', 3, '', data)
1299+
self.assertSensor('battery2_mode_label', 'Charge', '', data)
1300+
12901301

12911302
self.assertFalse(self.sensor_map, f"Some sensors were not tested {self.sensor_map}")
12921303

0 commit comments

Comments
 (0)