added ac300
This commit is contained in:
1 parent
d9d4860d44
commit
928ff2bf5d
3 files changed
+155
-7
No files matched your search
@@ -0,0 +1,68 @@
|
|||||||
|
"""AC300 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 AC300(ProtocolV1Device):
|
||||||
|
def __init__(self, address: str, sn: str):
|
||||||
|
super().__init__(address, "AC300", 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
|
||||||
|
self.struct.add_version_field('pack_bms_version', 201)
|
||||||
|
|
||||||
|
# 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),
|
||||||
|
ReadHoldingRegisters(201, 2),
|
||||||
|
]
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from enum import Enum, auto, unique
|
from enum import Enum, auto, unique
|
||||||
|
|
||||||
from .field_enums import AutoSleepMode, OutputMode
|
from .field_enums import AutoSleepMode, OutputMode, SplitPhaseMachineType, UpsMode
|
||||||
|
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
@@ -45,6 +45,13 @@ class CurrentFieldAttributes(FieldAttributes):
|
|||||||
device_class = 'current'
|
device_class = 'current'
|
||||||
state_class = 'measurement'
|
state_class = 'measurement'
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FrequencyFieldAttributes(FieldAttributes):
|
||||||
|
type = FieldType.NUMERIC,
|
||||||
|
unit_of_measurement = 'Hz',
|
||||||
|
device_class = 'frequency',
|
||||||
|
state_class ='measurement',
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class OutletFieldAttributes(FieldAttributes):
|
class OutletFieldAttributes(FieldAttributes):
|
||||||
type = FieldType.BOOL
|
type = FieldType.BOOL
|
||||||
@@ -87,6 +94,8 @@ FIELD_ATTRIBUTES = {
|
|||||||
'dc_output_on': OutletFieldAttributes(
|
'dc_output_on': OutletFieldAttributes(
|
||||||
name = 'DC Output',
|
name = 'DC Output',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
# Controls
|
||||||
'ac_output_on_switch': OutletFieldAttributes(
|
'ac_output_on_switch': OutletFieldAttributes(
|
||||||
name = 'AC Output',
|
name = 'AC Output',
|
||||||
setter = True,
|
setter = True,
|
||||||
@@ -111,12 +120,26 @@ FIELD_ATTRIBUTES = {
|
|||||||
'internal_power_one': PowerFieldAttributes(
|
'internal_power_one': PowerFieldAttributes(
|
||||||
name = 'Internal Power Sensor 1',
|
name = 'Internal Power Sensor 1',
|
||||||
),
|
),
|
||||||
'internal_ac_frequency': FieldAttributes(
|
'internal_ac_frequency': FrequencyFieldAttributes(
|
||||||
type = FieldType.NUMERIC,
|
|
||||||
name = 'Internal AC Frequency',
|
name = 'Internal AC Frequency',
|
||||||
unit_of_measurement = 'Hz',
|
),
|
||||||
device_class = 'frequency',
|
'internal_current_two': CurrentFieldAttributes(
|
||||||
state_class ='measurement',
|
name = 'Internal Current Sensor 2',
|
||||||
|
),
|
||||||
|
'internal_power_two': PowerFieldAttributes(
|
||||||
|
name = 'Internal Power Sensor 2',
|
||||||
|
),
|
||||||
|
'ac_input_voltage': VoltageFieldAttributes(
|
||||||
|
name = 'AC Input Voltage',
|
||||||
|
),
|
||||||
|
'internal_current_three': CurrentFieldAttributes(
|
||||||
|
name = 'Internal Current Sensor 3',
|
||||||
|
),
|
||||||
|
'internal_power_three': PowerFieldAttributes(
|
||||||
|
name = 'Internal Power Sensor 3',
|
||||||
|
),
|
||||||
|
'ac_input_frequency': FrequencyFieldAttributes(
|
||||||
|
name = 'AC Input Frequency',
|
||||||
),
|
),
|
||||||
'internal_dc_input_voltage': VoltageFieldAttributes(
|
'internal_dc_input_voltage': VoltageFieldAttributes(
|
||||||
name = 'Internal DC Input Voltage',
|
name = 'Internal DC Input Voltage',
|
||||||
@@ -127,6 +150,8 @@ FIELD_ATTRIBUTES = {
|
|||||||
'internal_dc_input_current': CurrentFieldAttributes(
|
'internal_dc_input_current': CurrentFieldAttributes(
|
||||||
name = 'Internal DC Input Current',
|
name = 'Internal DC Input Current',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
# Device specific controls
|
||||||
'power_off': FieldAttributes(
|
'power_off': FieldAttributes(
|
||||||
type = FieldType.BUTTON,
|
type = FieldType.BUTTON,
|
||||||
setter = True,
|
setter = True,
|
||||||
@@ -138,6 +163,45 @@ FIELD_ATTRIBUTES = {
|
|||||||
name = 'Screen Auto Sleep Mode',
|
name = 'Screen Auto Sleep Mode',
|
||||||
options = AutoSleepMode,
|
options = AutoSleepMode,
|
||||||
),
|
),
|
||||||
|
'ups_mode': FieldAttributes(
|
||||||
|
type = FieldType.ENUM,
|
||||||
|
setter = False, # Disabled for safety reasons
|
||||||
|
name = 'UPS Working Mode',
|
||||||
|
options = UpsMode,
|
||||||
|
),
|
||||||
|
'split_phase_on': FieldAttributes(
|
||||||
|
type = FieldType.BOOL,
|
||||||
|
setter = False, # Disabled for safety reasons
|
||||||
|
name = 'Split Phase',
|
||||||
|
),
|
||||||
|
'split_phase_machine_mode': FieldAttributes(
|
||||||
|
type = FieldType.ENUM,
|
||||||
|
setter = False, # Disabled for safety reasons
|
||||||
|
name = 'Split Phase Machine Type',
|
||||||
|
options = SplitPhaseMachineType,
|
||||||
|
),
|
||||||
|
'grid_charge_on': FieldAttributes(
|
||||||
|
type = FieldType.BOOL,
|
||||||
|
setter = False, # Disabled for safety reasons
|
||||||
|
name = 'Grid Charge',
|
||||||
|
),
|
||||||
|
'time_control_on': FieldAttributes(
|
||||||
|
type = FieldType.BOOL,
|
||||||
|
setter = False, # Disabled for safety reasons
|
||||||
|
name = 'Time Control',
|
||||||
|
),
|
||||||
|
'battery_range_start': FieldAttributes(
|
||||||
|
type = FieldType.NUMERIC,
|
||||||
|
setter = False, # Disabled
|
||||||
|
name = 'Battery Range Start',
|
||||||
|
unit_of_measurement = '%',
|
||||||
|
),
|
||||||
|
'battery_range_end': FieldAttributes(
|
||||||
|
type = FieldType.NUMERIC,
|
||||||
|
setter = False, # Disabled
|
||||||
|
name = 'Battery Range End',
|
||||||
|
unit_of_measurement = '%',
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def PACK_FIELD_ATTRIBUTES(pack: int):
|
def PACK_FIELD_ATTRIBUTES(pack: int):
|
||||||
@@ -146,10 +210,14 @@ def PACK_FIELD_ATTRIBUTES(pack: int):
|
|||||||
name = f'Battery Pack {pack} Voltage',
|
name = f'Battery Pack {pack} Voltage',
|
||||||
),
|
),
|
||||||
'pack_battery_percent': FieldAttributes(
|
'pack_battery_percent': FieldAttributes(
|
||||||
type = FieldType,
|
type = FieldType.NUMERIC,
|
||||||
name = f'Battery Pack {pack} Percent',
|
name = f'Battery Pack {pack} Percent',
|
||||||
unit_of_measurement = '%',
|
unit_of_measurement = '%',
|
||||||
device_class ='battery',
|
device_class ='battery',
|
||||||
state_class ='measurement',
|
state_class ='measurement',
|
||||||
),
|
),
|
||||||
|
'pack_bms_version': FieldAttributes(
|
||||||
|
type = FieldType.NUMERIC,
|
||||||
|
name = f'Battery Pack {pack} BMS Version',
|
||||||
|
),
|
||||||
}
|
}
|
||||||
@@ -18,3 +18,15 @@ class AutoSleepMode(Enum):
|
|||||||
ONE_MINUTE = 3
|
ONE_MINUTE = 3
|
||||||
FIVE_MINUTES = 4
|
FIVE_MINUTES = 4
|
||||||
NEVER = 5
|
NEVER = 5
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class UpsMode(Enum):
|
||||||
|
CUSTOMIZED = 1
|
||||||
|
PV_PRIORITY = 2
|
||||||
|
STANDARD = 3
|
||||||
|
TIME_CONTROL = 4
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class SplitPhaseMachineType(Enum):
|
||||||
|
SLAVE = 0
|
||||||
|
MASTER = 1
|
||||||
Reference in new issue
Block a user