diff --git a/homeassistant/components/rituals_perfume_genie/sensor.py b/homeassistant/components/rituals_perfume_genie/sensor.py index 2daeeae05dc1..91a9d58c368d 100644 --- a/homeassistant/components/rituals_perfume_genie/sensor.py +++ b/homeassistant/components/rituals_perfume_genie/sensor.py @@ -40,6 +40,7 @@ ENTITY_DESCRIPTIONS = ( key="fill", translation_key="fill", value_fn=lambda diffuser: diffuser.fill, + has_fn=lambda diffuser: "fillc" in diffuser.hub_data.get("sensors", {}), ), RitualsSensorEntityDescription( key="perfume", diff --git a/tests/components/rituals_perfume_genie/common.py b/tests/components/rituals_perfume_genie/common.py index 7505f933cea7..6bdcaadd4c4d 100644 --- a/tests/components/rituals_perfume_genie/common.py +++ b/tests/components/rituals_perfume_genie/common.py @@ -63,6 +63,7 @@ def mock_diffuser( diffuser_mock.version = version diffuser_mock.wifi_percentage = wifi_percentage diffuser_mock.data = load_json_object_fixture("data.json", DOMAIN) + diffuser_mock.hub_data = diffuser_mock.data["hub"] return diffuser_mock @@ -71,6 +72,24 @@ def mock_diffuser_v1_battery_cartridge() -> MagicMock: return mock_diffuser(hublot="lot123v1") +def mock_diffuser_v3_no_battery_no_fill() -> MagicMock: + """Create and return a mock version 3 Diffuser without battery or fill sensor.""" + diffuser = mock_diffuser( + hublot="lot123v3", + battery_percentage=Exception(), + charging=Exception(), + fill="", + has_battery=False, + has_cartridge=True, + name="Genie V3", + perfume="Ritual of Sakura", + version="6.0", + ) + diffuser.data = load_json_object_fixture("data_no_fill.json", DOMAIN) + diffuser.hub_data = diffuser.data["hub"] + return diffuser + + def mock_diffuser_v2_no_battery_no_cartridge() -> MagicMock: """Create and return a mock version 2 Diffuser without battery and cartridge.""" return mock_diffuser( diff --git a/tests/components/rituals_perfume_genie/fixtures/data_no_fill.json b/tests/components/rituals_perfume_genie/fixtures/data_no_fill.json new file mode 100644 index 000000000000..0d1f07077c0c --- /dev/null +++ b/tests/components/rituals_perfume_genie/fixtures/data_no_fill.json @@ -0,0 +1,70 @@ +{ + "hub": { + "hublot": "LOT456", + "hash": "abcdef1234567890ghijklmnopqrstuvwxyz", + "status": 1, + "title": null, + "current_time": "2023-06-09T20:50", + "cached_time": "2023-06-09T20:48", + "ping_update": "25", + "attributes": { + "roomc": "4", + "speedc": "3", + "fanc": "1", + "roomnamec": "Living room", + "resetc": "", + "fspacenamec": "", + "fspacetypec": "" + }, + "sensors": { + "wific": { + "id": 10, + "sensor_id": 1, + "title": "High", + "description": "", + "icon": "icon-signal.png", + "image": "", + "discover_image": "", + "discover_url": null, + "min_value": "-69.99", + "max_value": "-0.00", + "interval": "1", + "created_at": "2017-03-10 16:17:30", + "updated_at": "2020-06-17 16:57:53", + "default": 0 + }, + "rfidc": { + "id": 54, + "sensor_id": 4, + "title": "Private Collection Sweet Jasmine", + "description": "", + "icon": "icon-jasmine.png", + "image": "background-jasmine.png", + "discover_image": "discover-jasmine.png", + "discover_url": "sweet-jasmine-cartridge-1105402.html", + "min_value": "05377650", + "max_value": "05377650", + "interval": "", + "created_at": "2019-04-04 07:53:32", + "updated_at": "2021-01-26 14:17:03", + "default": 0 + }, + "versionc": "6.0", + "ipc": "1682963060" + }, + "settings": [ + { + "schedule_id": 1835730, + "start": "07:30", + "end": "08:30", + "mon": 1, + "tue": 1, + "wed": 1, + "thu": 1, + "fri": 1, + "sat": 1, + "sun": 1 + } + ] + } +} diff --git a/tests/components/rituals_perfume_genie/test_sensor.py b/tests/components/rituals_perfume_genie/test_sensor.py index fd273d238fe6..5ba47863d39d 100644 --- a/tests/components/rituals_perfume_genie/test_sensor.py +++ b/tests/components/rituals_perfume_genie/test_sensor.py @@ -14,6 +14,7 @@ from .common import ( init_integration, mock_config_entry, mock_diffuser_v1_battery_cartridge, + mock_diffuser_v3_no_battery_no_fill, ) @@ -63,3 +64,19 @@ async def test_sensors_diffuser_v1_battery_cartridge( assert entry assert entry.unique_id == f"{hublot}-wifi_percentage" assert entry.entity_category == EntityCategory.DIAGNOSTIC + + +async def test_sensors_diffuser_v3_no_fill( + hass: HomeAssistant, entity_registry: er.EntityRegistry +) -> None: + """Test that a Genie 3.0 without fill sensor data does not create a fill entity.""" + config_entry = mock_config_entry(unique_id="id_123_sensor_test_diffuser_v3") + diffuser = mock_diffuser_v3_no_battery_no_fill() + await init_integration(hass, config_entry, [diffuser]) + + assert hass.states.get("sensor.genie_v3_fill") is None + assert entity_registry.async_get("sensor.genie_v3_fill") is None + + state = hass.states.get("sensor.genie_v3_perfume") + assert state + assert state.state == diffuser.perfume