Source code for aioafero.v1.controllers.security_system_keypad

"""Controller holding and managing Afero IoT resources of type `security-system-keypad`."""

from aioafero.device import AferoDevice
from aioafero.errors import DeviceNotFound
from aioafero.v1.models import SecuritySystemKeypad, SecuritySystemKeypadPut, features
from aioafero.v1.models.resource import DeviceInformation, ResourceTypes

from .base import AferoBinarySensor, BaseResourcesController


[docs] class SecuritySystemKeypadController(BaseResourcesController[SecuritySystemKeypad]): """Security keypads on ``bridge.security_systems_keypads``.""" ITEM_TYPE_ID = ResourceTypes.DEVICE ITEM_TYPES = [ResourceTypes.SECURITY_SYSTEM_KEYPAD] ITEM_CLS = SecuritySystemKeypad # Binary sensors map key -> alerting value ITEM_BINARY_SENSORS: dict[str, str] = { "tamper-detection": "tampered", } # Elements that map to Select. func class / func instance to name ITEM_SELECTS = { ("volume", "buzzer-volume"): "Buzzer Volume", }
[docs] async def initialize_elem(self, afero_device: AferoDevice) -> SecuritySystemKeypad: """Initialize the element. :param afero_device: Afero Device that contains the updated states :return: Newly initialized resource """ available: bool = False selects: dict[tuple[str, str | None], features.SelectFeature] | None = {} binary_sensors: dict[str, AferoBinarySensor] = {} for state in afero_device.states: if state.functionClass == "available": available = state.value elif sensor := await self.initialize_sensor(state, afero_device.device_id): binary_sensors[sensor.id] = sensor elif select := await self.initialize_select(afero_device.functions, state): selects[select[0]] = select[1] self._items[afero_device.id] = SecuritySystemKeypad( _id=afero_device.id, available=available, binary_sensors=binary_sensors, selects=selects, device_information=DeviceInformation( device_class=afero_device.device_class, default_image=afero_device.default_image, default_name=afero_device.default_name, manufacturer=afero_device.manufacturerName, model=afero_device.model, name=afero_device.friendly_name, parent_id=afero_device.device_id, ), ) return self._items[afero_device.id]
[docs] async def update_elem(self, afero_device: AferoDevice) -> set: """Update the Security System with the latest API data. :param afero_device: Afero Device that contains the updated states :return: States that have been modified """ cur_item = self.get_device(afero_device.id) updated_keys = set() for state in afero_device.states: if state.functionClass == "available": if cur_item.available != state.value: updated_keys.add("available") cur_item.available = state.value elif ( (update_key := await self.update_sensor(state, cur_item)) or (update_key := await self.update_number(state, cur_item)) or (update_key := await self.update_select(state, cur_item)) ): updated_keys.add(update_key) return updated_keys
[docs] async def set_state( self, device_id: str, selects: dict[tuple[str, str | None], str] | None = None, ) -> None: """Update security keypad selects in the cloud. Args: device_id: Device ID from this controller. selects: Select features keyed by ``(functionClass, functionInstance)``. """ update_obj = SecuritySystemKeypadPut() try: cur_item = self.get_device(device_id) except DeviceNotFound: self._logger.info("Unable to find device %s", device_id) return if selects: for key, val in selects.items(): if key not in cur_item.selects: continue update_obj.selects[key] = features.SelectFeature( selected=val, selects=cur_item.selects[key].selects, name=cur_item.selects[key].name, ) await self.update(device_id, obj_in=update_obj)