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:
parent
38a1c97a51
commit
fb5afff9d5
4 changed files with 115 additions and 0 deletions
53
homeassistant/components/motionblinds_ble/diagnostics.py
Normal file
53
homeassistant/components/motionblinds_ble/diagnostics.py
Normal 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,
|
||||||
|
)
|
|
@ -109,6 +109,7 @@ def mock_config_entry(
|
||||||
return MockConfigEntry(
|
return MockConfigEntry(
|
||||||
title="mock_title",
|
title="mock_title",
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
|
entry_id="mock_entry_id",
|
||||||
unique_id=address,
|
unique_id=address,
|
||||||
data={
|
data={
|
||||||
CONF_ADDRESS: address,
|
CONF_ADDRESS: address,
|
||||||
|
|
|
@ -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,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
# ---
|
27
tests/components/motionblinds_ble/test_diagnostics.py
Normal file
27
tests/components/motionblinds_ble/test_diagnostics.py
Normal 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"))
|
Loading…
Add table
Add a link
Reference in a new issue