core/homeassistant/components/knocki/event.py

82 lines
2.6 KiB
Python

"""Event entity for Knocki integration."""
from knocki import Event, EventType, KnockiClient, Trigger
from homeassistant.components.event import EventEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import KnockiConfigEntry
from .const import DOMAIN
async def async_setup_entry(
hass: HomeAssistant,
entry: KnockiConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Knocki from a config entry."""
coordinator = entry.runtime_data
added_triggers = set(coordinator.data)
@callback
def _async_add_entities() -> None:
current_triggers = set(coordinator.data)
new_triggers = current_triggers - added_triggers
added_triggers.update(new_triggers)
if new_triggers:
async_add_entities(
KnockiTrigger(coordinator.data[trigger], coordinator.client)
for trigger in new_triggers
)
coordinator.async_add_listener(_async_add_entities)
async_add_entities(
KnockiTrigger(trigger, coordinator.client)
for trigger in coordinator.data.values()
)
EVENT_TRIGGERED = "triggered"
class KnockiTrigger(EventEntity):
"""Representation of a Knocki trigger."""
_attr_event_types = [EVENT_TRIGGERED]
_attr_has_entity_name = True
_attr_should_poll = False
_attr_translation_key = "knocki"
def __init__(self, trigger: Trigger, client: KnockiClient) -> None:
"""Initialize the entity."""
self._trigger = trigger
self._client = client
self._attr_name = trigger.details.name
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, trigger.device_id)},
manufacturer="Knocki",
serial_number=trigger.device_id,
name=trigger.device_id,
)
self._attr_unique_id = f"{trigger.device_id}_{trigger.details.trigger_id}"
async def async_added_to_hass(self) -> None:
"""Register listener."""
await super().async_added_to_hass()
self.async_on_remove(
self._client.register_listener(EventType.TRIGGERED, self._handle_event)
)
def _handle_event(self, event: Event) -> None:
"""Handle incoming event."""
if (
event.payload.details.trigger_id == self._trigger.details.trigger_id
and event.payload.device_id == self._trigger.device_id
):
self._trigger_event(EVENT_TRIGGERED)
self.schedule_update_ha_state()