mirror of
https://github.com/home-assistant/core.git
synced 2025-07-08 05:47:10 +00:00
Streamline setup of deCONZ group platform (#70712)
This commit is contained in:
parent
bdba3e193e
commit
fe3fb230be
@ -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():
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user