Skip to content

Commit 660e929

Browse files
authored
feat: add some extra status attributes (#514)
* feat: add some extra status attributes * fix: tests * feat: add support for detecting issues with the dock holders
1 parent 3ac8f2d commit 660e929

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

roborock/code_mappings.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,40 @@ class RoborockStartType(RoborockEnum):
768768
smart_watch = 821
769769

770770

771+
class RoborockDssCodes(RoborockEnum):
772+
@classmethod
773+
def _missing_(cls: type[RoborockEnum], key) -> RoborockEnum:
774+
# If the calculated value is not provided, then it should be viewed as okay.
775+
# As the math will sometimes result in you getting numbers that don't matter.
776+
return cls.okay # type: ignore
777+
778+
779+
class ClearWaterBoxStatus(RoborockDssCodes):
780+
"""Status of the clear water box."""
781+
782+
okay = 0
783+
out_of_water = 1
784+
out_of_water_2 = 38
785+
refill_error = 48
786+
787+
788+
class DirtyWaterBoxStatus(RoborockDssCodes):
789+
"""Status of the dirty water box."""
790+
791+
okay = 0
792+
full_not_installed = 1
793+
full_not_installed_2 = 39
794+
drain_error = 49
795+
796+
797+
class DustBagStatus(RoborockDssCodes):
798+
"""Status of the dust bag."""
799+
800+
okay = 0
801+
not_installed = 1
802+
full = 34
803+
804+
771805
class DyadSelfCleanMode(RoborockEnum):
772806
self_clean = 1
773807
self_clean_and_dry = 2

roborock/containers.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
from .code_mappings import (
1414
SHORT_MODEL_TO_ENUM,
15+
ClearWaterBoxStatus,
16+
DirtyWaterBoxStatus,
17+
DustBagStatus,
1518
RoborockCategory,
1619
RoborockCleanType,
1720
RoborockDockDustCollectionModeCode,
@@ -419,6 +422,11 @@ class Status(RoborockBase):
419422
dss: int | None = None
420423
common_status: int | None = None
421424
corner_clean_mode: int | None = None
425+
last_clean_t: int | None = None
426+
replenish_mode: int | None = None
427+
repeat: int | None = None
428+
kct: int | None = None
429+
subdivision_sets: int | None = None
422430

423431
@property
424432
def square_meter_clean_area(self) -> float | None:
@@ -474,6 +482,48 @@ def current_map(self) -> int | None:
474482
return map_flag
475483
return None
476484

485+
@property
486+
def clear_water_box_status(self) -> ClearWaterBoxStatus | None:
487+
if self.dss:
488+
return ClearWaterBoxStatus((self.dss >> 2) & 3)
489+
return None
490+
491+
@property
492+
def dirty_water_box_status(self) -> DirtyWaterBoxStatus | None:
493+
if self.dss:
494+
return DirtyWaterBoxStatus((self.dss >> 4) & 3)
495+
return None
496+
497+
@property
498+
def dust_bag_status(self) -> DustBagStatus | None:
499+
if self.dss:
500+
return DustBagStatus((self.dss >> 6) & 3)
501+
return None
502+
503+
@property
504+
def water_box_filter_status(self) -> int | None:
505+
if self.dss:
506+
return (self.dss >> 8) & 3
507+
return None
508+
509+
@property
510+
def clean_fluid_status(self) -> int | None:
511+
if self.dss:
512+
return (self.dss >> 10) & 3
513+
return None
514+
515+
@property
516+
def hatch_door_status(self) -> int | None:
517+
if self.dss:
518+
return (self.dss >> 12) & 7
519+
return None
520+
521+
@property
522+
def dock_cool_fan_status(self) -> int | None:
523+
if self.dss:
524+
return (self.dss >> 15) & 3
525+
return None
526+
477527
def __repr__(self) -> str:
478528
return _attr_repr(self)
479529

tests/devices/__snapshots__/test_v1_device.ambr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# serializer version: 1
22
# name: test_device_trait_command_parsing[payload0-<lambda>]
3-
StatusTrait(adbumper_status=None, auto_dust_collection=None, avoid_count=None, back_type=None, battery=100, camera_status=None, charge_status=None, clean_area=91287500, clean_percent=None, clean_time=5405, collision_avoid_status=None, command=<RoborockCommand.GET_STATUS: 'get_status'>, common_status=None, corner_clean_mode=None, current_map=0, debug_mode=None, distance_off=0, dnd_enabled=1, dock_error_status=None, dock_type=None, dry_status=None, dss=None, dust_collection_status=None, error_code=<RoborockErrorCode.none: 0>, error_code_name=None, fan_power=<RoborockFanSpeedS7MaxV.custom: 106>, fan_power_name='custom', fan_power_options=['off', 'quiet', 'balanced', 'turbo', 'max', 'custom', 'max_plus'], home_sec_enable_password=None, home_sec_status=None, in_cleaning=<RoborockInCleaning.complete: 0>, in_fresh_state=1, in_returning=0, in_warmup=None, is_exploring=None, is_locating=0, lab_status=1, lock_status=0, map_present=1, map_status=3, mop_forbidden_enable=0, mop_mode=None, mop_mode_name=None, msg_seq=515, msg_ver=2, rdt=None, rss=None, square_meter_clean_area=91.3, state=<RoborockStateCode.charging: 8>, state_name='charging', switch_map_mode=None, unsave_map_flag=0, unsave_map_reason=4, wash_phase=None, wash_ready=None, wash_status=None, water_box_carriage_status=0, water_box_mode=<RoborockMopIntensityS7.custom: 204>, water_box_mode_name='custom', water_box_status=0, water_shortage_status=None)
3+
StatusTrait(adbumper_status=None, auto_dust_collection=None, avoid_count=None, back_type=None, battery=100, camera_status=None, charge_status=None, clean_area=91287500, clean_fluid_status=None, clean_percent=None, clean_time=5405, clear_water_box_status=None, collision_avoid_status=None, command=<RoborockCommand.GET_STATUS: 'get_status'>, common_status=None, corner_clean_mode=None, current_map=0, debug_mode=None, dirty_water_box_status=None, distance_off=0, dnd_enabled=1, dock_cool_fan_status=None, dock_error_status=None, dock_type=None, dry_status=None, dss=None, dust_bag_status=None, dust_collection_status=None, error_code=<RoborockErrorCode.none: 0>, error_code_name=None, fan_power=<RoborockFanSpeedS7MaxV.custom: 106>, fan_power_name='custom', fan_power_options=['off', 'quiet', 'balanced', 'turbo', 'max', 'custom', 'max_plus'], hatch_door_status=None, home_sec_enable_password=None, home_sec_status=None, in_cleaning=<RoborockInCleaning.complete: 0>, in_fresh_state=1, in_returning=0, in_warmup=None, is_exploring=None, is_locating=0, kct=None, lab_status=1, last_clean_t=None, lock_status=0, map_present=1, map_status=3, mop_forbidden_enable=0, mop_mode=None, mop_mode_name=None, msg_seq=515, msg_ver=2, rdt=None, repeat=None, replenish_mode=None, rss=None, square_meter_clean_area=91.3, state=<RoborockStateCode.charging: 8>, state_name='charging', subdivision_sets=None, switch_map_mode=None, unsave_map_flag=0, unsave_map_reason=4, wash_phase=None, wash_ready=None, wash_status=None, water_box_carriage_status=0, water_box_filter_status=None, water_box_mode=<RoborockMopIntensityS7.custom: 204>, water_box_mode_name='custom', water_box_status=0, water_shortage_status=None)
44
# ---
55
# name: test_device_trait_command_parsing[payload1-<lambda>]
66
DoNotDisturbTrait(start_hour=22, start_minute=0, end_hour=8, end_minute=0, enabled=1)

0 commit comments

Comments
 (0)