Add matter node added subscription (#84377)

This commit is contained in:
Martin Hjelmare 2022-12-21 16:34:55 +01:00 committed by GitHub
parent c832982d94
commit 06b4c82a37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 2 deletions

View File

@ -4,6 +4,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from chip.clusters import Objects as all_clusters 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 matter_server.common.models.node_device import AbstractMatterNodeDevice
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
@ -42,10 +43,18 @@ class MatterAdapter:
self.platform_handlers[platform] = add_entities self.platform_handlers[platform] = add_entities
async def setup_nodes(self) -> None: 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(): for node in await self.matter_client.get_nodes():
self._setup_node(node) 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: def _setup_node(self, node: MatterNode) -> None:
"""Set up an node.""" """Set up an node."""
LOGGER.debug("Setting up entities for node %s", node.node_id) LOGGER.debug("Setting up entities for node %s", node.node_id)

View File

@ -3,13 +3,16 @@ from __future__ import annotations
from unittest.mock import MagicMock 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 import pytest
from homeassistant.components.matter.const import DOMAIN from homeassistant.components.matter.const import DOMAIN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr 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( 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.model == "Mock Light"
assert device2_entry.hw_version is None assert device2_entry.hw_version is None
assert device2_entry.sw_version == "1.49.1" 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