Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Entities for Synology DSM."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from typing import Any
7 
8 from homeassistant.helpers.device_registry import DeviceInfo
9 from homeassistant.helpers.entity import EntityDescription
10 from homeassistant.helpers.update_coordinator import CoordinatorEntity
11 
12 from .common import SynoApi
13 from .const import ATTRIBUTION, DOMAIN
14 from .coordinator import (
15  SynologyDSMCentralUpdateCoordinator,
16  SynologyDSMUpdateCoordinator,
17 )
18 
19 
20 @dataclass(frozen=True, kw_only=True)
22  """Generic Synology DSM entity description."""
23 
24  api_key: str
25 
26 
27 class SynologyDSMBaseEntity[_CoordinatorT: SynologyDSMUpdateCoordinator[Any]](
28  CoordinatorEntity[_CoordinatorT]
29 ):
30  """Representation of a Synology NAS entry."""
31 
32  entity_description: SynologyDSMEntityDescription
33  unique_id: str
34  _attr_attribution = ATTRIBUTION
35  _attr_has_entity_name = True
36 
37  def __init__(
38  self,
39  api: SynoApi,
40  coordinator: _CoordinatorT,
41  description: SynologyDSMEntityDescription,
42  ) -> None:
43  """Initialize the Synology DSM entity."""
44  super().__init__(coordinator)
45  self.entity_description = description
46 
47  self._api = api
48  information = api.information
49  network = api.network
50  assert information is not None
51  assert network is not None
52 
53  self._attr_unique_id: str = (
54  f"{information.serial}_{description.api_key}:{description.key}"
55  )
56  self._attr_device_info = DeviceInfo(
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,
63  )
64 
65  async def async_added_to_hass(self) -> None:
66  """Register entity for updates from API."""
67  self.async_on_remove(
68  self._api.subscribe(self.entity_description.api_key, self.unique_id)
69  )
70  await super().async_added_to_hass()
71 
72 
74  SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator]
75 ):
76  """Representation of a Synology NAS disk or volume entry."""
77 
78  def __init__(
79  self,
80  api: SynoApi,
81  coordinator: SynologyDSMCentralUpdateCoordinator,
82  description: SynologyDSMEntityDescription,
83  device_id: str | None = None,
84  ) -> None:
85  """Initialize the Synology DSM disk or volume entity."""
86  super().__init__(api, coordinator, description)
87  self._device_id_device_id = device_id
88  self._device_name_device_name: str | None = None
89  self._device_manufacturer_device_manufacturer: str | None = None
90  self._device_model_device_model: str | None = None
91  self._device_firmware_device_firmware: str | None = None
92  self._device_type_device_type = None
93  storage = api.storage
94  information = api.information
95  network = api.network
96  assert information is not None
97  assert storage is not None
98  assert network is not None
99 
100  if "volume" in description.key:
101  assert self._device_id_device_id is not None
102  volume = storage.get_volume(self._device_id_device_id)
103  assert volume is not None
104  # Volume does not have a name
105  self._device_name_device_name = volume["id"].replace("_", " ").capitalize()
106  self._device_manufacturer_device_manufacturer = "Synology"
107  self._device_model_device_model = information.model
108  self._device_firmware_device_firmware = information.version_string
109  self._device_type_device_type = (
110  volume["device_type"]
111  .replace("_", " ")
112  .replace("raid", "RAID")
113  .replace("shr", "SHR")
114  )
115  elif "disk" in description.key:
116  assert self._device_id_device_id is not None
117  disk = storage.get_disk(self._device_id_device_id)
118  assert disk is not None
119  self._device_name_device_name = disk["name"]
120  self._device_manufacturer_device_manufacturer = disk["vendor"]
121  self._device_model_device_model = disk["model"].strip()
122  self._device_firmware_device_firmware = disk["firm"]
123  self._device_type_device_type = disk["diskType"]
124 
125  self._attr_unique_id += f"_{self._device_id}"
126  self._attr_device_info_attr_device_info = DeviceInfo(
127  identifiers={(DOMAIN, f"{information.serial}_{self._device_id}")},
128  name=f"{network.hostname} ({self._device_name})",
129  manufacturer=self._device_manufacturer_device_manufacturer,
130  model=self._device_model_device_model,
131  sw_version=self._device_firmware_device_firmware,
132  via_device=(DOMAIN, information.serial),
133  configuration_url=self._api.config_url,
134  )
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMEntityDescription description, str|None device_id=None)
Definition: entity.py:84
Callable[[], None] subscribe(HomeAssistant hass, str topic, MessageCallbackType msg_callback, int qos=DEFAULT_QOS, str encoding="utf-8")
Definition: client.py:247
None __init__(self, SynoApi api, _CoordinatorT coordinator, SynologyDSMEntityDescription description)
Definition: entity.py:42