diff --git a/homeassistant/components/deconz/gateway.py b/homeassistant/components/deconz/gateway.py index ccb43d346d8..ef07a97ad8f 100644 --- a/homeassistant/components/deconz/gateway.py +++ b/homeassistant/components/deconz/gateway.py @@ -62,13 +62,12 @@ class DeconzGateway: self.ignore_state_updates = False self.signal_reachable = f"deconz-reachable-{config_entry.entry_id}" + self.signal_reload_groups = f"deconz_reload_group_{config_entry.entry_id}" - self.signal_new_group = f"deconz_new_group_{config_entry.entry_id}" self.signal_new_light = f"deconz_new_light_{config_entry.entry_id}" self.signal_new_sensor = f"deconz_new_sensor_{config_entry.entry_id}" self.deconz_resource_type_to_signal_new_device = { - ResourceGroup.GROUP.value: self.signal_new_group, ResourceGroup.LIGHT.value: self.signal_new_light, ResourceGroup.SENSOR.value: self.signal_new_sensor, } @@ -77,6 +76,10 @@ class DeconzGateway: self.entities: dict[str, set[str]] = {} self.events: list[DeconzAlarmEvent | DeconzEvent] = [] + self._option_allow_deconz_groups = self.config_entry.options.get( + CONF_ALLOW_DECONZ_GROUPS, DEFAULT_ALLOW_DECONZ_GROUPS + ) + @property def bridgeid(self) -> str: """Return the unique identifier of the gateway.""" @@ -218,11 +221,13 @@ class DeconzGateway: ] if self.option_allow_deconz_groups: - self.async_add_device_callback(ResourceGroup.GROUP.value) - + if not self._option_allow_deconz_groups: + async_dispatcher_send(self.hass, self.signal_reload_groups) else: deconz_ids += [group.deconz_id for group in self.api.groups.values()] + self._option_allow_deconz_groups = self.option_allow_deconz_groups + entity_registry = er.async_get(self.hass) for entity_id, deconz_id in self.deconz_ids.items(): diff --git a/homeassistant/components/deconz/light.py b/homeassistant/components/deconz/light.py index 8f881ce4917..ebfa2104783 100644 --- a/homeassistant/components/deconz/light.py +++ b/homeassistant/components/deconz/light.py @@ -5,6 +5,7 @@ from typing import Any, Generic, TypedDict, TypeVar from pydeconz.interfaces.lights import LightResources from pydeconz.models import ResourceType +from pydeconz.models.event import EventType from pydeconz.models.group import Group from pydeconz.models.light import ( ALERT_LONG, @@ -110,39 +111,42 @@ async def async_setup_entry( ) ) + async_add_light() + @callback - def async_add_group(groups: list[Group] | None = None) -> None: + def async_add_group(_: EventType, group_id: str) -> None: """Add group from deCONZ.""" - if not gateway.option_allow_deconz_groups: + if ( + not gateway.option_allow_deconz_groups + or (group := gateway.api.groups[group_id]) + and not group.lights + ): return - entities = [] + async_add_entities([DeconzGroup(group, gateway)]) - if groups is None: - groups = list(gateway.api.groups.values()) + config_entry.async_on_unload( + gateway.api.groups.subscribe( + async_add_group, + EventType.ADDED, + ) + ) - for group in groups: - if not group.lights: - continue - - known_groups = set(gateway.entities[DOMAIN]) - new_group = DeconzGroup(group, gateway) - if new_group.unique_id not in known_groups: - entities.append(new_group) - - if entities: - async_add_entities(entities) + @callback + def async_load_groups() -> None: + """Load deCONZ groups.""" + for group_id in gateway.api.groups: + async_add_group(EventType.ADDED, group_id) config_entry.async_on_unload( async_dispatcher_connect( hass, - gateway.signal_new_group, - async_add_group, + gateway.signal_reload_groups, + async_load_groups, ) ) - async_add_light() - async_add_group() + async_load_groups() class DeconzBaseLight(Generic[_L], DeconzDevice, LightEntity):