mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Add matter node added subscription (#84377)
This commit is contained in:
parent
c832982d94
commit
06b4c82a37
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user