Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for SLZB-06 buttons."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 import logging
8 
9 from pysmlight.web import CmdWrapper
10 
12  DOMAIN as BUTTON_DOMAIN,
13  ButtonDeviceClass,
14  ButtonEntity,
15  ButtonEntityDescription,
16 )
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.const import EntityCategory
19 from homeassistant.core import HomeAssistant, callback
20 from homeassistant.helpers import entity_registry as er
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 
23 from .const import DOMAIN
24 from .coordinator import SmDataUpdateCoordinator
25 from .entity import SmEntity
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 
30 @dataclass(frozen=True, kw_only=True)
32  """Class to describe a Button entity."""
33 
34  press_fn: Callable[[CmdWrapper], Awaitable[None]]
35 
36 
37 BUTTONS: list[SmButtonDescription] = [
39  key="core_restart",
40  translation_key="core_restart",
41  device_class=ButtonDeviceClass.RESTART,
42  press_fn=lambda cmd: cmd.reboot(),
43  ),
45  key="zigbee_restart",
46  translation_key="zigbee_restart",
47  device_class=ButtonDeviceClass.RESTART,
48  press_fn=lambda cmd: cmd.zb_restart(),
49  ),
51  key="zigbee_flash_mode",
52  translation_key="zigbee_flash_mode",
53  entity_registry_enabled_default=False,
54  press_fn=lambda cmd: cmd.zb_bootloader(),
55  ),
56 ]
57 
59  key="reconnect_zigbee_router",
60  translation_key="reconnect_zigbee_router",
61  entity_registry_enabled_default=False,
62  press_fn=lambda cmd: cmd.zb_router(),
63 )
64 
65 
67  hass: HomeAssistant,
68  entry: ConfigEntry,
69  async_add_entities: AddEntitiesCallback,
70 ) -> None:
71  """Set up SMLIGHT buttons based on a config entry."""
72  coordinator = entry.runtime_data.data
73 
74  async_add_entities(SmButton(coordinator, button) for button in BUTTONS)
75  entity_created = False
76 
77  @callback
78  def _check_router(startup: bool = False) -> None:
79  nonlocal entity_created
80 
81  if coordinator.data.info.zb_type == 1 and not entity_created:
82  async_add_entities([SmButton(coordinator, ROUTER)])
83  entity_created = True
84  elif coordinator.data.info.zb_type != 1 and (startup or entity_created):
85  entity_registry = er.async_get(hass)
86  if entity_id := entity_registry.async_get_entity_id(
87  BUTTON_DOMAIN, DOMAIN, f"{coordinator.unique_id}-{ROUTER.key}"
88  ):
89  entity_registry.async_remove(entity_id)
90 
91  coordinator.async_add_listener(_check_router)
92  _check_router(startup=True)
93 
94 
96  """Defines a SLZB-06 button."""
97 
98  coordinator: SmDataUpdateCoordinator
99  entity_description: SmButtonDescription
100  _attr_entity_category = EntityCategory.CONFIG
101 
102  def __init__(
103  self,
104  coordinator: SmDataUpdateCoordinator,
105  description: SmButtonDescription,
106  ) -> None:
107  """Initialize SLZB-06 button entity."""
108  super().__init__(coordinator)
109 
110  self.entity_descriptionentity_description = description
111  self._attr_unique_id_attr_unique_id = f"{coordinator.unique_id}-{description.key}"
112 
113  async def async_press(self) -> None:
114  """Trigger button press."""
115  await self.entity_descriptionentity_description.press_fn(self.coordinator.client.cmds)
None __init__(self, SmDataUpdateCoordinator coordinator, SmButtonDescription description)
Definition: button.py:106
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:70