1 """Provide integration helpers that are aware of the matter integration."""
3 from __future__
import annotations
6 from dataclasses
import dataclass
7 from typing
import TYPE_CHECKING
13 from .const
import DOMAIN, ID_TYPE_DEVICE_ID
16 from matter_server.client.models.node
import MatterEndpoint, MatterNode
17 from matter_server.common.models
import ServerInfoMessage
19 from .adapter
import MatterAdapter
23 """Exception raised when we can't find a node."""
28 """Hold Matter data for the config entry."""
30 adapter: MatterAdapter
31 listen_task: asyncio.Task
36 """Return MatterAdapter instance."""
40 matter_entry_data: MatterEntryData = next(iter(hass.data[DOMAIN].values()))
41 return matter_entry_data.adapter
45 server_info: ServerInfoMessage,
48 """Return `Operational Instance Name` for given MatterNode."""
49 fabric_id_hex = f
"{server_info.compressed_fabric_id:016X}"
50 node_id_hex = f
"{node.node_id:016X}"
53 return f
"{fabric_id_hex}-{node_id_hex}"
57 server_info: ServerInfoMessage,
58 endpoint: MatterEndpoint,
60 """Return HA device_id for the given MatterEndpoint."""
64 if compose_parent := endpoint.node.get_compose_parent(endpoint.endpoint_id):
65 endpoint = compose_parent
66 if endpoint.is_bridged_device:
68 postfix =
str(endpoint.endpoint_id)
71 postfix =
"MatterNodeDevice"
72 return f
"{operational_instance_id}-{postfix}"
77 """Get node id from ha device id."""
78 dev_reg = dr.async_get(hass)
79 device = dev_reg.async_get(ha_device_id)
81 raise MissingNode(f
"Invalid device ID: {ha_device_id}")
87 hass: HomeAssistant, device: dr.DeviceEntry
88 ) -> MatterNode |
None:
89 """Return MatterNode from device entry."""
91 device_id_type_prefix = f
"{ID_TYPE_DEVICE_ID}_"
92 device_id_full = next(
95 for identifier
in device.identifiers
96 if identifier[0] == DOMAIN
97 and identifier[1].startswith(device_id_type_prefix)
102 if device_id_full
is None:
105 device_id = device_id_full.lstrip(device_id_type_prefix)
106 matter_client = matter.matter_client
107 server_info = matter_client.server_info
109 if server_info
is None:
110 raise RuntimeError(
"Matter server information is not available")
115 for node
in matter_client.get_nodes()
116 for endpoint
in node.endpoints.values()
MatterAdapter get_matter(HomeAssistant hass)
str get_operational_instance_id(ServerInfoMessage server_info, MatterNode node)
MatterNode|None node_from_ha_device_id(HomeAssistant hass, str ha_device_id)
str get_device_id(ServerInfoMessage server_info, MatterEndpoint endpoint)
MatterNode|None get_node_from_device_entry(HomeAssistant hass, dr.DeviceEntry device)