Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Diagnostics support for AndroidTV."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 import attr
8 
9 from homeassistant.components.diagnostics import async_redact_data
10 from homeassistant.const import ATTR_CONNECTIONS, ATTR_IDENTIFIERS, CONF_UNIQUE_ID
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers import device_registry as dr, entity_registry as er
13 
14 from . import AndroidTVConfigEntry
15 from .const import DOMAIN, PROP_ETHMAC, PROP_SERIALNO, PROP_WIFIMAC
16 
17 TO_REDACT = {CONF_UNIQUE_ID} # UniqueID contain MAC Address
18 TO_REDACT_DEV = {ATTR_CONNECTIONS, ATTR_IDENTIFIERS}
19 TO_REDACT_DEV_PROP = {PROP_ETHMAC, PROP_SERIALNO, PROP_WIFIMAC}
20 
21 
23  hass: HomeAssistant, entry: AndroidTVConfigEntry
24 ) -> dict[str, dict[str, Any]]:
25  """Return diagnostics for a config entry."""
26  data = {"entry": async_redact_data(entry.as_dict(), TO_REDACT)}
27 
28  # Get information from AndroidTV library
29  aftv = entry.runtime_data.aftv
30  data["device_properties"] = {
31  **async_redact_data(aftv.device_properties, TO_REDACT_DEV_PROP),
32  "device_class": aftv.DEVICE_CLASS,
33  }
34 
35  # Gather information how this AndroidTV device is represented in Home Assistant
36  device_registry = dr.async_get(hass)
37  entity_registry = er.async_get(hass)
38  hass_device = device_registry.async_get_device(
39  identifiers={(DOMAIN, str(entry.unique_id))}
40  )
41  if not hass_device:
42  return data
43 
44  data["device"] = {
45  **async_redact_data(attr.asdict(hass_device), TO_REDACT_DEV),
46  "entities": {},
47  }
48 
49  hass_entities = er.async_entries_for_device(
50  entity_registry,
51  device_id=hass_device.id,
52  include_disabled_entities=True,
53  )
54 
55  for entity_entry in hass_entities:
56  state = hass.states.get(entity_entry.entity_id)
57  state_dict = None
58  if state:
59  state_dict = dict(state.as_dict())
60  # The entity_id is already provided at root level.
61  state_dict.pop("entity_id", None)
62  # The context doesn't provide useful information in this case.
63  state_dict.pop("context", None)
64 
65  data["device"]["entities"][entity_entry.entity_id] = {
67  attr.asdict(
68  entity_entry, filter=lambda attr, value: attr.name != "entity_id"
69  ),
70  TO_REDACT,
71  ),
72  "state": state_dict,
73  }
74 
75  return data
dict[str, dict[str, Any]] async_get_config_entry_diagnostics(HomeAssistant hass, AndroidTVConfigEntry entry)
Definition: diagnostics.py:24
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
Definition: util.py:14