added ac300

This commit is contained in:
Patrick762 committed 2024-02-17 20:09:59 +01:00
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