1 """Diagnostics support for HomeKit Controller."""
3 from __future__
import annotations
7 from aiohomekit.model.characteristics.characteristic_types
import CharacteristicsTypes
15 from .connection
import HKDevice
16 from .const
import KNOWN_DEVICES
18 REDACTED_CHARACTERISTICS = [
19 CharacteristicsTypes.SERIAL_NUMBER,
22 REDACTED_CONFIG_ENTRY_KEYS = [
27 REDACTED_STATE = [
"access_token",
"entity_picture"]
31 hass: HomeAssistant, entry: ConfigEntry
33 """Return diagnostics for a config entry."""
38 hass: HomeAssistant, entry: ConfigEntry, device: DeviceEntry
40 """Return diagnostics for a device entry."""
46 hass: HomeAssistant, device: DeviceEntry
48 data: dict[str, Any] = {}
50 data[
"name"] = device.name
51 data[
"model"] = device.model
52 data[
"manfacturer"] = device.manufacturer
53 data[
"sw_version"] = device.sw_version
54 data[
"hw_version"] = device.hw_version
56 entities = data[
"entities"] = []
58 hass_entities = er.async_entries_for_device(
61 include_disabled_entities=
True,
64 hass_entities.sort(key=
lambda entry: entry.original_name
or "")
66 for entity_entry
in hass_entities:
67 state = hass.states.get(entity_entry.entity_id)
71 state_dict.pop(
"context",
None)
75 "original_name": entity_entry.original_name,
76 "original_device_class": entity_entry.original_device_class,
77 "entity_category": entity_entry.entity_category,
78 "original_icon": entity_entry.original_icon,
79 "icon": entity_entry.icon,
80 "unit_of_measurement": entity_entry.unit_of_measurement,
81 "device_class": entity_entry.device_class,
82 "disabled": entity_entry.disabled,
83 "disabled_by": entity_entry.disabled_by,
93 hass: HomeAssistant, entry: ConfigEntry, device: DeviceEntry |
None =
None
95 """Return diagnostics for a config entry."""
96 hkid = entry.data[
"AccessoryPairingID"]
97 connection: HKDevice = hass.data[KNOWN_DEVICES][hkid]
99 data: dict[str, Any] = {
101 "title": entry.title,
102 "version": entry.version,
110 data[
"entity-map"] = accessories = connection.entity_map.serialize()
111 data[
"config-num"] = connection.config_num
114 for accessory
in accessories:
115 for service
in accessory.get(
"services", []):
116 for char
in service.get(
"characteristics", []):
117 if char[
"type"]
in REDACTED_CHARACTERISTICS:
118 char[
"value"] = REDACTED
123 device_registry = dr.async_get(hass)
125 devices = data[
"devices"] = []
126 for device_id
in connection.devices.values():
127 if not (device := device_registry.async_get(device_id)):
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, ConfigEntry entry)
dict[str, Any] _async_get_diagnostics_for_device(HomeAssistant hass, DeviceEntry device)
dict[str, Any] _async_get_diagnostics(HomeAssistant hass, ConfigEntry entry, DeviceEntry|None device=None)
dict[str, Any] async_get_device_diagnostics(HomeAssistant hass, ConfigEntry entry, DeviceEntry device)