Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion SUPPORTED_FEATURES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
| Feature | roborock.vacuum.a10 | roborock.vacuum.a117 | roborock.vacuum.a123 | roborock.vacuum.a125 | roborock.vacuum.a144 | roborock.vacuum.a147 | roborock.vacuum.a15 | roborock.vacuum.a187 | roborock.vacuum.a27 | roborock.vacuum.a87 | roborock.vacuum.s5e | roborock.vacuum.sc01 | roborock.vacuum.sc05 | roborock.vacuum.ss07 | roborock.wm.a102 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| product_nickname | TANOSV | PEARLPLUSS | PEARLSLITE | ULTRONSE | CORALPRO | VERDELITE | TANOSS | Unknown | TOPAZSV | PEARLPLUS | RUBYSLITE | Unknown | PEARLPLUS | Unknown | Unknown |
| product_nickname | TANOSV | PEARLPLUSS | PEARLSLITE | ULTRONSE | CORALPRO | VERDELITE | TANOSS | VIVIANC | TOPAZSV | PEARLPLUS | RUBYSLITE | Unknown | PEARLPLUS | Unknown | Unknown |
| protocol_version | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | B01 | B01 | B01 | A01 |
| new_feature_info | X | X | 0 | X | X | X | X | X | False | X | X | 0 | | 0 | 0 |
| new_feature_info_str | | X | X | X | X | X | X | X | | X | X | X | | X | X |
Expand Down
4 changes: 2 additions & 2 deletions device_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -665,7 +665,7 @@ roborock.vacuum.a15:
type: RAW
roborock.vacuum.a187:
protocol_version: '1.0'
product_nickname: Unknown
product_nickname: VIVIANC
new_feature_info: 2247397454282751
new_feature_info_str: 00040040282834C9C2FA8F5C7EDEFFFE
product:
Expand Down Expand Up @@ -1303,7 +1303,7 @@ roborock.vacuum.sc05:
property: 'null'
roborock.vacuum.a288:
protocol_version: '1.0'
product_nickname: PEARLPLUS
product_nickname: CORALPROSAW
new_feature_info: 4499197267967999
new_feature_info_str: 0000000000099518CCFF7EFDA8E93EDDDBFF8F7F7EFEFFFF
feature_info:
Expand Down
3 changes: 3 additions & 0 deletions docs/V1_DEVICE_FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -1373,6 +1373,7 @@ These features are determined by hardware capabilities and product variant.

### is_support_water_mode
**Product Features:** MOP_ELECTRONIC_MODULE, MOP_SHAKE_MODULE, MOP_SPIN_MODULE
**Also enabled by:** `is_roller_mop_supported` (roller-mop models have no mop module product feature)
**Feature:** Water Mode Control
**Description:** Electronic control over water flow for mopping.
**Impact:** Adjustable water flow rates for different floor wetness.
Expand Down Expand Up @@ -1413,6 +1414,7 @@ These features are determined by hardware capabilities and product variant.

### is_clean_route_setting_supported
**Product Features:** MOP_SHAKE_MODULE, MOP_SPIN_MODULE
**Also enabled by:** `is_shake_mop_set_supported`, `is_roller_mop_supported`
**Feature:** Clean Route Settings
**Description:** Configure cleaning route patterns.
**Impact:** Choose between different cleaning patterns (zigzag, edge-first, etc.).
Expand All @@ -1429,6 +1431,7 @@ These features are determined by hardware capabilities and product variant.

### is_customized_clean_supported
**Product Features:** MOP_SHAKE_MODULE, MOP_SPIN_MODULE
**Also enabled by:** `is_roller_mop_supported`
**Feature:** Customized Clean Settings
**Description:** Advanced customization for mop-equipped models.
**Impact:** Detailed control over mopping parameters.
49 changes: 47 additions & 2 deletions roborock/data/code_mappings.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,26 +179,60 @@ def __hash__(self) -> int:


class RoborockProductNickname(Enum):
# Beryl Series
BERYL = ProductInfo(nickname="Beryl", short_models=("a120", "a121"))
BERYLC = ProductInfo(nickname="BerylC", short_models=("a327", "a328"))
BERYLCE = ProductInfo(nickname="BerylCE", short_models=("a388", "a389"))
BERYLE = ProductInfo(nickname="BerylE", short_models=("a311", "a312"))
BERYLLITE = ProductInfo(nickname="BerylLite", short_models=("a244", "a245"))
BERYLS = ProductInfo(nickname="BerylS", short_models=("a306", "a307"))

# Coral Series
CORAL = ProductInfo(nickname="Coral", short_models=("a20", "a21"))
CORALPRO = ProductInfo(nickname="CoralPro", short_models=("a143", "a144"))
CORALPRO = ProductInfo(nickname="CoralPro", short_models=("a143", "a144", "a231", "a232", "a236", "a308"))
CORALPROS = ProductInfo(nickname="CoralProS", short_models=("a219", "a220"))
CORALPROSAW = ProductInfo(nickname="CoralProSAw", short_models=("a287", "a288"))

# Crag Series
CRAG = ProductInfo(nickname="Crag", short_models=("a390", "a391"))

# Hera Series
HERA = ProductInfo(nickname="Hera", short_models=("a224", "a249"))

# Pandora Series
PANDORA = ProductInfo(nickname="Pandora", short_models=("a243", "a250"))

# Pearl Series
PEARL = ProductInfo(nickname="Pearl", short_models=("a74", "a75"))
PEARLC = ProductInfo(nickname="PearlC", short_models=("a103", "a104"))
PEARLCLITE = ProductInfo(nickname="PearlCLite", short_models=("a198", "a199", "a205"))
PEARLE = ProductInfo(nickname="PearlE", short_models=("a167", "a168"))
PEARLEH = ProductInfo(nickname="PearlEH", short_models=("a325", "a326"))
# Newer app versions call this product PearlEPro.
PEARLELITE = ProductInfo(nickname="PearlELite", short_models=("a169", "a170"))
PEARLFPRO = ProductInfo(nickname="PearlFPro", short_models=("a216", "a217"))
PEARLPLUS = ProductInfo(nickname="PearlPlus", short_models=("a86", "a87"))
PEARLPLUSS = ProductInfo(nickname="PearlPlusS", short_models=("a116", "a117", "a136"))
PEARLS = ProductInfo(nickname="PearlS", short_models=("a100", "a101"))
PEARLSLITE = ProductInfo(nickname="PearlSLite", short_models=("a122", "a123"))

# Quinn Series
QUINN = ProductInfo(nickname="Quinn", short_models=("a293", "a294"))
QUINNE = ProductInfo(nickname="QuinnE", short_models=("a358", "a359"))
QUINNS = ProductInfo(nickname="QuinnS", short_models=("a404", "a405"))

# R Series
R50 = ProductInfo(nickname="R50", short_models=("a157", "a179"))

# Ruby Series
RUBYPLUS = ProductInfo(nickname="RubyPlus", short_models=("t4", "s4"))
RUBYSC = ProductInfo(nickname="RubySC", short_models=("p5", "a08"))
RUBYSE = ProductInfo(nickname="RubySE", short_models=("a19",))
RUBYSLITE = ProductInfo(nickname="RubySLite", short_models=("p6", "s5e", "a05"))

# Talc Series
TALCSC = ProductInfo(nickname="TalcSC", short_models=("a360", "a361"))

# Tanos Series
TANOS = ProductInfo(nickname="Tanos", short_models=("t6", "s6"))
TANOSE = ProductInfo(nickname="TanosE", short_models=("t7", "a11"))
Expand Down Expand Up @@ -228,10 +262,21 @@ class RoborockProductNickname(Enum):

# Verdelite Series
VERDELITE = ProductInfo(nickname="Verdelite", short_models=("a146", "a147"))
VERDELITES = ProductInfo(nickname="VerdeliteS", short_models=("a278", "a279"))

# Vida Series
VIDA = ProductInfo(nickname="Vida", short_models=("a295", "a296"))
VIDAS = ProductInfo(nickname="VidaS", short_models=("a373", "a376"))

# Vivian Series
VIVIAN = ProductInfo(nickname="Vivian", short_models=("a134", "a135", "a155", "a156"))
VIVIANC = ProductInfo(nickname="VivianC", short_models=("a158", "a159"))
VIVIANC = ProductInfo(nickname="VivianC", short_models=("a158", "a159", "a186", "a187", "a209", "a210", "a246"))
VIVIANF = ProductInfo(nickname="VivianF", short_models=("a182",))
VIVIANS = ProductInfo(nickname="VivianS", short_models=("a184", "a185"))
VIVIANSC = ProductInfo(nickname="VivianSC", short_models=("a196", "a197"))
VIVIANSPRO = ProductInfo(nickname="VivianSPro", short_models=("a225", "a226"))
VIVIANSPROC = ProductInfo(nickname="VivianSProC", short_models=("a297", "a298"))
VIVIANSPROE = ProductInfo(nickname="VivianSProE", short_models=("a374", "a375"))


SHORT_MODEL_TO_ENUM = {model: product for product in RoborockProductNickname for model in product.value.short_models}
Expand Down
35 changes: 35 additions & 0 deletions roborock/device_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ class ProductFeatures(StrEnum):
ULTRONSV_FEATURES = NEW_DEFAULT_FEATURES + RGB_CAMERA_FEATURES + [ProductFeatures.MOP_SHAKE_MODULE]
TANOSS_FEATURES = [ProductFeatures.REMOTE_BACK, ProductFeatures.MOP_SHAKE_MODULE]
TOPAZSPOWER_FEATURES = [ProductFeatures.CLEANMODE_MAXPLUS, ProductFeatures.MOP_SHAKE_MODULE]
BERYL_FEATURES = [ProductFeatures.CLEANMODE_MAXPLUS] + RGB_CAMERA_FEATURES
VIVIANSPROC_FEATURES = BERYL_FEATURES + [ProductFeatures.MOP_SPIN_MODULE]

PRODUCTS_WITHOUT_CUSTOM_CLEAN: set[RoborockProductNickname] = {
RoborockProductNickname.TANOS,
Expand Down Expand Up @@ -234,6 +236,35 @@ class ProductFeatures(StrEnum):
RoborockProductNickname.RUBYSC: [],
RoborockProductNickname.RUBYSE: [],
RoborockProductNickname.RUBYSLITE: [ProductFeatures.MOP_ELECTRONIC_MODULE],
RoborockProductNickname.PEARLCLITE: PEARL_FEATURES,
RoborockProductNickname.PEARLEH: PEARL_FEATURES,
RoborockProductNickname.QUINN: PEARL_FEATURES,
RoborockProductNickname.QUINNE: PEARL_FEATURES,
RoborockProductNickname.QUINNS: PEARL_FEATURES,
RoborockProductNickname.VIVIANSPROE: PEARL_FEATURES,
RoborockProductNickname.VIVIANF: PEARL_PLUS_FEATURES,
RoborockProductNickname.VIVIANS: PEARL_PLUS_FEATURES,
RoborockProductNickname.VIVIANSC: PEARL_PLUS_FEATURES,
RoborockProductNickname.VIVIANSPRO: PEARL_PLUS_FEATURES,
RoborockProductNickname.HERA: PEARL_PLUS_FEATURES,
RoborockProductNickname.PANDORA: PEARL_PLUS_FEATURES,
RoborockProductNickname.PEARLFPRO: PEARL_PLUS_FEATURES,
RoborockProductNickname.CORALPROS: PEARL_PLUS_FEATURES,
RoborockProductNickname.R50: PEARL_PLUS_FEATURES,
RoborockProductNickname.VIVIANSPROC: VIVIANSPROC_FEATURES,
RoborockProductNickname.VIDA: VIVIANSPROC_FEATURES,
RoborockProductNickname.VIDAS: VIVIANSPROC_FEATURES,
RoborockProductNickname.CORALPROSAW: VIVIANSPROC_FEATURES,
RoborockProductNickname.BERYLLITE: BERYL_FEATURES,
RoborockProductNickname.BERYL: BERYL_FEATURES,
RoborockProductNickname.BERYLS: BERYL_FEATURES,
RoborockProductNickname.BERYLE: BERYL_FEATURES,
RoborockProductNickname.BERYLC: BERYL_FEATURES,
RoborockProductNickname.CRAG: BERYL_FEATURES,
RoborockProductNickname.BERYLCE: [ProductFeatures.CLEANMODE_MAXPLUS, ProductFeatures.AIRECOGNITION_PET]
+ SINGLE_LINE_CAMERA_FEATURES,
RoborockProductNickname.VERDELITES: BERYL_FEATURES + [ProductFeatures.MOP_SHAKE_MODULE],
RoborockProductNickname.TALCSC: [ProductFeatures.MOP_ELECTRONIC_MODULE],
}

PRODUCT_FEATURE_MAP: dict[RoborockProductNickname, list[ProductFeatures]] = {
Expand Down Expand Up @@ -651,6 +682,10 @@ def from_feature_flags(
kwargs["is_clean_route_setting_supported"] |= (
kwargs["is_shake_mop_set_supported"] or kwargs["is_roller_mop_supported"]
)
# Roller-mop models have no mop module product feature; the app treats the
# roller mop like one for water modes and customized cleaning.
kwargs["is_support_water_mode"] |= kwargs["is_roller_mop_supported"]
kwargs["is_customized_clean_supported"] |= kwargs["is_roller_mop_supported"]

return cls(**kwargs)

Expand Down
Loading
Loading