1 """The Synology DSM component."""
3 from __future__
import annotations
5 from itertools
import chain
8 from synology_dsm.api.surveillance_station
import SynoSurveillanceStation
9 from synology_dsm.api.surveillance_station.camera
import SynoCamera
10 from synology_dsm.exceptions
import SynologyDSMNotLoggedInException
18 from .common
import SynoApi, raise_config_entry_auth_error
25 SYNOLOGY_AUTH_FAILED_EXCEPTIONS,
26 SYNOLOGY_CONNECTION_EXCEPTIONS,
28 from .coordinator
import (
29 SynologyDSMCameraUpdateCoordinator,
30 SynologyDSMCentralUpdateCoordinator,
31 SynologyDSMSwitchUpdateCoordinator,
33 from .models
import SynologyDSMData
34 from .service
import async_setup_services
36 _LOGGER = logging.getLogger(__name__)
40 """Set up Synology DSM sensors."""
43 dev_reg = dr.async_get(hass)
44 devices: list[dr.DeviceEntry] = dr.async_entries_for_config_entry(
45 dev_reg, entry.entry_id
47 for device
in devices:
48 old_identifier =
list(next(iter(device.identifiers)))
49 if len(old_identifier) > 2:
51 (old_identifier.pop(0),
"_".join([
str(x)
for x
in old_identifier]))
54 "migrate identifier '%s' to '%s'", device.identifiers, new_identifier
56 dev_reg.async_update_device(device.id, new_identifiers=new_identifier)
59 if entry.data.get(CONF_VERIFY_SSL)
is None:
60 hass.config_entries.async_update_entry(
61 entry, data={**entry.data, CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL}
67 await api.async_setup()
68 except SYNOLOGY_AUTH_FAILED_EXCEPTIONS
as err:
70 except (*SYNOLOGY_CONNECTION_EXCEPTIONS, SynologyDSMNotLoggedInException)
as err:
74 if err.args[0]
and isinstance(err.args[0], dict):
75 details = err.args[0].
get(EXCEPTION_DETAILS, EXCEPTION_UNKNOWN)
77 details = EXCEPTION_UNKNOWN
84 if not entry.data.get(CONF_MAC):
85 hass.config_entries.async_update_entry(
86 entry, data={**entry.data, CONF_MAC: api.dsm.network.macs}
91 available_apis = api.dsm.apis
93 coordinator_cameras: SynologyDSMCameraUpdateCoordinator |
None =
None
94 if api.surveillance_station
is not None:
96 await coordinator_cameras.async_config_entry_first_refresh()
98 coordinator_switches: SynologyDSMSwitchUpdateCoordinator |
None =
None
100 SynoSurveillanceStation.INFO_API_KEY
in available_apis
101 and SynoSurveillanceStation.HOME_MODE_API_KEY
in available_apis
102 and api.surveillance_station
is not None
105 await coordinator_switches.async_config_entry_first_refresh()
107 await coordinator_switches.async_setup()
108 except SYNOLOGY_CONNECTION_EXCEPTIONS
as ex:
109 raise ConfigEntryNotReady
from ex
113 coordinator_central=coordinator_central,
114 coordinator_cameras=coordinator_cameras,
115 coordinator_switches=coordinator_switches,
117 hass.data.setdefault(DOMAIN, {})[entry.unique_id] = synology_data
118 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
119 entry.async_on_unload(entry.add_update_listener(_async_update_listener))
125 """Unload Synology DSM sensors."""
126 if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
127 entry_data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
128 await entry_data.api.async_unload()
129 hass.data[DOMAIN].pop(entry.unique_id)
134 """Handle options update."""
135 await hass.config_entries.async_reload(entry.entry_id)
139 hass: HomeAssistant, entry: ConfigEntry, device_entry: dr.DeviceEntry
141 """Remove synology_dsm config entry from a device."""
142 data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
144 assert api.information
is not None
145 serial = api.information.serial
146 storage = api.storage
147 assert storage
is not None
148 all_cameras: list[SynoCamera] = []
149 if api.surveillance_station
is not None:
151 all_cameras = api.surveillance_station.get_all_cameras()
153 (camera.id
for camera
in all_cameras),
157 (SynoSurveillanceStation.INFO_API_KEY,),
159 return not device_entry.identifiers.intersection(
163 (DOMAIN, f
"{serial}_{device_id}")
for device_id
in device_ids
web.Response get(self, web.Request request, str config_key)
None async_setup_services(HomeAssistant hass)
None raise_config_entry_auth_error(Exception err)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_remove_config_entry_device(HomeAssistant hass, ConfigEntry entry, dr.DeviceEntry device_entry)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)