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>
This commit is contained in:
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 import logging
from Tami4EdgeAPI import Tami4EdgeAPI from Tami4EdgeAPI import Tami4EdgeAPI
from Tami4EdgeAPI.drink import Drink
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import API, DOMAIN from .const import API, DOMAIN
@ -24,12 +26,17 @@ class Tami4EdgeButtonEntityDescription(ButtonEntityDescription):
press_fn: Callable[[Tami4EdgeAPI], None] press_fn: Callable[[Tami4EdgeAPI], None]
BUTTONS: tuple[Tami4EdgeButtonEntityDescription] = ( @dataclass(frozen=True, kw_only=True)
Tami4EdgeButtonEntityDescription( class Tami4EdgeDrinkButtonEntityDescription(ButtonEntityDescription):
key="boil_water", """A class that describes Tami4Edge Drink button entities."""
translation_key="boil_water",
press_fn=lambda api: api.boil_water(), 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 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None: ) -> None:
"""Perform the setup for Tami4Edge.""" """Perform the setup for Tami4Edge."""
api: Tami4EdgeAPI = hass.data[DOMAIN][entry.entry_id][API]
async_add_entities( api: Tami4EdgeAPI = hass.data[DOMAIN][entry.entry_id][API]
Tami4EdgeButton(api, entity_description) for entity_description in BUTTONS 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): class Tami4EdgeButton(Tami4EdgeBaseEntity, ButtonEntity):
"""Button entity for Tami4Edge.""" """Button entity for Tami4Edge."""
@ -52,3 +76,20 @@ class Tami4EdgeButton(Tami4EdgeBaseEntity, ButtonEntity):
def press(self) -> None: def press(self) -> None:
"""Handle the button press.""" """Handle the button press."""
self.entity_description.press_fn(self._api) 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": { "button": {
"boil_water": { "boil_water": {
"default": "mdi:kettle-steam" "default": "mdi:kettle-steam"
},
"prepare_drink": {
"default": "mdi:beer"
} }
}, },
"sensor": { "sensor": {

View File

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