Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Diagnostics support for HomeKit."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from pyhap.accessory_driver import AccessoryDriver
8 from pyhap.state import State
9 
10 from homeassistant.components.diagnostics import async_redact_data
11 from homeassistant.core import HomeAssistant
12 
13 from .accessories import HomeAccessory, HomeBridge
14 from .models import HomeKitConfigEntry
15 
16 TO_REDACT = {"access_token", "entity_picture"}
17 
18 
20  hass: HomeAssistant, entry: HomeKitConfigEntry
21 ) -> dict[str, Any]:
22  """Return diagnostics for a config entry."""
23  homekit = entry.runtime_data.homekit
24  data: dict[str, Any] = {
25  "status": homekit.status,
26  "config-entry": {
27  "title": entry.title,
28  "version": entry.version,
29  "data": dict(entry.data),
30  "options": dict(entry.options),
31  },
32  }
33  if homekit.iid_storage:
34  data["iid_storage"] = homekit.iid_storage.allocations
35  if not homekit.driver: # not started yet or startup failed
36  return data
37  driver: AccessoryDriver = homekit.driver
38  if driver.accessory:
39  if isinstance(driver.accessory, HomeBridge):
40  data["bridge"] = _get_bridge_diagnostics(hass, driver.accessory)
41  else:
42  data["accessory"] = _get_accessory_diagnostics(hass, driver.accessory)
43  data.update(driver.get_accessories())
44  state: State = driver.state
45  data.update(
46  {
47  "client_properties": {
48  str(client): props for client, props in state.client_properties.items()
49  },
50  "config_version": state.config_version,
51  "pairing_id": state.mac,
52  }
53  )
54  return data
55 
56 
57 def _get_bridge_diagnostics(hass: HomeAssistant, bridge: HomeBridge) -> dict[int, Any]:
58  """Return diagnostics for a bridge."""
59  return {
60  aid: _get_accessory_diagnostics(hass, accessory)
61  for aid, accessory in bridge.accessories.items()
62  }
63 
64 
66  hass: HomeAssistant, accessory: HomeAccessory
67 ) -> dict[str, Any]:
68  """Return diagnostics for an accessory."""
69  entity_state = None
70  if accessory.entity_id:
71  entity_state = hass.states.get(accessory.entity_id)
72  data = {
73  "aid": accessory.aid,
74  "config": accessory.config,
75  "category": accessory.category,
76  "name": accessory.display_name,
77  "entity_id": accessory.entity_id,
78  }
79  if entity_state:
80  data["entity_state"] = async_redact_data(entity_state, TO_REDACT)
81  return data
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
Definition: util.py:14
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, HomeKitConfigEntry entry)
Definition: diagnostics.py:21
dict[str, Any] _get_accessory_diagnostics(HomeAssistant hass, HomeAccessory accessory)
Definition: diagnostics.py:67
dict[int, Any] _get_bridge_diagnostics(HomeAssistant hass, HomeBridge bridge)
Definition: diagnostics.py:57