Add Custom Drink Entities Tami4 Edge (#124506)

* Add drinks as button entities instead of using actions

* Remove button extensions

* Add an extension to create new buttons

* Use translation key for buttons names

* Change translation key wording

* Call async_add_entities once

* Add icons

* Update homeassistant/components/tami4/button.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
pull/123306/head
Tal Taub 2024-09-04 21:29:06 +03:00 committed by GitHub
parent c4029300c2
commit c4c8e74a8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 56 additions and 9 deletions

View File

@ -5,10 +5,12 @@ from dataclasses import dataclass
import logging
from Tami4EdgeAPI import Tami4EdgeAPI
from Tami4EdgeAPI.drink import Drink
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import API, DOMAIN
@ -24,12 +26,17 @@ class Tami4EdgeButtonEntityDescription(ButtonEntityDescription):
press_fn: Callable[[Tami4EdgeAPI], None]
BUTTONS: tuple[Tami4EdgeButtonEntityDescription] = (
Tami4EdgeButtonEntityDescription(
key="boil_water",
translation_key="boil_water",
press_fn=lambda api: api.boil_water(),
),
@dataclass(frozen=True, kw_only=True)
class Tami4EdgeDrinkButtonEntityDescription(ButtonEntityDescription):
"""A class that describes Tami4Edge Drink button entities."""
press_fn: Callable[[Tami4EdgeAPI, Drink], None]
BOIL_WATER_BUTTON = Tami4EdgeButtonEntityDescription(
key="boil_water",
translation_key="boil_water",
press_fn=lambda api: api.boil_water(),
)
@ -37,12 +44,29 @@ async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Perform the setup for Tami4Edge."""
api: Tami4EdgeAPI = hass.data[DOMAIN][entry.entry_id][API]
async_add_entities(
Tami4EdgeButton(api, entity_description) for entity_description in BUTTONS
api: Tami4EdgeAPI = hass.data[DOMAIN][entry.entry_id][API]
buttons: list[Tami4EdgeBaseEntity] = [Tami4EdgeButton(api, BOIL_WATER_BUTTON)]
device = await hass.async_add_executor_job(api.get_device)
drinks = device.drinks
buttons.extend(
Tami4EdgeDrinkButton(
api=api,
entity_description=Tami4EdgeDrinkButtonEntityDescription(
key=drink.id,
translation_key="prepare_drink",
translation_placeholders={"drink_name": drink.name},
press_fn=lambda api, drink: api.prepare_drink(drink),
),
drink=drink,
)
for drink in drinks
)
async_add_entities(buttons)
class Tami4EdgeButton(Tami4EdgeBaseEntity, ButtonEntity):
"""Button entity for Tami4Edge."""
@ -52,3 +76,20 @@ class Tami4EdgeButton(Tami4EdgeBaseEntity, ButtonEntity):
def press(self) -> None:
"""Handle the button press."""
self.entity_description.press_fn(self._api)
class Tami4EdgeDrinkButton(Tami4EdgeBaseEntity, ButtonEntity):
"""Drink Button entity for Tami4Edge."""
entity_description: Tami4EdgeDrinkButtonEntityDescription
def __init__(
self, api: Tami4EdgeAPI, entity_description: EntityDescription, drink: Drink
) -> None:
"""Initialize the drink button."""
super().__init__(api=api, entity_description=entity_description)
self.drink = drink
def press(self) -> None:
"""Handle the button press."""
self.entity_description.press_fn(self._api, self.drink)

View File

@ -3,6 +3,9 @@
"button": {
"boil_water": {
"default": "mdi:kettle-steam"
},
"prepare_drink": {
"default": "mdi:beer"
}
},
"sensor": {

View File

@ -26,6 +26,9 @@
"button": {
"boil_water": {
"name": "Boil water"
},
"prepare_drink": {
"name": "Prepare {drink_name}"
}
}
},