diff --git a/.coveragerc b/.coveragerc index 942f32eb9a567896a3cc3500890c8a28995d27b1..44b654d05ef58046c40f074ecead6e2e29eddac1 100644 --- a/.coveragerc +++ b/.coveragerc @@ -641,6 +641,7 @@ omit = homeassistant/components/kwb/sensor.py homeassistant/components/lacrosse/sensor.py homeassistant/components/lametric/__init__.py + homeassistant/components/lametric/button.py homeassistant/components/lametric/coordinator.py homeassistant/components/lametric/entity.py homeassistant/components/lametric/notify.py diff --git a/homeassistant/components/lametric/button.py b/homeassistant/components/lametric/button.py new file mode 100644 index 0000000000000000000000000000000000000000..4d8c75f0ab0e0f66e392f43e30a120ee98a699dc --- /dev/null +++ b/homeassistant/components/lametric/button.py @@ -0,0 +1,86 @@ +"""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.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import EntityCategory +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from .const import DOMAIN +from .coordinator import LaMetricDataUpdateCoordinator +from .entity import LaMetricEntity + + +@dataclass +class LaMetricButtonEntityDescriptionMixin: + """Mixin values for LaMetric entities.""" + + press_fn: Callable[[LaMetricDevice], Awaitable[Any]] + + +@dataclass +class LaMetricButtonEntityDescription( + ButtonEntityDescription, LaMetricButtonEntityDescriptionMixin +): + """Class describing LaMetric button entities.""" + + +BUTTONS = [ + LaMetricButtonEntityDescription( + key="app_next", + name="Next app", + icon="mdi:arrow-right-bold", + entity_category=EntityCategory.CONFIG, + press_fn=lambda api: api.app_next(), + ), + LaMetricButtonEntityDescription( + key="app_previous", + name="Previous app", + icon="mdi:arrow-left-bold", + entity_category=EntityCategory.CONFIG, + press_fn=lambda api: api.app_previous(), + ), +] + + +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up LaMetric button based on a config entry.""" + coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + 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}" + + async def async_press(self) -> None: + """Send out a command to LaMetric.""" + await self.entity_description.press_fn(self.coordinator.lametric) diff --git a/homeassistant/components/lametric/const.py b/homeassistant/components/lametric/const.py index 0fe4b3f21d8fe2ec38a24d7f1d24ce76e0025de0..da84450e784e856bcfcd892b82ebdc5d032952a2 100644 --- a/homeassistant/components/lametric/const.py +++ b/homeassistant/components/lametric/const.py @@ -7,7 +7,7 @@ from typing import Final from homeassistant.const import Platform DOMAIN: Final = "lametric" -PLATFORMS = [Platform.NUMBER] +PLATFORMS = [Platform.BUTTON, Platform.NUMBER] LOGGER = logging.getLogger(__package__) SCAN_INTERVAL = timedelta(seconds=30)