Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add some missing codes and make warnings only message once #218

Merged
merged 1 commit into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 96 additions & 2 deletions roborock/code_mappings.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from enum import Enum, IntEnum

_LOGGER = logging.getLogger(__name__)
completed_warnings = set()


class RoborockEnum(IntEnum):
Expand All @@ -16,10 +17,16 @@ def name(self) -> str:
@classmethod
def _missing_(cls: type[RoborockEnum], key) -> RoborockEnum:
if hasattr(cls, "unknown"):
_LOGGER.warning(f"Missing {cls.__name__} code: {key} - defaulting to 'unknown'")
warning = f"Missing {cls.__name__} code: {key} - defaulting to 'unknown'"
if warning not in completed_warnings:
completed_warnings.add(warning)
_LOGGER.warning(warning)
return cls.unknown # type: ignore
default_value = next(item for item in cls)
_LOGGER.warning(f"Missing {cls.__name__} code: {key} - defaulting to {default_value}")
warning = f"Missing {cls.__name__} code: {key} - defaulting to {default_value}"
if warning not in completed_warnings:
completed_warnings.add(warning)
_LOGGER.warning(warning)
return default_value

@classmethod
Expand Down Expand Up @@ -409,6 +416,93 @@ def __missing__(self, key):
return RoborockCategory.UNKNOWN


class RoborockFinishReason(RoborockEnum):
manual_interrupt = 21 # Cleaning interrupted by user
cleanup_interrupted = 24 # Cleanup interrupted
manual_interrupt_2 = 21
breakpoint = 32 # Could not continue cleaning
breakpoint_2 = 33
cleanup_interrupted_2 = 34
manual_interrupt_3 = 35
manual_interrupt_4 = 36
manual_interrupt_5 = 37
manual_interrupt_6 = 43
locate_fail = 45 # Positioning Failed
cleanup_interrupted_3 = 64
locate_fail_2 = 65
manual_interrupt_7 = 48
manual_interrupt_8 = 49
manual_interrupt_9 = 50
cleanup_interrupted_4 = 51
finished_cleaning = 52 # Finished cleaning
finished_cleaning_2 = 54
finished_cleaning_3 = 55
finished_cleaning_4 = 56
finished_clenaing_5 = 57
manual_interrupt_10 = 60
area_unreachable = 61 # Area unreachable
area_unreachable_2 = 62
washing_error = 67 # Washing error
back_to_wash_failure = 68 # Failed to return to the dock
cleanup_interrupted_5 = 101
breakpoint_4 = 102
manual_interrupt_11 = 103
cleanup_interrupted_6 = 104
cleanup_interrupted_7 = 105
cleanup_interrupted_8 = 106
cleanup_interrupted_9 = 107
cleanup_interrupted_10 = 109
cleanup_interrupted_11 = 110
patrol_success = 114 # Cruise completed
patrol_fail = 115 # Cruise failed
pet_patrol_success = 116 # Pet found
pet_patrol_fail = 117 # Pet found failed


class RoborockInCleaning(RoborockEnum):
complete = 0
global_clean_not_complete = 1
zone_clean_not_complete = 2
segment_clean_not_complete = 3


class RoborockCleanType(RoborockEnum):
all_zone = 1
draw_zone = 2
select_zone = 3
quick_build = 4
video_patrol = 5
pet_patrol = 6


class RoborockStartType(RoborockEnum):
button = 1
app = 2
schedule = 3
mi_home = 4
quick_start = 5
voice_control = 13
routines = 101
alexa = 801
google = 802
ifttt = 803
yandex = 804
homekit = 805
xiaoai = 806
tmall_genie = 807
duer = 808
dingdong = 809
siri = 810
clova = 811
wechat = 901
alipay = 902
aqara = 903
hisense = 904
huawei = 905
widget_launch = 820
smart_watch = 821


class DyadSelfCleanMode(RoborockEnum):
self_clean = 1
self_clean_and_dry = 2
Expand Down
5 changes: 4 additions & 1 deletion roborock/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,11 @@
ROBOROCK_C1 = "roborock.vacuum.c1"
ROBOROCK_S8_PRO_ULTRA = "roborock.vacuum.a70"
ROBOROCK_S8 = "roborock.vacuum.a51"
ROBOROCK_P10 = "roborock.vacuum.a75"
ROBOROCK_P10 = "roborock.vacuum.a75" # also known as q_revo
ROBOROCK_S8_MAXV_ULTRA = "roborock.vacuum.a97"
ROBOROCK_QREVO_S = "roborock.vacuum.a104"
ROBOROCK_QREVO_PRO = "roborock.vacuum.a101"
ROBOROCK_QREVO_MAXV = "roborock.vacuum.a87"

ROBOROCK_DYAD_AIR = "roborock.wetdryvac.a107"
ROBOROCK_DYAD_PRO_COMBO = "roborock.wetdryvac.a83"
Expand Down
21 changes: 17 additions & 4 deletions roborock/containers.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from .code_mappings import (
RoborockCategory,
RoborockCleanType,
RoborockDockDustCollectionModeCode,
RoborockDockErrorCode,
RoborockDockTypeCode,
Expand All @@ -25,6 +26,8 @@
RoborockFanSpeedS7,
RoborockFanSpeedS7MaxV,
RoborockFanSpeedS8MaxVUltra,
RoborockFinishReason,
RoborockInCleaning,
RoborockMopIntensityCode,
RoborockMopIntensityP10,
RoborockMopIntensityS5Max,
Expand All @@ -36,6 +39,7 @@
RoborockMopModeS7,
RoborockMopModeS8MaxVUltra,
RoborockMopModeS8ProUltra,
RoborockStartType,
RoborockStateCode,
)
from .const import (
Expand All @@ -47,6 +51,9 @@
ROBOROCK_G10S_PRO,
ROBOROCK_P10,
ROBOROCK_Q7_MAX,
ROBOROCK_QREVO_MAXV,
ROBOROCK_QREVO_PRO,
ROBOROCK_QREVO_S,
ROBOROCK_S4_MAX,
ROBOROCK_S5_MAX,
ROBOROCK_S6,
Expand Down Expand Up @@ -408,7 +415,7 @@ class Status(RoborockBase):
square_meter_clean_area: float | None = None
error_code: RoborockErrorCode | None = None
map_present: int | None = None
in_cleaning: int | None = None
in_cleaning: RoborockInCleaning | None = None
in_returning: int | None = None
in_fresh_state: int | None = None
lab_status: int | None = None
Expand Down Expand Up @@ -574,6 +581,12 @@ class S8MaxvUltraStatus(Status):
ROBOROCK_S8_PRO_ULTRA: S8ProUltraStatus,
ROBOROCK_G10S_PRO: S7MaxVStatus,
ROBOROCK_P10: P10Status,
# These likely are not correct,
# but i am currently unable to do my typical reverse engineering/ get any data from users on this,
# so this will be here in the mean time.
ROBOROCK_QREVO_S: P10Status,
ROBOROCK_QREVO_MAXV: P10Status,
ROBOROCK_QREVO_PRO: P10Status,
ROBOROCK_S8_MAXV_ULTRA: S8MaxvUltraStatus,
}

Expand Down Expand Up @@ -613,9 +626,9 @@ class CleanRecord(RoborockBase):
square_meter_area: float | None = None
error: int | None = None
complete: int | None = None
start_type: int | None = None
clean_type: int | None = None
finish_reason: int | None = None
start_type: RoborockStartType | None = None
clean_type: RoborockCleanType | None = None
finish_reason: RoborockFinishReason | None = None
dust_collection_status: int | None = None
avoid_count: int | None = None
wash_count: int | None = None
Expand Down
Loading