Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Diagnostics support for VeSync."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from pyvesync import VeSync
8 
9 from homeassistant.components.diagnostics import REDACTED
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers import entity_registry as er
13 from homeassistant.helpers.device_registry import DeviceEntry
14 
15 from .const import DOMAIN, VS_MANAGER
16 from .entity import VeSyncBaseDevice
17 
18 KEYS_TO_REDACT = {"manager", "uuid", "mac_id"}
19 
20 
22  hass: HomeAssistant, entry: ConfigEntry
23 ) -> dict[str, Any]:
24  """Return diagnostics for a config entry."""
25  manager: VeSync = hass.data[DOMAIN][VS_MANAGER]
26 
27  return {
28  DOMAIN: {
29  "bulb_count": len(manager.bulbs),
30  "fan_count": len(manager.fans),
31  "outlets_count": len(manager.outlets),
32  "switch_count": len(manager.switches),
33  "timezone": manager.time_zone,
34  },
35  "devices": {
36  "bulbs": [_redact_device_values(device) for device in manager.bulbs],
37  "fans": [_redact_device_values(device) for device in manager.fans],
38  "outlets": [_redact_device_values(device) for device in manager.outlets],
39  "switches": [_redact_device_values(device) for device in manager.switches],
40  },
41  }
42 
43 
45  hass: HomeAssistant, entry: ConfigEntry, device: DeviceEntry
46 ) -> dict[str, Any]:
47  """Return diagnostics for a device entry."""
48  manager: VeSync = hass.data[DOMAIN][VS_MANAGER]
49  device_dict = _build_device_dict(manager)
50  vesync_device_id = next(iden[1] for iden in device.identifiers if iden[0] == DOMAIN)
51 
52  # Base device information, without sensitive information.
53  data = _redact_device_values(device_dict[vesync_device_id])
54 
55  data["home_assistant"] = {
56  "name": device.name,
57  "name_by_user": device.name_by_user,
58  "disabled": device.disabled,
59  "disabled_by": device.disabled_by,
60  "entities": [],
61  }
62 
63  # Gather information how this VeSync device is represented in Home Assistant
64  entity_registry = er.async_get(hass)
65  hass_entities = er.async_entries_for_device(
66  entity_registry,
67  device_id=device.id,
68  include_disabled_entities=True,
69  )
70 
71  for entity_entry in hass_entities:
72  state = hass.states.get(entity_entry.entity_id)
73  state_dict = None
74  if state:
75  state_dict = dict(state.as_dict())
76  # The context doesn't provide useful information in this case.
77  state_dict.pop("context", None)
78 
79  data["home_assistant"]["entities"].append(
80  {
81  "domain": entity_entry.domain,
82  "entity_id": entity_entry.entity_id,
83  "entity_category": entity_entry.entity_category,
84  "device_class": entity_entry.device_class,
85  "original_device_class": entity_entry.original_device_class,
86  "name": entity_entry.name,
87  "original_name": entity_entry.original_name,
88  "icon": entity_entry.icon,
89  "original_icon": entity_entry.original_icon,
90  "unit_of_measurement": entity_entry.unit_of_measurement,
91  "state": state_dict,
92  "disabled": entity_entry.disabled,
93  "disabled_by": entity_entry.disabled_by,
94  }
95  )
96 
97  return data
98 
99 
100 def _build_device_dict(manager: VeSync) -> dict:
101  """Build a dictionary of ALL VeSync devices."""
102  device_dict = {x.cid: x for x in manager.switches}
103  device_dict.update({x.cid: x for x in manager.fans})
104  device_dict.update({x.cid: x for x in manager.outlets})
105  device_dict.update({x.cid: x for x in manager.bulbs})
106  return device_dict
107 
108 
109 def _redact_device_values(device: VeSyncBaseDevice) -> dict:
110  """Rebuild and redact values of a VeSync device."""
111  data = {}
112  for key, item in device.__dict__.items():
113  if key not in KEYS_TO_REDACT:
114  data[key] = item
115  else:
116  data[key] = REDACTED
117 
118  return data
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, ConfigEntry entry)
Definition: diagnostics.py:23
dict[str, Any] async_get_device_diagnostics(HomeAssistant hass, ConfigEntry entry, DeviceEntry device)
Definition: diagnostics.py:46
dict _redact_device_values(VeSyncBaseDevice device)
Definition: diagnostics.py:109