Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for Synology DSM switch."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 import logging
7 from typing import Any
8 
9 from synology_dsm.api.surveillance_station import SynoSurveillanceStation
10 
11 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.device_registry import DeviceInfo
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from . import SynoApi
18 from .const import DOMAIN
19 from .coordinator import SynologyDSMSwitchUpdateCoordinator
20 from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
21 from .models import SynologyDSMData
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  SwitchEntityDescription, SynologyDSMEntityDescription
29 ):
30  """Describes Synology DSM switch entity."""
31 
32 
33 SURVEILLANCE_SWITCH: tuple[SynologyDSMSwitchEntityDescription, ...] = (
35  api_key=SynoSurveillanceStation.HOME_MODE_API_KEY,
36  key="home_mode",
37  translation_key="home_mode",
38  ),
39 )
40 
41 
43  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
44 ) -> None:
45  """Set up the Synology NAS switch."""
46  data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
47  if coordinator := data.coordinator_switches:
48  assert coordinator.version is not None
51  data.api, coordinator.version, coordinator, description
52  )
53  for description in SURVEILLANCE_SWITCH
54  )
55 
56 
58  SynologyDSMBaseEntity[SynologyDSMSwitchUpdateCoordinator], SwitchEntity
59 ):
60  """Representation a Synology Surveillance Station Home Mode toggle."""
61 
62  entity_description: SynologyDSMSwitchEntityDescription
63 
64  def __init__(
65  self,
66  api: SynoApi,
67  version: str,
68  coordinator: SynologyDSMSwitchUpdateCoordinator,
69  description: SynologyDSMSwitchEntityDescription,
70  ) -> None:
71  """Initialize a Synology Surveillance Station Home Mode."""
72  super().__init__(api, coordinator, description)
73  self._version_version = version
74 
75  @property
76  def is_on(self) -> bool:
77  """Return the state."""
78  return self.coordinator.data["switches"][self.entity_description.key] # type: ignore[no-any-return]
79 
80  async def async_turn_on(self, **kwargs: Any) -> None:
81  """Turn on Home mode."""
82  assert self._api.surveillance_station is not None
83  assert self._api.information
84  _LOGGER.debug(
85  "SynoDSMSurveillanceHomeModeToggle.turn_on(%s)",
86  self._api.information.serial,
87  )
88  await self._api.dsm.surveillance_station.set_home_mode(True)
89  await self.coordinator.async_request_refresh()
90 
91  async def async_turn_off(self, **kwargs: Any) -> None:
92  """Turn off Home mode."""
93  assert self._api.surveillance_station is not None
94  assert self._api.information
95  _LOGGER.debug(
96  "SynoDSMSurveillanceHomeModeToggle.turn_off(%s)",
97  self._api.information.serial,
98  )
99  await self._api.dsm.surveillance_station.set_home_mode(False)
100  await self.coordinator.async_request_refresh()
101 
102  @property
103  def available(self) -> bool:
104  """Return True if entity is available."""
105  return bool(self._api.surveillance_station) and super().available
106 
107  @property
108  def device_info(self) -> DeviceInfo:
109  """Return the device information."""
110  assert self._api.surveillance_station is not None
111  assert self._api.information is not None
112  assert self._api.network is not None
113  return DeviceInfo(
114  identifiers={
115  (
116  DOMAIN,
117  f"{self._api.information.serial}_{SynoSurveillanceStation.INFO_API_KEY}",
118  )
119  },
120  name=f"{self._api.network.hostname} Surveillance Station",
121  manufacturer="Synology",
122  model=self._api.information.model,
123  sw_version=self._version_version,
124  via_device=(DOMAIN, self._api.information.serial),
125  )
None __init__(self, SynoApi api, str version, SynologyDSMSwitchUpdateCoordinator coordinator, SynologyDSMSwitchEntityDescription description)
Definition: switch.py:70
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:44