diff --git a/homeassistant/components/version/diagnostics.py b/homeassistant/components/version/diagnostics.py new file mode 100644 index 00000000000..2ba31bc8870 --- /dev/null +++ b/homeassistant/components/version/diagnostics.py @@ -0,0 +1,56 @@ +"""Provides diagnostics for Version.""" +from __future__ import annotations + +from typing import Any + +from attr import asdict + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers import device_registry as dr, entity_registry as er + +from .const import DOMAIN + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, + config_entry: ConfigEntry, +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + coordinator = hass.data[DOMAIN][config_entry.entry_id] + device_registry = dr.async_get(hass) + entity_registry = er.async_get(hass) + + devices = [] + + registry_devices = dr.async_entries_for_config_entry( + device_registry, config_entry.entry_id + ) + + for device in registry_devices: + entities = [] + + registry_entities = er.async_entries_for_device( + entity_registry, + device_id=device.id, + include_disabled_entities=True, + ) + + for entity in registry_entities: + state_dict = None + if state := hass.states.get(entity.entity_id): + state_dict = dict(state.as_dict()) + state_dict.pop("context", None) + + entities.append({"entry": asdict(entity), "state": state_dict}) + + devices.append({"device": asdict(device), "entities": entities}) + + return { + "entry": config_entry.as_dict(), + "coordinator_data": { + "version": coordinator.version, + "version_data": coordinator.version_data, + }, + "devices": devices, + } diff --git a/tests/components/version/test_diagnostics.py b/tests/components/version/test_diagnostics.py new file mode 100644 index 00000000000..1c9c8df4c62 --- /dev/null +++ b/tests/components/version/test_diagnostics.py @@ -0,0 +1,36 @@ +"""Test version diagnostics.""" + + +from aioaseko import ClientSession + +from homeassistant.core import HomeAssistant + +from .common import MOCK_VERSION, setup_version_integration + +from tests.components.diagnostics import get_diagnostics_for_config_entry + + +async def test_diagnostics( + hass: HomeAssistant, + hass_client: ClientSession, +) -> None: + """Test diagnostic information.""" + config_entry = await setup_version_integration(hass) + + diagnostics = await get_diagnostics_for_config_entry( + hass, hass_client, config_entry + ) + assert diagnostics["entry"]["data"] == { + "name": "", + "channel": "stable", + "image": "default", + "board": "OVA", + "version_source": "Local installation", + "source": "local", + } + + assert diagnostics["coordinator_data"] == { + "version": MOCK_VERSION, + "version_data": None, + } + assert len(diagnostics["devices"]) == 1