Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for Lektrico buttons."""
2 
3 from collections.abc import Callable, Coroutine
4 from dataclasses import dataclass
5 from typing import Any
6 
7 from lektricowifi import Device
8 
10  ButtonDeviceClass,
11  ButtonEntity,
12  ButtonEntityDescription,
13 )
14 from homeassistant.const import ATTR_SERIAL_NUMBER, CONF_TYPE, EntityCategory
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from . import LektricoConfigEntry, LektricoDeviceDataUpdateCoordinator
19 from .entity import LektricoEntity
20 
21 
22 @dataclass(frozen=True, kw_only=True)
24  """Describes Lektrico button entity."""
25 
26  press_fn: Callable[[Device], Coroutine[Any, Any, dict[Any, Any]]]
27 
28 
29 BUTTONS_FOR_CHARGERS: tuple[LektricoButtonEntityDescription, ...] = (
31  key="charge_start",
32  translation_key="charge_start",
33  entity_category=EntityCategory.CONFIG,
34  press_fn=lambda device: device.send_charge_start(),
35  ),
37  key="charge_stop",
38  translation_key="charge_stop",
39  entity_category=EntityCategory.CONFIG,
40  press_fn=lambda device: device.send_charge_stop(),
41  ),
43  key="reboot",
44  device_class=ButtonDeviceClass.RESTART,
45  entity_category=EntityCategory.CONFIG,
46  press_fn=lambda device: device.send_reset(),
47  ),
48 )
49 
50 BUTTONS_FOR_LB_DEVICES: tuple[LektricoButtonEntityDescription, ...] = (
52  key="reboot",
53  device_class=ButtonDeviceClass.RESTART,
54  entity_category=EntityCategory.CONFIG,
55  press_fn=lambda device: device.send_reset(),
56  ),
57 )
58 
59 
61  hass: HomeAssistant,
62  entry: LektricoConfigEntry,
63  async_add_entities: AddEntitiesCallback,
64 ) -> None:
65  """Set up Lektrico charger based on a config entry."""
66  coordinator = entry.runtime_data
67 
68  buttons_to_be_used: tuple[LektricoButtonEntityDescription, ...]
69  if coordinator.device_type in (Device.TYPE_1P7K, Device.TYPE_3P22K):
70  buttons_to_be_used = BUTTONS_FOR_CHARGERS
71  else:
72  buttons_to_be_used = BUTTONS_FOR_LB_DEVICES
73 
76  description,
77  coordinator,
78  f"{entry.data[CONF_TYPE]}_{entry.data[ATTR_SERIAL_NUMBER]}",
79  )
80  for description in buttons_to_be_used
81  )
82 
83 
85  """Defines an Lektrico button."""
86 
87  entity_description: LektricoButtonEntityDescription
88 
89  def __init__(
90  self,
91  description: LektricoButtonEntityDescription,
92  coordinator: LektricoDeviceDataUpdateCoordinator,
93  device_name: str,
94  ) -> None:
95  """Initialize Lektrico button."""
96  super().__init__(coordinator, device_name)
97  self.entity_descriptionentity_description = description
98  self._attr_unique_id_attr_unique_id = f"{coordinator.serial_number}-{description.key}"
99 
100  async def async_press(self) -> None:
101  """Press the button."""
102  await self.entity_descriptionentity_description.press_fn(self.coordinator.device)
None __init__(self, LektricoButtonEntityDescription description, LektricoDeviceDataUpdateCoordinator coordinator, str device_name)
Definition: button.py:94
None async_setup_entry(HomeAssistant hass, LektricoConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:64