Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for Synology DSM buttons."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 import logging
8 from typing import Any, Final
9 
11  ButtonDeviceClass,
12  ButtonEntity,
13  ButtonEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.device_registry import DeviceInfo
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from . import SynoApi
22 from .const import DOMAIN
23 from .models import SynologyDSMData
24 
25 LOGGER = logging.getLogger(__name__)
26 
27 
28 @dataclass(frozen=True, kw_only=True)
30  """Class to describe a Synology DSM button entity."""
31 
32  press_action: Callable[[SynoApi], Callable[[], Coroutine[Any, Any, None]]]
33 
34 
35 BUTTONS: Final = [
37  key="reboot",
38  name="Reboot",
39  device_class=ButtonDeviceClass.RESTART,
40  entity_category=EntityCategory.CONFIG,
41  press_action=lambda syno_api: syno_api.async_reboot,
42  ),
44  key="shutdown",
45  name="Shutdown",
46  icon="mdi:power",
47  entity_category=EntityCategory.CONFIG,
48  press_action=lambda syno_api: syno_api.async_shutdown,
49  ),
50 ]
51 
52 
54  hass: HomeAssistant,
55  entry: ConfigEntry,
56  async_add_entities: AddEntitiesCallback,
57 ) -> None:
58  """Set buttons for device."""
59  data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
60  async_add_entities(SynologyDSMButton(data.api, button) for button in BUTTONS)
61 
62 
64  """Defines a Synology DSM button."""
65 
66  entity_description: SynologyDSMbuttonDescription
67 
68  def __init__(
69  self,
70  api: SynoApi,
71  description: SynologyDSMbuttonDescription,
72  ) -> None:
73  """Initialize the Synology DSM binary_sensor entity."""
74  self.entity_descriptionentity_description = description
75  self.syno_apisyno_api = api
76  assert api.network is not None
77  assert api.information is not None
78  self._attr_name_attr_name = f"{api.network.hostname} {description.name}"
79  self._attr_unique_id_attr_unique_id = f"{api.information.serial}_{description.key}"
80  self._attr_device_info_attr_device_info = DeviceInfo(
81  identifiers={(DOMAIN, api.information.serial)}
82  )
83 
84  async def async_press(self) -> None:
85  """Triggers the Synology DSM button press service."""
86  assert self.syno_apisyno_api.network is not None
87  LOGGER.debug(
88  "Trigger %s for %s",
89  self.entity_descriptionentity_description.key,
90  self.syno_apisyno_api.network.hostname,
91  )
92  await self.entity_descriptionentity_description.press_action(self.syno_apisyno_api)()
None __init__(self, SynoApi api, SynologyDSMbuttonDescription description)
Definition: button.py:72
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:57