Skip to content

Commit 87d2597

Browse files
authored
Add diagnostics to Saunum integration (home-assistant#156623)
1 parent 437bc04 commit 87d2597

File tree

4 files changed

+110
-2
lines changed

4 files changed

+110
-2
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Diagnostics support for Saunum Leil Sauna Control Unit integration."""
2+
3+
from __future__ import annotations
4+
5+
from dataclasses import asdict
6+
from typing import Any
7+
8+
from homeassistant.components.diagnostics import async_redact_data
9+
from homeassistant.const import CONF_HOST
10+
from homeassistant.core import HomeAssistant
11+
12+
from . import LeilSaunaConfigEntry
13+
14+
REDACT_CONFIG = {CONF_HOST}
15+
16+
17+
async def async_get_config_entry_diagnostics(
18+
hass: HomeAssistant, entry: LeilSaunaConfigEntry
19+
) -> dict[str, Any]:
20+
"""Return diagnostics for a config entry."""
21+
coordinator = entry.runtime_data
22+
23+
# Build diagnostics data
24+
diagnostics_data: dict[str, Any] = {
25+
"config": async_redact_data(entry.data, REDACT_CONFIG),
26+
"client_info": {"connected": coordinator.client.is_connected},
27+
"coordinator_info": {
28+
"last_update_success": coordinator.last_update_success,
29+
"update_interval": str(coordinator.update_interval),
30+
"last_exception": str(coordinator.last_exception)
31+
if coordinator.last_exception
32+
else None,
33+
},
34+
}
35+
36+
# Add coordinator data if available
37+
if coordinator.data:
38+
data_dict = asdict(coordinator.data)
39+
diagnostics_data["coordinator_data"] = data_dict
40+
41+
# Add alarm summary
42+
alarm_fields = [
43+
key
44+
for key, value in data_dict.items()
45+
if key.startswith("alarm_") and value is True
46+
]
47+
diagnostics_data["active_alarms"] = alarm_fields
48+
49+
return diagnostics_data

homeassistant/components/saunum/quality_scale.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ rules:
4141

4242
# Gold tier
4343
devices: done
44-
diagnostics: todo
44+
diagnostics: done
4545
discovery:
4646
status: exempt
4747
comment: Device uses generic Espressif hardware with no unique identifying information (MAC OUI or hostname) that would distinguish it from other Espressif-based devices on the network.
4848
discovery-update-info: todo
4949
docs-data-update: done
5050
docs-examples: todo
5151
docs-known-limitations: done
52-
docs-supported-devices: todo
52+
docs-supported-devices: done
5353
docs-supported-functions: done
5454
docs-troubleshooting: done
5555
docs-use-cases: done
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# serializer version: 1
2+
# name: test_entry_diagnostics
3+
dict({
4+
'active_alarms': list([
5+
]),
6+
'client_info': dict({
7+
'connected': True,
8+
}),
9+
'config': dict({
10+
'host': '**REDACTED**',
11+
}),
12+
'coordinator_data': dict({
13+
'alarm_door_open': False,
14+
'alarm_door_sensor': False,
15+
'alarm_internal_temp': False,
16+
'alarm_temp_sensor_open': False,
17+
'alarm_temp_sensor_short': False,
18+
'alarm_thermal_cutoff': False,
19+
'current_temperature': 75.0,
20+
'door_open': False,
21+
'fan_duration': 10,
22+
'fan_speed': 2,
23+
'heater_elements_active': 0,
24+
'light_on': False,
25+
'on_time': 3600,
26+
'sauna_duration': 120,
27+
'sauna_type': 0,
28+
'session_active': False,
29+
'target_temperature': 80,
30+
}),
31+
'coordinator_info': dict({
32+
'last_exception': None,
33+
'last_update_success': True,
34+
'update_interval': '0:01:00',
35+
}),
36+
})
37+
# ---
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""Test Saunum Leil Sauna diagnostics."""
2+
3+
from syrupy.assertion import SnapshotAssertion
4+
5+
from homeassistant.core import HomeAssistant
6+
7+
from tests.common import MockConfigEntry
8+
from tests.components.diagnostics import get_diagnostics_for_config_entry
9+
from tests.typing import ClientSessionGenerator
10+
11+
12+
async def test_entry_diagnostics(
13+
hass: HomeAssistant,
14+
hass_client: ClientSessionGenerator,
15+
init_integration: MockConfigEntry,
16+
snapshot: SnapshotAssertion,
17+
) -> None:
18+
"""Test config entry diagnostics."""
19+
assert (
20+
await get_diagnostics_for_config_entry(hass, hass_client, init_integration)
21+
== snapshot
22+
)

0 commit comments

Comments
 (0)