Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions homeassistant/components/deconz/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,13 @@ def __init__(
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_scene = f"deconz_new_scene_{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.SCENE.value: self.signal_new_scene,
ResourceGroup.SENSOR.value: self.signal_new_sensor,
Expand All @@ -79,6 +78,10 @@ def __init__(
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."""
Expand Down Expand Up @@ -220,11 +223,13 @@ async def options_updated(self) -> None:
]

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():
Expand Down
44 changes: 24 additions & 20 deletions homeassistant/components/deconz/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

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,
Expand Down Expand Up @@ -110,39 +111,42 @@ def async_add_light(lights: list[LightResources] | None = None) -> None:
)
)

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 = []

if groups is None:
groups = list(gateway.api.groups.values())

for group in groups:
if not group.lights:
continue
async_add_entities([DeconzGroup(group, gateway)])

known_groups = set(gateway.entities[DOMAIN])
new_group = DeconzGroup(group, gateway)
if new_group.unique_id not in known_groups:
entities.append(new_group)
config_entry.async_on_unload(
gateway.api.groups.subscribe(
async_add_group,
EventType.ADDED,
)
)

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):
Expand Down