From 443f50cde6b31de6c937deeb3f180d2975b1ea23 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Fri, 21 Jan 2022 20:37:11 +0100 Subject: [PATCH] Add diagnostics to Synology DSM integration (#64480) --- .coveragerc | 1 + .../components/synology_dsm/diagnostics.py | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 homeassistant/components/synology_dsm/diagnostics.py diff --git a/.coveragerc b/.coveragerc index 3bce0f06030..7d661932183 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1098,6 +1098,7 @@ omit = homeassistant/components/synology_dsm/__init__.py homeassistant/components/synology_dsm/binary_sensor.py homeassistant/components/synology_dsm/camera.py + homeassistant/components/synology_dsm/diagnostics.py homeassistant/components/synology_dsm/sensor.py homeassistant/components/synology_dsm/switch.py homeassistant/components/synology_srm/device_tracker.py diff --git a/homeassistant/components/synology_dsm/diagnostics.py b/homeassistant/components/synology_dsm/diagnostics.py new file mode 100644 index 00000000000..8709170a6f8 --- /dev/null +++ b/homeassistant/components/synology_dsm/diagnostics.py @@ -0,0 +1,98 @@ +"""Diagnostics support for Synology DSM.""" +from __future__ import annotations + +from synology_dsm.api.surveillance_station.camera import SynoCamera + +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 . import SynoApi +from .const import CONF_DEVICE_TOKEN, DOMAIN, SYNO_API, SYSTEM_LOADED + +TO_REDACT = {CONF_USERNAME, CONF_PASSWORD, CONF_DEVICE_TOKEN} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: ConfigEntry +) -> dict: + """Return diagnostics for a config entry.""" + data: dict = hass.data[DOMAIN][entry.unique_id] + syno_api: SynoApi = data[SYNO_API] + dsm_info = syno_api.dsm.information + + diag_data = { + "entry": async_redact_data(entry.as_dict(), TO_REDACT), + "device_info": { + "model": dsm_info.model, + "version": dsm_info.version_string, + "ram": dsm_info.ram, + "uptime": dsm_info.uptime, + "temperature": dsm_info.temperature, + }, + "network": {"interfaces": {}}, + "storage": {"disks": {}, "volumes": {}}, + "surveillance_station": {"cameras": {}}, + "upgrade": {}, + "utilisation": {}, + "is_system_loaded": data[SYSTEM_LOADED], + "api_details": { + "fetching_entities": syno_api._fetching_entities, # pylint: disable=protected-access + }, + } + + if syno_api.network is not None: + intf: dict + for intf in syno_api.network.interfaces: + diag_data["network"]["interfaces"][intf["id"]] = { + "type": intf["type"], + "ip": intf["ip"], + } + + if syno_api.storage is not None: + disk: dict + for disk in syno_api.storage.disks: + diag_data["storage"]["disks"][disk["id"]] = { + "name": disk["name"], + "vendor": disk["vendor"], + "model": disk["model"], + "device": disk["device"], + "temp": disk["temp"], + "size_total": disk["size_total"], + } + + volume: dict + for volume in syno_api.storage.volumes: + diag_data["storage"]["volumes"][volume["id"]] = { + "name": volume["fs_type"], + "size": volume["size"], + } + + if syno_api.surveillance_station is not None: + camera: SynoCamera + for camera in syno_api.surveillance_station.get_all_cameras(): + diag_data["surveillance_station"]["cameras"][camera.id] = { + "name": camera.name, + "is_enabled": camera.is_enabled, + "is_motion_detection_enabled": camera.is_motion_detection_enabled, + "model": camera.model, + "resolution": camera.resolution, + } + + if syno_api.upgrade is not None: + diag_data["upgrade"] = { + "update_available": syno_api.upgrade.update_available, + "available_version": syno_api.upgrade.available_version, + "reboot_needed": syno_api.upgrade.reboot_needed, + "service_restarts": syno_api.upgrade.service_restarts, + } + + if syno_api.utilisation is not None: + diag_data["utilisation"] = { + "cpu": syno_api.utilisation.cpu, + "memory": syno_api.utilisation.memory, + "network": syno_api.utilisation.network, + } + + return diag_data