From a5c193931f0a188b0a50d9d138ffa6f57d503828 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 12 Jun 2026 08:30:57 +0200 Subject: [PATCH] Fix Rituals Perfume Genie sw_version dict passed to device registry (#173552) --- .../rituals_perfume_genie/entity.py | 10 ++++++- .../rituals_perfume_genie/test_switch.py | 29 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/rituals_perfume_genie/entity.py b/homeassistant/components/rituals_perfume_genie/entity.py index 075df410cf04..78540b684f51 100644 --- a/homeassistant/components/rituals_perfume_genie/entity.py +++ b/homeassistant/components/rituals_perfume_genie/entity.py @@ -1,5 +1,7 @@ """Base class for Rituals Perfume Genie diffuser entity.""" +from typing import Any + from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.update_coordinator import CoordinatorEntity @@ -12,6 +14,12 @@ MODEL = "The Perfume Genie" MODEL2 = "The Perfume Genie 2.0" +def _version_string(version: Any) -> str: + if isinstance(version, dict): + return str(version.get("title", version)) + return str(version) + + class DiffuserEntity(CoordinatorEntity[RitualsDataUpdateCoordinator]): """Representation of a diffuser entity.""" @@ -31,7 +39,7 @@ class DiffuserEntity(CoordinatorEntity[RitualsDataUpdateCoordinator]): manufacturer=MANUFACTURER, model=MODEL if coordinator.diffuser.has_battery else MODEL2, name=coordinator.diffuser.name, - sw_version=coordinator.diffuser.version, + sw_version=_version_string(coordinator.diffuser.version), ) @property diff --git a/tests/components/rituals_perfume_genie/test_switch.py b/tests/components/rituals_perfume_genie/test_switch.py index 1471105352f8..2eb271696d60 100644 --- a/tests/components/rituals_perfume_genie/test_switch.py +++ b/tests/components/rituals_perfume_genie/test_switch.py @@ -1,5 +1,9 @@ """Tests for the Rituals Perfume Genie switch platform.""" +import logging + +import pytest + from homeassistant.components.homeassistant import ( DOMAIN as HOMEASSISTANT_DOMAIN, SERVICE_UPDATE_ENTITY, @@ -13,12 +17,13 @@ from homeassistant.const import ( STATE_ON, ) from homeassistant.core import HomeAssistant -from homeassistant.helpers import entity_registry as er +from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.setup import async_setup_component from .common import ( init_integration, mock_config_entry, + mock_diffuser, mock_diffuser_v1_battery_cartridge, ) @@ -71,6 +76,28 @@ async def test_switch_handle_coordinator_update(hass: HomeAssistant) -> None: assert diffuser.update_data.call_count == call_count_before_update + 1 +async def test_device_info_sw_version_dict( + hass: HomeAssistant, + device_registry: dr.DeviceRegistry, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test that sw_version is a string even when the library returns a dict.""" + diffuser = mock_diffuser( + hublot="lot123dict", + version={"id": 1, "title": "5.2-rc15", "icon": ""}, + ) + config_entry = mock_config_entry(unique_id="id_123_version_dict_test") + with caplog.at_level(logging.WARNING, logger="homeassistant.helpers.frame"): + await init_integration(hass, config_entry, [diffuser]) + + device_entry = device_registry.async_get_device( + identifiers={("rituals_perfume_genie", "lot123dict")} + ) + assert device_entry + assert device_entry.sw_version == "5.2-rc15" + assert "non-string value" not in caplog.text + + async def test_set_switch_state(hass: HomeAssistant) -> None: """Test changing the diffuser switch entity state.""" config_entry = mock_config_entry(unique_id="id_123_switch_set_state_test")