Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Provide diagnostics for Matter."""
2 
3 from __future__ import annotations
4 
5 from copy import deepcopy
6 from typing import Any
7 
8 from chip.clusters import Objects
9 from matter_server.common.helpers.util import dataclass_to_dict, parse_attribute_path
10 
11 from homeassistant.components.diagnostics import REDACTED
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers import device_registry as dr
15 
16 from .helpers import get_matter, get_node_from_device_entry
17 
18 ATTRIBUTES_TO_REDACT = {Objects.BasicInformation.Attributes.Location}
19 
20 
21 def redact_matter_attributes(node_data: dict[str, Any]) -> dict[str, Any]:
22  """Redact Matter cluster attribute."""
23  redacted = deepcopy(node_data)
24  for attribute_to_redact in ATTRIBUTES_TO_REDACT:
25  for attribute_path in redacted["attributes"]:
26  _, cluster_id, attribute_id = parse_attribute_path(attribute_path)
27  if cluster_id != attribute_to_redact.cluster_id:
28  continue
29  if attribute_id != attribute_to_redact.attribute_id:
30  continue
31  redacted["attributes"][attribute_path] = REDACTED
32 
33  return redacted
34 
35 
36 def remove_serialization_type(data: dict[str, Any]) -> dict[str, Any]:
37  """Remove serialization type from data."""
38  if "_type" in data:
39  data.pop("_type")
40  return data
41 
42 
44  hass: HomeAssistant, config_entry: ConfigEntry
45 ) -> dict[str, Any]:
46  """Return diagnostics for a config entry."""
47  matter = get_matter(hass)
48  server_diagnostics = await matter.matter_client.get_diagnostics()
49  data = dataclass_to_dict(server_diagnostics)
50  nodes = [redact_matter_attributes(node_data) for node_data in data["nodes"]]
51  data["nodes"] = nodes
52 
53  return {"server": data}
54 
55 
57  hass: HomeAssistant, config_entry: ConfigEntry, device: dr.DeviceEntry
58 ) -> dict[str, Any]:
59  """Return diagnostics for a device."""
60  matter = get_matter(hass)
61  server_diagnostics = await matter.matter_client.get_diagnostics()
62  node = get_node_from_device_entry(hass, device)
63 
64  return {
65  "server_info": dataclass_to_dict(server_diagnostics.info),
67  remove_serialization_type(dataclass_to_dict(node.node_data) if node else {})
68  ),
69  }
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, ConfigEntry config_entry)
Definition: diagnostics.py:45
dict[str, Any] remove_serialization_type(dict[str, Any] data)
Definition: diagnostics.py:36
dict[str, Any] redact_matter_attributes(dict[str, Any] node_data)
Definition: diagnostics.py:21
dict[str, Any] async_get_device_diagnostics(HomeAssistant hass, ConfigEntry config_entry, dr.DeviceEntry device)
Definition: diagnostics.py:58
MatterAdapter get_matter(HomeAssistant hass)
Definition: helpers.py:35
MatterNode|None get_node_from_device_entry(HomeAssistant hass, dr.DeviceEntry device)
Definition: helpers.py:88