From d9d4860d4411ced7b52236470dcead40d3d9447e Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Sat, 17 Feb 2024 18:22:41 +0100 Subject: [PATCH] added ac200m --- .../bluetti_bt_lib/devices/ac200m.py | 48 +++++++++++++++++ .../bluetti_bt_lib/field_attributes.py | 53 ++++++++++++++++++- 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py new file mode 100644 index 0000000..b2df3ee --- /dev/null +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac200m.py @@ -0,0 +1,48 @@ +"""AC200M fields.""" + +from typing import List + +from ..utils.commands import ReadHoldingRegisters +from ..field_enums import AutoSleepMode, OutputMode +from ..base_devices.ProtocolV1Device import ProtocolV1Device + + +class AC200M(ProtocolV1Device): + def __init__(self, address: str, sn: str): + super().__init__(address, "AC200M", 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_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_bool_field('power_off', 3060) + self.struct.add_enum_field('auto_sleep_mode', 3061, AutoSleepMode) + + @property + def pack_num_max(self): + return 3 + + @property + def polling_commands(self) -> List[ReadHoldingRegisters]: + return super().polling_commands + [ + ReadHoldingRegisters(70, 4), + ReadHoldingRegisters(86, 3), + ] + + @property + def writable_ranges(self) -> List[range]: + return super().writable_ranges + [range(3060, 3061)] + + @property + def pack_polling_commands(self) -> List[ReadHoldingRegisters]: + return super().pack_polling_commands + [ReadHoldingRegisters(105, 16)] diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py b/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py index 577ab94..dda171d 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py @@ -3,6 +3,8 @@ from dataclasses import dataclass from enum import Enum, auto, unique +from .field_enums import AutoSleepMode, OutputMode + @unique class FieldType(Enum): @@ -20,6 +22,7 @@ class FieldAttributes: unit_of_measurement: str|None = None device_class: str|None = None state_class: str|None = None + options: Enum @dataclass(frozen=True) class PowerFieldAttributes(FieldAttributes): @@ -35,6 +38,13 @@ class VoltageFieldAttributes(FieldAttributes): device_class = 'voltage' state_class = 'measurement' +@dataclass +class CurrentFieldAttributes(FieldAttributes): + type = FieldType.NUMERIC + unit_of_measurement = 'A' + device_class = 'current' + state_class = 'measurement' + @dataclass(frozen=True) class OutletFieldAttributes(FieldAttributes): type = FieldType.BOOL @@ -65,7 +75,7 @@ FIELD_ATTRIBUTES = { type = FieldType.NUMERIC, name = 'Total Battery Percent', unit_of_measurement = '%', - device_class ='battery', + device_class = 'battery', state_class ='measurement', ), 'total_battery_voltage': VoltageFieldAttributes( @@ -87,6 +97,47 @@ FIELD_ATTRIBUTES = { ), # Device specific fields + 'ac_output_mode': FieldAttributes( + type = FieldType.ENUM, + name = 'AC Output Mode', + options = OutputMode, + ), + 'internal_ac_voltage': VoltageFieldAttributes( + name = 'Internal AC Voltage', + ), + 'internal_current_one': CurrentFieldAttributes( + name = 'Internal Current Sensor 1', + ), + 'internal_power_one': PowerFieldAttributes( + name = 'Internal Power Sensor 1', + ), + 'internal_ac_frequency': FieldAttributes( + type = FieldType.NUMERIC, + name = 'Internal AC Frequency', + unit_of_measurement = 'Hz', + device_class = 'frequency', + state_class ='measurement', + ), + 'internal_dc_input_voltage': VoltageFieldAttributes( + name = 'Internal DC Input Voltage', + ), + 'internal_dc_input_power': PowerFieldAttributes( + name = 'Internal DC Input Power', + ), + 'internal_dc_input_current': CurrentFieldAttributes( + name = 'Internal DC Input Current', + ), + 'power_off': FieldAttributes( + type = FieldType.BUTTON, + setter = True, + name = 'Power Off', + ), + 'auto_sleep_mode': FieldAttributes( + type = FieldType.ENUM, + setter = True, + name = 'Screen Auto Sleep Mode', + options = AutoSleepMode, + ), } def PACK_FIELD_ATTRIBUTES(pack: int):