From 76a38d446f74fbd67961c65b66ef3b8f2c6b9392 Mon Sep 17 00:00:00 2001 From: Tom Matheussen <13683094+Tommatheussen@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:19:22 +0200 Subject: [PATCH] Add panel information to diagnostics for Satel Integra (#180987) --- .../components/satel_integra/__init__.py | 13 +++++----- .../components/satel_integra/coordinator.py | 3 ++- .../components/satel_integra/diagnostics.py | 23 ++++++++++-------- .../snapshots/test_diagnostics.ambr | 24 +++++++++++++++++++ .../satel_integra/test_diagnostics.py | 20 ++++++++++++++++ 5 files changed, 66 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/satel_integra/__init__.py b/homeassistant/components/satel_integra/__init__.py index 5705b826052e..44a7fe31d0ff 100644 --- a/homeassistant/components/satel_integra/__init__.py +++ b/homeassistant/components/satel_integra/__init__.py @@ -69,8 +69,15 @@ async def async_setup_entry(hass: HomeAssistant, entry: SatelConfigEntry) -> boo ) await coordinator_temperatures.async_config_entry_first_refresh() + try: + panel_info = await client.controller.read_panel_info() + except SatelIntegraError: + _LOGGER.warning("Unable to read Satel panel information", exc_info=True) + panel_info = None + entry.runtime_data = SatelIntegraData( client=client, + panel_info=panel_info, coordinator_zones=coordinator_zones, coordinator_outputs=coordinator_outputs, coordinator_partitions=coordinator_partitions, @@ -86,12 +93,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: SatelConfigEntry) -> boo hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_close_connection) ) - try: - panel_info = await client.controller.read_panel_info() - except SatelIntegraError: - _LOGGER.warning("Unable to read Satel panel information", exc_info=True) - panel_info = None - device_registry = dr.async_get(hass) device_registry.async_get_or_create( config_entry_id=entry.entry_id, diff --git a/homeassistant/components/satel_integra/coordinator.py b/homeassistant/components/satel_integra/coordinator.py index c96cb2b976c0..39c2adffd337 100644 --- a/homeassistant/components/satel_integra/coordinator.py +++ b/homeassistant/components/satel_integra/coordinator.py @@ -5,7 +5,7 @@ from datetime import timedelta import logging from typing import override -from satel_integra import AlarmState +from satel_integra import AlarmState, SatelPanelInfo from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback @@ -26,6 +26,7 @@ class SatelIntegraData: """Data for the satel_integra integration.""" client: SatelClient + panel_info: SatelPanelInfo | None coordinator_zones: SatelIntegraZonesCoordinator coordinator_outputs: SatelIntegraOutputsCoordinator coordinator_partitions: SatelIntegraPartitionsCoordinator diff --git a/homeassistant/components/satel_integra/diagnostics.py b/homeassistant/components/satel_integra/diagnostics.py index d7e172819c67..0f1ca56d5560 100644 --- a/homeassistant/components/satel_integra/diagnostics.py +++ b/homeassistant/components/satel_integra/diagnostics.py @@ -1,26 +1,29 @@ """Diagnostics support for Satel Integra.""" +from dataclasses import asdict from typing import Any from homeassistant.components.diagnostics import async_redact_data -from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_CODE from homeassistant.core import HomeAssistant from .const import CONF_ENCRYPTION_KEY +from .coordinator import SatelConfigEntry TO_REDACT = {CONF_CODE, CONF_ENCRYPTION_KEY} async def async_get_config_entry_diagnostics( - hass: HomeAssistant, entry: ConfigEntry + hass: HomeAssistant, entry: SatelConfigEntry ) -> dict[str, Any]: """Return diagnostics for the config entry.""" - diag: dict[str, Any] = {} - - diag["config_entry_data"] = async_redact_data(entry.data, TO_REDACT) - diag["config_entry_options"] = async_redact_data(entry.options, TO_REDACT) - - diag["subentries"] = dict(entry.subentries) - - return diag + return { + "config_entry_data": async_redact_data(entry.data, TO_REDACT), + "config_entry_options": async_redact_data(entry.options, TO_REDACT), + "subentries": dict(entry.subentries), + "panel_info": ( + asdict(entry.runtime_data.panel_info) + if entry.runtime_data.panel_info + else None + ), + } diff --git a/tests/components/satel_integra/snapshots/test_diagnostics.ambr b/tests/components/satel_integra/snapshots/test_diagnostics.ambr index 221596f2602b..3d0aa7b892b2 100644 --- a/tests/components/satel_integra/snapshots/test_diagnostics.ambr +++ b/tests/components/satel_integra/snapshots/test_diagnostics.ambr @@ -9,6 +9,18 @@ 'config_entry_options': dict({ 'code': '**REDACTED**', }), + 'panel_info': dict({ + 'firmware': dict({ + 'release_date': '2025-03-12', + 'version': '1.24', + }), + 'language_code': 0, + 'model': dict({ + 'name': 'INTEGRA 64', + }), + 'settings_stored_in_flash': True, + 'type_code': 2, + }), 'subentries': dict({ 'ID_OUTPUT': dict({ 'data': dict({ @@ -67,6 +79,18 @@ 'config_entry_options': dict({ 'code': '**REDACTED**', }), + 'panel_info': dict({ + 'firmware': dict({ + 'release_date': '2025-03-12', + 'version': '1.24', + }), + 'language_code': 0, + 'model': dict({ + 'name': 'INTEGRA 64', + }), + 'settings_stored_in_flash': True, + 'type_code': 2, + }), 'subentries': dict({ 'ID_ZONE': dict({ 'data': dict({ diff --git a/tests/components/satel_integra/test_diagnostics.py b/tests/components/satel_integra/test_diagnostics.py index 7ac3ab78c46d..bf8d60bf2ea2 100644 --- a/tests/components/satel_integra/test_diagnostics.py +++ b/tests/components/satel_integra/test_diagnostics.py @@ -3,6 +3,7 @@ from unittest.mock import AsyncMock import pytest +from satel_integra import SatelUnexpectedResponseError from syrupy.assertion import SnapshotAssertion from syrupy.filters import props @@ -10,6 +11,7 @@ from homeassistant.core import HomeAssistant from . import setup_integration +from tests.common import MockConfigEntry from tests.components.diagnostics import get_diagnostics_for_config_entry from tests.typing import ClientSessionGenerator @@ -35,3 +37,21 @@ async def test_diagnostics( diagnostics = await get_diagnostics_for_config_entry(hass, hass_client, entry) assert diagnostics == snapshot(exclude=props("created_at", "modified_at", "id")) + + +async def test_diagnostics_without_panel_info( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + mock_satel: AsyncMock, + mock_config_entry: MockConfigEntry, +) -> None: + """Test diagnostics when panel information could not be read during setup.""" + mock_satel.read_panel_info.side_effect = SatelUnexpectedResponseError + await setup_integration(hass, mock_config_entry) + + diagnostics = await get_diagnostics_for_config_entry( + hass, hass_client, mock_config_entry + ) + + assert diagnostics["panel_info"] is None + mock_satel.read_panel_info.assert_awaited_once_with()