156 lines
4.2 KiB
Python
156 lines
4.2 KiB
Python
"""Field attributes for device fields."""
|
|
|
|
from dataclasses import dataclass
|
|
from enum import Enum, auto, unique
|
|
|
|
from .field_enums import AutoSleepMode, OutputMode
|
|
|
|
|
|
@unique
|
|
class FieldType(Enum):
|
|
NUMERIC = auto()
|
|
BOOL = auto()
|
|
ENUM = auto()
|
|
BUTTON = auto()
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class FieldAttributes:
|
|
type: FieldType
|
|
setter: bool = False
|
|
name: str
|
|
unit_of_measurement: str|None = None
|
|
device_class: str|None = None
|
|
state_class: str|None = None
|
|
options: Enum
|
|
|
|
@dataclass(frozen=True)
|
|
class PowerFieldAttributes(FieldAttributes):
|
|
type = FieldType.NUMERIC
|
|
unit_of_measurement = 'W'
|
|
device_class = 'power'
|
|
state_class = 'measurement'
|
|
|
|
@dataclass
|
|
class VoltageFieldAttributes(FieldAttributes):
|
|
type = FieldType.NUMERIC
|
|
unit_of_measurement = 'V'
|
|
device_class = 'voltage'
|
|
state_class = 'measurement'
|
|
|
|
@dataclass
|
|
class CurrentFieldAttributes(FieldAttributes):
|
|
type = FieldType.NUMERIC
|
|
unit_of_measurement = 'A'
|
|
device_class = 'current'
|
|
state_class = 'measurement'
|
|
|
|
@dataclass(frozen=True)
|
|
class OutletFieldAttributes(FieldAttributes):
|
|
type = FieldType.BOOL
|
|
device_class = 'outlet'
|
|
|
|
FIELD_ATTRIBUTES = {
|
|
# Base device fields
|
|
'dc_input_power': PowerFieldAttributes(
|
|
name = 'DC Input Power',
|
|
),
|
|
'ac_input_power': PowerFieldAttributes(
|
|
name = 'AC Input Power',
|
|
),
|
|
'ac_output_power': PowerFieldAttributes(
|
|
name = 'AC Output Power',
|
|
),
|
|
'dc_output_power': PowerFieldAttributes(
|
|
name = 'DC Output Power',
|
|
),
|
|
'power_generation': FieldAttributes(
|
|
type = FieldType.NUMERIC,
|
|
name = 'Total Power Generation',
|
|
unit_of_measurement = 'kWh',
|
|
device_class = 'energy',
|
|
state_class = 'total_increasing',
|
|
),
|
|
'total_battery_percent': FieldAttributes(
|
|
type = FieldType.NUMERIC,
|
|
name = 'Total Battery Percent',
|
|
unit_of_measurement = '%',
|
|
device_class = 'battery',
|
|
state_class ='measurement',
|
|
),
|
|
'total_battery_voltage': VoltageFieldAttributes(
|
|
name = 'Total Battery Voltage',
|
|
),
|
|
'ac_output_on': OutletFieldAttributes(
|
|
name = 'AC Output',
|
|
),
|
|
'dc_output_on': OutletFieldAttributes(
|
|
name = 'DC Output',
|
|
),
|
|
'ac_output_on_switch': OutletFieldAttributes(
|
|
name = 'AC Output',
|
|
setter = True,
|
|
),
|
|
'dc_output_on_switch': OutletFieldAttributes(
|
|
name = 'DC Output',
|
|
setter = True,
|
|
),
|
|
|
|
# Device specific fields
|
|
'ac_output_mode': FieldAttributes(
|
|
type = FieldType.ENUM,
|
|
name = 'AC Output Mode',
|
|
options = OutputMode,
|
|
),
|
|
'internal_ac_voltage': VoltageFieldAttributes(
|
|
name = 'Internal AC Voltage',
|
|
),
|
|
'internal_current_one': CurrentFieldAttributes(
|
|
name = 'Internal Current Sensor 1',
|
|
),
|
|
'internal_power_one': PowerFieldAttributes(
|
|
name = 'Internal Power Sensor 1',
|
|
),
|
|
'internal_ac_frequency': FieldAttributes(
|
|
type = FieldType.NUMERIC,
|
|
name = 'Internal AC Frequency',
|
|
unit_of_measurement = 'Hz',
|
|
device_class = 'frequency',
|
|
state_class ='measurement',
|
|
),
|
|
'internal_dc_input_voltage': VoltageFieldAttributes(
|
|
name = 'Internal DC Input Voltage',
|
|
),
|
|
'internal_dc_input_power': PowerFieldAttributes(
|
|
name = 'Internal DC Input Power',
|
|
),
|
|
'internal_dc_input_current': CurrentFieldAttributes(
|
|
name = 'Internal DC Input Current',
|
|
),
|
|
'power_off': FieldAttributes(
|
|
type = FieldType.BUTTON,
|
|
setter = True,
|
|
name = 'Power Off',
|
|
),
|
|
'auto_sleep_mode': FieldAttributes(
|
|
type = FieldType.ENUM,
|
|
setter = True,
|
|
name = 'Screen Auto Sleep Mode',
|
|
options = AutoSleepMode,
|
|
),
|
|
}
|
|
|
|
def PACK_FIELD_ATTRIBUTES(pack: int):
|
|
return {
|
|
'pack_voltage': VoltageFieldAttributes(
|
|
name = f'Battery Pack {pack} Voltage',
|
|
),
|
|
'pack_battery_percent': FieldAttributes(
|
|
type = FieldType,
|
|
name = f'Battery Pack {pack} Percent',
|
|
unit_of_measurement = '%',
|
|
device_class ='battery',
|
|
state_class ='measurement',
|
|
),
|
|
}
|