From 3a709f9bc5ed18cd3c606d6d9b56fea1f580ba3f Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Sat, 17 Feb 2024 20:43:34 +0100 Subject: [PATCH] added ep500 --- .../bluetti_bt_lib/devices/ac300.py | 4 +- .../bluetti_bt_lib/devices/ac500.py | 6 +- .../bluetti_bt_lib/devices/ep500.py | 63 +++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py 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 bb757fc..5151c32 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 + # Details (matches EP500 + AC500) self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_uint_field("internal_ac_voltage", 71) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -31,7 +31,7 @@ class AC300(ProtocolV1Device): self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal self.struct.add_version_field("pack_bms_version", 201) - # Controls + # Controls (matches EP500 + AC500) self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( 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 ed3e44c..12edcb2 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 + # Details (matches EP500 + AC300) self.struct.add_enum_field("ac_output_mode", 70, OutputMode) self.struct.add_uint_field("internal_ac_voltage", 71) self.struct.add_decimal_field("internal_current_one", 72, 1) @@ -27,10 +27,10 @@ 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 + # Battery packs (matches EP500) self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal - # Controls + # Controls (matches EP500 + AC300) self.struct.add_enum_field("ups_mode", 3001, UpsMode) self.struct.add_bool_field("split_phase_on", 3004) self.struct.add_enum_field( diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py new file mode 100644 index 0000000..1c5ff4a --- /dev/null +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ep500.py @@ -0,0 +1,63 @@ +"""EP500 fields.""" + +from typing import List + +from ..utils.commands import ReadHoldingRegisters +from ..field_enums import AutoSleepMode, OutputMode, SplitPhaseMachineType, UpsMode +from ..base_devices.ProtocolV1Device import ProtocolV1Device + + +class EP500(ProtocolV1Device): + def __init__(self, address: str, sn: str): + super().__init__(address, "EP500", sn) + + # Details (matches AC500 + AC300) + self.struct.add_enum_field("ac_output_mode", 70, OutputMode) + self.struct.add_uint_field("internal_ac_voltage", 71) + self.struct.add_decimal_field("internal_current_one", 72, 1) + self.struct.add_uint_field("internal_power_one", 73) + self.struct.add_decimal_field("internal_ac_frequency", 74, 1) + self.struct.add_decimal_field("internal_current_two", 75, 1) + self.struct.add_uint_field("internal_power_two", 76) + self.struct.add_decimal_field("ac_input_voltage", 77, 1) + self.struct.add_decimal_field("internal_current_three", 78, 1, (0, 100)) + self.struct.add_uint_field("internal_power_three", 79) + self.struct.add_decimal_field("ac_input_frequency", 80, 2) + self.struct.add_uint_field("internal_dc_input_voltage", 86) + 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) + self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal + + # Controls (matches AC500 + AC300) + self.struct.add_enum_field("ups_mode", 3001, UpsMode) + self.struct.add_bool_field("split_phase_on", 3004) + self.struct.add_enum_field( + "split_phase_machine_mode", 3005, SplitPhaseMachineType + ) + self.struct.add_bool_field("grid_charge_on", 3011) + self.struct.add_bool_field("time_control_on", 3013) + self.struct.add_uint_field("battery_range_start", 3015) + self.struct.add_uint_field("battery_range_end", 3016) + self.struct.add_enum_field("auto_sleep_mode", 3061, AutoSleepMode) + + @property + def polling_commands(self) -> List[ReadHoldingRegisters]: + return super().polling_commands + [ + ReadHoldingRegisters(70, 10), + ReadHoldingRegisters(86, 3), + ] + + @property + def writable_ranges(self) -> List[range]: + return super().writable_ranges + [ + range(3001, 3016), + 3061, + ] + + @property + def pack_polling_commands(self) -> List[ReadHoldingRegisters]: + return super().pack_polling_commands + [ + ReadHoldingRegisters(105, 16), + ]