From 763981324741b073a17fa9ecbfd7c03e823c30fc Mon Sep 17 00:00:00 2001 From: Imou-OpenPlatform Date: Thu, 3 Sep 2026 20:15:06 +0800 Subject: [PATCH] Add Imou diagnostics for config entries (#181132) --- homeassistant/components/imou/diagnostics.py | 44 +++++++++++++++++++ .../components/imou/quality_scale.yaml | 2 +- .../imou/snapshots/test_diagnostics.ambr | 24 ++++++++++ tests/components/imou/test_diagnostics.py | 22 ++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/imou/diagnostics.py create mode 100644 tests/components/imou/snapshots/test_diagnostics.ambr create mode 100644 tests/components/imou/test_diagnostics.py diff --git a/homeassistant/components/imou/diagnostics.py b/homeassistant/components/imou/diagnostics.py new file mode 100644 index 000000000000..2df7e1f8d9a4 --- /dev/null +++ b/homeassistant/components/imou/diagnostics.py @@ -0,0 +1,44 @@ +"""Diagnostics support for Imou.""" + +from typing import Any + +from pyimouapi.ha_device import ImouHaDevice + +from homeassistant.core import HomeAssistant + +from .const import CONF_API_URL, CONF_APP_ID, imou_device_identifier +from .coordinator import ImouConfigEntry + + +def _serialize_device(device: ImouHaDevice) -> dict[str, Any]: + """Return a JSON-safe view of a discovered Imou device.""" + return { + "identifier": imou_device_identifier(device), + "device_id": device.device_id, + "channel_id": device.channel_id, + "model": device.model, + "manufacturer": device.manufacturer, + "sw_version": device.swversion, + "product_id": device.product_id, + "is_ipc": device.is_ipc, + } + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: ImouConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + coordinator = entry.runtime_data + return { + "entry": { + CONF_API_URL: entry.data[CONF_API_URL], + CONF_APP_ID: entry.data[CONF_APP_ID], + }, + "coordinator": { + "last_update_success": coordinator.last_update_success, + }, + "devices": [ + _serialize_device(device) + for device in sorted(coordinator.devices, key=imou_device_identifier) + ], + } diff --git a/homeassistant/components/imou/quality_scale.yaml b/homeassistant/components/imou/quality_scale.yaml index a9c86bee01c3..ed9c0718fcc1 100644 --- a/homeassistant/components/imou/quality_scale.yaml +++ b/homeassistant/components/imou/quality_scale.yaml @@ -45,7 +45,7 @@ rules: # Gold devices: done - diagnostics: todo + diagnostics: done discovery-update-info: status: exempt comment: Cloud hub; DHCP only surfaces the integration. Device IP is not stored or updated. diff --git a/tests/components/imou/snapshots/test_diagnostics.ambr b/tests/components/imou/snapshots/test_diagnostics.ambr new file mode 100644 index 000000000000..324bda74759f --- /dev/null +++ b/tests/components/imou/snapshots/test_diagnostics.ambr @@ -0,0 +1,24 @@ +# serializer version: 1 +# name: test_config_entry_diagnostics + dict({ + 'coordinator': dict({ + 'last_update_success': True, + }), + 'devices': list([ + dict({ + 'channel_id': None, + 'device_id': 'd1', + 'identifier': 'd1', + 'is_ipc': False, + 'manufacturer': 'Imou', + 'model': 'm1', + 'product_id': None, + 'sw_version': '1.0', + }), + ]), + 'entry': dict({ + 'api_url': 'sg', + 'app_id': 'test_app_id', + }), + }) +# --- diff --git a/tests/components/imou/test_diagnostics.py b/tests/components/imou/test_diagnostics.py new file mode 100644 index 000000000000..2d8ffccbdc7d --- /dev/null +++ b/tests/components/imou/test_diagnostics.py @@ -0,0 +1,22 @@ +"""Tests for Imou 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_config_entry_diagnostics( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + init_integration: MockConfigEntry, + snapshot: SnapshotAssertion, +) -> None: + """Diagnostics include the region, App ID, and current devices.""" + assert ( + await get_diagnostics_for_config_entry(hass, hass_client, init_integration) + == snapshot + )