diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/base_devices/ProtocolV1Device.py b/custom_components/bluetti_bt/bluetti_bt_lib/base_devices/ProtocolV1Device.py index ff66723..7f1f585 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/base_devices/ProtocolV1Device.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/base_devices/ProtocolV1Device.py @@ -29,13 +29,6 @@ class ProtocolV1Device(BluettiDevice): # Battery self.struct.add_uint_field("total_battery_percent", 43) - # Battery packs - self.struct.add_uint_field("pack_num_max", 91) # internal - self.struct.add_decimal_field("total_battery_voltage", 92, 1) - self.struct.add_uint_field("pack_num", 96) # internal - self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage - self.struct.add_uint_field("pack_battery_percent", 99) - # Output state self.struct.add_bool_field("ac_output_on", 48) self.struct.add_bool_field("dc_output_on", 49) @@ -63,11 +56,3 @@ class ProtocolV1Device(BluettiDevice): @property def writable_ranges(self) -> List[range]: return [range(3006, 3009)] - - @property - def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return [ - ReadHoldingRegisters(91, 2), - ReadHoldingRegisters(96, 1), - ReadHoldingRegisters(98, 2), - ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py index 5c4f4ae..79feaea 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py @@ -22,6 +22,11 @@ class AC200M(ProtocolV1Device): self.struct.add_decimal_field("internal_dc_input_current", 88, 2) # Battery packs + self.struct.add_uint_field("pack_num_max", 91) # internal + self.struct.add_decimal_field("total_battery_voltage", 92, 1) + self.struct.add_uint_field("pack_num", 96) # internal + self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage + self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal # Controls @@ -46,4 +51,9 @@ class AC200M(ProtocolV1Device): @property def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return super().pack_polling_commands + [ReadHoldingRegisters(105, 16)] + return [ + ReadHoldingRegisters(91, 2), + ReadHoldingRegisters(96, 1), + ReadHoldingRegisters(98, 2), + ReadHoldingRegisters(105, 16) + ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac300.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac300.py index 5a73e4a..b94bd5f 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac300.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac300.py @@ -11,7 +11,7 @@ class AC300(ProtocolV1Device): def __init__(self, address: str, sn: str): super().__init__(address, "AC300", sn) - # Details (matches EP500 + AC500) + # Details self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_decimal_field("internal_ac_voltage", 71, 1) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -28,10 +28,15 @@ class AC300(ProtocolV1Device): self.struct.add_decimal_field("internal_dc_input_current", 88, 2) # Battery packs + self.struct.add_uint_field("pack_num_max", 91) # internal + self.struct.add_decimal_field("total_battery_voltage", 92, 1) + self.struct.add_uint_field("pack_num", 96) # internal + self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage + self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_version_field("pack_bms_version", 201) - # Controls (matches EP500 + AC500) + # Controls self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( @@ -69,7 +74,10 @@ class AC300(ProtocolV1Device): @property def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return super().pack_polling_commands + [ + return [ + ReadHoldingRegisters(91, 2), + ReadHoldingRegisters(96, 1), + ReadHoldingRegisters(98, 2), ReadHoldingRegisters(105, 16), ReadHoldingRegisters(201, 2), ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py index 099ee6f..e9b6832 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py @@ -11,7 +11,7 @@ class AC500(ProtocolV1Device): def __init__(self, address: str, sn: str): super().__init__(address, "AC500", sn) - # Details (matches EP500 + AC300) + # Details self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_decimal_field("internal_ac_voltage", 71, 1) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -27,10 +27,15 @@ class AC500(ProtocolV1Device): self.struct.add_decimal_field("internal_dc_input_power", 87, 1) self.struct.add_decimal_field("internal_dc_input_current", 88, 2) - # Battery packs (matches EP500) + # Battery packs + self.struct.add_uint_field("pack_num_max", 91) # internal + self.struct.add_decimal_field("total_battery_voltage", 92, 1) + self.struct.add_uint_field("pack_num", 96) # internal + self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage + self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal - # Controls (matches EP500 + AC300) + # Controls self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( @@ -68,6 +73,9 @@ class AC500(ProtocolV1Device): @property def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return super().pack_polling_commands + [ + return [ + ReadHoldingRegisters(91, 2), + ReadHoldingRegisters(96, 1), + ReadHoldingRegisters(98, 2), ReadHoldingRegisters(105, 16), ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py index 184cbc9..0f374c6 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py @@ -11,7 +11,7 @@ class EP500(ProtocolV1Device): def __init__(self, address: str, sn: str): super().__init__(address, "EP500", sn) - # Details (matches AC500 + AC300) + # Details self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_decimal_field("internal_ac_voltage", 71, 1) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -27,10 +27,15 @@ class EP500(ProtocolV1Device): self.struct.add_decimal_field("internal_dc_input_power", 87, 1) self.struct.add_decimal_field("internal_dc_input_current", 88, 2) - # Battery packs (matches AC500) + # Battery packs + self.struct.add_uint_field("pack_num_max", 91) # internal + self.struct.add_decimal_field("total_battery_voltage", 92, 1) + self.struct.add_uint_field("pack_num", 96) # internal + self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage + self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal - # Controls (matches AC500 + AC300) + # Controls self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( @@ -64,6 +69,9 @@ class EP500(ProtocolV1Device): @property def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return super().pack_polling_commands + [ + return [ + ReadHoldingRegisters(91, 2), + ReadHoldingRegisters(96, 1), + ReadHoldingRegisters(98, 2), ReadHoldingRegisters(105, 16), ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500p.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500p.py index 53df796..872874c 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500p.py @@ -11,7 +11,7 @@ class EP500P(ProtocolV1Device): def __init__(self, address: str, sn: str): super().__init__(address, "EP500P", sn) - # Details (matches AC500 + AC300) + # Details self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_decimal_field("internal_ac_voltage", 71, 1) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -27,10 +27,15 @@ class EP500P(ProtocolV1Device): self.struct.add_decimal_field("internal_dc_input_power", 87, 1) self.struct.add_decimal_field("internal_dc_input_current", 88, 2) - # Battery packs (matches AC500) + # Battery packs + self.struct.add_uint_field("pack_num_max", 91) # internal + self.struct.add_decimal_field("total_battery_voltage", 92, 1) + self.struct.add_uint_field("pack_num", 96) # internal + self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage + self.struct.add_uint_field("pack_battery_percent", 99) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal - # Controls (matches AC500 + AC300) + # Controls self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( @@ -64,6 +69,9 @@ class EP500P(ProtocolV1Device): @property def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - return super().pack_polling_commands + [ + return [ + ReadHoldingRegisters(91, 2), + ReadHoldingRegisters(96, 1), + ReadHoldingRegisters(98, 2), ReadHoldingRegisters(105, 16), ] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep600.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep600.py index bfbc861..c59485b 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep600.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep600.py @@ -79,10 +79,6 @@ class EP600(ProtocolV2Device): self.struct.add_version_field("safety_module_version", 6181) # internal self.struct.add_version_field("high_voltage_module_version", 6184) # internal - # @property - # def pack_num_max(self): - # return 16 - @property def polling_commands(self) -> List[ReadHoldingRegisters]: return super().polling_commands + [ @@ -105,10 +101,3 @@ class EP600(ProtocolV2Device): ReadHoldingRegisters(156, 1), ReadHoldingRegisters(158, 1), ] - - # @property - # def pack_polling_commands(self) -> List[ReadHoldingRegisters]: - # return super().pack_polling_commands + [ - # ReadHoldingRegisters(6101, 10), - # ReadHoldingRegisters(6175, 12), - # ] diff --git a/custom_components/bluetti_bt/sensor.py b/custom_components/bluetti_bt/sensor.py index d024a38..cba296b 100644 --- a/custom_components/bluetti_bt/sensor.py +++ b/custom_components/bluetti_bt/sensor.py @@ -171,6 +171,8 @@ class BluettiSensor(CoordinatorEntity, SensorEntity): self._attr_available = True + _LOGGER.error(response_data) + # Different for enum and numeric if ( self._options is not None