From 06b4c82a37aac80325005361e9c66f209722fd89 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 21 Dec 2022 16:34:55 +0100 Subject: [PATCH] Add matter node added subscription (#84377) --- homeassistant/components/matter/adapter.py | 11 +++++++- tests/components/matter/test_adapter.py | 31 +++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/matter/adapter.py b/homeassistant/components/matter/adapter.py index 08ca80dbb0e..19bbe81c75d 100644 --- a/homeassistant/components/matter/adapter.py +++ b/homeassistant/components/matter/adapter.py @@ -4,6 +4,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from chip.clusters import Objects as all_clusters +from matter_server.common.models.events import EventType from matter_server.common.models.node_device import AbstractMatterNodeDevice from homeassistant.config_entries import ConfigEntry @@ -42,10 +43,18 @@ class MatterAdapter: self.platform_handlers[platform] = add_entities async def setup_nodes(self) -> None: - """Set up all existing nodes.""" + """Set up all existing nodes and subscribe to new nodes.""" for node in await self.matter_client.get_nodes(): self._setup_node(node) + def node_added_callback(event: EventType, node: MatterNode) -> None: + """Handle node added event.""" + self._setup_node(node) + + self.config_entry.async_on_unload( + self.matter_client.subscribe(EventType.NODE_ADDED, node_added_callback) + ) + def _setup_node(self, node: MatterNode) -> None: """Set up an node.""" LOGGER.debug("Setting up entities for node %s", node.node_id) diff --git a/tests/components/matter/test_adapter.py b/tests/components/matter/test_adapter.py index 96d28839be9..1a093f3245d 100644 --- a/tests/components/matter/test_adapter.py +++ b/tests/components/matter/test_adapter.py @@ -3,13 +3,16 @@ from __future__ import annotations from unittest.mock import MagicMock +from matter_server.common.helpers.util import dataclass_from_dict +from matter_server.common.models.events import EventType +from matter_server.common.models.node import MatterNode import pytest from homeassistant.components.matter.const import DOMAIN from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr -from .common import setup_integration_with_node_fixture +from .common import load_and_parse_node_fixture, setup_integration_with_node_fixture async def test_device_registry_single_node_device( @@ -80,3 +83,29 @@ async def test_device_registry_bridge( assert device2_entry.model == "Mock Light" assert device2_entry.hw_version is None assert device2_entry.sw_version == "1.49.1" + + +async def test_node_added_subscription( + hass: HomeAssistant, + matter_client: MagicMock, + integration: MagicMock, +) -> None: + """Test subscription to new devices work.""" + assert matter_client.subscribe.call_count == 1 + assert matter_client.subscribe.call_args[0][0] == EventType.NODE_ADDED + + node_added_callback = matter_client.subscribe.call_args[0][1] + node_data = load_and_parse_node_fixture("onoff-light") + node = dataclass_from_dict( + MatterNode, + node_data, + ) + + entity_state = hass.states.get("light.mock_onoff_light") + assert not entity_state + + node_added_callback(EventType.NODE_ADDED, node) + await hass.async_block_till_done() + + entity_state = hass.states.get("light.mock_onoff_light") + assert entity_state