Source code for aioafero.v1.models.standard_mixin

"""Handles generic information related to all devices."""

from dataclasses import dataclass, field

from . import features
from .resource import DeviceInformation
from .sensor import AferoBinarySensor, AferoSensor


[docs] @dataclass(kw_only=True) class StandardMixin: """Mixin for standard properties and methods.""" _id: str # ID used when interacting with Afero available: bool device_information: DeviceInformation = field(default_factory=DeviceInformation) split_identifier: str | None = None numbers: dict[tuple[str, str | None], features.NumbersFeature] | None = field( default_factory=dict ) selects: dict[tuple[str, str | None], features.SelectFeature] | None = field( default_factory=dict ) sensors: dict[str, AferoSensor] = field(default_factory=dict) binary_sensors: dict[str, AferoBinarySensor] = field(default_factory=dict) # Defined at initialization instances: dict = field(default_factory=dict, repr=False, init=False)
[docs] def __post_init__(self): """Configure the available instances.""" instances = {} for function in self.device_information.functions or []: instances[function["functionClass"]] = function.get( "functionInstance", None ) self.instances = instances
[docs] def get_instance(self, elem): """Lookup the instance associated with the elem.""" return self.instances.get(elem, None)
@property def id(self): """ID for the device (split or normal).""" return self._id @property def instance(self): """Instance for the split device.""" if self.split_identifier: return self.id.rsplit(f"-{self.split_identifier}-", 1)[1] return None @property def update_id(self) -> str: """ID used when sending updates to Afero API.""" if self.split_identifier: return self.id.rsplit(f"-{self.split_identifier}-", 1)[0] return self.id