core/homeassistant/components/fully_kiosk/notify.py

75 lines
2.3 KiB
Python

"""Support for Fully Kiosk Browser notifications."""
from __future__ import annotations
from dataclasses import dataclass
from fullykiosk import FullyKioskError
from homeassistant.components.notify import NotifyEntity, NotifyEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .coordinator import FullyKioskDataUpdateCoordinator
from .entity import FullyKioskEntity
@dataclass(frozen=True, kw_only=True)
class FullyNotifyEntityDescription(NotifyEntityDescription):
"""Fully Kiosk Browser notify entity description."""
cmd: str
NOTIFIERS: tuple[FullyNotifyEntityDescription, ...] = (
FullyNotifyEntityDescription(
key="overlay_message",
translation_key="overlay_message",
cmd="setOverlayMessage",
),
FullyNotifyEntityDescription(
key="tts",
translation_key="tts",
cmd="textToSpeech",
),
)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the Fully Kiosk Browser notify entities."""
coordinator: FullyKioskDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
FullyNotifyEntity(coordinator, description) for description in NOTIFIERS
)
class FullyNotifyEntity(FullyKioskEntity, NotifyEntity):
"""Implement the notify entity for Fully Kiosk Browser."""
entity_description: FullyNotifyEntityDescription
def __init__(
self,
coordinator: FullyKioskDataUpdateCoordinator,
description: FullyNotifyEntityDescription,
) -> None:
"""Initialize the entity."""
FullyKioskEntity.__init__(self, coordinator)
NotifyEntity.__init__(self)
self.entity_description = description
self._attr_unique_id = f"{coordinator.data['deviceID']}-{description.key}"
async def async_send_message(self, message: str, title: str | None = None) -> None:
"""Send a message."""
try:
await self.coordinator.fully.sendCommand(
self.entity_description.cmd, text=message
)
except FullyKioskError as err:
raise HomeAssistantError(err) from err