Repository navigation
Q10 (B01/ss07): fault codes aren't fully implemented — dpFault (DP 90) surfaces as a raw int; here's an app-sourced fault table + crosswalk to B01Fault #855
Description
On the Q10 (roborock.vacuum.ss07, B01), faults aren't really decoded yet: the container surfaces fault: int straight from dpFault (DP 90), so a fault reaches the user as a bare number. There's no Q10 equivalent of the Q7 B01Fault map, and B01Fault itself isn't referenced from b01_q10. (Doesn't look tracked in the Q10 omnibus #767 yet.)
To help fill that in, I pulled the Q10's fault/notification strings from the device's app bundle and built a crosswalk against the existing B01Fault. Columns:
- ss07 app text — verbatim from the app's
error_<code>strings (English). - Seen live — ✅ if I observed that raw
dpFaultvalue on my own Q10 during normal use (otherwise it's app-sourced only, not hardware-confirmed). B01Fault(Q7, onmain) — the existing upstream label for the same number, or "—" if there's no entry.- Notes — where the Q7 label wouldn't fit the ss07 meaning, or where a code is really status/info, not a fault.
| code | ss07 app text (verbatim) | seen live | B01Fault (Q7, on main) |
notes |
|---|---|---|---|---|
| 1 | LiDAR turret or laser blocked. Check for obstruction and retry. | — | ||
| 2 | Bumper stuck. Clean it and lightly tap it to release it. | — | ||
| 3 | Robot suspended. Move the robot away and restart. | — | ||
| 4 | Cliff sensor error. Clean cliff sensors, move the robot away from drops, and restart. | — | ||
| 5 | Clean the main brush and bearings. | — | ||
| 7 | Rotate the main wheels for cleaning. Move the robot away and restart. | — | ||
| 8 | Robot trapped. Move the robot away and restart. | ✅ | — | |
| 9 | Make sure the dustbin and filter are installed properly. | — | ||
| 12 | Low battery. Recharge now. | — | ||
| 14 | Temperature threshold. Wait for the temperature to return to normal. | — | ||
| 16 | Robot tilted. Move it to flat floor and restart. | — | ||
| 21 | Ensure the LiDAR sensor cover is not obstructed. | — | ||
| 24 | No-Go Zone or Invisible Wall detected. Move the robot away. | — | ||
| 27 | Mopping module stuck. Remove foreign objects if any. | — | ||
| 28 | Carpet avoidance mode. Move the robot away and restart. | — | ||
| 29 | Unable to cross the carpet. Move the robot across the carpet and restart. | — | ||
| 46 | Install the dust bag. | — | ||
| 54 | The mop mount fell off. | — | ||
| 58 | LiDAR sensor may be dirty. Wipe it. | — | ||
| 301 | The filter has reached its service life. Please replace it immediately. | — | consumable-life notice | |
| 302 | The main brush has reached its service life. Please replace it immediately. | — | consumable-life notice | |
| 303 | The side brush has reached its service life. Please replace it immediately | — | consumable-life notice | |
| 304 | The sensor is left uncleaned for a prolonged period of time. Please clean it. | — | consumable-life notice | |
| 310 | Dust bag full. Empty it. | — | ||
| 400 | Starting scheduled cleaning. | ✅ | — | status/info, not a fault |
| 407 | Cleaning in progress. Scheduled cleaning ignored. | cleaning_in_progress (407) |
matches; status/info | |
| 500 | Empty the dustbin. It has been full for a long time. | lidar_blocked (500) |
Q7 label differs | |
| 501 | Cleaning completed. Returning to dock. | robot_suspended (501) |
Q7 label differs; status/info | |
| 502 | Low battery. Resume cleaning after recharging. | low_battery (502) |
matches | |
| 503 | Docking error. Clear obstacles around the dock and clean charging contacts. | dustbin_not_installed (503) |
Q7 label differs | |
| 556 | Positioning failed. Starting a new task. | ✅ | — | relocalization; alert |
| 569 | Too frequent emptying attempts. Try again later. | main_wheels_entangled (569, = F_568) |
Q7 label differs | |
| 570 | Unable to reach the target. Cleaning incomplete. | ✅ | main_brush_entangled (570) |
Q7 label differs — Q7's "cannot reach target" is F_2007/F_2012 |
| 588 | Offline warning: The robot has been asleep for a long time and is about to shut down. Charge it. | fault_588 (588) |
Q7 has only a generic placeholder | |
| 589 | Offline warning: Battery too low. The robot is about to shut down. Charge it. | fault_589 (589) |
Q7 has only a generic placeholder | |
| 591 | In Do Not Disturb mode, Auto Top-up is disabled. | fault_591 (591) |
Q7 generic placeholder; status/info | |
| 707 | Clean carpet ultrasonic sensors, and move robot away. | — | ||
| 1002 | Robot error. Reset the system. | — | ||
| 3001 | Voice pack update available. Update? | — | notification, not a hardware fault |
A couple of things to flag from the crosswalk: several dpFault values are really status/info rather than errors (400, 407, 501, 502, 3001…), and where a number also exists in B01Fault the Q7 label sometimes doesn't fit the ss07 meaning — most clearly 570, which is main_brush_entangled in B01Fault but "unable to reach the target" on the Q10 (Q7's own cannot-reach-target is F_2007/F_2012). So the Q7 map isn't a safe drop-in for the Q10. (The app only exposes these display strings — no identifier names — so a Q10 enum's labels would be yours to name, the same way the existing B01Fault ones are.)
I'm not sure how much of this gap is a genuine per-model difference vs. worth mapping, so I didn't want to assume the fix. Happy to help however works best for you — put up a PR adding a b01_q10 fault map seeded from this table, just make these labels available alongside the raw int, or leave it if the gap is intentional. A couple of extras I can fold in if useful: most of the hardware-fault codes (1–29) also carry a longer error_des_<code> remediation string in the bundle (the same short-plus-long pairing your B01Fault comments already use), and the app groups these into error / alert / offline / other buckets for surfacing. Thanks for all the recent B01/Q10 work.
Activity
feat: decode Q10 (B01/ss07) dpFault codes with a YXFault enum (#863)