Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Diagnostics support for Synology DSM."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from homeassistant.components.camera import diagnostics as camera_diagnostics
8 from homeassistant.components.diagnostics import async_redact_data
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
11 from homeassistant.core import HomeAssistant
12 
13 from .const import CONF_DEVICE_TOKEN, DOMAIN
14 from .models import SynologyDSMData
15 
16 TO_REDACT = {CONF_USERNAME, CONF_PASSWORD, CONF_DEVICE_TOKEN}
17 
18 
20  hass: HomeAssistant, entry: ConfigEntry
21 ) -> dict[str, Any]:
22  """Return diagnostics for a config entry."""
23  data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
24  syno_api = data.api
25  dsm_info = syno_api.dsm.information
26 
27  diag_data: dict[str, Any] = {
28  "entry": async_redact_data(entry.as_dict(), TO_REDACT),
29  "device_info": {
30  "model": dsm_info.model,
31  "version": dsm_info.version_string,
32  "ram": dsm_info.ram,
33  "uptime": dsm_info.uptime,
34  "temperature": dsm_info.temperature,
35  },
36  "network": {"interfaces": {}},
37  "storage": {"disks": {}, "volumes": {}},
38  "surveillance_station": {"cameras": {}, "camera_diagnostics": {}},
39  "upgrade": {},
40  "utilisation": {},
41  "is_system_loaded": True,
42  "api_details": {
43  "fetching_entities": syno_api._fetching_entities, # noqa: SLF001
44  },
45  }
46 
47  if syno_api.network is not None:
48  for intf in syno_api.network.interfaces:
49  diag_data["network"]["interfaces"][intf["id"]] = {
50  "type": intf["type"],
51  "ip": intf["ip"],
52  }
53 
54  if syno_api.storage is not None:
55  for disk in syno_api.storage.disks:
56  diag_data["storage"]["disks"][disk["id"]] = {
57  "name": disk["name"],
58  "vendor": disk["vendor"],
59  "model": disk["model"],
60  "device": disk["device"],
61  "temp": disk["temp"],
62  "size_total": disk["size_total"],
63  }
64 
65  for volume in syno_api.storage.volumes:
66  diag_data["storage"]["volumes"][volume["id"]] = {
67  "name": volume["fs_type"],
68  "size": volume["size"],
69  }
70 
71  if syno_api.surveillance_station is not None:
72  for camera in syno_api.surveillance_station.get_all_cameras():
73  diag_data["surveillance_station"]["cameras"][camera.id] = {
74  "name": camera.name,
75  "is_enabled": camera.is_enabled,
76  "is_motion_detection_enabled": camera.is_motion_detection_enabled,
77  "model": camera.model,
78  "resolution": camera.resolution,
79  }
80  if camera_data := await camera_diagnostics.async_get_config_entry_diagnostics(
81  hass, entry
82  ):
83  diag_data["surveillance_station"]["camera_diagnostics"] = camera_data
84 
85  if syno_api.upgrade is not None:
86  diag_data["upgrade"] = {
87  "update_available": syno_api.upgrade.update_available,
88  "available_version": syno_api.upgrade.available_version,
89  "reboot_needed": syno_api.upgrade.reboot_needed,
90  "service_restarts": syno_api.upgrade.service_restarts,
91  }
92 
93  if syno_api.utilisation is not None:
94  diag_data["utilisation"] = {
95  "cpu": syno_api.utilisation.cpu,
96  "memory": syno_api.utilisation.memory,
97  "network": syno_api.utilisation.network,
98  }
99 
100  return diag_data
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
Definition: util.py:14
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, ConfigEntry entry)
Definition: diagnostics.py:21