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    # NOTE: ss07 hardware also pushes data points 112 and 113 in its full status
105    # dump. They are absent from the official app's vacuum plugin and stayed 0
106    # across every observed state (docked/charging, segment cleaning, lifted-off-
107    # ground fault, returning to dock, dustbin removed), so their meaning is not
108    # yet known. They are intentionally left unmapped; ``decode_rpc_response``
109    # silently ignores unknown codes via ``from_code_optional``, so they do not
110    # produce "not a valid code" warnings. Map them here once identified.
111    STATUS = ("dpStatus", 121)
112    BATTERY = ("dpBattery", 122)
113    FAN_LEVEL = ("dpFanLevel", 123)  # NOTE: typo "dpfunLevel" in source code
114    WATER_LEVEL = ("dpWaterLevel", 124)
115    MAIN_BRUSH_LIFE = ("dpMainBrushLife", 125)
116    SIDE_BRUSH_LIFE = ("dpSideBrushLife", 126)
117    FILTER_LIFE = ("dpFilterLife", 127)
118    TASK_CANCEL_IN_MOTION = ("dpTaskCancelInMotion", 132)
119    OFFLINE = ("dpOffline", 135)
120    CLEAN_COUNT = ("dpCleanCount", 136)
121    CLEAN_MODE = ("dpCleanMode", 137)
122    CLEAN_TASK_TYPE = ("dpCleanTaskType", 138)
123    BACK_TYPE = ("dpBackType", 139)
124    CLEANING_PROGRESS = ("dpCleaningProgress", 141)
125    FLEEING_GOODS = ("dpFleeingGoods", 142)
126    START_CLEAN = ("dpStartClean", 201)
127    START_BACK = ("dpStartBack", 202)
128    START_DOCK_TASK = ("dpStartDockTask", 203)
129    PAUSE = ("dpPause", 204)
130    RESUME = ("dpResume", 205)
131    STOP = ("dpStop", 206)
132    USER_PLAN = ("dpUserPlan", 207)
133
134
135class YXFanLevel(RoborockModeEnum):
136    """The fan or vacuum level of the robot.
137
138    Note: The names used here are the v1 names, though the values
139    have different aliases in the app bundles.
140    """
141
142    UNKNOWN = "unknown", -1
143    OFF = "off", 0  # close
144    QUIET = "quiet", 1
145    BALANCED = "balanced", 2  # normal
146    TURBO = "turbo", 3  # strong
147    MAX = "max", 4
148    MAX_PLUS = "max_plus", 8  # super
149
150
151class YXWaterLevel(RoborockModeEnum):
152    UNKNOWN = "unknown", -1
153    OFF = "off", 0  # close
154    LOW = "low", 1
155    MEDIUM = "medium", 2  # middle
156    HIGH = "high", 3
157
158
159class YXCleanLine(RoborockModeEnum):
160    FAST = "fast", 0
161    DAILY = "daily", 1
162    FINE = "fine", 2
163
164
165class YXRoomMaterial(RoborockModeEnum):
166    HORIZONTAL_FLOOR_BOARD = "horizontalfloorboard", 0
167    VERTICAL_FLOOR_BOARD = "verticalfloorboard", 1
168    CERAMIC_TILE = "ceramictile", 2
169    OTHER = "other", 255
170
171
172class YXCleanType(RoborockModeEnum):
173    UNKNOWN = "unknown", -1
174    VAC_AND_MOP = "vac_and_mop", 1  # bothwork
175    VACUUM = "vacuum", 2  # onlysweep
176    MOP = "mop", 3  # onlymop
177    CUSTOMIZED = "customized", 4  # custom mode
178
179
180class YXDeviceState(RoborockModeEnum):
181    UNKNOWN = "unknown", -1
182    SLEEPING = "sleeping", 2  # sleepstate
183    IDLE = "idle", 3  # standbystate
184    CLEANING = "cleaning", 5  # cleaningstate
185    RETURNING_HOME = "returning_home", 6  # tochargestate
186    REMOTE_CONTROL_ACTIVE = "remote_control_active", 7  # remoteingstate
187    CHARGING = "charging", 8  # chargingstate
188    PAUSED = "paused", 10  # pausestate
189    ERROR = "error", 12  # faultstate
190    UPDATING = "updating", 14  # upgradestate
191    EMPTYING_THE_BIN = "emptying_the_bin", 22  # dusting
192    MAPPING = "mapping", 29  # creatingmapstate
193    SAVING_MAP = "saving_map", 99  # mapsavestate
194    RELOCATING = "relocating", 101  # relocationstate
195    SWEEPING = "sweeping", 102  # robotsweeping
196    MOPPING = "mopping", 103  # robotmoping
197    SWEEP_AND_MOP = "sweep_and_mop", 104  # robotsweepandmoping
198    TRANSITIONING = "transitioning", 105  # robottransitioning
199    WAITING_TO_CHARGE = "waiting_to_charge", 108  # robotwaitcharge
200
201
202class YXBackType(RoborockModeEnum):
203    UNKNOWN = "unknown", -1
204    IDLE = "idle", 0
205    BACK_DUSTING = "backdusting", 4
206    BACK_CHARGING = "backcharging", 5
207
208
209class YXDeviceWorkMode(RoborockModeEnum):
210    UNKNOWN = "unknown", -1
211    BOTH_WORK = "bothwork", 1
212    ONLY_SWEEP = "onlysweep", 2
213    ONLY_MOP = "onlymop", 3
214    CUSTOMIZED = "customized", 4
215    SAVE_WORRY = "saveworry", 5
216    SWEEP_MOP = "sweepmop", 6
217
218
219class YXDeviceCleanTask(RoborockModeEnum):
220    UNKNOWN = "unknown", -1
221    IDLE = "idle", 0
222    SMART = "smart", 1
223    ELECTORAL = "electoral", 2
224    DIVIDE_AREAS = "divideareas", 3
225    CREATING_MAP = "creatingmap", 4
226    PART = "part", 5
227
228
229class YXDeviceDustCollectionFrequency(RoborockModeEnum):
230    # The app exposes "regular" (code 0) vs "frequent", where "frequent" selects
231    # one of the every-N-cleans intervals below.
232    REGULAR = "regular", 0
233    INTERVAL_15 = "interval_15", 15
234    INTERVAL_30 = "interval_30", 30
235    INTERVAL_45 = "interval_45", 45
236    INTERVAL_60 = "interval_60", 60
237
238
239class YXAreaUnit(RoborockModeEnum):
240    """Unit used to report cleaned area (dpAreaUnit)."""
241
242    SQUARE_METER = "square_meter", 0
243    SQUARE_FEET = "square_feet", 1
244
245
246class YXCarpetCleanType(RoborockModeEnum):
247    """Carpet handling behavior (dpCarpetCleanType)."""
248
249    RISE = "rise", 0  # lift the mop and boost over carpet
250    AVOID = "avoid", 1
251    IGNORE = "ignore", 2
252    CROSS = "cross", 3
253
254
255class RemoteCommand(IntEnum):
256    FORWARD = 0
257    LEFT = 2
258    RIGHT = 3
259    STOP = 4
260    EXIT = 5
class B01_Q10_DP(roborock.data.code_mappings.RoborockModeEnum):
  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    # NOTE: ss07 hardware also pushes data points 112 and 113 in its full status
106    # dump. They are absent from the official app's vacuum plugin and stayed 0
107    # across every observed state (docked/charging, segment cleaning, lifted-off-
108    # ground fault, returning to dock, dustbin removed), so their meaning is not
109    # yet known. They are intentionally left unmapped; ``decode_rpc_response``
110    # silently ignores unknown codes via ``from_code_optional``, so they do not
111    # produce "not a valid code" warnings. Map them here once identified.
112    STATUS = ("dpStatus", 121)
113    BATTERY = ("dpBattery", 122)
114    FAN_LEVEL = ("dpFanLevel", 123)  # NOTE: typo "dpfunLevel" in source code
115    WATER_LEVEL = ("dpWaterLevel", 124)
116    MAIN_BRUSH_LIFE = ("dpMainBrushLife", 125)
117    SIDE_BRUSH_LIFE = ("dpSideBrushLife", 126)
118    FILTER_LIFE = ("dpFilterLife", 127)
119    TASK_CANCEL_IN_MOTION = ("dpTaskCancelInMotion", 132)
120    OFFLINE = ("dpOffline", 135)
121    CLEAN_COUNT = ("dpCleanCount", 136)
122    CLEAN_MODE = ("dpCleanMode", 137)
123    CLEAN_TASK_TYPE = ("dpCleanTaskType", 138)
124    BACK_TYPE = ("dpBackType", 139)
125    CLEANING_PROGRESS = ("dpCleaningProgress", 141)
126    FLEEING_GOODS = ("dpFleeingGoods", 142)
127    START_CLEAN = ("dpStartClean", 201)
128    START_BACK = ("dpStartBack", 202)
129    START_DOCK_TASK = ("dpStartDockTask", 203)
130    PAUSE = ("dpPause", 204)
131    RESUME = ("dpResume", 205)
132    STOP = ("dpStop", 206)
133    USER_PLAN = ("dpUserPlan", 207)

A custom StrEnum that also stores an integer code for each member.

CLEAN_TIME = <B01_Q10_DP.CLEAN_TIME: 'dpCleanTime'>
CLEAN_AREA = <B01_Q10_DP.CLEAN_AREA: 'dpCleanArea'>
SEEK = <B01_Q10_DP.SEEK: 'dpSeek'>
REMOTE = <B01_Q10_DP.REMOTE: 'dpRemote'>
MAP_RESET = <B01_Q10_DP.MAP_RESET: 'dpMapReset'>
REQUEST = <B01_Q10_DP.REQUEST: 'dpRequest'>
RESET_SIDE_BRUSH = <B01_Q10_DP.RESET_SIDE_BRUSH: 'dpResetSideBrush'>
RESET_MAIN_BRUSH = <B01_Q10_DP.RESET_MAIN_BRUSH: 'dpResetMainBrush'>
RESET_FILTER = <B01_Q10_DP.RESET_FILTER: 'dpResetFilter'>
RAG_LIFE = <B01_Q10_DP.RAG_LIFE: 'dpRagLife'>
RESET_RAG_LIFE = <B01_Q10_DP.RESET_RAG_LIFE: 'dpResetRagLife'>
NOT_DISTURB = <B01_Q10_DP.NOT_DISTURB: 'dpNotDisturb'>
VOLUME = <B01_Q10_DP.VOLUME: 'dpVolume'>
BEAK_CLEAN = <B01_Q10_DP.BEAK_CLEAN: 'dpBeakClean'>
TOTAL_CLEAN_AREA = <B01_Q10_DP.TOTAL_CLEAN_AREA: 'dpTotalCleanArea'>
TOTAL_CLEAN_COUNT = <B01_Q10_DP.TOTAL_CLEAN_COUNT: 'dpTotalCleanCount'>
TOTAL_CLEAN_TIME = <B01_Q10_DP.TOTAL_CLEAN_TIME: 'dpTotalCleanTime'>
TIMER = <B01_Q10_DP.TIMER: 'dpTimer'>
NOT_DISTURB_DATA = <B01_Q10_DP.NOT_DISTURB_DATA: 'dpNotDisturbData'>
DEVICE_INFO = <B01_Q10_DP.DEVICE_INFO: 'dpDeviceInfo'>
VOICE_PACKAGE = <B01_Q10_DP.VOICE_PACKAGE: 'dpVoicePackage'>
VOICE_LANGUAGE = <B01_Q10_DP.VOICE_LANGUAGE: 'dpVoiceLanguage'>
DUST_SWITCH = <B01_Q10_DP.DUST_SWITCH: 'dpDustSwitch'>
CUSTOM_MODE = <B01_Q10_DP.CUSTOM_MODE: 'dpCustomMode'>
MOP_STATE = <B01_Q10_DP.MOP_STATE: 'dpMopState'>
UNIT = <B01_Q10_DP.UNIT: 'dpUnit'>
CARPET_CLEAN_PREFER = <B01_Q10_DP.CARPET_CLEAN_PREFER: 'dpCarpetCleanPrefer'>
AUTO_BOOST = <B01_Q10_DP.AUTO_BOOST: 'dpAutoBoost'>
CHILD_LOCK = <B01_Q10_DP.CHILD_LOCK: 'dpChildLock'>
DUST_SETTING = <B01_Q10_DP.DUST_SETTING: 'dpDustSetting'>
MAP_SAVE_SWITCH = <B01_Q10_DP.MAP_SAVE_SWITCH: 'dpMapSaveSwitch'>
CLEAN_RECORD = <B01_Q10_DP.CLEAN_RECORD: 'dpCleanRecord'>
RECENT_CLEAN_RECORD = <B01_Q10_DP.RECENT_CLEAN_RECORD: 'dpRecentCleanRecord'>
RESTRICTED_ZONE = <B01_Q10_DP.RESTRICTED_ZONE: 'dpRestrictedZone'>
RESTRICTED_ZONE_UP = <B01_Q10_DP.RESTRICTED_ZONE_UP: 'dpRestrictedZoneUp'>
VIRTUAL_WALL = <B01_Q10_DP.VIRTUAL_WALL: 'dpVirtualWall'>
VIRTUAL_WALL_UP = <B01_Q10_DP.VIRTUAL_WALL_UP: 'dpVirtualWallUp'>
ZONED = <B01_Q10_DP.ZONED: 'dpZoned'>
ZONED_UP = <B01_Q10_DP.ZONED_UP: 'dpZonedUp'>
MULTI_MAP_SWITCH = <B01_Q10_DP.MULTI_MAP_SWITCH: 'dpMultiMapSwitch'>
MULTI_MAP = <B01_Q10_DP.MULTI_MAP: 'dpMultiMap'>
CUSTOMER_CLEAN = <B01_Q10_DP.CUSTOMER_CLEAN: 'dpCustomerClean'>
CUSTOMER_CLEAN_REQUEST = <B01_Q10_DP.CUSTOMER_CLEAN_REQUEST: 'dpCustomerCleanRequest'>
GET_CARPET = <B01_Q10_DP.GET_CARPET: 'dpGetCarpet'>
CARPET_UP = <B01_Q10_DP.CARPET_UP: 'dpCarpetUp'>
SELF_IDENTIFYING_CARPET = <B01_Q10_DP.SELF_IDENTIFYING_CARPET: 'dpSelfIdentifyingCarpet'>
SENSOR_LIFE = <B01_Q10_DP.SENSOR_LIFE: 'dpSensorLife'>
RESET_SENSOR = <B01_Q10_DP.RESET_SENSOR: 'dpResetSensor'>
REQUEST_TIMER = <B01_Q10_DP.REQUEST_TIMER: 'dpRequestTimer'>
REMOVE_ZONED = <B01_Q10_DP.REMOVE_ZONED: 'dpRemoveZoned'>
REMOVE_ZONED_UP = <B01_Q10_DP.REMOVE_ZONED_UP: 'dpRemoveZonedUp'>
ROOM_MERGE = <B01_Q10_DP.ROOM_MERGE: 'dpRoomMerge'>
ROOM_SPLIT = <B01_Q10_DP.ROOM_SPLIT: 'dpRoomSplit'>
RESET_ROOM_NAME = <B01_Q10_DP.RESET_ROOM_NAME: 'dpResetRoomName'>
REQUEST_NOT_DISTURB_DATA = <B01_Q10_DP.REQUEST_NOT_DISTURB_DATA: 'dpRequestNotDisturbData'>
CARPET_CLEAN_TYPE = <B01_Q10_DP.CARPET_CLEAN_TYPE: 'dpCarpetCleanType'>
BUTTON_LIGHT_SWITCH = <B01_Q10_DP.BUTTON_LIGHT_SWITCH: 'dpButtonLightSwitch'>
CLEAN_LINE = <B01_Q10_DP.CLEAN_LINE: 'dpCleanLine'>
TIME_ZONE = <B01_Q10_DP.TIME_ZONE: 'dpTimeZone'>
AREA_UNIT = <B01_Q10_DP.AREA_UNIT: 'dpAreaUnit'>
NET_INFO = <B01_Q10_DP.NET_INFO: 'dpNetInfo'>
CLEAN_ORDER = <B01_Q10_DP.CLEAN_ORDER: 'dpCleanOrder'>
ROBOT_TYPE = <B01_Q10_DP.ROBOT_TYPE: 'dpRobotType'>
LOG_SWITCH = <B01_Q10_DP.LOG_SWITCH: 'dpLogSwitch'>
FLOOR_MATERIAL = <B01_Q10_DP.FLOOR_MATERIAL: 'dpFloorMaterial'>
LINE_LASER_OBSTACLE_AVOIDANCE = <B01_Q10_DP.LINE_LASER_OBSTACLE_AVOIDANCE: 'dpLineLaserObstacleAvoidance'>
CLEAN_PROGRESS = <B01_Q10_DP.CLEAN_PROGRESS: 'dpCleanProgress'>
GROUND_CLEAN = <B01_Q10_DP.GROUND_CLEAN: 'dpGroundClean'>
IGNORE_OBSTACLE = <B01_Q10_DP.IGNORE_OBSTACLE: 'dpIgnoreObstacle'>
FAULT = <B01_Q10_DP.FAULT: 'dpFault'>
CLEAN_EXPAND = <B01_Q10_DP.CLEAN_EXPAND: 'dpCleanExpand'>
NOT_DISTURB_EXPAND = <B01_Q10_DP.NOT_DISTURB_EXPAND: 'dpNotDisturbExpand'>
TIMER_TYPE = <B01_Q10_DP.TIMER_TYPE: 'dpTimerType'>
CREATE_MAP_FINISHED = <B01_Q10_DP.CREATE_MAP_FINISHED: 'dpCreateMapFinished'>
ADD_CLEAN_AREA = <B01_Q10_DP.ADD_CLEAN_AREA: 'dpAddCleanArea'>
ADD_CLEAN_STATE = <B01_Q10_DP.ADD_CLEAN_STATE: 'dpAddCleanState'>
RESTRICTED_AREA = <B01_Q10_DP.RESTRICTED_AREA: 'dpRestrictedArea'>
RESTRICTED_AREA_UP = <B01_Q10_DP.RESTRICTED_AREA_UP: 'dpRestrictedAreaUp'>
SUSPECTED_THRESHOLD = <B01_Q10_DP.SUSPECTED_THRESHOLD: 'dpSuspectedThreshold'>
SUSPECTED_THRESHOLD_UP = <B01_Q10_DP.SUSPECTED_THRESHOLD_UP: 'dpSuspectedThresholdUp'>
COMMON = <B01_Q10_DP.COMMON: 'dpCommon'>
REQUEST_DPS = <B01_Q10_DP.REQUEST_DPS: 'dpRequestDps'>
CLIFF_RESTRICTED_AREA_UP = <B01_Q10_DP.CLIFF_RESTRICTED_AREA_UP: 'dpCliffRestrictedAreaUp'>
BREAKPOINT_CLEAN = <B01_Q10_DP.BREAKPOINT_CLEAN: 'dpBreakpointClean'>
VALLEY_POINT_CHARGING = <B01_Q10_DP.VALLEY_POINT_CHARGING: 'dpValleyPointCharging'>
VALLEY_POINT_CHARGING_DATA_UP = <B01_Q10_DP.VALLEY_POINT_CHARGING_DATA_UP: 'dpValleyPointChargingDataUp'>
VALLEY_POINT_CHARGING_DATA = <B01_Q10_DP.VALLEY_POINT_CHARGING_DATA: 'dpValleyPointChargingData'>
VOICE_VERSION = <B01_Q10_DP.VOICE_VERSION: 'dpVoiceVersion'>
ROBOT_COUNTRY_CODE = <B01_Q10_DP.ROBOT_COUNTRY_CODE: 'dpRobotCountryCode'>
HEARTBEAT = <B01_Q10_DP.HEARTBEAT: 'dpHeartbeat'>
STATUS = <B01_Q10_DP.STATUS: 'dpStatus'>
BATTERY = <B01_Q10_DP.BATTERY: 'dpBattery'>
FAN_LEVEL = <B01_Q10_DP.FAN_LEVEL: 'dpFanLevel'>
WATER_LEVEL = <B01_Q10_DP.WATER_LEVEL: 'dpWaterLevel'>
MAIN_BRUSH_LIFE = <B01_Q10_DP.MAIN_BRUSH_LIFE: 'dpMainBrushLife'>
SIDE_BRUSH_LIFE = <B01_Q10_DP.SIDE_BRUSH_LIFE: 'dpSideBrushLife'>
FILTER_LIFE = <B01_Q10_DP.FILTER_LIFE: 'dpFilterLife'>
TASK_CANCEL_IN_MOTION = <B01_Q10_DP.TASK_CANCEL_IN_MOTION: 'dpTaskCancelInMotion'>
OFFLINE = <B01_Q10_DP.OFFLINE: 'dpOffline'>
CLEAN_COUNT = <B01_Q10_DP.CLEAN_COUNT: 'dpCleanCount'>
CLEAN_MODE = <B01_Q10_DP.CLEAN_MODE: 'dpCleanMode'>
CLEAN_TASK_TYPE = <B01_Q10_DP.CLEAN_TASK_TYPE: 'dpCleanTaskType'>
BACK_TYPE = <B01_Q10_DP.BACK_TYPE: 'dpBackType'>
CLEANING_PROGRESS = <B01_Q10_DP.CLEANING_PROGRESS: 'dpCleaningProgress'>
FLEEING_GOODS = <B01_Q10_DP.FLEEING_GOODS: 'dpFleeingGoods'>
START_CLEAN = <B01_Q10_DP.START_CLEAN: 'dpStartClean'>
START_BACK = <B01_Q10_DP.START_BACK: 'dpStartBack'>
START_DOCK_TASK = <B01_Q10_DP.START_DOCK_TASK: 'dpStartDockTask'>
PAUSE = <B01_Q10_DP.PAUSE: 'dpPause'>
RESUME = <B01_Q10_DP.RESUME: 'dpResume'>
STOP = <B01_Q10_DP.STOP: 'dpStop'>
USER_PLAN = <B01_Q10_DP.USER_PLAN: 'dpUserPlan'>
class YXFanLevel(roborock.data.code_mappings.RoborockModeEnum):
136class YXFanLevel(RoborockModeEnum):
137    """The fan or vacuum level of the robot.
138
139    Note: The names used here are the v1 names, though the values
140    have different aliases in the app bundles.
141    """
142
143    UNKNOWN = "unknown", -1
144    OFF = "off", 0  # close
145    QUIET = "quiet", 1
146    BALANCED = "balanced", 2  # normal
147    TURBO = "turbo", 3  # strong
148    MAX = "max", 4
149    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.

UNKNOWN = <YXFanLevel.UNKNOWN: 'unknown'>
OFF = <YXFanLevel.OFF: 'off'>
QUIET = <YXFanLevel.QUIET: 'quiet'>
BALANCED = <YXFanLevel.BALANCED: 'balanced'>
TURBO = <YXFanLevel.TURBO: 'turbo'>
MAX = <YXFanLevel.MAX: 'max'>
MAX_PLUS = <YXFanLevel.MAX_PLUS: 'max_plus'>
class YXWaterLevel(roborock.data.code_mappings.RoborockModeEnum):
152class YXWaterLevel(RoborockModeEnum):
153    UNKNOWN = "unknown", -1
154    OFF = "off", 0  # close
155    LOW = "low", 1
156    MEDIUM = "medium", 2  # middle
157    HIGH = "high", 3

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXWaterLevel.UNKNOWN: 'unknown'>
OFF = <YXWaterLevel.OFF: 'off'>
LOW = <YXWaterLevel.LOW: 'low'>
MEDIUM = <YXWaterLevel.MEDIUM: 'medium'>
HIGH = <YXWaterLevel.HIGH: 'high'>
class YXCleanLine(roborock.data.code_mappings.RoborockModeEnum):
160class YXCleanLine(RoborockModeEnum):
161    FAST = "fast", 0
162    DAILY = "daily", 1
163    FINE = "fine", 2

A custom StrEnum that also stores an integer code for each member.

FAST = <YXCleanLine.FAST: 'fast'>
DAILY = <YXCleanLine.DAILY: 'daily'>
FINE = <YXCleanLine.FINE: 'fine'>
class YXRoomMaterial(roborock.data.code_mappings.RoborockModeEnum):
166class YXRoomMaterial(RoborockModeEnum):
167    HORIZONTAL_FLOOR_BOARD = "horizontalfloorboard", 0
168    VERTICAL_FLOOR_BOARD = "verticalfloorboard", 1
169    CERAMIC_TILE = "ceramictile", 2
170    OTHER = "other", 255

A custom StrEnum that also stores an integer code for each member.

HORIZONTAL_FLOOR_BOARD = <YXRoomMaterial.HORIZONTAL_FLOOR_BOARD: 'horizontalfloorboard'>
VERTICAL_FLOOR_BOARD = <YXRoomMaterial.VERTICAL_FLOOR_BOARD: 'verticalfloorboard'>
CERAMIC_TILE = <YXRoomMaterial.CERAMIC_TILE: 'ceramictile'>
OTHER = <YXRoomMaterial.OTHER: 'other'>
class YXCleanType(roborock.data.code_mappings.RoborockModeEnum):
173class YXCleanType(RoborockModeEnum):
174    UNKNOWN = "unknown", -1
175    VAC_AND_MOP = "vac_and_mop", 1  # bothwork
176    VACUUM = "vacuum", 2  # onlysweep
177    MOP = "mop", 3  # onlymop
178    CUSTOMIZED = "customized", 4  # custom mode

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXCleanType.UNKNOWN: 'unknown'>
VAC_AND_MOP = <YXCleanType.VAC_AND_MOP: 'vac_and_mop'>
VACUUM = <YXCleanType.VACUUM: 'vacuum'>
MOP = <YXCleanType.MOP: 'mop'>
CUSTOMIZED = <YXCleanType.CUSTOMIZED: 'customized'>
class YXDeviceState(roborock.data.code_mappings.RoborockModeEnum):
181class YXDeviceState(RoborockModeEnum):
182    UNKNOWN = "unknown", -1
183    SLEEPING = "sleeping", 2  # sleepstate
184    IDLE = "idle", 3  # standbystate
185    CLEANING = "cleaning", 5  # cleaningstate
186    RETURNING_HOME = "returning_home", 6  # tochargestate
187    REMOTE_CONTROL_ACTIVE = "remote_control_active", 7  # remoteingstate
188    CHARGING = "charging", 8  # chargingstate
189    PAUSED = "paused", 10  # pausestate
190    ERROR = "error", 12  # faultstate
191    UPDATING = "updating", 14  # upgradestate
192    EMPTYING_THE_BIN = "emptying_the_bin", 22  # dusting
193    MAPPING = "mapping", 29  # creatingmapstate
194    SAVING_MAP = "saving_map", 99  # mapsavestate
195    RELOCATING = "relocating", 101  # relocationstate
196    SWEEPING = "sweeping", 102  # robotsweeping
197    MOPPING = "mopping", 103  # robotmoping
198    SWEEP_AND_MOP = "sweep_and_mop", 104  # robotsweepandmoping
199    TRANSITIONING = "transitioning", 105  # robottransitioning
200    WAITING_TO_CHARGE = "waiting_to_charge", 108  # robotwaitcharge

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXDeviceState.UNKNOWN: 'unknown'>
SLEEPING = <YXDeviceState.SLEEPING: 'sleeping'>
IDLE = <YXDeviceState.IDLE: 'idle'>
CLEANING = <YXDeviceState.CLEANING: 'cleaning'>
RETURNING_HOME = <YXDeviceState.RETURNING_HOME: 'returning_home'>
REMOTE_CONTROL_ACTIVE = <YXDeviceState.REMOTE_CONTROL_ACTIVE: 'remote_control_active'>
CHARGING = <YXDeviceState.CHARGING: 'charging'>
PAUSED = <YXDeviceState.PAUSED: 'paused'>
ERROR = <YXDeviceState.ERROR: 'error'>
UPDATING = <YXDeviceState.UPDATING: 'updating'>
EMPTYING_THE_BIN = <YXDeviceState.EMPTYING_THE_BIN: 'emptying_the_bin'>
MAPPING = <YXDeviceState.MAPPING: 'mapping'>
SAVING_MAP = <YXDeviceState.SAVING_MAP: 'saving_map'>
RELOCATING = <YXDeviceState.RELOCATING: 'relocating'>
SWEEPING = <YXDeviceState.SWEEPING: 'sweeping'>
MOPPING = <YXDeviceState.MOPPING: 'mopping'>
SWEEP_AND_MOP = <YXDeviceState.SWEEP_AND_MOP: 'sweep_and_mop'>
TRANSITIONING = <YXDeviceState.TRANSITIONING: 'transitioning'>
WAITING_TO_CHARGE = <YXDeviceState.WAITING_TO_CHARGE: 'waiting_to_charge'>
class YXBackType(roborock.data.code_mappings.RoborockModeEnum):
203class YXBackType(RoborockModeEnum):
204    UNKNOWN = "unknown", -1
205    IDLE = "idle", 0
206    BACK_DUSTING = "backdusting", 4
207    BACK_CHARGING = "backcharging", 5

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXBackType.UNKNOWN: 'unknown'>
IDLE = <YXBackType.IDLE: 'idle'>
BACK_DUSTING = <YXBackType.BACK_DUSTING: 'backdusting'>
BACK_CHARGING = <YXBackType.BACK_CHARGING: 'backcharging'>
class YXDeviceWorkMode(roborock.data.code_mappings.RoborockModeEnum):
210class YXDeviceWorkMode(RoborockModeEnum):
211    UNKNOWN = "unknown", -1
212    BOTH_WORK = "bothwork", 1
213    ONLY_SWEEP = "onlysweep", 2
214    ONLY_MOP = "onlymop", 3
215    CUSTOMIZED = "customized", 4
216    SAVE_WORRY = "saveworry", 5
217    SWEEP_MOP = "sweepmop", 6

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXDeviceWorkMode.UNKNOWN: 'unknown'>
BOTH_WORK = <YXDeviceWorkMode.BOTH_WORK: 'bothwork'>
ONLY_SWEEP = <YXDeviceWorkMode.ONLY_SWEEP: 'onlysweep'>
ONLY_MOP = <YXDeviceWorkMode.ONLY_MOP: 'onlymop'>
CUSTOMIZED = <YXDeviceWorkMode.CUSTOMIZED: 'customized'>
SAVE_WORRY = <YXDeviceWorkMode.SAVE_WORRY: 'saveworry'>
SWEEP_MOP = <YXDeviceWorkMode.SWEEP_MOP: 'sweepmop'>
class YXDeviceCleanTask(roborock.data.code_mappings.RoborockModeEnum):
220class YXDeviceCleanTask(RoborockModeEnum):
221    UNKNOWN = "unknown", -1
222    IDLE = "idle", 0
223    SMART = "smart", 1
224    ELECTORAL = "electoral", 2
225    DIVIDE_AREAS = "divideareas", 3
226    CREATING_MAP = "creatingmap", 4
227    PART = "part", 5

A custom StrEnum that also stores an integer code for each member.

UNKNOWN = <YXDeviceCleanTask.UNKNOWN: 'unknown'>
IDLE = <YXDeviceCleanTask.IDLE: 'idle'>
SMART = <YXDeviceCleanTask.SMART: 'smart'>
ELECTORAL = <YXDeviceCleanTask.ELECTORAL: 'electoral'>
DIVIDE_AREAS = <YXDeviceCleanTask.DIVIDE_AREAS: 'divideareas'>
CREATING_MAP = <YXDeviceCleanTask.CREATING_MAP: 'creatingmap'>
PART = <YXDeviceCleanTask.PART: 'part'>
class YXDeviceDustCollectionFrequency(roborock.data.code_mappings.RoborockModeEnum):
230class YXDeviceDustCollectionFrequency(RoborockModeEnum):
231    # The app exposes "regular" (code 0) vs "frequent", where "frequent" selects
232    # one of the every-N-cleans intervals below.
233    REGULAR = "regular", 0
234    INTERVAL_15 = "interval_15", 15
235    INTERVAL_30 = "interval_30", 30
236    INTERVAL_45 = "interval_45", 45
237    INTERVAL_60 = "interval_60", 60

A custom StrEnum that also stores an integer code for each member.

INTERVAL_15 = <YXDeviceDustCollectionFrequency.INTERVAL_15: 'interval_15'>
INTERVAL_30 = <YXDeviceDustCollectionFrequency.INTERVAL_30: 'interval_30'>
INTERVAL_45 = <YXDeviceDustCollectionFrequency.INTERVAL_45: 'interval_45'>
INTERVAL_60 = <YXDeviceDustCollectionFrequency.INTERVAL_60: 'interval_60'>
class YXAreaUnit(roborock.data.code_mappings.RoborockModeEnum):
240class YXAreaUnit(RoborockModeEnum):
241    """Unit used to report cleaned area (dpAreaUnit)."""
242
243    SQUARE_METER = "square_meter", 0
244    SQUARE_FEET = "square_feet", 1

Unit used to report cleaned area (dpAreaUnit).

SQUARE_METER = <YXAreaUnit.SQUARE_METER: 'square_meter'>
SQUARE_FEET = <YXAreaUnit.SQUARE_FEET: 'square_feet'>
class YXCarpetCleanType(roborock.data.code_mappings.RoborockModeEnum):
247class YXCarpetCleanType(RoborockModeEnum):
248    """Carpet handling behavior (dpCarpetCleanType)."""
249
250    RISE = "rise", 0  # lift the mop and boost over carpet
251    AVOID = "avoid", 1
252    IGNORE = "ignore", 2
253    CROSS = "cross", 3

Carpet handling behavior (dpCarpetCleanType).

RISE = <YXCarpetCleanType.RISE: 'rise'>
AVOID = <YXCarpetCleanType.AVOID: 'avoid'>
IGNORE = <YXCarpetCleanType.IGNORE: 'ignore'>
CROSS = <YXCarpetCleanType.CROSS: 'cross'>
class RemoteCommand(enum.IntEnum):
256class RemoteCommand(IntEnum):
257    FORWARD = 0
258    LEFT = 2
259    RIGHT = 3
260    STOP = 4
261    EXIT = 5
FORWARD = <RemoteCommand.FORWARD: 0>
LEFT = <RemoteCommand.LEFT: 2>
RIGHT = <RemoteCommand.RIGHT: 3>
STOP = <RemoteCommand.STOP: 4>
EXIT = <RemoteCommand.EXIT: 5>