From 3963c1b29dd6acf0384065e1e78626bee1b3cfac Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Thu, 7 May 2026 22:42:18 +0200 Subject: [PATCH 1/2] Return unknown state for Overkiz covers when OpenClosedUnknownState reports unknown Previously, is_closed treated any non-closed value as False (open), but the core:OpenClosedUnknownState definition explicitly allows "unknown" which should map to HA's unknown state rather than open. --- homeassistant/components/overkiz/cover.py | 2 + .../setup/cloud_somfy_tahoma_v2_europe.json | 70 +++++++++++++++++++ .../overkiz/snapshots/test_cover.ambr | 53 ++++++++++++++ 3 files changed, 125 insertions(+) diff --git a/homeassistant/components/overkiz/cover.py b/homeassistant/components/overkiz/cover.py index 9eb3b3d079d8c9..5c6eaae48c572c 100644 --- a/homeassistant/components/overkiz/cover.py +++ b/homeassistant/components/overkiz/cover.py @@ -391,6 +391,8 @@ def is_closed(self) -> bool | None: """Return if the cover is closed.""" if is_closed_state := self.entity_description.is_closed_state: if state := self.device.states.get(is_closed_state): + if state.value == "unknown": # TODO wait for pyOverkiz enum update + return None return state.value == OverkizCommandParam.CLOSED if (position := self.current_cover_position) is not None: diff --git a/tests/components/overkiz/fixtures/setup/cloud_somfy_tahoma_v2_europe.json b/tests/components/overkiz/fixtures/setup/cloud_somfy_tahoma_v2_europe.json index b20d0c4c58b997..a494041046bdf5 100644 --- a/tests/components/overkiz/fixtures/setup/cloud_somfy_tahoma_v2_europe.json +++ b/tests/components/overkiz/fixtures/setup/cloud_somfy_tahoma_v2_europe.json @@ -644,6 +644,76 @@ "oid": "0df95043-359c-4b3d-9147-f49b2b35053c", "uiClass": "GarageDoor" }, + { + "creationTime": 1521964729000, + "lastUpdateTime": 1521964729000, + "label": "Basement Garage Door", + "deviceURL": "io://1234-1234-6233/1166864", + "shortcut": false, + "controllableName": "io:GarageOpenerIOComponent", + "definition": { + "commands": [ + { + "commandName": "close", + "nparams": 0 + }, + { + "commandName": "open", + "nparams": 0 + }, + { + "commandName": "setClosure", + "nparams": 1 + }, + { + "commandName": "stop", + "nparams": 0 + } + ], + "states": [ + { + "type": "ContinuousState", + "qualifiedName": "core:ClosureState" + }, + { + "type": "DiscreteState", + "values": ["closed", "open", "unknown"], + "qualifiedName": "core:OpenClosedUnknownState" + } + ], + "widgetName": "PositionableGarageDoor", + "uiProfiles": [ + "StatefulCloseableGarageOpener", + "StatefulCloseable", + "Closeable", + "OpenClose" + ], + "uiClass": "GarageDoor", + "qualifiedName": "io:GarageOpenerIOComponent", + "type": "ACTUATOR" + }, + "states": [ + { + "name": "core:OpenClosedUnknownState", + "type": 3, + "value": "unknown" + } + ], + "attributes": [ + { + "name": "core:Manufacturer", + "type": 3, + "value": "Somfy" + } + ], + "available": true, + "enabled": true, + "placeOID": "bcbb34ef-2241-43a1-9c5b-523aa0563ec3", + "widget": "PositionableGarageDoor", + "type": 1, + "oid": "1df95043-359c-4b3d-9147-f49b2b35053d", + "uiClass": "GarageDoor" + }, { "creationTime": 1552163547000, "lastUpdateTime": 1552163547000, diff --git a/tests/components/overkiz/snapshots/test_cover.ambr b/tests/components/overkiz/snapshots/test_cover.ambr index dc35a2d803bc97..c03866dd5bf542 100644 --- a/tests/components/overkiz/snapshots/test_cover.ambr +++ b/tests/components/overkiz/snapshots/test_cover.ambr @@ -919,6 +919,59 @@ 'state': 'open', }) # --- +# name: test_cover_entities_snapshot[cloud_somfy_tahoma_v2_europe.json][cover.basement_garage_door-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'cover', + 'entity_category': None, + 'entity_id': 'cover.basement_garage_door', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': None, + 'platform': 'overkiz', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': , + 'translation_key': None, + 'unique_id': 'io://1234-1234-6233/1166864', + 'unit_of_measurement': None, + }) +# --- +# name: test_cover_entities_snapshot[cloud_somfy_tahoma_v2_europe.json][cover.basement_garage_door-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'garage', + 'friendly_name': 'Basement Garage Door', + 'is_closed': None, + 'supported_features': , + }), + 'context': , + 'entity_id': 'cover.basement_garage_door', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_cover_entities_snapshot[cloud_somfy_tahoma_v2_europe.json][cover.bedroom_blinds-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ From 5f52d101b8d875444282459aa00441b2d4995cae Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Fri, 8 May 2026 06:47:42 +0000 Subject: [PATCH 2/2] Use OverkizCommandParam.UNKNOWN for unknown state check in OverkizCover --- homeassistant/components/overkiz/cover.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/overkiz/cover.py b/homeassistant/components/overkiz/cover.py index 5c6eaae48c572c..2e09716d3587d3 100644 --- a/homeassistant/components/overkiz/cover.py +++ b/homeassistant/components/overkiz/cover.py @@ -391,7 +391,7 @@ def is_closed(self) -> bool | None: """Return if the cover is closed.""" if is_closed_state := self.entity_description.is_closed_state: if state := self.device.states.get(is_closed_state): - if state.value == "unknown": # TODO wait for pyOverkiz enum update + if state.value == OverkizCommandParam.UNKNOWN: return None return state.value == OverkizCommandParam.CLOSED