Add Motionblinds Bluetooth diagnostics (#121899)

* Add diagnostics platform

* Add diagnostics test

* Remove comments

* Exclude created_at and modified_at from snapshot

* Fix entry_id in mock_config_entry

* Add repr to excluded props from snapshot

* Improve diagnostics

* Use function name instead of number for callback diagnostics

* Remove info from diagnostics

* Reformat
This commit is contained in:
Lenn 2024-09-04 12:11:11 +02:00 committed by GitHub
parent 38a1c97a51
commit fb5afff9d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 115 additions and 0 deletions

View file

@ -0,0 +1,53 @@
"""Diagnostics support for Motionblinds Bluetooth."""
from __future__ import annotations
from collections.abc import Iterable
from typing import Any
from motionblindsble.device import MotionDevice
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_UNIQUE_ID
from homeassistant.core import HomeAssistant
from .const import DOMAIN
CONF_TITLE = "title"
TO_REDACT: Iterable[Any] = {
# Config entry title and unique ID may contain sensitive data:
CONF_TITLE,
CONF_UNIQUE_ID,
}
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: ConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
device: MotionDevice = hass.data[DOMAIN][entry.entry_id]
return async_redact_data(
{
"entry": entry.as_dict(),
"device": {
"blind_type": device.blind_type.value,
"timezone": device.timezone,
"position": device._position, # noqa: SLF001
"tilt": device._tilt, # noqa: SLF001
"calibration_type": device._calibration_type.value # noqa: SLF001
if device._calibration_type # noqa: SLF001
else None,
"connection_type": device._connection_type.value, # noqa: SLF001
"end_position_info": None
if not device._end_position_info # noqa: SLF001
else {
"end_positions": device._end_position_info.end_positions.value, # noqa: SLF001
"favorite": device._end_position_info.favorite_position, # noqa: SLF001
},
},
},
TO_REDACT,
)

View file

@ -109,6 +109,7 @@ def mock_config_entry(
return MockConfigEntry(
title="mock_title",
domain=DOMAIN,
entry_id="mock_entry_id",
unique_id=address,
data={
CONF_ADDRESS: address,

View file

@ -0,0 +1,34 @@
# serializer version: 1
# name: test_diagnostics
dict({
'device': dict({
'blind_type': 'Roller blind',
'calibration_type': None,
'connection_type': 'disconnected',
'end_position_info': None,
'position': None,
'tilt': None,
'timezone': None,
}),
'entry': dict({
'data': dict({
'address': 'cc:cc:cc:cc:cc:cc',
'blind_type': 'roller',
'local_name': 'Motionblind CCCC',
'mac_code': 'CCCC',
}),
'disabled_by': None,
'domain': 'motionblinds_ble',
'entry_id': 'mock_entry_id',
'minor_version': 1,
'options': dict({
}),
'pref_disable_new_entities': False,
'pref_disable_polling': False,
'source': 'user',
'title': '**REDACTED**',
'unique_id': '**REDACTED**',
'version': 1,
}),
})
# ---

View file

@ -0,0 +1,27 @@
"""Test Motionblinds Bluetooth diagnostics."""
from syrupy import SnapshotAssertion
from syrupy.filters import props
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
async def test_diagnostics(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Test diagnostics."""
await setup_integration(hass, mock_config_entry)
assert await get_diagnostics_for_config_entry(
hass, hass_client, mock_config_entry
) == snapshot(exclude=props("created_at", "modified_at", "repr"))