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
dpFault value on my own Q10 during normal use (otherwise it's app-sourced only, not hardware-confirmed).
B01Fault (Q7, on main) — 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.
On the Q10 (
roborock.vacuum.ss07, B01), faults aren't really decoded yet: the container surfacesfault: intstraight fromdpFault(DP 90), so a fault reaches the user as a bare number. There's no Q10 equivalent of the Q7B01Faultmap, andB01Faultitself isn't referenced fromb01_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:error_<code>strings (English).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.B01Fault(Q7, onmain)cleaning_in_progress(407)lidar_blocked(500)robot_suspended(501)low_battery(502)dustbin_not_installed(503)main_wheels_entangled(569, =F_568)main_brush_entangled(570)F_2007/F_2012fault_588(588)fault_589(589)fault_591(591)A couple of things to flag from the crosswalk: several
dpFaultvalues are really status/info rather than errors (400, 407, 501, 502, 3001…), and where a number also exists inB01Faultthe Q7 label sometimes doesn't fit the ss07 meaning — most clearly 570, which ismain_brush_entangledinB01Faultbut "unable to reach the target" on the Q10 (Q7's own cannot-reach-target isF_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 existingB01Faultones 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_q10fault 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 longererror_des_<code>remediation string in the bundle (the same short-plus-long pairing yourB01Faultcomments already use), and the app groups these into error / alert / offline / other buckets for surfacing. Thanks for all the recent B01/Q10 work.