Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Buttons for the RainMachine integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 
8 from regenmaschine.controller import Controller
9 from regenmaschine.errors import RainMachineError
10 
12  ButtonDeviceClass,
13  ButtonEntity,
14  ButtonEntityDescription,
15 )
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.exceptions import HomeAssistantError
19 from homeassistant.helpers.dispatcher import async_dispatcher_send
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 
22 from . import RainMachineConfigEntry
23 from .const import DATA_PROVISION_SETTINGS
24 from .entity import RainMachineEntity, RainMachineEntityDescription
25 
26 
27 @dataclass(frozen=True, kw_only=True)
29  ButtonEntityDescription, RainMachineEntityDescription
30 ):
31  """Describe a RainMachine button description."""
32 
33  push_action: Callable[[Controller], Awaitable]
34 
35 
36 BUTTON_KIND_REBOOT = "reboot"
37 
38 
39 async def _async_reboot(controller: Controller) -> None:
40  """Reboot the RainMachine."""
41  await controller.machine.reboot()
42 
43 
44 BUTTON_DESCRIPTIONS = (
46  key=BUTTON_KIND_REBOOT,
47  api_category=DATA_PROVISION_SETTINGS,
48  push_action=_async_reboot,
49  ),
50 )
51 
52 
54  hass: HomeAssistant,
55  entry: RainMachineConfigEntry,
56  async_add_entities: AddEntitiesCallback,
57 ) -> None:
58  """Set up RainMachine buttons based on a config entry."""
59  data = entry.runtime_data
61  RainMachineButton(entry, data, description)
62  for description in BUTTON_DESCRIPTIONS
63  )
64 
65 
67  """Define a RainMachine button."""
68 
69  _attr_device_class = ButtonDeviceClass.RESTART
70  _attr_entity_category = EntityCategory.CONFIG
71 
72  entity_description: RainMachineButtonDescription
73 
74  async def async_press(self) -> None:
75  """Send out a restart command."""
76  try:
77  await self.entity_descriptionentity_description.push_action(self._data_data.controller)
78  except RainMachineError as err:
79  raise HomeAssistantError(
80  f'Error while pressing button "{self.entity_id}": {err}'
81  ) from err
82 
83  async_dispatcher_send(self.hasshasshass, self.coordinator.signal_reboot_requested)
None _async_reboot(Controller controller)
Definition: button.py:39
None async_setup_entry(HomeAssistant hass, RainMachineConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:57
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:193