roborock.data.b01_q10.b01_q10_code_mappings
1from enum import IntEnum 2 3from ..code_mappings import RoborockModeEnum 4 5 6class B01_Q10_DP(RoborockModeEnum): 7 CLEAN_TIME = ("dpCleanTime", 6) 8 CLEAN_AREA = ("dpCleanArea", 7) 9 SEEK = ("dpSeek", 11) 10 REMOTE = ("dpRemote", 12) 11 MAP_RESET = ("dpMapReset", 13) 12 REQUEST = ("dpRequest", 16) 13 RESET_SIDE_BRUSH = ("dpResetSideBrush", 18) 14 RESET_MAIN_BRUSH = ("dpResetMainBrush", 20) 15 RESET_FILTER = ("dpResetFilter", 22) 16 RAG_LIFE = ("dpRagLife", 23) 17 RESET_RAG_LIFE = ("dpResetRagLife", 24) 18 NOT_DISTURB = ("dpNotDisturb", 25) 19 VOLUME = ("dpVolume", 26) 20 BEAK_CLEAN = ("dpBeakClean", 27) 21 TOTAL_CLEAN_AREA = ("dpTotalCleanArea", 29) 22 TOTAL_CLEAN_COUNT = ("dpTotalCleanCount", 30) 23 TOTAL_CLEAN_TIME = ("dpTotalCleanTime", 31) 24 TIMER = ("dpTimer", 32) 25 NOT_DISTURB_DATA = ("dpNotDisturbData", 33) 26 DEVICE_INFO = ("dpDeviceInfo", 34) 27 VOICE_PACKAGE = ("dpVoicePackage", 35) 28 VOICE_LANGUAGE = ("dpVoiceLanguage", 36) 29 DUST_SWITCH = ("dpDustSwitch", 37) 30 CUSTOM_MODE = ("dpCustomMode", 39) 31 MOP_STATE = ("dpMopState", 40) 32 UNIT = ("dpUnit", 42) 33 CARPET_CLEAN_PREFER = ("dpCarpetCleanPrefer", 44) 34 AUTO_BOOST = ("dpAutoBoost", 45) 35 CHILD_LOCK = ("dpChildLock", 47) 36 DUST_SETTING = ("dpDustSetting", 50) 37 MAP_SAVE_SWITCH = ("dpMapSaveSwitch", 51) 38 CLEAN_RECORD = ("dpCleanRecord", 52) 39 RECENT_CLEAN_RECORD = ("dpRecentCleanRecord", 53) # NOTE: typo "dpRecendCleanRecord" in source code 40 RESTRICTED_ZONE = ("dpRestrictedZone", 54) 41 RESTRICTED_ZONE_UP = ("dpRestrictedZoneUp", 55) 42 VIRTUAL_WALL = ("dpVirtualWall", 56) 43 VIRTUAL_WALL_UP = ("dpVirtualWallUp", 57) 44 ZONED = ("dpZoned", 58) 45 ZONED_UP = ("dpZonedUp", 59) 46 MULTI_MAP_SWITCH = ("dpMultiMapSwitch", 60) 47 MULTI_MAP = ("dpMultiMap", 61) 48 CUSTOMER_CLEAN = ("dpCustomerClean", 62) 49 CUSTOMER_CLEAN_REQUEST = ("dpCustomerCleanRequest", 63) 50 GET_CARPET = ("dpGetCarpet", 64) 51 CARPET_UP = ("dpCarpetUp", 65) 52 SELF_IDENTIFYING_CARPET = ("dpSelfIdentifyingCarpet", 66) 53 SENSOR_LIFE = ("dpSensorLife", 67) 54 RESET_SENSOR = ("dpResetSensor", 68) 55 REQUEST_TIMER = ("dpRequestTimer", 69) 56 REMOVE_ZONED = ("dpRemoveZoned", 70) 57 REMOVE_ZONED_UP = ("dpRemoveZonedUp", 71) 58 ROOM_MERGE = ("dpRoomMerge", 72) 59 ROOM_SPLIT = ("dpRoomSplit", 73) 60 RESET_ROOM_NAME = ("dpResetRoomName", 74) 61 REQUEST_NOT_DISTURB_DATA = ("dpRequestNotDisturbData", 75) # NOTE: typo "dpRequsetNotDisturbData" in source code 62 CARPET_CLEAN_TYPE = ("dpCarpetCleanType", 76) 63 BUTTON_LIGHT_SWITCH = ("dpButtonLightSwitch", 77) 64 CLEAN_LINE = ("dpCleanLine", 78) 65 TIME_ZONE = ("dpTimeZone", 79) 66 AREA_UNIT = ("dpAreaUnit", 80) 67 NET_INFO = ("dpNetInfo", 81) 68 CLEAN_ORDER = ("dpCleanOrder", 82) 69 ROBOT_TYPE = ("dpRobotType", 83) 70 LOG_SWITCH = ("dpLogSwitch", 84) 71 FLOOR_MATERIAL = ("dpFloorMaterial", 85) 72 LINE_LASER_OBSTACLE_AVOIDANCE = ("dpLineLaserObstacleAvoidance", 86) 73 CLEAN_PROGRESS = ("dpCleanProgress", 87) # NOTE: typo "dpCleanProgess" in source code 74 GROUND_CLEAN = ("dpGroundClean", 88) 75 IGNORE_OBSTACLE = ("dpIgnoreObstacle", 89) 76 FAULT = ("dpFault", 90) 77 CLEAN_EXPAND = ("dpCleanExpand", 91) 78 NOT_DISTURB_EXPAND = ("dpNotDisturbExpand", 92) 79 TIMER_TYPE = ("dpTimerType", 93) 80 CREATE_MAP_FINISHED = ("dpCreateMapFinished", 94) 81 ADD_CLEAN_AREA = ("dpAddCleanArea", 95) 82 ADD_CLEAN_STATE = ("dpAddCleanState", 96) 83 RESTRICTED_AREA = ("dpRestrictedArea", 97) 84 RESTRICTED_AREA_UP = ("dpRestrictedAreaUp", 98) 85 SUSPECTED_THRESHOLD = ("dpSuspectedThreshold", 99) 86 SUSPECTED_THRESHOLD_UP = ("dpSuspectedThresholdUp", 100) 87 COMMON = ("dpCommon", 101) 88 REQUEST_DPS = ("dpRequestDps", 102) # NOTE: typo "dpRequetdps" in source code 89 # NOTE: the legacy B01 source also listed dpJumpScan (101) and 90 # dpCliffRestrictedArea (102), which collided with the confirmed dpCommon / 91 # dpRequestDps codes above (verified against ss07 hardware and the official app 92 # plugin) and shadowed them in ``from_code``. Both are unused and their real 93 # codes could not be verified, so they were removed rather than left as wrong 94 # duplicates. dpCliffRestrictedAreaUp (103) is kept: ss07 hardware does push 95 # data point 103 (an empty list when no cliff-restricted areas are set). 96 CLIFF_RESTRICTED_AREA_UP = ("dpCliffRestrictedAreaUp", 103) 97 BREAKPOINT_CLEAN = ("dpBreakpointClean", 104) 98 VALLEY_POINT_CHARGING = ("dpValleyPointCharging", 105) 99 VALLEY_POINT_CHARGING_DATA_UP = ("dpValleyPointChargingDataUp", 106) 100 VALLEY_POINT_CHARGING_DATA = ("dpValleyPointChargingData", 107) 101 VOICE_VERSION = ("dpVoiceVersion", 108) 102 ROBOT_COUNTRY_CODE = ("dpRobotCountryCode", 109) 103 HEARTBEAT = ("dpHeartbeat", 110) 104 UNKNOWN_112 = ("dpUnknown112", 112) 105 UNKNOWN_113 = ("dpUnknown113", 113) 106 STATUS = ("dpStatus", 121) 107 BATTERY = ("dpBattery", 122) 108 FAN_LEVEL = ("dpFanLevel", 123) # NOTE: typo "dpfunLevel" in source code 109 WATER_LEVEL = ("dpWaterLevel", 124) 110 MAIN_BRUSH_LIFE = ("dpMainBrushLife", 125) 111 SIDE_BRUSH_LIFE = ("dpSideBrushLife", 126) 112 FILTER_LIFE = ("dpFilterLife", 127) 113 TASK_CANCEL_IN_MOTION = ("dpTaskCancelInMotion", 132) 114 OFFLINE = ("dpOffline", 135) 115 CLEAN_COUNT = ("dpCleanCount", 136) 116 CLEAN_MODE = ("dpCleanMode", 137) 117 CLEAN_TASK_TYPE = ("dpCleanTaskType", 138) 118 BACK_TYPE = ("dpBackType", 139) 119 CLEANING_PROGRESS = ("dpCleaningProgress", 141) 120 FLEEING_GOODS = ("dpFleeingGoods", 142) 121 START_CLEAN = ("dpStartClean", 201) 122 START_BACK = ("dpStartBack", 202) 123 START_DOCK_TASK = ("dpStartDockTask", 203) 124 PAUSE = ("dpPause", 204) 125 RESUME = ("dpResume", 205) 126 STOP = ("dpStop", 206) 127 USER_PLAN = ("dpUserPlan", 207) 128 129 130class YXFanLevel(RoborockModeEnum): 131 """The fan or vacuum level of the robot. 132 133 Note: The names used here are the v1 names, though the values 134 have different aliases in the app bundles. 135 """ 136 137 UNKNOWN = "unknown", -1 138 OFF = "off", 0 # close 139 QUIET = "quiet", 1 140 BALANCED = "balanced", 2 # normal 141 TURBO = "turbo", 3 # strong 142 MAX = "max", 4 143 MAX_PLUS = "max_plus", 8 # super 144 145 146class YXWaterLevel(RoborockModeEnum): 147 UNKNOWN = "unknown", -1 148 OFF = "off", 0 # close 149 LOW = "low", 1 150 MEDIUM = "medium", 2 # middle 151 HIGH = "high", 3 152 153 154class YXCleanLine(RoborockModeEnum): 155 FAST = "fast", 0 156 DAILY = "daily", 1 157 FINE = "fine", 2 158 159 160class YXRoomMaterial(RoborockModeEnum): 161 HORIZONTAL_FLOOR_BOARD = "horizontalfloorboard", 0 162 VERTICAL_FLOOR_BOARD = "verticalfloorboard", 1 163 CERAMIC_TILE = "ceramictile", 2 164 OTHER = "other", 255 165 166 167class YXCleanType(RoborockModeEnum): 168 UNKNOWN = "unknown", -1 169 VAC_AND_MOP = "vac_and_mop", 1 # bothwork 170 VACUUM = "vacuum", 2 # onlysweep 171 MOP = "mop", 3 # onlymop 172 CUSTOMIZED = "customized", 4 # custom mode 173 174 175class YXDeviceState(RoborockModeEnum): 176 UNKNOWN = "unknown", -1 177 SLEEPING = "sleeping", 2 # sleepstate 178 IDLE = "idle", 3 # standbystate 179 CLEANING = "cleaning", 5 # cleaningstate 180 RETURNING_HOME = "returning_home", 6 # tochargestate 181 REMOTE_CONTROL_ACTIVE = "remote_control_active", 7 # remoteingstate 182 CHARGING = "charging", 8 # chargingstate 183 PAUSED = "paused", 10 # pausestate 184 ERROR = "error", 12 # faultstate 185 UPDATING = "updating", 14 # upgradestate 186 EMPTYING_THE_BIN = "emptying_the_bin", 22 # dusting 187 MAPPING = "mapping", 29 # creatingmapstate 188 SAVING_MAP = "saving_map", 99 # mapsavestate 189 RELOCATING = "relocating", 101 # relocationstate 190 SWEEPING = "sweeping", 102 # robotsweeping 191 MOPPING = "mopping", 103 # robotmoping 192 SWEEP_AND_MOP = "sweep_and_mop", 104 # robotsweepandmoping 193 TRANSITIONING = "transitioning", 105 # robottransitioning 194 WAITING_TO_CHARGE = "waiting_to_charge", 108 # robotwaitcharge 195 196 197class YXBackType(RoborockModeEnum): 198 UNKNOWN = "unknown", -1 199 IDLE = "idle", 0 200 BACK_DUSTING = "backdusting", 4 201 BACK_CHARGING = "backcharging", 5 202 203 204class YXDeviceWorkMode(RoborockModeEnum): 205 UNKNOWN = "unknown", -1 206 BOTH_WORK = "bothwork", 1 207 ONLY_SWEEP = "onlysweep", 2 208 ONLY_MOP = "onlymop", 3 209 CUSTOMIZED = "customized", 4 210 SAVE_WORRY = "saveworry", 5 211 SWEEP_MOP = "sweepmop", 6 212 213 214class YXDeviceCleanTask(RoborockModeEnum): 215 UNKNOWN = "unknown", -1 216 IDLE = "idle", 0 217 SMART = "smart", 1 218 ELECTORAL = "electoral", 2 219 DIVIDE_AREAS = "divideareas", 3 220 CREATING_MAP = "creatingmap", 4 221 PART = "part", 5 222 223 224class YXCleanScope(RoborockModeEnum): 225 """Clean scope/type as stored in a *clean record* (``dpCleanRecord``, field 7). 226 227 This is the same conceptual axis as the live :class:`YXDeviceCleanTask`, but the 228 persisted record uses a different integer encoding -- e.g. a full clean records 229 ``0`` here vs ``1`` (``smart``) live, and a select-rooms clean records ``1`` here 230 vs ``2`` (``electoral``) live. Ground-truthed against the app's History labels; 231 code ``2`` was never observed on ss07 and is intentionally unmapped (so it 232 resolves to ``None`` rather than a guessed label). 233 """ 234 235 UNKNOWN = "unknown", -1 236 FULL = "full", 0 237 SELECTIVE_ROOM = "selective_room", 1 238 ZONE = "zone", 3 239 SPOT = "spot", 4 240 241 242class YXCleaningResult(RoborockModeEnum): 243 """How a clean ended, as stored in a clean record (``dpCleanRecord``, field 9).""" 244 245 UNKNOWN = "unknown", -1 246 INTERRUPTED = "interrupted", 0 # ended on a fault 247 COMPLETED = "completed", 1 248 STOPPED = "stopped", 2 # ended early without a fault 249 250 251class YXStartMethod(RoborockModeEnum): 252 """What initiated a clean, as stored in a clean record (``dpCleanRecord``, field 10).""" 253 254 UNKNOWN = "unknown", -1 255 REMOTE = "remote", 0 256 APP = "app", 1 257 TIMER = "timer", 2 # schedule / timer 258 BUTTON = "button", 3 # device button 259 260 261class YXDeviceDustCollectionFrequency(RoborockModeEnum): 262 # The app exposes "regular" (code 0) vs "frequent", where "frequent" selects 263 # one of the every-N-cleans intervals below. 264 REGULAR = "regular", 0 265 INTERVAL_15 = "interval_15", 15 266 INTERVAL_30 = "interval_30", 30 267 INTERVAL_45 = "interval_45", 45 268 INTERVAL_60 = "interval_60", 60 269 270 271class YXAreaUnit(RoborockModeEnum): 272 """Unit used to report cleaned area (dpAreaUnit).""" 273 274 SQUARE_METER = "square_meter", 0 275 SQUARE_FEET = "square_feet", 1 276 277 278class YXCarpetCleanType(RoborockModeEnum): 279 """Carpet handling behavior (dpCarpetCleanType).""" 280 281 RISE = "rise", 0 # lift the mop and boost over carpet 282 AVOID = "avoid", 1 283 IGNORE = "ignore", 2 284 CROSS = "cross", 3 285 286 287class YXFault(RoborockModeEnum): 288 """Q10 (B01/ss07) ``dpFault`` (90) codes, from the ss07 fault spec. 289 290 ``dpFault`` is *overloaded*: several values are lifecycle/status rather than 291 errors (e.g. 400 = scheduled clean starting, 501 = returning to dock, 292 502 = recharge). A non-zero fault is not necessarily a blocking error. 293 The converse also holds: the device can sit in its error state (``dpStatus`` 294 12) with ``dpFault`` still 0 (observed live with the dust-bin module 295 removed), so a ``None``/``NONE`` fault does not imply the absence of an 296 error condition. 297 298 These labels differ from the Q7 ``B01Fault`` for several shared numbers 299 (500, 501, 503, 569, 570) -- so this is a Q10-specific map, not a reuse of 300 ``B01Fault``. Codes marked "hw-confirmed" were observed firing live on a 301 physical ss07 in a context matching the label; the rest are from the spec 302 only, not yet observed live (single device). 303 """ 304 305 UNKNOWN = "unknown", -1 306 NONE = "none", 0 307 LIDAR_BLOCKED = "lidar_blocked", 1 308 BUMPER_STUCK = "bumper_stuck", 2 # hw-confirmed (bumper held in during commanded motion) 309 ROBOT_SUSPENDED = "robot_suspended", 3 # hw-confirmed (wheels lifted off the floor mid-task) 310 CLIFF_SENSOR_ERROR = "cliff_sensor_error", 4 # hw-confirmed (one side lifted mid-task) 311 MAIN_BRUSH_STUCK = "main_brush_stuck", 5 # hw-confirmed (two physical brush jams) 312 MAIN_WHEELS_STUCK = "main_wheels_stuck", 7 313 ROBOT_TRAPPED = "robot_trapped", 8 # hw-confirmed 314 CHECK_DUSTBIN_FILTER = "check_dustbin_filter", 9 315 LOW_BATTERY = "low_battery", 12 # hw-confirmed (fired at 14% mid clean) 316 TEMPERATURE_THRESHOLD = "temperature_threshold", 14 317 ROBOT_TILTED = "robot_tilted", 16 318 LIDAR_COVER_OBSTRUCTED = "lidar_cover_obstructed", 21 319 NO_GO_ZONE_DETECTED = "no_go_zone_detected", 24 320 MOPPING_MODULE_STUCK = "mopping_module_stuck", 27 321 CARPET_AVOIDANCE = "carpet_avoidance", 28 322 CANNOT_CROSS_CARPET = "cannot_cross_carpet", 29 323 INSTALL_DUST_BAG = "install_dust_bag", 46 # hw-confirmed (docked with bag removed; fires at dock contact) 324 MOP_MOUNT_FELL_OFF = "mop_mount_fell_off", 54 325 LIDAR_DIRTY = "lidar_dirty", 58 326 FILTER_SERVICE_LIFE = "filter_service_life", 301 327 MAIN_BRUSH_SERVICE_LIFE = "main_brush_service_life", 302 328 SIDE_BRUSH_SERVICE_LIFE = "side_brush_service_life", 303 329 SENSOR_NEEDS_CLEANING = "sensor_needs_cleaning", 304 # hw-confirmed (fired during auto-empty) 330 DUST_BAG_FULL = "dust_bag_full", 310 # inferred from auto-empty context; not hw-confirmed 331 STARTING_SCHEDULED_CLEAN = "starting_scheduled_clean", 400 # hw-confirmed x3; lifecycle, not an error 332 # hw-confirmed (a due scheduled clean fired mid-clean and was ignored); lifecycle, not an error 333 CLEANING_IN_PROGRESS = "cleaning_in_progress", 407 334 EMPTY_DUSTBIN = "empty_dustbin", 500 # ss07 != Q7 B01Fault (lidar_blocked); spec-only 335 # hw-confirmed, fires per completed task; ss07 != Q7 (robot_suspended) 336 CLEANING_COMPLETED_RETURNING = "cleaning_completed_returning", 501 337 LOW_BATTERY_RESUME = "low_battery_resume", 502 # hw-confirmed; lifecycle 338 DOCKING_ERROR = "docking_error", 503 # hw-confirmed; ss07 != Q7 (dustbin_not_installed) 339 POSITIONING_FAILED = "positioning_failed", 556 # hw-confirmed; relocalization 340 # hw-confirmed (3rd auto-empty in ~15 min: dock refuses to run the cycle); ss07 != Q7 (main_wheels_entangled) 341 TOO_FREQUENT_EMPTYING = "too_frequent_emptying", 569 342 CANNOT_REACH_TARGET = "cannot_reach_target", 570 # hw-confirmed; ss07 != Q7 (main_brush_entangled) 343 OFFLINE_WARNING_ASLEEP = "offline_warning_asleep", 588 344 OFFLINE_WARNING_LOW_BATTERY = "offline_warning_low_battery", 589 345 DND_AUTO_TOPUP_DISABLED = "dnd_auto_topup_disabled", 591 346 CLEAN_CARPET_ULTRASONIC_SENSORS = "clean_carpet_ultrasonic_sensors", 707 347 ROBOT_ERROR_RESET = "robot_error_reset", 1002 348 VOICE_PACK_UPDATE_AVAILABLE = "voice_pack_update_available", 3001 349 350 351class RemoteCommand(IntEnum): 352 FORWARD = 0 353 LEFT = 2 354 RIGHT = 3 355 STOP = 4 356 EXIT = 5
7class B01_Q10_DP(RoborockModeEnum): 8 CLEAN_TIME = ("dpCleanTime", 6) 9 CLEAN_AREA = ("dpCleanArea", 7) 10 SEEK = ("dpSeek", 11) 11 REMOTE = ("dpRemote", 12) 12 MAP_RESET = ("dpMapReset", 13) 13 REQUEST = ("dpRequest", 16) 14 RESET_SIDE_BRUSH = ("dpResetSideBrush", 18) 15 RESET_MAIN_BRUSH = ("dpResetMainBrush", 20) 16 RESET_FILTER = ("dpResetFilter", 22) 17 RAG_LIFE = ("dpRagLife", 23) 18 RESET_RAG_LIFE = ("dpResetRagLife", 24) 19 NOT_DISTURB = ("dpNotDisturb", 25) 20 VOLUME = ("dpVolume", 26) 21 BEAK_CLEAN = ("dpBeakClean", 27) 22 TOTAL_CLEAN_AREA = ("dpTotalCleanArea", 29) 23 TOTAL_CLEAN_COUNT = ("dpTotalCleanCount", 30) 24 TOTAL_CLEAN_TIME = ("dpTotalCleanTime", 31) 25 TIMER = ("dpTimer", 32) 26 NOT_DISTURB_DATA = ("dpNotDisturbData", 33) 27 DEVICE_INFO = ("dpDeviceInfo", 34) 28 VOICE_PACKAGE = ("dpVoicePackage", 35) 29 VOICE_LANGUAGE = ("dpVoiceLanguage", 36) 30 DUST_SWITCH = ("dpDustSwitch", 37) 31 CUSTOM_MODE = ("dpCustomMode", 39) 32 MOP_STATE = ("dpMopState", 40) 33 UNIT = ("dpUnit", 42) 34 CARPET_CLEAN_PREFER = ("dpCarpetCleanPrefer", 44) 35 AUTO_BOOST = ("dpAutoBoost", 45) 36 CHILD_LOCK = ("dpChildLock", 47) 37 DUST_SETTING = ("dpDustSetting", 50) 38 MAP_SAVE_SWITCH = ("dpMapSaveSwitch", 51) 39 CLEAN_RECORD = ("dpCleanRecord", 52) 40 RECENT_CLEAN_RECORD = ("dpRecentCleanRecord", 53) # NOTE: typo "dpRecendCleanRecord" in source code 41 RESTRICTED_ZONE = ("dpRestrictedZone", 54) 42 RESTRICTED_ZONE_UP = ("dpRestrictedZoneUp", 55) 43 VIRTUAL_WALL = ("dpVirtualWall", 56) 44 VIRTUAL_WALL_UP = ("dpVirtualWallUp", 57) 45 ZONED = ("dpZoned", 58) 46 ZONED_UP = ("dpZonedUp", 59) 47 MULTI_MAP_SWITCH = ("dpMultiMapSwitch", 60) 48 MULTI_MAP = ("dpMultiMap", 61) 49 CUSTOMER_CLEAN = ("dpCustomerClean", 62) 50 CUSTOMER_CLEAN_REQUEST = ("dpCustomerCleanRequest", 63) 51 GET_CARPET = ("dpGetCarpet", 64) 52 CARPET_UP = ("dpCarpetUp", 65) 53 SELF_IDENTIFYING_CARPET = ("dpSelfIdentifyingCarpet", 66) 54 SENSOR_LIFE = ("dpSensorLife", 67) 55 RESET_SENSOR = ("dpResetSensor", 68) 56 REQUEST_TIMER = ("dpRequestTimer", 69) 57 REMOVE_ZONED = ("dpRemoveZoned", 70) 58 REMOVE_ZONED_UP = ("dpRemoveZonedUp", 71) 59 ROOM_MERGE = ("dpRoomMerge", 72) 60 ROOM_SPLIT = ("dpRoomSplit", 73) 61 RESET_ROOM_NAME = ("dpResetRoomName", 74) 62 REQUEST_NOT_DISTURB_DATA = ("dpRequestNotDisturbData", 75) # NOTE: typo "dpRequsetNotDisturbData" in source code 63 CARPET_CLEAN_TYPE = ("dpCarpetCleanType", 76) 64 BUTTON_LIGHT_SWITCH = ("dpButtonLightSwitch", 77) 65 CLEAN_LINE = ("dpCleanLine", 78) 66 TIME_ZONE = ("dpTimeZone", 79) 67 AREA_UNIT = ("dpAreaUnit", 80) 68 NET_INFO = ("dpNetInfo", 81) 69 CLEAN_ORDER = ("dpCleanOrder", 82) 70 ROBOT_TYPE = ("dpRobotType", 83) 71 LOG_SWITCH = ("dpLogSwitch", 84) 72 FLOOR_MATERIAL = ("dpFloorMaterial", 85) 73 LINE_LASER_OBSTACLE_AVOIDANCE = ("dpLineLaserObstacleAvoidance", 86) 74 CLEAN_PROGRESS = ("dpCleanProgress", 87) # NOTE: typo "dpCleanProgess" in source code 75 GROUND_CLEAN = ("dpGroundClean", 88) 76 IGNORE_OBSTACLE = ("dpIgnoreObstacle", 89) 77 FAULT = ("dpFault", 90) 78 CLEAN_EXPAND = ("dpCleanExpand", 91) 79 NOT_DISTURB_EXPAND = ("dpNotDisturbExpand", 92) 80 TIMER_TYPE = ("dpTimerType", 93) 81 CREATE_MAP_FINISHED = ("dpCreateMapFinished", 94) 82 ADD_CLEAN_AREA = ("dpAddCleanArea", 95) 83 ADD_CLEAN_STATE = ("dpAddCleanState", 96) 84 RESTRICTED_AREA = ("dpRestrictedArea", 97) 85 RESTRICTED_AREA_UP = ("dpRestrictedAreaUp", 98) 86 SUSPECTED_THRESHOLD = ("dpSuspectedThreshold", 99) 87 SUSPECTED_THRESHOLD_UP = ("dpSuspectedThresholdUp", 100) 88 COMMON = ("dpCommon", 101) 89 REQUEST_DPS = ("dpRequestDps", 102) # NOTE: typo "dpRequetdps" in source code 90 # NOTE: the legacy B01 source also listed dpJumpScan (101) and 91 # dpCliffRestrictedArea (102), which collided with the confirmed dpCommon / 92 # dpRequestDps codes above (verified against ss07 hardware and the official app 93 # plugin) and shadowed them in ``from_code``. Both are unused and their real 94 # codes could not be verified, so they were removed rather than left as wrong 95 # duplicates. dpCliffRestrictedAreaUp (103) is kept: ss07 hardware does push 96 # data point 103 (an empty list when no cliff-restricted areas are set). 97 CLIFF_RESTRICTED_AREA_UP = ("dpCliffRestrictedAreaUp", 103) 98 BREAKPOINT_CLEAN = ("dpBreakpointClean", 104) 99 VALLEY_POINT_CHARGING = ("dpValleyPointCharging", 105) 100 VALLEY_POINT_CHARGING_DATA_UP = ("dpValleyPointChargingDataUp", 106) 101 VALLEY_POINT_CHARGING_DATA = ("dpValleyPointChargingData", 107) 102 VOICE_VERSION = ("dpVoiceVersion", 108) 103 ROBOT_COUNTRY_CODE = ("dpRobotCountryCode", 109) 104 HEARTBEAT = ("dpHeartbeat", 110) 105 UNKNOWN_112 = ("dpUnknown112", 112) 106 UNKNOWN_113 = ("dpUnknown113", 113) 107 STATUS = ("dpStatus", 121) 108 BATTERY = ("dpBattery", 122) 109 FAN_LEVEL = ("dpFanLevel", 123) # NOTE: typo "dpfunLevel" in source code 110 WATER_LEVEL = ("dpWaterLevel", 124) 111 MAIN_BRUSH_LIFE = ("dpMainBrushLife", 125) 112 SIDE_BRUSH_LIFE = ("dpSideBrushLife", 126) 113 FILTER_LIFE = ("dpFilterLife", 127) 114 TASK_CANCEL_IN_MOTION = ("dpTaskCancelInMotion", 132) 115 OFFLINE = ("dpOffline", 135) 116 CLEAN_COUNT = ("dpCleanCount", 136) 117 CLEAN_MODE = ("dpCleanMode", 137) 118 CLEAN_TASK_TYPE = ("dpCleanTaskType", 138) 119 BACK_TYPE = ("dpBackType", 139) 120 CLEANING_PROGRESS = ("dpCleaningProgress", 141) 121 FLEEING_GOODS = ("dpFleeingGoods", 142) 122 START_CLEAN = ("dpStartClean", 201) 123 START_BACK = ("dpStartBack", 202) 124 START_DOCK_TASK = ("dpStartDockTask", 203) 125 PAUSE = ("dpPause", 204) 126 RESUME = ("dpResume", 205) 127 STOP = ("dpStop", 206) 128 USER_PLAN = ("dpUserPlan", 207)
A custom StrEnum that also stores an integer code for each member.
131class YXFanLevel(RoborockModeEnum): 132 """The fan or vacuum level of the robot. 133 134 Note: The names used here are the v1 names, though the values 135 have different aliases in the app bundles. 136 """ 137 138 UNKNOWN = "unknown", -1 139 OFF = "off", 0 # close 140 QUIET = "quiet", 1 141 BALANCED = "balanced", 2 # normal 142 TURBO = "turbo", 3 # strong 143 MAX = "max", 4 144 MAX_PLUS = "max_plus", 8 # super
The fan or vacuum level of the robot.
Note: The names used here are the v1 names, though the values have different aliases in the app bundles.
147class YXWaterLevel(RoborockModeEnum): 148 UNKNOWN = "unknown", -1 149 OFF = "off", 0 # close 150 LOW = "low", 1 151 MEDIUM = "medium", 2 # middle 152 HIGH = "high", 3
A custom StrEnum that also stores an integer code for each member.
155class YXCleanLine(RoborockModeEnum): 156 FAST = "fast", 0 157 DAILY = "daily", 1 158 FINE = "fine", 2
A custom StrEnum that also stores an integer code for each member.
161class YXRoomMaterial(RoborockModeEnum): 162 HORIZONTAL_FLOOR_BOARD = "horizontalfloorboard", 0 163 VERTICAL_FLOOR_BOARD = "verticalfloorboard", 1 164 CERAMIC_TILE = "ceramictile", 2 165 OTHER = "other", 255
A custom StrEnum that also stores an integer code for each member.
168class YXCleanType(RoborockModeEnum): 169 UNKNOWN = "unknown", -1 170 VAC_AND_MOP = "vac_and_mop", 1 # bothwork 171 VACUUM = "vacuum", 2 # onlysweep 172 MOP = "mop", 3 # onlymop 173 CUSTOMIZED = "customized", 4 # custom mode
A custom StrEnum that also stores an integer code for each member.
176class YXDeviceState(RoborockModeEnum): 177 UNKNOWN = "unknown", -1 178 SLEEPING = "sleeping", 2 # sleepstate 179 IDLE = "idle", 3 # standbystate 180 CLEANING = "cleaning", 5 # cleaningstate 181 RETURNING_HOME = "returning_home", 6 # tochargestate 182 REMOTE_CONTROL_ACTIVE = "remote_control_active", 7 # remoteingstate 183 CHARGING = "charging", 8 # chargingstate 184 PAUSED = "paused", 10 # pausestate 185 ERROR = "error", 12 # faultstate 186 UPDATING = "updating", 14 # upgradestate 187 EMPTYING_THE_BIN = "emptying_the_bin", 22 # dusting 188 MAPPING = "mapping", 29 # creatingmapstate 189 SAVING_MAP = "saving_map", 99 # mapsavestate 190 RELOCATING = "relocating", 101 # relocationstate 191 SWEEPING = "sweeping", 102 # robotsweeping 192 MOPPING = "mopping", 103 # robotmoping 193 SWEEP_AND_MOP = "sweep_and_mop", 104 # robotsweepandmoping 194 TRANSITIONING = "transitioning", 105 # robottransitioning 195 WAITING_TO_CHARGE = "waiting_to_charge", 108 # robotwaitcharge
A custom StrEnum that also stores an integer code for each member.
198class YXBackType(RoborockModeEnum): 199 UNKNOWN = "unknown", -1 200 IDLE = "idle", 0 201 BACK_DUSTING = "backdusting", 4 202 BACK_CHARGING = "backcharging", 5
A custom StrEnum that also stores an integer code for each member.
205class YXDeviceWorkMode(RoborockModeEnum): 206 UNKNOWN = "unknown", -1 207 BOTH_WORK = "bothwork", 1 208 ONLY_SWEEP = "onlysweep", 2 209 ONLY_MOP = "onlymop", 3 210 CUSTOMIZED = "customized", 4 211 SAVE_WORRY = "saveworry", 5 212 SWEEP_MOP = "sweepmop", 6
A custom StrEnum that also stores an integer code for each member.
215class YXDeviceCleanTask(RoborockModeEnum): 216 UNKNOWN = "unknown", -1 217 IDLE = "idle", 0 218 SMART = "smart", 1 219 ELECTORAL = "electoral", 2 220 DIVIDE_AREAS = "divideareas", 3 221 CREATING_MAP = "creatingmap", 4 222 PART = "part", 5
A custom StrEnum that also stores an integer code for each member.
225class YXCleanScope(RoborockModeEnum): 226 """Clean scope/type as stored in a *clean record* (``dpCleanRecord``, field 7). 227 228 This is the same conceptual axis as the live :class:`YXDeviceCleanTask`, but the 229 persisted record uses a different integer encoding -- e.g. a full clean records 230 ``0`` here vs ``1`` (``smart``) live, and a select-rooms clean records ``1`` here 231 vs ``2`` (``electoral``) live. Ground-truthed against the app's History labels; 232 code ``2`` was never observed on ss07 and is intentionally unmapped (so it 233 resolves to ``None`` rather than a guessed label). 234 """ 235 236 UNKNOWN = "unknown", -1 237 FULL = "full", 0 238 SELECTIVE_ROOM = "selective_room", 1 239 ZONE = "zone", 3 240 SPOT = "spot", 4
Clean scope/type as stored in a clean record (dpCleanRecord, field 7).
This is the same conceptual axis as the live YXDeviceCleanTask, but the
persisted record uses a different integer encoding -- e.g. a full clean records
0 here vs 1 (smart) live, and a select-rooms clean records 1 here
vs 2 (electoral) live. Ground-truthed against the app's History labels;
code 2 was never observed on ss07 and is intentionally unmapped (so it
resolves to None rather than a guessed label).
243class YXCleaningResult(RoborockModeEnum): 244 """How a clean ended, as stored in a clean record (``dpCleanRecord``, field 9).""" 245 246 UNKNOWN = "unknown", -1 247 INTERRUPTED = "interrupted", 0 # ended on a fault 248 COMPLETED = "completed", 1 249 STOPPED = "stopped", 2 # ended early without a fault
How a clean ended, as stored in a clean record (dpCleanRecord, field 9).
252class YXStartMethod(RoborockModeEnum): 253 """What initiated a clean, as stored in a clean record (``dpCleanRecord``, field 10).""" 254 255 UNKNOWN = "unknown", -1 256 REMOTE = "remote", 0 257 APP = "app", 1 258 TIMER = "timer", 2 # schedule / timer 259 BUTTON = "button", 3 # device button
What initiated a clean, as stored in a clean record (dpCleanRecord, field 10).
262class YXDeviceDustCollectionFrequency(RoborockModeEnum): 263 # The app exposes "regular" (code 0) vs "frequent", where "frequent" selects 264 # one of the every-N-cleans intervals below. 265 REGULAR = "regular", 0 266 INTERVAL_15 = "interval_15", 15 267 INTERVAL_30 = "interval_30", 30 268 INTERVAL_45 = "interval_45", 45 269 INTERVAL_60 = "interval_60", 60
A custom StrEnum that also stores an integer code for each member.
272class YXAreaUnit(RoborockModeEnum): 273 """Unit used to report cleaned area (dpAreaUnit).""" 274 275 SQUARE_METER = "square_meter", 0 276 SQUARE_FEET = "square_feet", 1
Unit used to report cleaned area (dpAreaUnit).
279class YXCarpetCleanType(RoborockModeEnum): 280 """Carpet handling behavior (dpCarpetCleanType).""" 281 282 RISE = "rise", 0 # lift the mop and boost over carpet 283 AVOID = "avoid", 1 284 IGNORE = "ignore", 2 285 CROSS = "cross", 3
Carpet handling behavior (dpCarpetCleanType).
288class YXFault(RoborockModeEnum): 289 """Q10 (B01/ss07) ``dpFault`` (90) codes, from the ss07 fault spec. 290 291 ``dpFault`` is *overloaded*: several values are lifecycle/status rather than 292 errors (e.g. 400 = scheduled clean starting, 501 = returning to dock, 293 502 = recharge). A non-zero fault is not necessarily a blocking error. 294 The converse also holds: the device can sit in its error state (``dpStatus`` 295 12) with ``dpFault`` still 0 (observed live with the dust-bin module 296 removed), so a ``None``/``NONE`` fault does not imply the absence of an 297 error condition. 298 299 These labels differ from the Q7 ``B01Fault`` for several shared numbers 300 (500, 501, 503, 569, 570) -- so this is a Q10-specific map, not a reuse of 301 ``B01Fault``. Codes marked "hw-confirmed" were observed firing live on a 302 physical ss07 in a context matching the label; the rest are from the spec 303 only, not yet observed live (single device). 304 """ 305 306 UNKNOWN = "unknown", -1 307 NONE = "none", 0 308 LIDAR_BLOCKED = "lidar_blocked", 1 309 BUMPER_STUCK = "bumper_stuck", 2 # hw-confirmed (bumper held in during commanded motion) 310 ROBOT_SUSPENDED = "robot_suspended", 3 # hw-confirmed (wheels lifted off the floor mid-task) 311 CLIFF_SENSOR_ERROR = "cliff_sensor_error", 4 # hw-confirmed (one side lifted mid-task) 312 MAIN_BRUSH_STUCK = "main_brush_stuck", 5 # hw-confirmed (two physical brush jams) 313 MAIN_WHEELS_STUCK = "main_wheels_stuck", 7 314 ROBOT_TRAPPED = "robot_trapped", 8 # hw-confirmed 315 CHECK_DUSTBIN_FILTER = "check_dustbin_filter", 9 316 LOW_BATTERY = "low_battery", 12 # hw-confirmed (fired at 14% mid clean) 317 TEMPERATURE_THRESHOLD = "temperature_threshold", 14 318 ROBOT_TILTED = "robot_tilted", 16 319 LIDAR_COVER_OBSTRUCTED = "lidar_cover_obstructed", 21 320 NO_GO_ZONE_DETECTED = "no_go_zone_detected", 24 321 MOPPING_MODULE_STUCK = "mopping_module_stuck", 27 322 CARPET_AVOIDANCE = "carpet_avoidance", 28 323 CANNOT_CROSS_CARPET = "cannot_cross_carpet", 29 324 INSTALL_DUST_BAG = "install_dust_bag", 46 # hw-confirmed (docked with bag removed; fires at dock contact) 325 MOP_MOUNT_FELL_OFF = "mop_mount_fell_off", 54 326 LIDAR_DIRTY = "lidar_dirty", 58 327 FILTER_SERVICE_LIFE = "filter_service_life", 301 328 MAIN_BRUSH_SERVICE_LIFE = "main_brush_service_life", 302 329 SIDE_BRUSH_SERVICE_LIFE = "side_brush_service_life", 303 330 SENSOR_NEEDS_CLEANING = "sensor_needs_cleaning", 304 # hw-confirmed (fired during auto-empty) 331 DUST_BAG_FULL = "dust_bag_full", 310 # inferred from auto-empty context; not hw-confirmed 332 STARTING_SCHEDULED_CLEAN = "starting_scheduled_clean", 400 # hw-confirmed x3; lifecycle, not an error 333 # hw-confirmed (a due scheduled clean fired mid-clean and was ignored); lifecycle, not an error 334 CLEANING_IN_PROGRESS = "cleaning_in_progress", 407 335 EMPTY_DUSTBIN = "empty_dustbin", 500 # ss07 != Q7 B01Fault (lidar_blocked); spec-only 336 # hw-confirmed, fires per completed task; ss07 != Q7 (robot_suspended) 337 CLEANING_COMPLETED_RETURNING = "cleaning_completed_returning", 501 338 LOW_BATTERY_RESUME = "low_battery_resume", 502 # hw-confirmed; lifecycle 339 DOCKING_ERROR = "docking_error", 503 # hw-confirmed; ss07 != Q7 (dustbin_not_installed) 340 POSITIONING_FAILED = "positioning_failed", 556 # hw-confirmed; relocalization 341 # hw-confirmed (3rd auto-empty in ~15 min: dock refuses to run the cycle); ss07 != Q7 (main_wheels_entangled) 342 TOO_FREQUENT_EMPTYING = "too_frequent_emptying", 569 343 CANNOT_REACH_TARGET = "cannot_reach_target", 570 # hw-confirmed; ss07 != Q7 (main_brush_entangled) 344 OFFLINE_WARNING_ASLEEP = "offline_warning_asleep", 588 345 OFFLINE_WARNING_LOW_BATTERY = "offline_warning_low_battery", 589 346 DND_AUTO_TOPUP_DISABLED = "dnd_auto_topup_disabled", 591 347 CLEAN_CARPET_ULTRASONIC_SENSORS = "clean_carpet_ultrasonic_sensors", 707 348 ROBOT_ERROR_RESET = "robot_error_reset", 1002 349 VOICE_PACK_UPDATE_AVAILABLE = "voice_pack_update_available", 3001
Q10 (B01/ss07) dpFault (90) codes, from the ss07 fault spec.
dpFault is overloaded: several values are lifecycle/status rather than
errors (e.g. 400 = scheduled clean starting, 501 = returning to dock,
502 = recharge). A non-zero fault is not necessarily a blocking error.
The converse also holds: the device can sit in its error state (dpStatus
12) with dpFault still 0 (observed live with the dust-bin module
removed), so a None/NONE fault does not imply the absence of an
error condition.
These labels differ from the Q7 B01Fault for several shared numbers
(500, 501, 503, 569, 570) -- so this is a Q10-specific map, not a reuse of
B01Fault. Codes marked "hw-confirmed" were observed firing live on a
physical ss07 in a context matching the label; the rest are from the spec
only, not yet observed live (single device).
352class RemoteCommand(IntEnum): 353 FORWARD = 0 354 LEFT = 2 355 RIGHT = 3 356 STOP = 4 357 EXIT = 5