mirror of https://github.com/home-assistant/core
82 lines
2.6 KiB
Python
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()
|