core/homeassistant/components/lametric/button.py

91 lines
2.8 KiB
Python

"""Support for LaMetric buttons."""
from __future__ import annotations
from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from typing import Any
from demetriek import LaMetricDevice
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity
from .helpers import lametric_exception_handler
@dataclass(frozen=True, kw_only=True)
class LaMetricButtonEntityDescription(ButtonEntityDescription):
"""Class describing LaMetric button entities."""
press_fn: Callable[[LaMetricDevice], Awaitable[Any]]
BUTTONS = [
LaMetricButtonEntityDescription(
key="app_next",
translation_key="app_next",
entity_category=EntityCategory.CONFIG,
press_fn=lambda api: api.app_next(),
),
LaMetricButtonEntityDescription(
key="app_previous",
translation_key="app_previous",
entity_category=EntityCategory.CONFIG,
press_fn=lambda api: api.app_previous(),
),
LaMetricButtonEntityDescription(
key="dismiss_current",
translation_key="dismiss_current",
entity_category=EntityCategory.CONFIG,
press_fn=lambda api: api.dismiss_current_notification(),
),
LaMetricButtonEntityDescription(
key="dismiss_all",
translation_key="dismiss_all",
entity_category=EntityCategory.CONFIG,
press_fn=lambda api: api.dismiss_all_notifications(),
),
]
async def async_setup_entry(
hass: HomeAssistant,
entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up LaMetric button based on a config entry."""
coordinator = entry.runtime_data
async_add_entities(
LaMetricButtonEntity(
coordinator=coordinator,
description=description,
)
for description in BUTTONS
)
class LaMetricButtonEntity(LaMetricEntity, ButtonEntity):
"""Representation of a LaMetric number."""
entity_description: LaMetricButtonEntityDescription
def __init__(
self,
coordinator: LaMetricDataUpdateCoordinator,
description: LaMetricButtonEntityDescription,
) -> None:
"""Initialize the button entity."""
super().__init__(coordinator=coordinator)
self.entity_description = description
self._attr_unique_id = f"{coordinator.data.serial_number}-{description.key}"
@lametric_exception_handler
async def async_press(self) -> None:
"""Send out a command to LaMetric."""
await self.entity_description.press_fn(self.coordinator.lametric)