1
mirror of https://github.com/home-assistant/core synced 2024-08-02 23:40:32 +02:00
ha-core/homeassistant/components/zha/logbook.py
David F. Mulcahey 269fa14721
Fix bad conditional in ZHA logbook (#74277)
* Fix bad conditional in ZHA logbook

* change syntax
2022-06-30 23:59:35 +03:00

86 lines
2.9 KiB
Python

"""Describe ZHA logbook events."""
from __future__ import annotations
from collections.abc import Callable
from typing import TYPE_CHECKING
from homeassistant.components.logbook.const import (
LOGBOOK_ENTRY_MESSAGE,
LOGBOOK_ENTRY_NAME,
)
from homeassistant.const import ATTR_COMMAND, ATTR_DEVICE_ID
from homeassistant.core import Event, HomeAssistant, callback
import homeassistant.helpers.device_registry as dr
from .core.const import DOMAIN as ZHA_DOMAIN, ZHA_EVENT
from .core.helpers import async_get_zha_device
if TYPE_CHECKING:
from .core.device import ZHADevice
@callback
def async_describe_events(
hass: HomeAssistant,
async_describe_event: Callable[[str, str, Callable[[Event], dict[str, str]]], None],
) -> None:
"""Describe logbook events."""
device_registry = dr.async_get(hass)
@callback
def async_describe_zha_event(event: Event) -> dict[str, str]:
"""Describe zha logbook event."""
device: dr.DeviceEntry | None = None
device_name: str = "Unknown device"
zha_device: ZHADevice | None = None
event_data: dict = event.data
event_type: str | None = None
event_subtype: str | None = None
try:
device = device_registry.devices[event.data[ATTR_DEVICE_ID]]
if device:
device_name = device.name_by_user or device.name or "Unknown device"
zha_device = async_get_zha_device(hass, event.data[ATTR_DEVICE_ID])
except (KeyError, AttributeError):
pass
if (
zha_device
and (command := event_data.get(ATTR_COMMAND))
and (command_to_etype_subtype := zha_device.device_automation_commands)
and (etype_subtypes := command_to_etype_subtype.get(command))
):
all_triggers = zha_device.device_automation_triggers
for etype_subtype in etype_subtypes:
trigger = all_triggers[etype_subtype]
if not all(
event_data.get(key) == value for key, value in trigger.items()
):
continue
event_type, event_subtype = etype_subtype
break
if event_type is None:
event_type = event_data.get(ATTR_COMMAND, ZHA_EVENT)
if event_subtype is not None and event_subtype != event_type:
event_type = f"{event_type} - {event_subtype}"
if event_type is not None:
event_type = event_type.replace("_", " ").title()
if "event" in event_type.lower():
message = f"{event_type} was fired"
else:
message = f"{event_type} event was fired"
if params := event_data.get("params"):
message = f"{message} with parameters: {params}"
return {
LOGBOOK_ENTRY_NAME: device_name,
LOGBOOK_ENTRY_MESSAGE: message,
}
async_describe_event(ZHA_DOMAIN, ZHA_EVENT, async_describe_zha_event)