Source code for aioafero.v1.models.standard_mixin
"""Handles generic information related to all devices."""
from dataclasses import dataclass, field
from aioafero.device import SplitDeviceId
from . import features
from .resource import DeviceInformation
from .sensor import AferoBinarySensor, AferoSensor
from .update_comparison import default_feature_for_update_comparison
[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: SplitDeviceId | 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)
[docs]
def feature_for_update_comparison(
self, field_name: str, put_feature: object | None
) -> object | None:
"""Return the cached feature used to suppress unchanged API writes."""
return default_feature_for_update_comparison(self, field_name, put_feature)
@property
def id(self):
"""ID for the device (split or normal)."""
return self._id
@property
def split_identifier(self) -> str | None:
"""Token used in the synthetic split id, or ``None`` if not split."""
return None if self.split is None else self.split.identifier
@property
def instance(self):
"""Instance for the split device."""
return None if self.split is None else self.split.instance
@property
def update_id(self) -> str:
"""ID used when sending updates to Afero API."""
return self.id if self.split is None else self.split.parent_id