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.