Skip to content

feat(v1): add CleaningMode.VAC_THEN_MOP - #1024

Open
paulleonartcalvo wants to merge 4 commits into
Python-roborock:mainfrom
paulleonartcalvo:feat/vac-then-mop-cleaning-mode
Open

paulleonartcalvo wants to merge 4 commits into
Python-roborock:mainfrom
paulleonartcalvo:feat/vac-then-mop-cleaning-mode

Conversation

@paulleonartcalvo

Copy link
Copy Markdown

Builds on #959 and implements the direction @allenporter suggested in this review comment: fold "clean then mop" into CleaningMode as a fourth mode, so consumers like Home Assistant get it through the existing cleaning mode select instead of a separate control. Closes #914.

The first three commits are @klowdo's from #959, rebased onto main unchanged. The last commit adds the mode on top. Happy to fold this into #959 instead if that is easier.

Changes

  • CleaningMode.VAC_THEN_MOP ("vac_then_mop"), offered in get_cleaning_mode_options() when is_clean_then_mop_mode_supported.
  • get_current_cleaning_mode() takes an optional seq_type and reports VAC_THEN_MOP for vacuum-and-mop settings with seq_type == 1; StatusTrait.current_cleaning_mode passes it through.
  • StatusTrait.set_cleaning_mode():
    • VAC_THEN_MOP: writes the vacuum-and-mop motor settings with set_clean_motor_mode, then app_set_clean_sequence_type with type: 1 and the same motor values (repeat: 1 when is_ctm_with_repeat_supported).
    • Any other mode while the sequence is on: sends type: 0 after the motor write, like the app. Nothing extra is sent when it is already off or unsupported.
  • clean_then_mop returns None on devices without the feature (point 3 of the review).
  • Removed the separate set_clean_then_mop() setter from feat(v1): expose clean-then-mop status from the device #959, since the mode now covers it and a standalone setter can produce the conflicting type: 1 with water_box_mode: 200 case from the review. Easy to restore if you would rather keep it.
  • SEQ_TYPE_CLEAN_THEN_MOP now lives in v1_clean_modes and is shared with the per-room CustomizeCleanModeTrait (feat(v1): expose per-room clean-then-mop via customize clean mode #984).

Device testing

Qrevo Edge 3 Pro (roborock.vacuum.a296, water slide, isCleanThenMopModeSupported and isCtmWithRepeatSupported both true):

  • Payload the official app sends when picking "Vacuum then mop": app_set_clean_sequence_type {"type": 1, "water_box_mode": 248, "mop_mode": 300, "fan_power": 102, "repeat": 1}. The robot answered ok.
  • With that set, a kitchen segment clean detached the mop pads for the vacuum pass, returned to the dock to reattach them, then went back out to mop.
  • Not yet verified on this model: reading seq_type back from get_status (verified on the Saros 20 in feat(v1): expose clean-then-mop status from the device #959).

uv run pytest (2301 passed) and uv run pre-commit run --all-files pass.

🤖 Generated with Claude Code

klowdo and others added 4 commits November 9, 2026 22:18
The device reports seq_type in its get_status payload, but StatusV2 did not
model it, so RoborockBase.from_dict discarded it along with every other
unmatched key. The vendor app reads the same field off the same payload to
derive its "clean then mop" state.

Add seq_type to StatusV2 and a clean_then_mop property on StatusTrait that
reports whether the current run vacuums each room fully before mopping it.
It describes the run in progress rather than a persisted setting, and the
device offers no setter, so it is read only here; the value travels outbound
as a parameter of the cleaning command instead.

Gated for reporting on is_clean_then_mop_mode_supported.

Verified against a Roborock Saros 20 (roborock.vacuum.a288).
Model the app's "Vacuum then mop" choice as a fourth high-level cleaning
mode, as suggested in review of Python-roborock#959, so consumers such as Home Assistant
get it through cleaning_mode_options / current_cleaning_mode /
set_cleaning_mode without orchestrating a separate control.

- Offer VAC_THEN_MOP when is_clean_then_mop_mode_supported.
- Report it when vacuum-and-mop settings run with seq_type 1.
- set_cleaning_mode writes the vacuum-and-mop motor settings, then
  app_set_clean_sequence_type with type 1 (repeat 1 when
  is_ctm_with_repeat_supported); switching to another mode while it is
  enabled sends type 0, like the app.
- clean_then_mop returns None on devices without the feature.
- Replace the separate set_clean_then_mop setter with the mode, and share
  SEQ_TYPE_CLEAN_THEN_MOP with the per-room customize clean mode trait.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support the "Clean then mop" cleaning mode (feature bit 93, is_clean_then_mop_mode_supported)

2 participants