1 """Support for Synology DSM sensors."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from datetime
import datetime, timedelta
7 from typing
import cast
9 from synology_dsm.api.core.utilization
import SynoCoreUtilization
10 from synology_dsm.api.dsm.information
import SynoDSMInformation
11 from synology_dsm.api.storage.storage
import SynoStorage
16 SensorEntityDescription,
34 from .const
import CONF_VOLUMES, DOMAIN, ENTITY_UNIT_LOAD
35 from .coordinator
import SynologyDSMCentralUpdateCoordinator
37 SynologyDSMBaseEntity,
38 SynologyDSMDeviceEntity,
39 SynologyDSMEntityDescription,
41 from .models
import SynologyDSMData
44 @dataclass(frozen=True, kw_only=True)
46 SensorEntityDescription, SynologyDSMEntityDescription
48 """Describes Synology DSM sensor entity."""
51 UTILISATION_SENSORS: tuple[SynologyDSMSensorEntityDescription, ...] = (
53 api_key=SynoCoreUtilization.API_KEY,
55 translation_key=
"cpu_other_load",
56 native_unit_of_measurement=PERCENTAGE,
57 entity_registry_enabled_default=
False,
58 state_class=SensorStateClass.MEASUREMENT,
61 api_key=SynoCoreUtilization.API_KEY,
63 translation_key=
"cpu_user_load",
64 native_unit_of_measurement=PERCENTAGE,
65 state_class=SensorStateClass.MEASUREMENT,
68 api_key=SynoCoreUtilization.API_KEY,
69 key=
"cpu_system_load",
70 translation_key=
"cpu_system_load",
71 native_unit_of_measurement=PERCENTAGE,
72 entity_registry_enabled_default=
False,
73 state_class=SensorStateClass.MEASUREMENT,
76 api_key=SynoCoreUtilization.API_KEY,
78 translation_key=
"cpu_total_load",
79 native_unit_of_measurement=PERCENTAGE,
80 state_class=SensorStateClass.MEASUREMENT,
83 api_key=SynoCoreUtilization.API_KEY,
85 translation_key=
"cpu_1min_load",
86 native_unit_of_measurement=ENTITY_UNIT_LOAD,
87 entity_registry_enabled_default=
False,
90 api_key=SynoCoreUtilization.API_KEY,
92 translation_key=
"cpu_5min_load",
93 native_unit_of_measurement=ENTITY_UNIT_LOAD,
96 api_key=SynoCoreUtilization.API_KEY,
98 translation_key=
"cpu_15min_load",
99 native_unit_of_measurement=ENTITY_UNIT_LOAD,
102 api_key=SynoCoreUtilization.API_KEY,
103 key=
"memory_real_usage",
104 translation_key=
"memory_real_usage",
105 native_unit_of_measurement=PERCENTAGE,
106 state_class=SensorStateClass.MEASUREMENT,
109 api_key=SynoCoreUtilization.API_KEY,
111 translation_key=
"memory_size",
112 native_unit_of_measurement=UnitOfInformation.BYTES,
113 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
114 suggested_display_precision=1,
115 device_class=SensorDeviceClass.DATA_SIZE,
116 entity_registry_enabled_default=
False,
117 state_class=SensorStateClass.MEASUREMENT,
120 api_key=SynoCoreUtilization.API_KEY,
122 translation_key=
"memory_cached",
123 native_unit_of_measurement=UnitOfInformation.BYTES,
124 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
125 suggested_display_precision=1,
126 device_class=SensorDeviceClass.DATA_SIZE,
127 entity_registry_enabled_default=
False,
128 state_class=SensorStateClass.MEASUREMENT,
131 api_key=SynoCoreUtilization.API_KEY,
132 key=
"memory_available_swap",
133 translation_key=
"memory_available_swap",
134 native_unit_of_measurement=UnitOfInformation.BYTES,
135 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
136 suggested_display_precision=1,
137 device_class=SensorDeviceClass.DATA_SIZE,
138 state_class=SensorStateClass.MEASUREMENT,
141 api_key=SynoCoreUtilization.API_KEY,
142 key=
"memory_available_real",
143 translation_key=
"memory_available_real",
144 native_unit_of_measurement=UnitOfInformation.BYTES,
145 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
146 suggested_display_precision=1,
147 device_class=SensorDeviceClass.DATA_SIZE,
148 state_class=SensorStateClass.MEASUREMENT,
151 api_key=SynoCoreUtilization.API_KEY,
152 key=
"memory_total_swap",
153 translation_key=
"memory_total_swap",
154 native_unit_of_measurement=UnitOfInformation.BYTES,
155 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
156 suggested_display_precision=1,
157 device_class=SensorDeviceClass.DATA_SIZE,
158 state_class=SensorStateClass.MEASUREMENT,
161 api_key=SynoCoreUtilization.API_KEY,
162 key=
"memory_total_real",
163 translation_key=
"memory_total_real",
164 native_unit_of_measurement=UnitOfInformation.BYTES,
165 suggested_unit_of_measurement=UnitOfInformation.MEGABYTES,
166 suggested_display_precision=1,
167 device_class=SensorDeviceClass.DATA_SIZE,
168 state_class=SensorStateClass.MEASUREMENT,
171 api_key=SynoCoreUtilization.API_KEY,
173 translation_key=
"network_up",
174 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
175 suggested_unit_of_measurement=UnitOfDataRate.KILOBYTES_PER_SECOND,
176 suggested_display_precision=1,
177 device_class=SensorDeviceClass.DATA_RATE,
178 state_class=SensorStateClass.MEASUREMENT,
181 api_key=SynoCoreUtilization.API_KEY,
183 translation_key=
"network_down",
184 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
185 suggested_unit_of_measurement=UnitOfDataRate.KILOBYTES_PER_SECOND,
186 suggested_display_precision=1,
187 device_class=SensorDeviceClass.DATA_RATE,
188 state_class=SensorStateClass.MEASUREMENT,
191 STORAGE_VOL_SENSORS: tuple[SynologyDSMSensorEntityDescription, ...] = (
193 api_key=SynoStorage.API_KEY,
195 translation_key=
"volume_status",
198 api_key=SynoStorage.API_KEY,
199 key=
"volume_size_total",
200 translation_key=
"volume_size_total",
201 native_unit_of_measurement=UnitOfInformation.BYTES,
202 suggested_unit_of_measurement=UnitOfInformation.TERABYTES,
203 suggested_display_precision=2,
204 device_class=SensorDeviceClass.DATA_SIZE,
205 entity_registry_enabled_default=
False,
206 state_class=SensorStateClass.MEASUREMENT,
209 api_key=SynoStorage.API_KEY,
210 key=
"volume_size_used",
211 translation_key=
"volume_size_used",
212 native_unit_of_measurement=UnitOfInformation.BYTES,
213 suggested_unit_of_measurement=UnitOfInformation.TERABYTES,
214 suggested_display_precision=2,
215 device_class=SensorDeviceClass.DATA_SIZE,
216 state_class=SensorStateClass.MEASUREMENT,
219 api_key=SynoStorage.API_KEY,
220 key=
"volume_percentage_used",
221 translation_key=
"volume_percentage_used",
222 native_unit_of_measurement=PERCENTAGE,
225 api_key=SynoStorage.API_KEY,
226 key=
"volume_disk_temp_avg",
227 translation_key=
"volume_disk_temp_avg",
228 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
229 device_class=SensorDeviceClass.TEMPERATURE,
230 entity_category=EntityCategory.DIAGNOSTIC,
233 api_key=SynoStorage.API_KEY,
234 key=
"volume_disk_temp_max",
235 translation_key=
"volume_disk_temp_max",
236 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
237 device_class=SensorDeviceClass.TEMPERATURE,
238 entity_registry_enabled_default=
False,
239 entity_category=EntityCategory.DIAGNOSTIC,
242 STORAGE_DISK_SENSORS: tuple[SynologyDSMSensorEntityDescription, ...] = (
244 api_key=SynoStorage.API_KEY,
245 key=
"disk_smart_status",
246 translation_key=
"disk_smart_status",
247 entity_registry_enabled_default=
False,
248 entity_category=EntityCategory.DIAGNOSTIC,
251 api_key=SynoStorage.API_KEY,
253 translation_key=
"disk_status",
254 entity_category=EntityCategory.DIAGNOSTIC,
257 api_key=SynoStorage.API_KEY,
259 translation_key=
"disk_temp",
260 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
261 device_class=SensorDeviceClass.TEMPERATURE,
262 state_class=SensorStateClass.MEASUREMENT,
263 entity_category=EntityCategory.DIAGNOSTIC,
267 INFORMATION_SENSORS: tuple[SynologyDSMSensorEntityDescription, ...] = (
269 api_key=SynoDSMInformation.API_KEY,
271 translation_key=
"temperature",
272 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
273 device_class=SensorDeviceClass.TEMPERATURE,
274 state_class=SensorStateClass.MEASUREMENT,
275 entity_category=EntityCategory.DIAGNOSTIC,
278 api_key=SynoDSMInformation.API_KEY,
280 translation_key=
"uptime",
281 device_class=SensorDeviceClass.TIMESTAMP,
282 entity_registry_enabled_default=
False,
283 entity_category=EntityCategory.DIAGNOSTIC,
289 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
291 """Set up the Synology NAS Sensor."""
292 data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
294 coordinator = data.coordinator_central
295 storage = api.storage
296 assert storage
is not None
298 entities: list[SynoDSMUtilSensor | SynoDSMStorageSensor | SynoDSMInfoSensor] = [
300 for description
in UTILISATION_SENSORS
304 if storage.volumes_ids:
308 for volume
in entry.data.get(CONF_VOLUMES, storage.volumes_ids)
309 for description
in STORAGE_VOL_SENSORS
314 if storage.disks_ids:
318 for disk
in entry.data.get(CONF_DISKS, storage.disks_ids)
319 for description
in STORAGE_DISK_SENSORS
326 for description
in INFORMATION_SENSORS
334 SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], SensorEntity
336 """Mixin for sensor specific attributes."""
338 entity_description: SynologyDSMSensorEntityDescription
343 coordinator: SynologyDSMCentralUpdateCoordinator,
344 description: SynologyDSMSensorEntityDescription,
346 """Initialize the Synology DSM sensor entity."""
347 super().
__init__(api, coordinator, description)
351 """Representation a Synology Utilisation sensor."""
355 """Return the state."""
356 attr = getattr(self._api.utilisation, self.entity_description.key)
362 isinstance(attr, int)
365 return round(attr / 100, 2)
371 """Return True if entity is available."""
372 return bool(self._api.utilisation)
and super().available
376 """Representation a Synology Storage sensor."""
378 entity_description: SynologyDSMSensorEntityDescription
383 coordinator: SynologyDSMCentralUpdateCoordinator,
384 description: SynologyDSMSensorEntityDescription,
385 device_id: str |
None =
None,
387 """Initialize the Synology DSM storage sensor entity."""
388 super().
__init__(api, coordinator, description, device_id)
392 """Return the state."""
395 getattr(self._api.storage, self.entity_description.key)(self.
_device_id_device_id),
400 """Representation a Synology information sensor."""
405 coordinator: SynologyDSMCentralUpdateCoordinator,
406 description: SynologyDSMSensorEntityDescription,
408 """Initialize the Synology SynoDSMInfoSensor entity."""
409 super().
__init__(api, coordinator, description)
411 self.
_last_boot_last_boot: datetime |
None =
None
415 """Return the state."""
416 attr = getattr(self._api.information, self.entity_description.key)
420 if self.entity_description.key ==
"uptime":
str|None native_unit_of_measurement(self)
StateType|datetime native_value(self)
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMSensorEntityDescription description)
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMSensorEntityDescription description)
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMSensorEntityDescription description, str|None device_id=None)
StateType native_value(self)
StateType native_value(self)
native_unit_of_measurement
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)