Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Button platform for La Marzocco espresso machines."""
2 
3 import asyncio
4 from collections.abc import Callable, Coroutine
5 from dataclasses import dataclass
6 from typing import Any
7 
8 from pylamarzocco.exceptions import RequestNotSuccessful
9 
10 from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
11 from homeassistant.core import HomeAssistant
12 from homeassistant.exceptions import HomeAssistantError
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .const import DOMAIN
16 from .coordinator import LaMarzoccoConfigEntry, LaMarzoccoUpdateCoordinator
17 from .entity import LaMarzoccoEntity, LaMarzoccoEntityDescription
18 
19 PARALLEL_UPDATES = 1
20 BACKFLUSH_ENABLED_DURATION = 15
21 
22 
23 @dataclass(frozen=True, kw_only=True)
25  LaMarzoccoEntityDescription,
26  ButtonEntityDescription,
27 ):
28  """Description of a La Marzocco button."""
29 
30  press_fn: Callable[[LaMarzoccoUpdateCoordinator], Coroutine[Any, Any, None]]
31 
32 
33 async def async_backflush_and_update(coordinator: LaMarzoccoUpdateCoordinator) -> None:
34  """Press backflush button."""
35  await coordinator.device.start_backflush()
36  # lib will set state optimistically
37  coordinator.async_set_updated_data(None)
38  # backflush is enabled for 15 seconds
39  # then turns off automatically
40  await asyncio.sleep(BACKFLUSH_ENABLED_DURATION + 1)
41  await coordinator.async_request_refresh()
42 
43 
44 ENTITIES: tuple[LaMarzoccoButtonEntityDescription, ...] = (
46  key="start_backflush",
47  translation_key="start_backflush",
48  press_fn=async_backflush_and_update,
49  ),
50 )
51 
52 
54  hass: HomeAssistant,
55  entry: LaMarzoccoConfigEntry,
56  async_add_entities: AddEntitiesCallback,
57 ) -> None:
58  """Set up button entities."""
59 
60  coordinator = entry.runtime_data
62  LaMarzoccoButtonEntity(coordinator, description)
63  for description in ENTITIES
64  if description.supported_fn(coordinator)
65  )
66 
67 
69  """La Marzocco Button Entity."""
70 
71  entity_description: LaMarzoccoButtonEntityDescription
72 
73  async def async_press(self) -> None:
74  """Press button."""
75  try:
76  await self.entity_descriptionentity_description.press_fn(self.coordinator)
77  except RequestNotSuccessful as exc:
78  raise HomeAssistantError(
79  translation_domain=DOMAIN,
80  translation_key="button_error",
81  translation_placeholders={
82  "key": self.entity_descriptionentity_description.key,
83  },
84  ) from exc
None async_setup_entry(HomeAssistant hass, LaMarzoccoConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:57
None async_backflush_and_update(LaMarzoccoUpdateCoordinator coordinator)
Definition: button.py:33