"""Binary sensors: connectivity и флаги op_status (PROTOCOL §8.4).""" from __future__ import annotations from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, BinarySensorEntity, ) from homeassistant.const import EntityCategory from pyfglair import Prop, State from pyfglair.templates import template_info from .const import OP_STATUS_BITS from .coordinator import FglairCoordinator, FglairRuntime from .entity import FglairEntity class FglairConnectivity(FglairEntity, BinarySensorEntity): _attr_translation_key = "connectivity" _attr_device_class = BinarySensorDeviceClass.CONNECTIVITY def __init__(self, coordinator: FglairCoordinator) -> None: super().__init__(coordinator, "connectivity", "connectivity") @property def available(self) -> bool: return True @property def is_on(self) -> bool: return self.coordinator.data.state == State.ONLINE class FglairStatusFlag(FglairEntity, BinarySensorEntity): _attr_entity_category = EntityCategory.DIAGNOSTIC def __init__( self, coordinator: FglairCoordinator, key: str, bit: int ) -> None: super().__init__(coordinator, f"op_status_{key}", key) self._bit = bit @property def is_on(self) -> bool: status = self.raw_value(Prop.OP_STATUS) if status is None: return False return bool(status & (1 << self._bit)) async def async_setup_entry(hass, entry, async_add_entities) -> None: runtime: FglairRuntime = entry.runtime_data coordinator = runtime.coordinator props = { info.prop for info in template_info(runtime.client.template) } entities = [FglairConnectivity(coordinator)] if Prop.OP_STATUS in props: entities.extend( FglairStatusFlag(coordinator, key, bit) for key, bit in OP_STATUS_BITS.items() ) async_add_entities(entities)