Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Synology DSM binary sensors."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from synology_dsm.api.core.security import SynoCoreSecurity
8 from synology_dsm.api.storage.storage import SynoStorage
9 
11  BinarySensorDeviceClass,
12  BinarySensorEntity,
13  BinarySensorEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import CONF_DISKS, EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from . import SynoApi
21 from .const import DOMAIN
22 from .coordinator import SynologyDSMCentralUpdateCoordinator
23 from .entity import (
24  SynologyDSMBaseEntity,
25  SynologyDSMDeviceEntity,
26  SynologyDSMEntityDescription,
27 )
28 from .models import SynologyDSMData
29 
30 
31 @dataclass(frozen=True, kw_only=True)
33  BinarySensorEntityDescription, SynologyDSMEntityDescription
34 ):
35  """Describes Synology DSM binary sensor entity."""
36 
37 
38 SECURITY_BINARY_SENSORS: tuple[SynologyDSMBinarySensorEntityDescription, ...] = (
40  api_key=SynoCoreSecurity.API_KEY,
41  key="status",
42  translation_key="status",
43  device_class=BinarySensorDeviceClass.SAFETY,
44  ),
45 )
46 
47 STORAGE_DISK_BINARY_SENSORS: tuple[SynologyDSMBinarySensorEntityDescription, ...] = (
49  api_key=SynoStorage.API_KEY,
50  key="disk_exceed_bad_sector_thr",
51  translation_key="disk_exceed_bad_sector_thr",
52  device_class=BinarySensorDeviceClass.SAFETY,
53  entity_category=EntityCategory.DIAGNOSTIC,
54  ),
56  api_key=SynoStorage.API_KEY,
57  key="disk_below_remain_life_thr",
58  translation_key="disk_below_remain_life_thr",
59  device_class=BinarySensorDeviceClass.SAFETY,
60  entity_category=EntityCategory.DIAGNOSTIC,
61  ),
62 )
63 
64 
66  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
67 ) -> None:
68  """Set up the Synology NAS binary sensor."""
69  data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
70  api = data.api
71  coordinator = data.coordinator_central
72  assert api.storage is not None
73 
74  entities: list[SynoDSMSecurityBinarySensor | SynoDSMStorageBinarySensor] = [
75  SynoDSMSecurityBinarySensor(api, coordinator, description)
76  for description in SECURITY_BINARY_SENSORS
77  ]
78 
79  # Handle all disks
80  if api.storage.disks_ids:
81  entities.extend(
82  [
83  SynoDSMStorageBinarySensor(api, coordinator, description, disk)
84  for disk in entry.data.get(CONF_DISKS, api.storage.disks_ids)
85  for description in STORAGE_DISK_BINARY_SENSORS
86  ]
87  )
88 
89  async_add_entities(entities)
90 
91 
93  SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], BinarySensorEntity
94 ):
95  """Mixin for binary sensor specific attributes."""
96 
97  entity_description: SynologyDSMBinarySensorEntityDescription
98 
99  def __init__(
100  self,
101  api: SynoApi,
102  coordinator: SynologyDSMCentralUpdateCoordinator,
103  description: SynologyDSMBinarySensorEntityDescription,
104  ) -> None:
105  """Initialize the Synology DSM binary_sensor entity."""
106  super().__init__(api, coordinator, description)
107 
108 
110  """Representation a Synology Security binary sensor."""
111 
112  @property
113  def is_on(self) -> bool:
114  """Return the state."""
115  return getattr(self._api.security, self.entity_description.key) != "safe" # type: ignore[no-any-return]
116 
117  @property
118  def available(self) -> bool:
119  """Return True if entity is available."""
120  return bool(self._api.security) and super().available
121 
122  @property
123  def extra_state_attributes(self) -> dict[str, str]:
124  """Return security checks details."""
125  assert self._api.security is not None
126  return self._api.security.status_by_check
127 
128 
130  """Representation a Synology Storage binary sensor."""
131 
132  entity_description: SynologyDSMBinarySensorEntityDescription
133 
134  def __init__(
135  self,
136  api: SynoApi,
137  coordinator: SynologyDSMCentralUpdateCoordinator,
138  description: SynologyDSMBinarySensorEntityDescription,
139  device_id: str | None = None,
140  ) -> None:
141  """Initialize the Synology DSM storage binary_sensor entity."""
142  super().__init__(api, coordinator, description, device_id)
143 
144  @property
145  def is_on(self) -> bool:
146  """Return the state."""
147  return bool(
148  getattr(self._api.storage, self.entity_description.key)(self._device_id_device_id)
149  )
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMBinarySensorEntityDescription description)
None __init__(self, SynoApi api, SynologyDSMCentralUpdateCoordinator coordinator, SynologyDSMBinarySensorEntityDescription description, str|None device_id=None)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)