diff --git a/README.md b/README.md index b716e93..58f2e37 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ After the installation, you can use this button to install the integration: - AC70 (basic data) - AC70P (untested) - AC180 (basic data) -- AC180P (basic data) +- AC180P (tested) - AC200L (untested) - AC200M - AC300 (tested) diff --git a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py index eeb4236..7adc3df 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py @@ -1,8 +1,52 @@ """AC180P fields.""" -from ..base_devices.ProtocolV2Device import ProtocolV2Device +from typing import List +from ..field_enums import ChargingMode +from ..utils.commands import ReadHoldingRegisters +from ..base_devices.ProtocolV2Device import ProtocolV2Device class AC180P(ProtocolV2Device): def __init__(self, address: str, sn: str): super().__init__(address, "AC180P", sn) + + # Power IO + self.struct.add_uint_field('dc_output_power', 140) + self.struct.add_uint_field('ac_output_power', 142) + self.struct.add_uint_field('dc_input_power', 144) + self.struct.add_uint_field('ac_input_power', 146) + + # Input Details (1100 - 1300) + self.struct.add_decimal_field('ac_input_voltage', 1314, 1) + + # Controls (2000) + self.struct.add_bool_field('ac_output_on_switch', 2011) + self.struct.add_bool_field('dc_output_on_switch', 2012) + self.struct.add_bool_field('silent_charging_on', 2020) # to be able to choose between normal and silent charging modes + self.struct.add_enum_field('charging_mode', 2020, ChargingMode) # can't be set from HA, custom switch needed + self.struct.add_bool_field('power_lifting_on', 2021) + + # Controls (2200) + self.struct.add_bool_field('grid_enhancement_mode_on', 2225) + + @property + def polling_commands(self) -> List[ReadHoldingRegisters]: + return super().polling_commands + [ + ReadHoldingRegisters(140, 1), + ReadHoldingRegisters(142, 1), + ReadHoldingRegisters(144, 1), + ReadHoldingRegisters(146, 1), + ReadHoldingRegisters(1314, 1), + ReadHoldingRegisters(2011, 1), + ReadHoldingRegisters(2012, 1), + ReadHoldingRegisters(2020, 1), + ReadHoldingRegisters(2021, 1), + ReadHoldingRegisters(2225, 1), + ] + + @property + def writable_ranges(self) -> List[range]: + return super().writable_ranges + [ + range(2000, 2022), + range(2200, 2226) + ] \ No newline at end of file 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 db9707e..8b663df 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py @@ -316,6 +316,16 @@ FIELD_ATTRIBUTES: dict[str, FieldAttributes] = { setter=True, name="Power Lifting", ), + "grid_enhancement_mode_on": FieldAttributes( + type=FieldType.BOOL, + setter=True, + name="Grid Enhancement Mode", + ), + "silent_charging_on": FieldAttributes( + type=FieldType.BOOL, + setter=True, + name="Silent Charging", + ), } diff --git a/custom_components/bluetti_bt/const.py b/custom_components/bluetti_bt/const.py index 1568e73..0f16d01 100644 --- a/custom_components/bluetti_bt/const.py +++ b/custom_components/bluetti_bt/const.py @@ -23,6 +23,7 @@ SUPPORTED_MODELS = [ "EP500P", "EP600", "EP760", + "AC180P", ] CONTROL_FIELDS = [ @@ -31,6 +32,8 @@ CONTROL_FIELDS = [ "power_off", "eco_on", "power_lifting_on", + "grid_enhancement_mode_on", + "silent_charging_on", ] DIAGNOSTIC_FIELDS = [ @@ -45,4 +48,5 @@ DIAGNOSTIC_FIELDS = [ "total_ac_consumption", "total_grid_consumption", "total_grid_feed", + "ac_input_voltage", ]