From 30d46d5a133c506d359605fb5fb2fe97765c2ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 22 Mar 2026 16:56:21 +0100 Subject: [PATCH 1/3] refactor(q10): harmonize enum state values across Q10 modes --- .../data/b01_q10/b01_q10_code_mappings.py | 20 ++++++------ tests/data/test_code_mappings.py | 32 ++++++++++++++++++- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/roborock/data/b01_q10/b01_q10_code_mappings.py b/roborock/data/b01_q10/b01_q10_code_mappings.py index 660a35c5..bfb08de8 100644 --- a/roborock/data/b01_q10/b01_q10_code_mappings.py +++ b/roborock/data/b01_q10/b01_q10_code_mappings.py @@ -171,7 +171,7 @@ class YXDeviceState(RoborockModeEnum): REMOTEING_STATE = "remote_control", 7 CHARGING_STATE = "charging", 8 PAUSE_STATE = "paused", 10 - FAULT_STATE = "fault", 12 + FAULT_STATE = "error", 12 UPGRADE_STATE = "updating", 14 DUSTING = "dusting", 22 CREATING_MAP_STATE = "creating_map", 29 @@ -187,18 +187,18 @@ class YXDeviceState(RoborockModeEnum): class YXBackType(RoborockModeEnum): UNKNOWN = "unknown", -1 IDLE = "idle", 0 - BACK_DUSTING = "backdusting", 4 - BACK_CHARGING = "backcharging", 5 + BACK_DUSTING = "back_dusting", 4 + BACK_CHARGING = "back_charging", 5 class YXDeviceWorkMode(RoborockModeEnum): UNKNOWN = "unknown", -1 - BOTH_WORK = "bothwork", 1 - ONLY_SWEEP = "onlysweep", 2 - ONLY_MOP = "onlymop", 3 + BOTH_WORK = "vac_and_mop", 1 + ONLY_SWEEP = "vacuum", 2 + ONLY_MOP = "mop", 3 CUSTOMIZED = "customized", 4 - SAVE_WORRY = "saveworry", 5 - SWEEP_MOP = "sweepmop", 6 + SAVE_WORRY = "save_worry", 5 + SWEEP_MOP = "sweep_mop", 6 class YXDeviceCleanTask(RoborockModeEnum): @@ -206,8 +206,8 @@ class YXDeviceCleanTask(RoborockModeEnum): IDLE = "idle", 0 SMART = "smart", 1 ELECTORAL = "electoral", 2 - DIVIDE_AREAS = "divideareas", 3 - CREATING_MAP = "creatingmap", 4 + DIVIDE_AREAS = "divide_areas", 3 + CREATING_MAP = "creating_map", 4 PART = "part", 5 diff --git a/tests/data/test_code_mappings.py b/tests/data/test_code_mappings.py index 3c25f105..ac124fb1 100644 --- a/tests/data/test_code_mappings.py +++ b/tests/data/test_code_mappings.py @@ -5,7 +5,13 @@ import pytest from roborock import HomeDataProduct, RoborockCategory -from roborock.data.b01_q10.b01_q10_code_mappings import B01_Q10_DP +from roborock.data.b01_q10.b01_q10_code_mappings import ( + B01_Q10_DP, + YXBackType, + YXDeviceCleanTask, + YXDeviceState, + YXDeviceWorkMode, +) def test_from_code() -> None: @@ -89,3 +95,27 @@ def test_homedata_product_unknown_category(): product = HomeDataProduct.from_dict(data) assert product.id == "unknown_cat_id" assert product.category == RoborockCategory.UNKNOWN +def test_yx_device_state_fault_uses_error_value() -> None: + """Test YXDeviceState uses a cross-device-consistent error label.""" + assert YXDeviceState.FAULT_STATE.value == "error" + + +def test_yx_back_type_values_are_readable() -> None: + """Test YXBackType values are exposed as readable snake_case.""" + assert YXBackType.BACK_DUSTING.value == "back_dusting" + assert YXBackType.BACK_CHARGING.value == "back_charging" + + +def test_yx_device_work_mode_values_are_readable() -> None: + """Test YXDeviceWorkMode values align with readable cleaning labels.""" + assert YXDeviceWorkMode.BOTH_WORK.value == "vac_and_mop" + assert YXDeviceWorkMode.ONLY_SWEEP.value == "vacuum" + assert YXDeviceWorkMode.ONLY_MOP.value == "mop" + assert YXDeviceWorkMode.SAVE_WORRY.value == "save_worry" + assert YXDeviceWorkMode.SWEEP_MOP.value == "sweep_mop" + + +def test_yx_device_clean_task_values_are_readable() -> None: + """Test YXDeviceCleanTask values are exposed as readable snake_case.""" + assert YXDeviceCleanTask.DIVIDE_AREAS.value == "divide_areas" + assert YXDeviceCleanTask.CREATING_MAP.value == "creating_map" From c1c446ab55029b76a13cecbc6be900947911f204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 22 Mar 2026 17:22:45 +0100 Subject: [PATCH 2/3] test: add assertion for unknown category in HomeDataProduct test --- tests/data/test_code_mappings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/data/test_code_mappings.py b/tests/data/test_code_mappings.py index ac124fb1..f612b5ba 100644 --- a/tests/data/test_code_mappings.py +++ b/tests/data/test_code_mappings.py @@ -95,6 +95,8 @@ def test_homedata_product_unknown_category(): product = HomeDataProduct.from_dict(data) assert product.id == "unknown_cat_id" assert product.category == RoborockCategory.UNKNOWN + + def test_yx_device_state_fault_uses_error_value() -> None: """Test YXDeviceState uses a cross-device-consistent error label.""" assert YXDeviceState.FAULT_STATE.value == "error" From 1a69f4547ce38e63eb44620ddcdc91b955654694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 22 Mar 2026 17:23:56 +0100 Subject: [PATCH 3/3] fix(test): update fault state value to match canonical naming --- tests/data/b01_q10/test_b01_q10_code_mappings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/b01_q10/test_b01_q10_code_mappings.py b/tests/data/b01_q10/test_b01_q10_code_mappings.py index b6703110..e296ef23 100644 --- a/tests/data/b01_q10/test_b01_q10_code_mappings.py +++ b/tests/data/b01_q10/test_b01_q10_code_mappings.py @@ -14,7 +14,7 @@ def test_q10_status_values_are_canonical() -> None: YXDeviceState.REMOTEING_STATE: "remote_control", YXDeviceState.CHARGING_STATE: "charging", YXDeviceState.PAUSE_STATE: "paused", - YXDeviceState.FAULT_STATE: "fault", + YXDeviceState.FAULT_STATE: "error", YXDeviceState.UPGRADE_STATE: "updating", YXDeviceState.DUSTING: "dusting", YXDeviceState.CREATING_MAP_STATE: "creating_map",