From 6934f7fca2ae6ada004a27a1e8b604f1dbba0178 Mon Sep 17 00:00:00 2001 From: Luke Lashley Date: Sat, 31 Oct 2026 14:16:42 -0400 Subject: [PATCH] fix(a01): skip DP 225 on Zeo H1 Neo Exclude DEFAULT_SETTING from the initial force-load query for roborock.wm.a90, matching the existing H1 workaround. The device does not return DP 225, so requiring it prevents setup from completing. Test both affected models, keep other model support unchanged, and retain the remaining softener DPs in the query. Fixes #996 --- roborock/devices/traits/a01/device_feature.py | 7 +++++-- tests/devices/traits/a01/test_device_feature.py | 12 +++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/roborock/devices/traits/a01/device_feature.py b/roborock/devices/traits/a01/device_feature.py index 001ee3c91..3290833d7 100644 --- a/roborock/devices/traits/a01/device_feature.py +++ b/roborock/devices/traits/a01/device_feature.py @@ -143,10 +143,13 @@ } ) -# Devices known to lack DEFAULT_SETTING (DP 225). +# Devices known to lack DEFAULT_SETTING (DP 225). These models have a softener +# compartment but never answer the DP 225 query, so requesting it stalls the +# force-load until it times out. _UNSUPPORTED_DEFAULT_SETTING: frozenset[str] = frozenset( { "roborock.wm.a63", # H1 + "roborock.wm.a90", # H1 Lite / H1 Neo } ) @@ -250,7 +253,7 @@ def supports_feature_bits(model: str | None) -> bool: def supports_default_setting(model: str | None) -> bool: - """H1 (a63) does not support DP 225 even though it has a softener compartment.""" + """H1 (a63) and H1 Lite (a90) do not support DP 225 despite having a softener compartment.""" if model is None: return True # conservative: assume yes return model not in _UNSUPPORTED_DEFAULT_SETTING diff --git a/tests/devices/traits/a01/test_device_feature.py b/tests/devices/traits/a01/test_device_feature.py index 75d92b271..fcc293b1d 100644 --- a/tests/devices/traits/a01/test_device_feature.py +++ b/tests/devices/traits/a01/test_device_feature.py @@ -11,18 +11,20 @@ [ ("roborock.wm.a63", False), # H1 ("roborock.wm.a102", True), # H1 Overseas - ("roborock.wm.a90", True), # H1 Lite + ("roborock.wm.a90", False), # H1 Lite / H1 Neo + ("roborock.wm.a91", True), # H1 Lite Overseas (None, True), # unknown model: assume supported ], ) def test_supports_default_setting(model: str | None, expected: bool) -> None: - """DP 225 is unsupported on H1 (a63) only.""" + """DP 225 is unsupported on H1 (a63) and H1 Lite (a90).""" assert supports_default_setting(model) is expected -def test_force_load_omits_default_setting_for_h1() -> None: - """H1 (a63) has a softener compartment but must not be queried for DP 225.""" - dp_list = build_force_load_dp_list("roborock.wm.a63") +@pytest.mark.parametrize("model", ["roborock.wm.a63", "roborock.wm.a90"]) +def test_force_load_omits_default_setting_for_h1(model: str) -> None: + """H1 variants have a softener compartment but must not be queried for DP 225.""" + dp_list = build_force_load_dp_list(model) assert RoborockZeoProtocol.DEFAULT_SETTING not in dp_list # The remaining softener DPs are still queried.