From 2f106112dfd15c4f9b9adef9be7ea686a91807ef Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 9 Jun 2022 17:48:07 -1000 Subject: [PATCH] Add async_remove_config_entry_device to synology_dsm (#73293) --- .../components/synology_dsm/__init__.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py index d8d768d36e4..e6868491eae 100644 --- a/homeassistant/components/synology_dsm/__init__.py +++ b/homeassistant/components/synology_dsm/__init__.py @@ -1,9 +1,11 @@ """The Synology DSM component.""" from __future__ import annotations +from itertools import chain import logging from synology_dsm.api.surveillance_station import SynoSurveillanceStation +from synology_dsm.api.surveillance_station.camera import SynoCamera from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_MAC, CONF_VERIFY_SSL @@ -137,3 +139,28 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None: """Handle options update.""" await hass.config_entries.async_reload(entry.entry_id) + + +async def async_remove_config_entry_device( + hass: HomeAssistant, entry: ConfigEntry, device_entry: dr.DeviceEntry +) -> bool: + """Remove synology_dsm config entry from a device.""" + data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id] + api = data.api + serial = api.information.serial + storage = api.storage + # get_all_cameras does not do I/O + all_cameras: list[SynoCamera] = api.surveillance_station.get_all_cameras() + device_ids = chain( + (camera.id for camera in all_cameras), + storage.volumes_ids, + storage.disks_ids, + storage.volumes_ids, + (SynoSurveillanceStation.INFO_API_KEY,), # Camera home/away + ) + return not device_entry.identifiers.intersection( + ( + (DOMAIN, serial), # Base device + *((DOMAIN, f"{serial}_{id}") for id in device_ids), # Storage and cameras + ) + )