core/homeassistant/components/doorbird/event.py

89 lines
2.8 KiB
Python

"""Support for doorbird events."""
from typing import TYPE_CHECKING
from homeassistant.components.event import (
EventDeviceClass,
EventEntity,
EventEntityDescription,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .device import DoorbirdEvent
from .entity import DoorBirdEntity
from .models import DoorBirdConfigEntry, DoorBirdData
EVENT_DESCRIPTIONS = {
"doorbell": EventEntityDescription(
key="doorbell",
translation_key="doorbell",
device_class=EventDeviceClass.DOORBELL,
event_types=["ring"],
),
"motion": EventEntityDescription(
key="motion",
translation_key="motion",
device_class=EventDeviceClass.MOTION,
event_types=["motion"],
),
}
async def async_setup_entry(
hass: HomeAssistant,
config_entry: DoorBirdConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the DoorBird event platform."""
door_bird_data = config_entry.runtime_data
async_add_entities(
DoorBirdEventEntity(door_bird_data, doorbird_event, description)
for doorbird_event in door_bird_data.door_station.event_descriptions
if (description := EVENT_DESCRIPTIONS.get(doorbird_event.event_type))
)
class DoorBirdEventEntity(DoorBirdEntity, EventEntity):
"""A doorbird event entity."""
entity_description: EventEntityDescription
_attr_has_entity_name = True
def __init__(
self,
door_bird_data: DoorBirdData,
doorbird_event: DoorbirdEvent,
entity_description: EventEntityDescription,
) -> None:
"""Initialize an event for a doorbird device."""
super().__init__(door_bird_data)
self._doorbird_event = doorbird_event
self.entity_description = entity_description
event = doorbird_event.event
self._attr_unique_id = f"{self._mac_addr}_{event}"
slug_name = event.removeprefix(self._door_station.slug).strip("_")
friendly_name = slug_name.replace("_", " ")
self._attr_name = friendly_name[0:1].upper() + friendly_name[1:].lower()
async def async_added_to_hass(self) -> None:
"""Subscribe to device events."""
self.async_on_remove(
async_dispatcher_connect(
self.hass,
f"{DOMAIN}_{self._doorbird_event.event}",
self._async_handle_event,
)
)
@callback
def _async_handle_event(self) -> None:
"""Handle a device event."""
event_types = self.entity_description.event_types
if TYPE_CHECKING:
assert event_types is not None
self._trigger_event(event_type=event_types[0])
self.async_write_ha_state()