diff --git a/homeassistant/components/stiebel_eltron/diagnostics.py b/homeassistant/components/stiebel_eltron/diagnostics.py new file mode 100644 index 000000000000..483968dca5c6 --- /dev/null +++ b/homeassistant/components/stiebel_eltron/diagnostics.py @@ -0,0 +1,35 @@ +"""Diagnostics support for STIEBEL ELTRON.""" + +from typing import Any + +from homeassistant.components.diagnostics import async_redact_data +from homeassistant.const import CONF_HOST +from homeassistant.core import HomeAssistant + +from . import StiebelEltronConfigEntry + +TO_REDACT = {CONF_HOST} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: StiebelEltronConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + coordinator = entry.runtime_data + + return { + "entry_data": async_redact_data(entry.data, TO_REDACT), + "model": coordinator.device_info["model"], + "modbus": { + "is_connected": coordinator.api_client.is_connected, + }, + "data": { + "current_temp": coordinator.api_client.get_current_temp(), + "target_temp": coordinator.api_client.get_target_temp(), + "current_humidity": coordinator.api_client.get_current_humidity(), + "operating_mode": coordinator.api_client.get_operation().name, + "heating_status": coordinator.api_client.get_heating_status(), + "cooling_status": coordinator.api_client.get_cooling_status(), + "filter_alarm": coordinator.api_client.get_filter_alarm_status(), + }, + } diff --git a/homeassistant/components/stiebel_eltron/quality_scale.yaml b/homeassistant/components/stiebel_eltron/quality_scale.yaml index fb718177cb62..83242da57564 100644 --- a/homeassistant/components/stiebel_eltron/quality_scale.yaml +++ b/homeassistant/components/stiebel_eltron/quality_scale.yaml @@ -47,7 +47,7 @@ rules: # Gold devices: done - diagnostics: todo + diagnostics: done discovery-update-info: todo discovery: todo docs-data-update: todo diff --git a/tests/components/stiebel_eltron/conftest.py b/tests/components/stiebel_eltron/conftest.py index 5c43aab97196..489377acd783 100644 --- a/tests/components/stiebel_eltron/conftest.py +++ b/tests/components/stiebel_eltron/conftest.py @@ -44,9 +44,14 @@ def mock_lwz_api() -> Generator[MagicMock]: api_client.get_current_temp = MagicMock(return_value=21.0) api_client.get_current_humidity = MagicMock(return_value=45.0) api_client.get_operation = MagicMock(return_value=OperatingMode.AUTOMATIC) + api_client.get_heating_status = MagicMock(return_value=True) + api_client.get_cooling_status = MagicMock(return_value=False) api_client.get_filter_alarm_status = MagicMock(return_value=False) - api_client.connect = AsyncMock() + def _connect() -> None: + api_client.is_connected = True + + api_client.connect = AsyncMock(side_effect=_connect) api_client.close = AsyncMock() api_client.async_update = AsyncMock() api_client.set_operation = AsyncMock() diff --git a/tests/components/stiebel_eltron/snapshots/test_diagnostics.ambr b/tests/components/stiebel_eltron/snapshots/test_diagnostics.ambr new file mode 100644 index 000000000000..004cc7fa8435 --- /dev/null +++ b/tests/components/stiebel_eltron/snapshots/test_diagnostics.ambr @@ -0,0 +1,22 @@ +# serializer version: 1 +# name: test_diagnostics + dict({ + 'data': dict({ + 'cooling_status': False, + 'current_humidity': 45.0, + 'current_temp': 21.0, + 'filter_alarm': False, + 'heating_status': True, + 'operating_mode': 'AUTOMATIC', + 'target_temp': 22.5, + }), + 'entry_data': dict({ + 'host': '**REDACTED**', + 'port': 502, + }), + 'modbus': dict({ + 'is_connected': True, + }), + 'model': 'LWZ', + }) +# --- diff --git a/tests/components/stiebel_eltron/test_diagnostics.py b/tests/components/stiebel_eltron/test_diagnostics.py new file mode 100644 index 000000000000..bc1c820fb1d0 --- /dev/null +++ b/tests/components/stiebel_eltron/test_diagnostics.py @@ -0,0 +1,26 @@ +"""Tests for STIEBEL ELTRON diagnostics.""" + +from syrupy.assertion import SnapshotAssertion + +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry +from tests.components.diagnostics import get_diagnostics_for_config_entry +from tests.typing import ClientSessionGenerator + + +async def test_diagnostics( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + mock_config_entry: MockConfigEntry, + snapshot: SnapshotAssertion, +) -> None: + """Test config entry diagnostics.""" + mock_config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert ( + await get_diagnostics_for_config_entry(hass, hass_client, mock_config_entry) + == snapshot + )