diff --git a/homeassistant/components/lutron_caseta/__init__.py b/homeassistant/components/lutron_caseta/__init__.py index dd64ed4ec6f..d915c2a45cb 100644 --- a/homeassistant/components/lutron_caseta/__init__.py +++ b/homeassistant/components/lutron_caseta/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio import contextlib +from itertools import chain import logging import ssl @@ -48,6 +49,7 @@ from .device_trigger import ( DEVICE_TYPE_SUBTYPE_MAP_TO_LIP, LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP, ) +from .util import serial_to_unique_id _LOGGER = logging.getLogger(__name__) @@ -358,3 +360,41 @@ class LutronCasetaDeviceUpdatableEntity(LutronCasetaDevice): """Update when forcing a refresh of the device.""" self._device = self._smartbridge.get_device_by_id(self.device_id) _LOGGER.debug(self._device) + + +def _id_to_identifier(lutron_id: str) -> None: + """Convert a lutron caseta identifier to a device identifier.""" + return (DOMAIN, lutron_id) + + +async def async_remove_config_entry_device( + hass: HomeAssistant, entry: config_entries.ConfigEntry, device_entry: dr.DeviceEntry +) -> bool: + """Remove lutron_caseta config entry from a device.""" + bridge: Smartbridge = hass.data[DOMAIN][entry.entry_id][BRIDGE_LEAP] + devices = bridge.get_devices() + buttons = bridge.buttons + occupancy_groups = bridge.occupancy_groups + bridge_device = devices[BRIDGE_DEVICE_ID] + bridge_unique_id = serial_to_unique_id(bridge_device["serial"]) + all_identifiers: set[tuple[str, str]] = { + # Base bridge + _id_to_identifier(bridge_unique_id), + # Motion sensors and occupancy groups + *( + _id_to_identifier( + f"occupancygroup_{bridge_unique_id}_{device['occupancy_group_id']}" + ) + for device in occupancy_groups.values() + ), + # Button devices such as pico remotes and all other devices + *( + _id_to_identifier(device["serial"]) + for device in chain(devices.values(), buttons.values()) + ), + } + return not any( + identifier + for identifier in device_entry.identifiers + if identifier in all_identifiers + )