-
-
Notifications
You must be signed in to change notification settings - Fork 38.5k
Expand file tree
/
Copy pathdiagnostics.py
More file actions
106 lines (93 loc) · 2.73 KB
/
Copy pathdiagnostics.py
File metadata and controls
106 lines (93 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""Provide diagnostics for OpenEVSE."""
from datetime import date, datetime
from enum import Enum
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from .coordinator import OpenEVSEConfigEntry
REDACT_CONFIG_DATA = {CONF_PASSWORD, CONF_USERNAME}
CHARGER_PROPERTIES = (
"status",
"vehicle",
"mode",
"charge_mode",
"divertmode",
"manual_override",
"ota_update",
"service_level",
"charge_time_elapsed",
"vehicle_eta",
"charging_current",
"charging_voltage",
"charging_power",
"current_power",
"current_capacity",
"max_current",
"min_amps",
"max_amps",
"max_current_soft",
"available_current",
"smoothed_available_current",
"charge_rate",
"ambient_temperature",
"ir_temperature",
"rtc_temperature",
"esp_temperature",
"usage_session",
"usage_total",
"total_day",
"total_week",
"total_month",
"total_year",
"vehicle_soc",
"vehicle_range",
"wifi_signal",
"shaper_live_power",
"shaper_available_current",
"shaper_max_power",
"gfi_trip_count",
"no_gnd_trip_count",
"stuck_relay_trip_count",
"uptime",
"freeram",
"wifi_firmware",
"openevse_firmware",
)
def _to_json_safe(val: Any) -> Any:
"""Coerce value to be JSON-serializable."""
if isinstance(val, (str, int, float, bool)) or val is None:
return val
if isinstance(val, (datetime, date)):
return val.isoformat()
if isinstance(val, Enum):
return val.value
if isinstance(val, (set, frozenset)):
return [_to_json_safe(v) for v in sorted(val, key=str)]
if isinstance(val, (list, tuple)):
return [_to_json_safe(v) for v in val]
if isinstance(val, dict):
return {str(k): _to_json_safe(v) for k, v in val.items()}
return str(val)
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, config_entry: OpenEVSEConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator = config_entry.runtime_data
charger = coordinator.charger
charger_data: dict[str, Any] = {}
for prop in CHARGER_PROPERTIES:
try:
val = getattr(charger, prop)
except AttributeError:
continue
except Exception as err: # noqa: BLE001
charger_data[prop] = f"Error: {type(err).__name__}: {err}"
continue
if callable(val):
continue
charger_data[prop] = _to_json_safe(val)
return {
"config_entry": async_redact_data(config_entry.as_dict(), REDACT_CONFIG_DATA),
"charger": charger_data,
}