From 3d65d8b00f7e71964ad0da555222dc9cede1fdd9 Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Sat, 17 Feb 2024 20:24:44 +0100 Subject: [PATCH] added ac500 --- .../bluetti_bt_lib/devices/ac500.py | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py new file mode 100644 index 0000000..ed3e44c --- /dev/null +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac500.py @@ -0,0 +1,67 @@ +"""AC500 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 AC500(ProtocolV1Device): + def __init__(self, address: str, sn: str): + super().__init__(address, "AC500", sn) + + # Details + 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 + self.struct.add_decimal_array_field("cell_voltages", 105, 16, 2) # internal + + # Controls + 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 pack_num_max(self): + return 4 + + @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), + ]