Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions roborock/clean_modes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
from __future__ import annotations

from enum import StrEnum

from roborock import DeviceFeatures


class RoborockModeEnum(StrEnum):
"""A custom StrEnum that also stores an integer code for each member."""

code: int

def __new__(cls, value: str, code: int) -> RoborockModeEnum:
"""Creates a new enum member."""
member = str.__new__(cls, value)
member._value_ = value
member.code = code
return member


class CleanModes(RoborockModeEnum):
GENTLE = ("gentle", 105)
OFF = ("off", 105)
QUIET = ("quiet", 101)
BALANCED = ("balanced", 102)
TURBO = ("turbo", 103)
MAX = ("max", 104)
MAX_PLUS = ("max_plus", 108)
CUSTOMIZED = ("custom", 106)
SMART_MODE = ("smart_mode", 110)


class CleanRoutes(RoborockModeEnum):
STANDARD = ("standard", 300)
DEEP = ("deep", 301)
DEEP_PLUS = ("deep_plus", 303)
FAST = ("fast", 304)
DEEP_PLUS_CN = ("deep_plus", 305)
SMART_MODE = ("smart_mode", 306)
CUSTOMIZED = ("custom", 302)


class CleanModesOld(RoborockModeEnum):
QUIET = ("quiet", 38)
BALANCED = ("balanced", 60)
TURBO = ("turbo", 75)
MAX = ("max", 100)


class WaterModes(RoborockModeEnum):
OFF = ("off", 200)
LOW = ("low", 201)
MILD = ("mild", 201)
MEDIUM = ("medium", 202)
STANDARD = ("standard", 202)
HIGH = ("high", 203)
INTENSE = ("intense", 203)
CUSTOMIZED = ("custom", 204)
CUSTOM = ("custom_water_flow", 207)
EXTREME = ("extreme", 208)
SMART_MODE = ("smart_mode", 209)


def get_clean_modes(features: DeviceFeatures) -> list[CleanModes]:
modes = [CleanModes.QUIET, CleanModes.BALANCED, CleanModes.TURBO, CleanModes.MAX]
if features.is_max_plus_mode_supported or features.is_none_pure_clean_mop_with_max_plus:
modes.append(CleanModes.MAX_PLUS)
if features.is_pure_clean_mop_supported:
modes.append(CleanModes.OFF)
else:
modes.append(CleanModes.GENTLE)
return modes


def get_clean_routes(features: DeviceFeatures, region: str) -> list[CleanRoutes]:
if features.is_none_pure_clean_mop_with_max_plus:
return [CleanRoutes.FAST, CleanRoutes.STANDARD]
supported = [CleanRoutes.STANDARD, CleanRoutes.DEEP]
if features.is_careful_slow_mop_supported:
if not (
features.is_corner_clean_mode_supported
and features.is_clean_route_deep_slow_plus_supported
and region == "CN"
):
supported.append(CleanRoutes.DEEP_PLUS_CN)
else:
supported.append(CleanRoutes.DEEP_PLUS)

if features.is_clean_route_fast_mode_supported:
supported.append(CleanRoutes.FAST)
return supported


def get_water_modes(features: DeviceFeatures) -> list[WaterModes]:
supported_modes = [WaterModes.OFF]
if features.is_mop_shake_module_supported:
supported_modes.extend([WaterModes.MILD, WaterModes.STANDARD, WaterModes.INTENSE])
else:
supported_modes.extend([WaterModes.LOW, WaterModes.MEDIUM, WaterModes.HIGH])
if features.is_custom_water_box_distance_supported:
supported_modes.append(WaterModes.CUSTOM)
if features.is_mop_shake_module_supported and features.is_mop_shake_water_max_supported:
supported_modes.append(WaterModes.EXTREME)
return supported_modes
1 change: 1 addition & 0 deletions roborock/device_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ class DeviceFeatures:
is_clean_route_setting_supported: bool = field(
metadata={"product_features": [ProductFeatures.MOP_SHAKE_MODULE, ProductFeatures.MOP_SPIN_MODULE]}
)
is_mop_shake_module_supported: bool = field(metadata={"product_features": [ProductFeatures.MOP_SHAKE_MODULE]})

@classmethod
def from_feature_flags(
Expand Down