core/homeassistant/components/mobile_app/logbook.py

64 lines
2.2 KiB
Python

"""Describe mobile_app logbook events."""
from __future__ import annotations
from collections.abc import Callable
from typing import Any
from homeassistant.components.logbook import (
LOGBOOK_ENTRY_ENTITY_ID,
LOGBOOK_ENTRY_ICON,
LOGBOOK_ENTRY_MESSAGE,
LOGBOOK_ENTRY_NAME,
)
from homeassistant.const import ATTR_FRIENDLY_NAME, ATTR_ICON
from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.util.event_type import EventType
from .const import DOMAIN
IOS_EVENT_ZONE_ENTERED = "ios.zone_entered"
IOS_EVENT_ZONE_EXITED = "ios.zone_exited"
ATTR_ZONE = "zone"
ATTR_SOURCE_DEVICE_NAME = "sourceDeviceName"
ATTR_SOURCE_DEVICE_ID = "sourceDeviceID"
EVENT_TO_DESCRIPTION: dict[EventType[Any] | str, str] = {
IOS_EVENT_ZONE_ENTERED: "entered zone",
IOS_EVENT_ZONE_EXITED: "exited zone",
}
@callback
def async_describe_events(
hass: HomeAssistant,
async_describe_event: Callable[[str, str, Callable[[Event], dict[str, str]]], None],
) -> None:
"""Describe logbook events."""
@callback
def async_describe_zone_event(event: Event) -> dict[str, str]:
"""Describe mobile_app logbook event."""
data = event.data
event_description = EVENT_TO_DESCRIPTION[event.event_type]
zone_entity_id = data.get(ATTR_ZONE)
source_device_name = data.get(
ATTR_SOURCE_DEVICE_NAME, data.get(ATTR_SOURCE_DEVICE_ID)
)
zone_name = None
zone_icon = None
if zone_entity_id and (zone_state := hass.states.get(zone_entity_id)):
zone_name = zone_state.attributes.get(ATTR_FRIENDLY_NAME)
zone_icon = zone_state.attributes.get(ATTR_ICON)
description = {
LOGBOOK_ENTRY_NAME: source_device_name,
LOGBOOK_ENTRY_MESSAGE: f"{event_description} {zone_name or zone_entity_id}",
LOGBOOK_ENTRY_ICON: zone_icon or "mdi:crosshairs-gps",
}
if zone_entity_id:
description[LOGBOOK_ENTRY_ENTITY_ID] = zone_entity_id
return description
async_describe_event(DOMAIN, IOS_EVENT_ZONE_ENTERED, async_describe_zone_event)
async_describe_event(DOMAIN, IOS_EVENT_ZONE_EXITED, async_describe_zone_event)