From bebf5009d6f1b3f0e3962ffc39a7f64c1ac39eb3 Mon Sep 17 00:00:00 2001 From: ollo69 <60491700+ollo69@users.noreply.github.com> Date: Fri, 4 Feb 2022 20:40:29 +0100 Subject: [PATCH] Add diagnostics support for Asuswrt (#65605) Co-authored-by: Paulus Schoutsen --- .coveragerc | 1 + .../components/asuswrt/diagnostics.py | 84 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 homeassistant/components/asuswrt/diagnostics.py diff --git a/.coveragerc b/.coveragerc index 03e99959fd4..f16666609bb 100644 --- a/.coveragerc +++ b/.coveragerc @@ -80,6 +80,7 @@ omit = homeassistant/components/asterisk_cdr/mailbox.py homeassistant/components/asterisk_mbox/* homeassistant/components/asuswrt/__init__.py + homeassistant/components/asuswrt/diagnostics.py homeassistant/components/asuswrt/router.py homeassistant/components/aten_pe/* homeassistant/components/atome/* diff --git a/homeassistant/components/asuswrt/diagnostics.py b/homeassistant/components/asuswrt/diagnostics.py new file mode 100644 index 00000000000..dc26bca5512 --- /dev/null +++ b/homeassistant/components/asuswrt/diagnostics.py @@ -0,0 +1,84 @@ +"""Diagnostics support for Asuswrt.""" +from __future__ import annotations + +from typing import Any + +from homeassistant.components.diagnostics import async_redact_data +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers import device_registry as dr, entity_registry as er + +from .const import DATA_ASUSWRT, DOMAIN +from .router import AsusWrtRouter + +TO_REDACT = {CONF_PASSWORD, CONF_USERNAME} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: ConfigEntry +) -> dict[str, dict[str, Any]]: + """Return diagnostics for a config entry.""" + data = {"entry": async_redact_data(entry.as_dict(), TO_REDACT)} + + router: AsusWrtRouter = hass.data[DOMAIN][entry.entry_id][DATA_ASUSWRT] + + # Gather information how this AsusWrt device is represented in Home Assistant + device_registry = dr.async_get(hass) + entity_registry = er.async_get(hass) + hass_device = device_registry.async_get_device( + identifiers=router.device_info["identifiers"] + ) + if not hass_device: + return data + + data["device"] = { + "name": hass_device.name, + "name_by_user": hass_device.name_by_user, + "disabled": hass_device.disabled, + "disabled_by": hass_device.disabled_by, + "device_info": async_redact_data(dict(router.device_info), {"identifiers"}), + "entities": {}, + "tracked_devices": [], + } + + hass_entities = er.async_entries_for_device( + entity_registry, + device_id=hass_device.id, + include_disabled_entities=True, + ) + + for entity_entry in hass_entities: + state = hass.states.get(entity_entry.entity_id) + state_dict = None + if state: + state_dict = dict(state.as_dict()) + # The entity_id is already provided at root level. + state_dict.pop("entity_id", None) + # The context doesn't provide useful information in this case. + state_dict.pop("context", None) + + data["device"]["entities"][entity_entry.entity_id] = { + "name": entity_entry.name, + "original_name": entity_entry.original_name, + "disabled": entity_entry.disabled, + "disabled_by": entity_entry.disabled_by, + "entity_category": entity_entry.entity_category, + "device_class": entity_entry.device_class, + "original_device_class": entity_entry.original_device_class, + "icon": entity_entry.icon, + "original_icon": entity_entry.original_icon, + "unit_of_measurement": entity_entry.unit_of_measurement, + "state": state_dict, + } + + for device in router.devices.values(): + data["device"]["tracked_devices"].append( + { + "name": device.name or "Unknown device", + "ip_address": device.ip_address, + "last_activity": device.last_activity, + } + ) + + return data