From e5f690ef3be98af9f8d7d6001c325850b22e0a35 Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 12:24:52 +0300 Subject: [PATCH 1/8] AC180P more data and functionality --- .../bluetti_bt_lib/devices/ac180p.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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..279f590 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,56 @@ """AC180P fields.""" +from typing import List +from enum import Enum, unique + +from ..utils.commands import ReadHoldingRegisters from ..base_devices.ProtocolV2Device import ProtocolV2Device +@unique +class ChargingMode(Enum): + STANDARD = 0 + SILENT = 1 + TURBO = 2 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', 2011) + self.struct.add_bool_field('dc_output_on', 2012) + self.struct.add_enum_field('charging_mode', 2020, ChargingMode) + 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), + ] + + @property + def writable_ranges(self) -> List[range]: + return super().writable_ranges + [ + range(2000, 2022), + range(2200, 2226) + ] \ No newline at end of file From cc755b3003db25f64dfc65c8ff9227b678c742df Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 13:25:39 +0300 Subject: [PATCH 2/8] test + fix --- .../bluetti_bt/bluetti_bt_lib/devices/ac180p.py | 5 +++++ 1 file changed, 5 insertions(+) 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 279f590..7145740 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py @@ -25,6 +25,8 @@ class AC180P(ProtocolV2Device): # Input Details (1100 - 1300) self.struct.add_decimal_field('ac_input_voltage', 1314, 1) + self.struct.add_bool_field('ac_output_on_0', 1509) + # Controls (2000) self.struct.add_bool_field('ac_output_on', 2011) self.struct.add_bool_field('dc_output_on', 2012) @@ -42,15 +44,18 @@ class AC180P(ProtocolV2Device): ReadHoldingRegisters(144, 1), ReadHoldingRegisters(146, 1), ReadHoldingRegisters(1314, 1), + ReadHoldingRegisters(1509, 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(1509, 1510), range(2000, 2022), range(2200, 2226) ] \ No newline at end of file From a7f7ff184327788a7cd32cf93f66651d351d5b3c Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 13:55:10 +0300 Subject: [PATCH 3/8] fixes --- .../bluetti_bt/bluetti_bt_lib/devices/ac180p.py | 15 +++------------ .../bluetti_bt/bluetti_bt_lib/field_attributes.py | 5 +++++ 2 files changed, 8 insertions(+), 12 deletions(-) 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 7145740..8658997 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py @@ -3,15 +3,10 @@ from typing import List from enum import Enum, unique +from ..field_enums import ChargingMode from ..utils.commands import ReadHoldingRegisters from ..base_devices.ProtocolV2Device import ProtocolV2Device -@unique -class ChargingMode(Enum): - STANDARD = 0 - SILENT = 1 - TURBO = 2 - class AC180P(ProtocolV2Device): def __init__(self, address: str, sn: str): super().__init__(address, "AC180P", sn) @@ -25,11 +20,9 @@ class AC180P(ProtocolV2Device): # Input Details (1100 - 1300) self.struct.add_decimal_field('ac_input_voltage', 1314, 1) - self.struct.add_bool_field('ac_output_on_0', 1509) - # Controls (2000) - self.struct.add_bool_field('ac_output_on', 2011) - self.struct.add_bool_field('dc_output_on', 2012) + self.struct.add_bool_field('ac_output_on_switch', 2011) + self.struct.add_bool_field('dc_output_on_switch', 2012) self.struct.add_enum_field('charging_mode', 2020, ChargingMode) self.struct.add_bool_field('power_lifting_on', 2021) @@ -44,7 +37,6 @@ class AC180P(ProtocolV2Device): ReadHoldingRegisters(144, 1), ReadHoldingRegisters(146, 1), ReadHoldingRegisters(1314, 1), - ReadHoldingRegisters(1509, 1), ReadHoldingRegisters(2011, 1), ReadHoldingRegisters(2012, 1), ReadHoldingRegisters(2020, 1), @@ -55,7 +47,6 @@ class AC180P(ProtocolV2Device): @property def writable_ranges(self) -> List[range]: return super().writable_ranges + [ - range(1509, 1510), 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..2787382 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,11 @@ FIELD_ATTRIBUTES: dict[str, FieldAttributes] = { setter=True, name="Power Lifting", ), + "grid_enhancement_mode_on": FieldAttributes( + type=FieldType.BOOL, + setter=True, + name="Grid Enhancement Mode", + ), } From 7396616113b2e510c407ac9f4e76e5ff2f0ef2d8 Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 13:56:58 +0300 Subject: [PATCH 4/8] readme fix --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 1807142..8ef3948 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ # hassio-bluetti-bt -[![hacs_badge](https://img.shields.io/badge/HACS-Default-41BDF5.svg)](https://github.com/hacs/integration) -[![Validate with hassfest](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/hassfest_validation.yml/badge.svg)](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/hassfest_validation.yml) -[![HACS Action](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/HACS.yml/badge.svg)](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/HACS.yml) - Bluetti Integration for Home Assistant ## Disclaimer From 75209ee1aa67faeacc69c082664834a7018c7723 Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 13:59:45 +0300 Subject: [PATCH 5/8] readme fix 2 --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 8ef3948..9482d13 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,6 @@ This integration is provided without any warranty or support by Bluetti (unfortu ## Installation To install this integration, you first need [HACS](https://hacs.xyz/) installed. -After the installation, you can use this button to install the integration: - -[![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=Patrick762&repository=hassio-bluetti-bt&category=integration) ### Supported devices: From c96f551024a9b5bd2edad408d1852223efdcca0b Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Sun, 30 Jun 2024 14:11:31 +0300 Subject: [PATCH 6/8] fixes --- custom_components/bluetti_bt/const.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/custom_components/bluetti_bt/const.py b/custom_components/bluetti_bt/const.py index 1568e73..1a7d103 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", + "charging_mode" ] DIAGNOSTIC_FIELDS = [ From 1fbcf83b1bab6142ce5e170765374aaf66f8d6ea Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Mon, 1 Jul 2024 18:16:58 +0300 Subject: [PATCH 7/8] simple set charging mode (no turbo) --- .../bluetti_bt/bluetti_bt_lib/devices/ac180p.py | 3 +-- .../bluetti_bt/bluetti_bt_lib/field_attributes.py | 5 +++++ custom_components/bluetti_bt/const.py | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) 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 8658997..e25d62e 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py @@ -1,7 +1,6 @@ """AC180P fields.""" from typing import List -from enum import Enum, unique from ..field_enums import ChargingMode from ..utils.commands import ReadHoldingRegisters @@ -23,7 +22,7 @@ class AC180P(ProtocolV2Device): # 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_enum_field('charging_mode', 2020, ChargingMode) + self.struct.add_bool_field('silent_charging_on', 2020) self.struct.add_bool_field('power_lifting_on', 2021) # Controls (2200) 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 2787382..c490967 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py @@ -321,6 +321,11 @@ FIELD_ATTRIBUTES: dict[str, FieldAttributes] = { setter=True, name="Grid Enhancement Mode", ), + "silent_charging_on": FieldAttributes( + type=FieldType.BOOL, + setter=True, + name="Silet Charging", + ), } diff --git a/custom_components/bluetti_bt/const.py b/custom_components/bluetti_bt/const.py index 1a7d103..0f16d01 100644 --- a/custom_components/bluetti_bt/const.py +++ b/custom_components/bluetti_bt/const.py @@ -33,7 +33,7 @@ CONTROL_FIELDS = [ "eco_on", "power_lifting_on", "grid_enhancement_mode_on", - "charging_mode" + "silent_charging_on", ] DIAGNOSTIC_FIELDS = [ @@ -48,4 +48,5 @@ DIAGNOSTIC_FIELDS = [ "total_ac_consumption", "total_grid_consumption", "total_grid_feed", + "ac_input_voltage", ] From 7b6f845edb99e1e92dfc502f419dcb5214756080 Mon Sep 17 00:00:00 2001 From: kvanonavk Date: Fri, 5 Jul 2024 14:42:56 +0300 Subject: [PATCH 8/8] fixes --- README.md | 9 ++++++++- .../bluetti_bt/bluetti_bt_lib/devices/ac180p.py | 3 ++- .../bluetti_bt/bluetti_bt_lib/field_attributes.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9482d13..e6dc1c8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ # hassio-bluetti-bt +[![hacs_badge](https://img.shields.io/badge/HACS-Default-41BDF5.svg)](https://github.com/hacs/integration) +[![Validate with hassfest](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/hassfest_validation.yml/badge.svg)](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/hassfest_validation.yml) +[![HACS Action](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/HACS.yml/badge.svg)](https://github.com/Patrick762/hassio-bluetti-bt/actions/workflows/HACS.yml) + Bluetti Integration for Home Assistant ## Disclaimer @@ -6,12 +10,15 @@ This integration is provided without any warranty or support by Bluetti (unfortu ## Installation To install this integration, you first need [HACS](https://hacs.xyz/) installed. +After the installation, you can use this button to install the integration: + +[![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=Patrick762&repository=hassio-bluetti-bt&category=integration) ### Supported devices: - AC60 - 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 e25d62e..7adc3df 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/devices/ac180p.py @@ -22,7 +22,8 @@ class AC180P(ProtocolV2Device): # 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) + 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) 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 c490967..8b663df 100644 --- a/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py +++ b/custom_components/bluetti_bt/bluetti_bt_lib/field_attributes.py @@ -324,7 +324,7 @@ FIELD_ATTRIBUTES: dict[str, FieldAttributes] = { "silent_charging_on": FieldAttributes( type=FieldType.BOOL, setter=True, - name="Silet Charging", + name="Silent Charging", ), }