…NE; verify SuctionMax
A 2026-05-25 observation probe on r2449a (Dreame X40 Ultra Complete,
firmware FU174072 EU) using a label-before-tap protocol (typed marker
in terminal before each tap in the Dreamehome app, then read MQTT echo)
caught three things the v0.4.1 PR (malard#9) either got wrong or didn't
cover.
Breaking
- CleaningMode value mapping corrected on r2449a — Sweeping and
SweepAndMop values were inverted in v0.4.1 / v0.4.2. The prior
mapping was round-trip-verified (write N → echo N) but the named-mode
↔ value pairing was not established against the app. Corrected
values:
SweepAndMop = 0 (was 2)
Mopping = 1 (unchanged)
Sweeping = 2 (was 0)
MopAfterSweep = 3 (unchanged)
Behavioural corroboration: with the old mapping, writing 0 for
"Sweeping" caused the dock to attach the mop pad (device actually
entered SweepAndMop).
r2532a — needs re-verification. Earlier r2532a notes that paired
5120 ↔ 5122 transitions with the mop-install / remove dock sequence
were named under the inverted mapping. The physical correlation is
unchanged; the named direction depends on whether r2532a uses the
same value mapping as r2449a. JSDocs on CLEAN_MODE_SETTING and
CLEANING_MODE now carry a "needs re-verification on r2532a" note
instead of the previous named-mode direction claim.
Added
- DOCK_PROP.WATER_VOLUME_FINE at siid 28 piid 1. Fine-grained per-job
mop-water volume; integer slider 1..32. The axis the Dreamehome app
surfaces in the per-mode water controls — the coarse
VACUUM_PROP.WATER_VOLUME (siid 4 piid 5) 3-step Low/Medium/High
enum is the legacy axis; new code should write the fine field.
Verified on r2449a 2026-05-25 by dragging the slider through
1, 8, 16, 32 and observing the echo. Not yet observed on r2532a.
Changed
- FEATURE_CONFIG_KEYS.SuctionMax promoted from ~ to ✓. Boolean
(0 = off, 1 = on), writeable in both Sweeping and MopAfterSweep
sub-modes (the two sub-modes the app surfaces the toggle in — any
mode with a pure-vacuum phase). Verified on r2449a 2026-05-25.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Follow-up to #9 from a 2026-05-25 observation probe on r2449a (Dreame X40 Ultra Complete, firmware FU174072 EU). Three findings, all r2449a-only:
🚨 Breaking —
CleaningModevalue mapping was inverted onSweeping/SweepAndMop. Re-verified by tapping each sub-mode in the Dreamehome app (label-before-tap protocol) and reading back the MQTT echo. Behavioural symptom that prompted the re-check: writing0for "Sweeping" caused the dock to attach the mop pad (the device actually enteredSweepAndMop).2.64.234.23 & 0x305120(0x1400)015121(0x1401)125122(0x1402)235123(0x1403)3Old mapping was round-trip-verified only (write N → echo N), which doesn't establish named-mode ↔ value pairing.
Add
DOCK_PROP.WATER_VOLUME_FINEatsiid 28 piid 1— fine-grained per-job mop-water slider, integer1..32. This is the axis the Dreamehome app surfaces; the existingVACUUM_PROP.WATER_VOLUME(siid 4.5) coarse 3-stepLow/Medium/Highis the legacy axis.Promote
FEATURE_CONFIG_KEYS.SuctionMaxfrom~to✓— boolean (0/1) Max Suction Power toggle. Writeable in bothSweepingandMopAfterSweepsub-modes (the two the app surfaces it in).r2532a scoping
Per-model, strictly. Existing r2532a paragraphs in the
CLEAN_MODE_SETTINGandCLEANING_MODEJSDocs were named under the inverted mapping, so the named direction of the5120 ↔ 5122mop-install/remove correlation is now uncertain on r2532a. The physical correlation (clean-mode change co-fires with the dock sequence) is unchanged. Both JSDocs now carry a "needs re-verification on r2532a" note instead of the previous direction claim.Test plan
vitest run— all 341 tests pass (updatedtest/miot-spec.test.tsfor the corrected enum values).tsc --noEmitclean.eslint .clean.🤖 Generated with Claude Code