diff --git a/roborock/data/b01_q7/b01_q7_code_mappings.py b/roborock/data/b01_q7/b01_q7_code_mappings.py index 857b0ca3..b1c910b8 100644 --- a/roborock/data/b01_q7/b01_q7_code_mappings.py +++ b/roborock/data/b01_q7/b01_q7_code_mappings.py @@ -46,8 +46,15 @@ class CleanTypeMapping(RoborockModeEnum): class CleanRepeatMapping(RoborockModeEnum): """Maps the cleaning repeat parameter.""" - ONCE = ("once", 0) - TWICE = ("twice", 1) + ONE = ("one", 0) + TWO = ("two", 1) + + +class CleanPathPreferenceMapping(RoborockModeEnum): + """Maps the cleaning path preference parameter.""" + + BALANCED = ("balanced", 0) + DEEP = ("deep", 1) class SCDeviceCleanParam(RoborockModeEnum): diff --git a/roborock/data/b01_q7/b01_q7_containers.py b/roborock/data/b01_q7/b01_q7_containers.py index f8c3fb9c..58b6dd35 100644 --- a/roborock/data/b01_q7/b01_q7_containers.py +++ b/roborock/data/b01_q7/b01_q7_containers.py @@ -7,6 +7,8 @@ from ..containers import RoborockBase from .b01_q7_code_mappings import ( B01Fault, + CleanPathPreferenceMapping, + CleanRepeatMapping, CleanTypeMapping, SCWindMapping, WaterLevelMapping, @@ -94,10 +96,10 @@ class B01Props(RoborockBase): mop_life: int | None = None main_sensor: int | None = None net_status: NetStatus | None = None - repeat_state: int | None = None + repeat_state: CleanRepeatMapping | None = None tank_state: int | None = None sweep_type: int | None = None - clean_path_preference: int | None = None + clean_path_preference: CleanPathPreferenceMapping | None = None cloth_state: int | None = None time_zone: int | None = None time_zone_info: str | None = None @@ -210,6 +212,16 @@ def work_mode_name(self) -> str | None: """Returns the name of the current work mode.""" return self.work_mode.value if self.work_mode is not None else None + @property + def repeat_state_name(self) -> str | None: + """Returns the name of the current repeat state.""" + return self.repeat_state.value if self.repeat_state is not None else None + + @property + def clean_path_preference_name(self) -> str | None: + """Returns the name of the current clean path preference.""" + return self.clean_path_preference.value if self.clean_path_preference is not None else None + @dataclass class CleanRecordDetail(RoborockBase): diff --git a/roborock/devices/traits/b01/q7/__init__.py b/roborock/devices/traits/b01/q7/__init__.py index 608221ba..9c09c05c 100644 --- a/roborock/devices/traits/b01/q7/__init__.py +++ b/roborock/devices/traits/b01/q7/__init__.py @@ -5,6 +5,8 @@ from roborock import B01Props from roborock.data.b01_q7.b01_q7_code_mappings import ( + CleanPathPreferenceMapping, + CleanRepeatMapping, CleanTaskTypeMapping, CleanTypeMapping, SCDeviceCleanParam, @@ -66,6 +68,14 @@ async def set_mode(self, mode: CleanTypeMapping) -> None: """Set the cleaning mode (vacuum, mop, or vacuum and mop).""" await self.set_prop(RoborockB01Props.MODE, mode.code) + async def set_clean_path_preference(self, preference: CleanPathPreferenceMapping) -> None: + """Set the cleaning path preference (route).""" + await self.set_prop(RoborockB01Props.CLEAN_PATH_PREFERENCE, preference.code) + + async def set_repeat_state(self, repeat: CleanRepeatMapping) -> None: + """Set the cleaning repeat state (cycles).""" + await self.set_prop(RoborockB01Props.REPEAT_STATE, repeat.code) + async def start_clean(self) -> None: """Start cleaning.""" await self.send( diff --git a/tests/data/b01_q7/test_b01_q7_containers.py b/tests/data/b01_q7/test_b01_q7_containers.py index 9d99eb79..3cedd023 100644 --- a/tests/data/b01_q7/test_b01_q7_containers.py +++ b/tests/data/b01_q7/test_b01_q7_containers.py @@ -5,8 +5,10 @@ from roborock.data.b01_q7 import ( B01Fault, B01Props, + CleanPathPreferenceMapping, CleanRecordDetail, CleanRecordList, + CleanRepeatMapping, SCWindMapping, WorkStatusMapping, ) @@ -106,6 +108,10 @@ def test_b01props_deserialization(): assert deserialized.wind == SCWindMapping.STRONG assert deserialized.net_status is not None assert deserialized.net_status.ip == "192.168.1.102" + assert deserialized.repeat_state == CleanRepeatMapping.TWO + assert deserialized.clean_path_preference == CleanPathPreferenceMapping.DEEP + assert deserialized.repeat_state_name == "two" + assert deserialized.clean_path_preference_name == "deep" def test_b01_q7_clean_record_list_parses_detail_fields():