Merge pull request #86 from Patrick762/ac200l
Ac200l support and manifest fix
This commit is contained in:
4 files changed
+66
-2
No files matched your search
@@ -19,6 +19,7 @@ After the installation, you can use this button to install the integration:
|
|||||||
- AC60
|
- AC60
|
||||||
- AC180 (basic data)
|
- AC180 (basic data)
|
||||||
- AC180P (basic data)
|
- AC180P (basic data)
|
||||||
|
- AC200L (untested)
|
||||||
- AC200M
|
- AC200M
|
||||||
- AC300 (tested)
|
- AC300 (tested)
|
||||||
- AC500
|
- AC500
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
"""AC200L fields."""
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from ..utils.commands import ReadHoldingRegisters
|
||||||
|
from ..field_enums import AutoSleepMode, OutputMode
|
||||||
|
from ..base_devices.ProtocolV1Device import ProtocolV1Device
|
||||||
|
|
||||||
|
|
||||||
|
class AC200L(ProtocolV1Device):
|
||||||
|
def __init__(self, address: str, sn: str):
|
||||||
|
super().__init__(address, "AC200L", sn)
|
||||||
|
|
||||||
|
# Details
|
||||||
|
self.struct.add_enum_field("ac_output_mode", 70, OutputMode)
|
||||||
|
self.struct.add_decimal_field("internal_ac_voltage", 71, 1)
|
||||||
|
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, 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_uint_field("pack_num_max", 91) # internal
|
||||||
|
self.struct.add_decimal_field("total_battery_voltage", 92, 1)
|
||||||
|
self.struct.add_uint_field("pack_num", 96) # internal
|
||||||
|
self.struct.add_decimal_field("pack_voltage", 98, 2) # Full pack voltage
|
||||||
|
self.struct.add_uint_field("pack_battery_percent", 99)
|
||||||
|
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, 5),
|
||||||
|
ReadHoldingRegisters(86, 3),
|
||||||
|
ReadHoldingRegisters(3060, 2),
|
||||||
|
]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def writable_ranges(self) -> List[range]:
|
||||||
|
return super().writable_ranges + [range(3060, 3062)]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pack_polling_commands(self) -> List[ReadHoldingRegisters]:
|
||||||
|
return [
|
||||||
|
ReadHoldingRegisters(91, 2),
|
||||||
|
ReadHoldingRegisters(96, 1),
|
||||||
|
ReadHoldingRegisters(98, 2),
|
||||||
|
ReadHoldingRegisters(105, 16)
|
||||||
|
]
|
||||||
@@ -5,6 +5,7 @@ import re
|
|||||||
from ..devices.ac60 import AC60
|
from ..devices.ac60 import AC60
|
||||||
from ..devices.ac180 import AC180
|
from ..devices.ac180 import AC180
|
||||||
from ..devices.ac180p import AC180P
|
from ..devices.ac180p import AC180P
|
||||||
|
from ..devices.ac200l import AC200L
|
||||||
from ..devices.ac200m import AC200M
|
from ..devices.ac200m import AC200M
|
||||||
from ..devices.ac300 import AC300
|
from ..devices.ac300 import AC300
|
||||||
from ..devices.ac500 import AC500
|
from ..devices.ac500 import AC500
|
||||||
@@ -16,7 +17,7 @@ from ..devices.ep760 import EP760
|
|||||||
from ..devices.ep800 import EP800
|
from ..devices.ep800 import EP800
|
||||||
|
|
||||||
DEVICE_NAME_RE = re.compile(
|
DEVICE_NAME_RE = re.compile(
|
||||||
r"^(AC60|AC180|AC180P|AC200M|AC300|AC500|EB3A|EP500|EP500P|EP600|EP760|EP800)(\d+)$"
|
r"^(AC60|AC180|AC180P|AC200L|AC200M|AC300|AC500|EB3A|EP500|EP500P|EP600|EP760|EP800)(\d+)$"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -28,6 +29,8 @@ def build_device(address: str, name: str):
|
|||||||
return AC180(address, match[2])
|
return AC180(address, match[2])
|
||||||
if match[1] == "AC180P":
|
if match[1] == "AC180P":
|
||||||
return AC180P(address, match[2])
|
return AC180P(address, match[2])
|
||||||
|
if match[1] == "AC200L":
|
||||||
|
return AC200L(address, match[2])
|
||||||
if match[1] == "AC200M":
|
if match[1] == "AC200M":
|
||||||
return AC200M(address, match[2])
|
return AC200M(address, match[2])
|
||||||
if match[1] == "AC300":
|
if match[1] == "AC300":
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"bluetooth": [
|
"bluetooth": [
|
||||||
{ "local_name": "AC60*" },
|
{ "local_name": "AC60*" },
|
||||||
{ "local_name": "AC180*" },
|
{ "local_name": "AC180*" },
|
||||||
|
{ "local_name": "AC200L*" },
|
||||||
{ "local_name": "AC200M*" },
|
{ "local_name": "AC200M*" },
|
||||||
{ "local_name": "AC300*" },
|
{ "local_name": "AC300*" },
|
||||||
{ "local_name": "AC500*" },
|
{ "local_name": "AC500*" },
|
||||||
@@ -22,5 +23,5 @@
|
|||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"issue_tracker": "https://github.com/Patrick762/hassio-bluetti-bt/issues",
|
"issue_tracker": "https://github.com/Patrick762/hassio-bluetti-bt/issues",
|
||||||
"requirements": [],
|
"requirements": [],
|
||||||
"version": "0.0.21"
|
"version": "0.0.22"
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user