core/homeassistant/components/persistent_notification/trigger.py

82 lines
2.5 KiB
Python

"""Offer persistent_notifications triggered automation rules."""
from __future__ import annotations
import logging
from typing import Final
import voluptuous as vol
from homeassistant.const import CONF_PLATFORM
from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.trigger import TriggerActionType, TriggerData, TriggerInfo
from homeassistant.helpers.typing import ConfigType
from . import Notification, UpdateType, async_register_callback
_LOGGER = logging.getLogger(__name__)
CONF_NOTIFICATION_ID: Final = "notification_id"
CONF_UPDATE_TYPE: Final = "update_type"
TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend(
{
vol.Required(CONF_PLATFORM): "persistent_notification",
vol.Optional(CONF_NOTIFICATION_ID): str,
vol.Optional(CONF_UPDATE_TYPE): vol.All(
cv.ensure_list, [vol.Coerce(UpdateType)]
),
}
)
async def async_attach_trigger(
hass: HomeAssistant,
config: ConfigType,
action: TriggerActionType,
trigger_info: TriggerInfo,
) -> CALLBACK_TYPE:
"""Listen for state changes based on configuration."""
trigger_data: TriggerData = trigger_info["trigger_data"]
job = HassJob(action)
persistent_notification_id = config.get(CONF_NOTIFICATION_ID)
update_types = config.get(CONF_UPDATE_TYPE)
@callback
def persistent_notification_listener(
update_type: UpdateType, notifications: dict[str, Notification]
) -> None:
"""Listen for persistent_notification updates."""
for notification in notifications.values():
if update_types and update_type not in update_types:
continue
if (
persistent_notification_id
and notification[CONF_NOTIFICATION_ID] != persistent_notification_id
):
continue
hass.async_run_hass_job(
job,
{
"trigger": {
**trigger_data,
"platform": "persistent_notification",
"update_type": update_type,
"notification": notification,
}
},
)
_LOGGER.debug(
"Attaching persistent_notification trigger for ID: '%s', update_types: %s",
persistent_notification_id,
update_types,
)
return async_register_callback(hass, persistent_notification_listener)