Skip to content

Commit 8bb33cc

Browse files
committed
chore: address comments from copilot
1 parent c29c38f commit 8bb33cc

3 files changed

Lines changed: 61 additions & 18 deletions

File tree

roborock/data/v1/v1_clean_modes.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,32 @@ def get_mop_only_vacuum_mode(features: DeviceFeatures) -> VacuumModes:
207207
return VacuumModes.OFF
208208

209209

210-
_CLEAN_MOTOR_MODE_PARAMS: dict[CleaningModes, tuple[int, int, int]] = {
211-
CleaningModes.VACUUM: (VacuumModes.BALANCED.code, WaterModes.OFF.code, CleanRoutes.STANDARD.code),
212-
CleaningModes.VAC_AND_MOP: (VacuumModes.BALANCED.code, WaterModes.STANDARD.code, CleanRoutes.STANDARD.code),
213-
CleaningModes.CUSTOM: (VacuumModes.CUSTOMIZED.code, WaterModes.CUSTOMIZED.code, CleanRoutes.CUSTOMIZED.code),
214-
CleaningModes.SMART_MODE: (VacuumModes.SMART_MODE.code, WaterModes.SMART_MODE.code, CleanRoutes.SMART_MODE.code),
215-
}
210+
def _get_default_mopping_water_code(features: DeviceFeatures) -> int:
211+
"""Pick a sensible default water code when mopping for the device."""
212+
# Water-slide devices use a disjoint set of water codes; pick a mid-flow
213+
# slide code instead of the standard 202, which they don't accept.
214+
if features.is_water_slide_mode_supported:
215+
return WaterModes.PURE_WATER_FLOW_MIDDLE.code
216+
return WaterModes.STANDARD.code
217+
218+
219+
def _get_clean_motor_mode_params(mode: CleaningModes, features: DeviceFeatures) -> tuple[int, int, int]:
220+
"""Return (fan_power, water_box_mode, mop_mode) codes for the high-level mode."""
221+
if mode == CleaningModes.VACUUM:
222+
return (VacuumModes.BALANCED.code, WaterModes.OFF.code, CleanRoutes.STANDARD.code)
223+
if mode == CleaningModes.VAC_AND_MOP:
224+
return (VacuumModes.BALANCED.code, _get_default_mopping_water_code(features), CleanRoutes.STANDARD.code)
225+
if mode == CleaningModes.MOP:
226+
return (
227+
get_mop_only_vacuum_mode(features).code,
228+
_get_default_mopping_water_code(features),
229+
CleanRoutes.STANDARD.code,
230+
)
231+
if mode == CleaningModes.CUSTOM:
232+
return (VacuumModes.CUSTOMIZED.code, WaterModes.CUSTOMIZED.code, CleanRoutes.CUSTOMIZED.code)
233+
if mode == CleaningModes.SMART_MODE:
234+
return (VacuumModes.SMART_MODE.code, WaterModes.SMART_MODE.code, CleanRoutes.SMART_MODE.code)
235+
raise RoborockUnsupportedFeature(f"Cleaning mode {mode.value!r} is not supported")
216236

217237

218238
def get_cleaning_mode_parameters(cleaning_mode: str | CleaningModes, features: DeviceFeatures) -> list[dict[str, int]]:
@@ -224,13 +244,7 @@ def get_cleaning_mode_parameters(cleaning_mode: str | CleaningModes, features: D
224244
if mode not in get_cleaning_mode_options(features):
225245
raise RoborockUnsupportedFeature(f"Cleaning mode {mode.value!r} is not supported")
226246

227-
if mode == CleaningModes.MOP:
228-
fan_power = get_mop_only_vacuum_mode(features).code
229-
water_box_mode = WaterModes.STANDARD.code
230-
mop_mode = CleanRoutes.STANDARD.code
231-
else:
232-
fan_power, water_box_mode, mop_mode = _CLEAN_MOTOR_MODE_PARAMS[mode]
233-
247+
fan_power, water_box_mode, mop_mode = _get_clean_motor_mode_params(mode, features)
234248
params: dict[str, int] = {"fan_power": fan_power, "water_box_mode": water_box_mode}
235249
if features.is_clean_route_setting_supported:
236250
params["mop_mode"] = mop_mode

roborock/devices/traits/v1/status.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ class StatusTrait(StatusV2, common.V1TraitMixin):
3838
- Water Mode
3939
- Mop Route
4040
41-
You should call the _options() version of the attribute to know which are
42-
supported for your device (i.e. fan_speed_options())
43-
Then you can call the _mapping to convert an int value to the actual Enum.
44-
(i.e. fan_speed_mapping())
45-
You can call the _name property to get the str value of the enum. (i.e. fan_speed_name)
41+
You should use the _options version of the attribute to know which are
42+
supported for your device (i.e. fan_speed_options)
43+
Then you can use the _mapping to convert an int value to the actual Enum.
44+
(i.e. fan_speed_mapping)
45+
You can use the _name property to get the str value of the enum. (i.e. fan_speed_name)
4646
4747
"""
4848

tests/devices/traits/v1/test_status.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ def _create_cleaning_mode_status_trait(**feature_overrides: bool) -> StatusTrait
4141
features.is_customized_clean_supported = True
4242
features.is_clean_route_setting_supported = True
4343
for feature_name, value in feature_overrides.items():
44+
if not hasattr(features, feature_name):
45+
raise AttributeError(f"Unknown DeviceFeatures override: {feature_name}")
4446
setattr(features, feature_name, value)
4547
return StatusTrait(cast(DeviceFeaturesTrait, features), region="us")
4648

@@ -305,6 +307,33 @@ def test_get_cleaning_mode_parameters_without_clean_route_setting() -> None:
305307
]
306308

307309

310+
def test_get_cleaning_mode_parameters_water_slide_device() -> None:
311+
"""Water-slide devices should use a slide-compatible water code, not 202."""
312+
status_trait = _create_cleaning_mode_status_trait(is_water_slide_mode_supported=True)
313+
314+
assert status_trait.get_cleaning_mode_parameters(CleaningModes.VACUUM) == [
315+
{
316+
"fan_power": VacuumModes.BALANCED.code,
317+
"water_box_mode": WaterModes.OFF.code,
318+
"mop_mode": CleanRoutes.STANDARD.code,
319+
}
320+
]
321+
assert status_trait.get_cleaning_mode_parameters(CleaningModes.VAC_AND_MOP) == [
322+
{
323+
"fan_power": VacuumModes.BALANCED.code,
324+
"water_box_mode": WaterModes.PURE_WATER_FLOW_MIDDLE.code,
325+
"mop_mode": CleanRoutes.STANDARD.code,
326+
}
327+
]
328+
assert status_trait.get_cleaning_mode_parameters(CleaningModes.MOP) == [
329+
{
330+
"fan_power": VacuumModes.OFF.code,
331+
"water_box_mode": WaterModes.PURE_WATER_FLOW_MIDDLE.code,
332+
"mop_mode": CleanRoutes.STANDARD.code,
333+
}
334+
]
335+
336+
308337
def test_current_cleaning_mode_gentle_not_mop_without_pure_mop() -> None:
309338
"""Test code 105 is not treated as mop-only on devices without pure mop."""
310339
status_trait = _create_cleaning_mode_status_trait(is_pure_clean_mop_supported=False)

0 commit comments

Comments
 (0)