1 """Entities for Synology DSM."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
12 from .common
import SynoApi
13 from .const
import ATTRIBUTION, DOMAIN
14 from .coordinator
import (
15 SynologyDSMCentralUpdateCoordinator,
16 SynologyDSMUpdateCoordinator,
20 @dataclass(frozen=True, kw_only=True)
22 """Generic Synology DSM entity description."""
28 CoordinatorEntity[_CoordinatorT]
30 """Representation of a Synology NAS entry."""
32 entity_description: SynologyDSMEntityDescription
34 _attr_attribution = ATTRIBUTION
35 _attr_has_entity_name =
True
40 coordinator: _CoordinatorT,
41 description: SynologyDSMEntityDescription,
43 """Initialize the Synology DSM entity."""
45 self.entity_description = description
48 information = api.information
50 assert information
is not None
51 assert network
is not None
53 self._attr_unique_id: str = (
54 f
"{information.serial}_{description.api_key}:{description.key}"
57 identifiers={(DOMAIN, information.serial)},
58 name=network.hostname,
59 manufacturer=
"Synology",
60 model=information.model,
61 sw_version=information.version_string,
62 configuration_url=api.config_url,
66 """Register entity for updates from API."""
68 self._api.
subscribe(self.entity_description.api_key, self.unique_id)
74 SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator]
76 """Representation of a Synology NAS disk or volume entry."""
81 coordinator: SynologyDSMCentralUpdateCoordinator,
82 description: SynologyDSMEntityDescription,
83 device_id: str |
None =
None,
85 """Initialize the Synology DSM disk or volume entity."""
86 super().
__init__(api, coordinator, description)
94 information = api.information
96 assert information
is not None
97 assert storage
is not None
98 assert network
is not None
100 if "volume" in description.key:
102 volume = storage.get_volume(self.
_device_id_device_id)
103 assert volume
is not None
105 self.
_device_name_device_name = volume[
"id"].replace(
"_",
" ").capitalize()
110 volume[
"device_type"]
112 .replace(
"raid",
"RAID")
113 .replace(
"shr",
"SHR")
115 elif "disk" in description.key:
117 disk = storage.get_disk(self.
_device_id_device_id)
118 assert disk
is not None
125 self._attr_unique_id += f
"_{self._device_id}"
127 identifiers={(DOMAIN, f
"{information.serial}_{self._device_id}")},
128 name=f
"{network.hostname} ({self._device_name})",
132 via_device=(DOMAIN, information.serial),
133 configuration_url=self._api.config_url,
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMEntityDescription description, str|None device_id=None)
Callable[[], None] subscribe(HomeAssistant hass, str topic, MessageCallbackType msg_callback, int qos=DEFAULT_QOS, str encoding="utf-8")
None async_added_to_hass(self)
None __init__(self, SynoApi api, _CoordinatorT coordinator, SynologyDSMEntityDescription description)