1 """Support for Synology DSM buttons."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from dataclasses
import dataclass
8 from typing
import Any, Final
13 ButtonEntityDescription,
22 from .const
import DOMAIN
23 from .models
import SynologyDSMData
25 LOGGER = logging.getLogger(__name__)
28 @dataclass(frozen=True, kw_only=True)
30 """Class to describe a Synology DSM button entity."""
32 press_action: Callable[[SynoApi], Callable[[], Coroutine[Any, Any,
None]]]
39 device_class=ButtonDeviceClass.RESTART,
40 entity_category=EntityCategory.CONFIG,
41 press_action=
lambda syno_api: syno_api.async_reboot,
47 entity_category=EntityCategory.CONFIG,
48 press_action=
lambda syno_api: syno_api.async_shutdown,
56 async_add_entities: AddEntitiesCallback,
58 """Set buttons for device."""
59 data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
64 """Defines a Synology DSM button."""
66 entity_description: SynologyDSMbuttonDescription
71 description: SynologyDSMbuttonDescription,
73 """Initialize the Synology DSM binary_sensor entity."""
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}"
81 identifiers={(DOMAIN, api.information.serial)}
85 """Triggers the Synology DSM button press service."""
86 assert self.
syno_apisyno_api.network
is not None
90 self.
syno_apisyno_api.network.hostname,