diff --git a/roborock/data/v1/v1_code_mappings.py b/roborock/data/v1/v1_code_mappings.py index d2a9b24d..82199186 100644 --- a/roborock/data/v1/v1_code_mappings.py +++ b/roborock/data/v1/v1_code_mappings.py @@ -281,209 +281,10 @@ class RoborockFanSpeedE2(RoborockFanPowerCode): turbo = 100 -class RoborockFanSpeedS7(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - - -class RoborockFanSpeedS7MaxV(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - - -class RoborockFanSpeedS6Pure(RoborockFanPowerCode): - gentle = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - - -class RoborockFanSpeedQ7Max(RoborockFanPowerCode): - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - - -class RoborockFanSpeedQRevoMaster(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedQRevoCurv(RoborockFanPowerCode): - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - off = 105 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedQRevoMaxV(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedP10(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedS8MaxVUltra(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedSaros10(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockFanSpeedSaros10R(RoborockFanPowerCode): - off = 105 - quiet = 101 - balanced = 102 - turbo = 103 - max = 104 - custom = 106 - max_plus = 108 - smart_mode = 110 - - -class RoborockMopModeCode(RoborockEnum): - """Describes the mop mode of the vacuum cleaner.""" - - -class RoborockMopModeQRevoCurv(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - smart_mode = 306 - - -class RoborockMopModeS7(RoborockMopModeCode): - """Describes the mop mode of the vacuum cleaner.""" - - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - - -class RoborockMopModeS8ProUltra(RoborockMopModeCode): - standard = 300 - deep = 301 - deep_plus = 303 - fast = 304 - custom = 302 - smart_mode = 306 - - -class RoborockMopModeS8MaxVUltra(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - deep_plus_pearl = 305 - smart_mode = 306 - - -class RoborockMopModeSaros10R(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - smart_mode = 306 - - -class RoborockMopModeQRevoMaster(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - smart_mode = 306 - - -class RoborockMopModeQRevoMaxV(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - smart_mode = 306 - - -class RoborockMopModeSaros10(RoborockMopModeCode): - standard = 300 - deep = 301 - custom = 302 - deep_plus = 303 - fast = 304 - smart_mode = 306 - - class RoborockMopIntensityCode(RoborockEnum): """Describes the mop intensity of the vacuum cleaner.""" -class RoborockMopIntensityS7(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - mild = 201 - moderate = 202 - intense = 203 - custom = 204 - - class RoborockMopIntensityV2(RoborockMopIntensityCode): """Describes the mop intensity of the vacuum cleaner.""" @@ -494,114 +295,6 @@ class RoborockMopIntensityV2(RoborockMopIntensityCode): custom = 207 -class RoborockMopIntensityQRevoMaster(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - smart_mode = 209 - - -class RoborockMopIntensityQRevoCurv(RoborockMopIntensityCode): - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - smart_mode = 209 - - -class RoborockMopIntensityQRevoMaxV(RoborockMopIntensityCode): - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - smart_mode = 209 - - -class RoborockMopIntensityP10(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - smart_mode = 209 - - -class RoborockMopIntensityS8MaxVUltra(RoborockMopIntensityCode): - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - max = 208 - smart_mode = 209 - custom_water_flow = 207 - - -class RoborockMopIntensitySaros10(RoborockMopIntensityCode): - off = 200 - mild = 201 - standard = 202 - intense = 203 - extreme = 208 - custom = 204 - smart_mode = 209 - - -class RoborockMopIntensitySaros10R(RoborockMopIntensityCode): - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - extreme = 250 - vac_followed_by_mop = 235 - smart_mode = 209 - - -class RoborockMopIntensityS5Max(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - - -class RoborockMopIntensityS6MaxV(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - low = 201 - medium = 202 - high = 203 - custom = 204 - custom_water_flow = 207 - - -class RoborockMopIntensityQ7Max(RoborockMopIntensityCode): - """Describes the mop intensity of the vacuum cleaner.""" - - off = 200 - low = 201 - medium = 202 - high = 203 - custom_water_flow = 207 - - class RoborockDockErrorCode(RoborockEnum): """Describes the error code of the dock.""" diff --git a/roborock/data/v1/v1_containers.py b/roborock/data/v1/v1_containers.py index 2f01870b..aaeb0800 100644 --- a/roborock/data/v1/v1_containers.py +++ b/roborock/data/v1/v1_containers.py @@ -11,32 +11,10 @@ MAIN_BRUSH_REPLACE_TIME, MOP_ROLLER_REPLACE_TIME, NO_MAP, - ROBOROCK_G10S_PRO, - ROBOROCK_P10, - ROBOROCK_Q7_MAX, - ROBOROCK_QREVO_CURV, - ROBOROCK_QREVO_MASTER, - ROBOROCK_QREVO_MAXV, - ROBOROCK_QREVO_PRO, - ROBOROCK_QREVO_S, - ROBOROCK_S4_MAX, - ROBOROCK_S5_MAX, - ROBOROCK_S6, - ROBOROCK_S6_MAXV, - ROBOROCK_S6_PURE, - ROBOROCK_S7, - ROBOROCK_S7_MAXV, - ROBOROCK_S8, - ROBOROCK_S8_MAXV_ULTRA, - ROBOROCK_S8_PRO_ULTRA, - ROBOROCK_SAROS_10, - ROBOROCK_SAROS_10R, SENSOR_DIRTY_REPLACE_TIME, SIDE_BRUSH_REPLACE_TIME, STRAINER_REPLACE_TIME, - ROBOROCK_G20S_Ultra, ) -from roborock.exceptions import RoborockException from roborock.roborock_message import RoborockDataProtocol from ..containers import NamedRoomMapping, RoborockBase, RoborockBaseTimer, _attr_repr, field_metadata @@ -53,41 +31,8 @@ RoborockDockState, RoborockDockTypeCode, RoborockErrorCode, - RoborockFanPowerCode, - RoborockFanSpeedP10, - RoborockFanSpeedQ7Max, - RoborockFanSpeedQRevoCurv, - RoborockFanSpeedQRevoMaster, - RoborockFanSpeedQRevoMaxV, - RoborockFanSpeedS6Pure, - RoborockFanSpeedS7, - RoborockFanSpeedS7MaxV, - RoborockFanSpeedS8MaxVUltra, - RoborockFanSpeedSaros10, - RoborockFanSpeedSaros10R, RoborockFinishReason, RoborockInCleaning, - RoborockMopIntensityCode, - RoborockMopIntensityP10, - RoborockMopIntensityQ7Max, - RoborockMopIntensityQRevoCurv, - RoborockMopIntensityQRevoMaster, - RoborockMopIntensityQRevoMaxV, - RoborockMopIntensityS5Max, - RoborockMopIntensityS6MaxV, - RoborockMopIntensityS7, - RoborockMopIntensityS8MaxVUltra, - RoborockMopIntensitySaros10, - RoborockMopIntensitySaros10R, - RoborockMopModeCode, - RoborockMopModeQRevoCurv, - RoborockMopModeQRevoMaster, - RoborockMopModeQRevoMaxV, - RoborockMopModeS7, - RoborockMopModeS8MaxVUltra, - RoborockMopModeS8ProUltra, - RoborockMopModeSaros10, - RoborockMopModeSaros10R, RoborockStartType, RoborockStateCode, ) @@ -128,192 +73,9 @@ class StatusField(FieldNameBase): RDT = "rdt" -@dataclass -class Status(RoborockBase): - """This status will be deprecated in favor of StatusV2.""" - - msg_ver: int | None = None - msg_seq: int | None = None - state: RoborockStateCode | None = field(default=None, metadata={"dps": RoborockDataProtocol.STATE}) - battery: int | None = field(default=None, metadata={"dps": RoborockDataProtocol.BATTERY}) - clean_time: int | None = None - clean_area: int | None = None - error_code: RoborockErrorCode | None = field(default=None, metadata={"dps": RoborockDataProtocol.ERROR_CODE}) - map_present: int | None = None - in_cleaning: RoborockInCleaning | None = None - in_returning: int | None = None - in_fresh_state: int | None = None - lab_status: int | None = None - water_box_status: int | None = None - back_type: int | None = None - wash_phase: int | None = None - wash_ready: int | None = None - fan_power: RoborockFanPowerCode | None = field(default=None, metadata={"dps": RoborockDataProtocol.FAN_POWER}) - dnd_enabled: int | None = None - map_status: int | None = None - is_locating: int | None = None - lock_status: int | None = None - water_box_mode: RoborockMopIntensityCode | None = field( - default=None, metadata={"dps": RoborockDataProtocol.WATER_BOX_MODE} - ) - water_box_carriage_status: int | None = None - mop_forbidden_enable: int | None = None - camera_status: int | None = None - is_exploring: int | None = None - home_sec_status: int | None = None - home_sec_enable_password: int | None = None - adbumper_status: list[int] | None = None - water_shortage_status: int | None = None - dock_type: RoborockDockTypeCode | None = None - dust_collection_status: int | None = None - auto_dust_collection: int | None = None - avoid_count: int | None = None - mop_mode: RoborockMopModeCode | None = None - debug_mode: int | None = None - collision_avoid_status: int | None = None - switch_map_mode: int | None = None - dock_error_status: RoborockDockErrorCode | None = None - charge_status: RoborockChargeStatus | None = field( - default=None, metadata={"dps": RoborockDataProtocol.CHARGE_STATUS} - ) - unsave_map_reason: int | None = None - unsave_map_flag: int | None = None - wash_status: int | None = None - distance_off: int | None = None - in_warmup: int | None = None - dry_status: int | None = field(default=None, metadata={"dps": RoborockDataProtocol.DRYING_STATUS}) - rdt: int | None = None - clean_percent: int | None = None - rss: int | None = None - dss: int | None = None - common_status: int | None = None - corner_clean_mode: int | None = None - last_clean_t: int | None = None - replenish_mode: int | None = None - repeat: int | None = None - kct: int | None = None - subdivision_sets: int | None = None - - @property - def square_meter_clean_area(self) -> float | None: - return round(self.clean_area / 1000000, 1) if self.clean_area is not None else None - - @property - def error_code_name(self) -> str | None: - return self.error_code.name if self.error_code is not None else None - - @property - def state_name(self) -> str | None: - return self.state.name if self.state is not None else None - - @property - def water_box_mode_name(self) -> str | None: - return self.water_box_mode.name if self.water_box_mode is not None else None - - @property - def fan_power_options(self) -> list[str]: - if self.fan_power is None: - return [] - return list(self.fan_power.keys()) - - @property - def fan_power_name(self) -> str | None: - return self.fan_power.name if self.fan_power is not None else None - - @property - def mop_mode_name(self) -> str | None: - return self.mop_mode.name if self.mop_mode is not None else None - - def get_fan_speed_code(self, fan_speed: str) -> int: - if self.fan_power is None: - raise RoborockException("Attempted to get fan speed before status has been updated.") - return self.fan_power.as_dict().get(fan_speed) - - def get_mop_intensity_code(self, mop_intensity: str) -> int: - if self.water_box_mode is None: - raise RoborockException("Attempted to get mop_intensity before status has been updated.") - return self.water_box_mode.as_dict().get(mop_intensity) - - def get_mop_mode_code(self, mop_mode: str) -> int: - if self.mop_mode is None: - raise RoborockException("Attempted to get mop_mode before status has been updated.") - return self.mop_mode.as_dict().get(mop_mode) - - @property - def current_map(self) -> int | None: - """Returns the current map ID if the map is present.""" - if self.map_status is not None: - map_flag = self.map_status >> 2 - if map_flag != NO_MAP: - return map_flag - return None - - @property - def has_am(self) -> bool | None: - if self.dss is None: - return None - return (self.dss & 3) == 2 - - @property - @field_metadata(dock_feature="is_washable") - def clear_water_box_status(self) -> ClearWaterBoxStatus | None: - if self.dss: - return ClearWaterBoxStatus((self.dss >> 2) & 3) - return None - - @property - @field_metadata(dock_feature="is_washable") - def dirty_water_box_status(self) -> DirtyWaterBoxStatus | None: - if self.dss: - return DirtyWaterBoxStatus((self.dss >> 4) & 3) - return None - - @property - def dust_bag_status(self) -> DustBagStatus | None: - if self.dss: - return DustBagStatus((self.dss >> 6) & 3) - return None - - @property - def water_box_filter_status(self) -> int | None: - if self.dss: - return (self.dss >> 8) & 3 - return None - - @property - @field_metadata( - dock_feature="is_clean_fluid_auto_delivery_supported", - ) - def clean_fluid_status(self) -> CleanFluidStatus | None: - if self.dss: - value = (self.dss >> 10) & 3 - if value == 0: - return None # Feature not supported by this device - return CleanFluidStatus(value) - return None - - @property - def hatch_door_status(self) -> int | None: - if self.dss: - return (self.dss >> 12) & 7 - return None - - @property - def dock_cool_fan_status(self) -> int | None: - if self.dss: - return (self.dss >> 15) & 3 - return None - - def __repr__(self) -> str: - return _attr_repr(self) - - @dataclass class StatusV2(RoborockBase): - """ - This is a new version of the Status object. - This is the result of GET_STATUS from the api. - """ + """The result of a GET_STATUS API request.""" msg_ver: int | None = None msg_seq: int | None = None @@ -492,141 +254,6 @@ def __repr__(self) -> str: return _attr_repr(self) -@dataclass -class S4MaxStatus(Status): - fan_power: RoborockFanSpeedS6Pure | None = None - water_box_mode: RoborockMopIntensityS7 | None = None - mop_mode: RoborockMopModeS7 | None = None - - -@dataclass -class S5MaxStatus(Status): - fan_power: RoborockFanSpeedS6Pure | None = None - water_box_mode: RoborockMopIntensityS5Max | None = None - - -@dataclass -class Q7MaxStatus(Status): - fan_power: RoborockFanSpeedQ7Max | None = None - water_box_mode: RoborockMopIntensityQ7Max | None = None - - -@dataclass -class QRevoMasterStatus(Status): - fan_power: RoborockFanSpeedQRevoMaster | None = None - water_box_mode: RoborockMopIntensityQRevoMaster | None = None - mop_mode: RoborockMopModeQRevoMaster | None = None - - -@dataclass -class QRevoCurvStatus(Status): - fan_power: RoborockFanSpeedQRevoCurv | None = None - water_box_mode: RoborockMopIntensityQRevoCurv | None = None - mop_mode: RoborockMopModeQRevoCurv | None = None - - -@dataclass -class QRevoMaxVStatus(Status): - fan_power: RoborockFanSpeedQRevoMaxV | None = None - water_box_mode: RoborockMopIntensityQRevoMaxV | None = None - mop_mode: RoborockMopModeQRevoMaxV | None = None - - -@dataclass -class S6MaxVStatus(Status): - fan_power: RoborockFanSpeedS7MaxV | None = None - water_box_mode: RoborockMopIntensityS6MaxV | None = None - - -@dataclass -class S6PureStatus(Status): - fan_power: RoborockFanSpeedS6Pure | None = None - - -@dataclass -class S7MaxVStatus(Status): - fan_power: RoborockFanSpeedS7MaxV | None = None - water_box_mode: RoborockMopIntensityS7 | None = None - mop_mode: RoborockMopModeS7 | None = None - - -@dataclass -class S7Status(Status): - fan_power: RoborockFanSpeedS7 | None = None - water_box_mode: RoborockMopIntensityS7 | None = None - mop_mode: RoborockMopModeS7 | None = None - - -@dataclass -class S8ProUltraStatus(Status): - fan_power: RoborockFanSpeedS7MaxV | None = None - water_box_mode: RoborockMopIntensityS7 | None = None - mop_mode: RoborockMopModeS8ProUltra | None = None - - -@dataclass -class S8Status(Status): - fan_power: RoborockFanSpeedS7MaxV | None = None - water_box_mode: RoborockMopIntensityS7 | None = None - mop_mode: RoborockMopModeS8ProUltra | None = None - - -@dataclass -class P10Status(Status): - fan_power: RoborockFanSpeedP10 | None = None - water_box_mode: RoborockMopIntensityP10 | None = None - mop_mode: RoborockMopModeS8ProUltra | None = None - - -@dataclass -class S8MaxvUltraStatus(Status): - fan_power: RoborockFanSpeedS8MaxVUltra | None = None - water_box_mode: RoborockMopIntensityS8MaxVUltra | None = None - mop_mode: RoborockMopModeS8MaxVUltra | None = None - - -@dataclass -class Saros10RStatus(Status): - fan_power: RoborockFanSpeedSaros10R | None = None - water_box_mode: RoborockMopIntensitySaros10R | None = None - mop_mode: RoborockMopModeSaros10R | None = None - - -@dataclass -class Saros10Status(Status): - fan_power: RoborockFanSpeedSaros10 | None = None - water_box_mode: RoborockMopIntensitySaros10 | None = None - mop_mode: RoborockMopModeSaros10 | None = None - - -ModelStatus: dict[str, type[Status]] = { - ROBOROCK_S4_MAX: S4MaxStatus, - ROBOROCK_S5_MAX: S5MaxStatus, - ROBOROCK_Q7_MAX: Q7MaxStatus, - ROBOROCK_QREVO_MASTER: QRevoMasterStatus, - ROBOROCK_QREVO_CURV: QRevoCurvStatus, - ROBOROCK_S6: S6PureStatus, - ROBOROCK_S6_MAXV: S6MaxVStatus, - ROBOROCK_S6_PURE: S6PureStatus, - ROBOROCK_S7_MAXV: S7MaxVStatus, - ROBOROCK_S7: S7Status, - ROBOROCK_S8: S8Status, - ROBOROCK_S8_PRO_ULTRA: S8ProUltraStatus, - ROBOROCK_G10S_PRO: S7MaxVStatus, - ROBOROCK_G20S_Ultra: QRevoMasterStatus, - 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: QRevoMaxVStatus, - ROBOROCK_QREVO_PRO: P10Status, - ROBOROCK_S8_MAXV_ULTRA: S8MaxvUltraStatus, - ROBOROCK_SAROS_10R: Saros10RStatus, - ROBOROCK_SAROS_10: Saros10Status, -} - - @dataclass class DnDTimer(RoborockBaseTimer): """DnDTimer""" diff --git a/roborock/roborock_typing.py b/roborock/roborock_typing.py index 71251324..ea97235b 100644 --- a/roborock/roborock_typing.py +++ b/roborock/roborock_typing.py @@ -1,17 +1,4 @@ -from dataclasses import dataclass, field from enum import Enum, StrEnum -from typing import Self - -from .data import ( - CleanRecord, - CleanSummary, - Consumable, - DustCollectionMode, - RoborockBase, - SmartWashParams, - Status, - WashTowelMode, -) class RoborockCommand(str, Enum): @@ -341,41 +328,3 @@ class RoborockB01Q7Methods(StrEnum): GET_RECORD_LIST = "service.get_record_list" GET_ORDER = "service.get_order" POST_PROP = "prop.post" - - -@dataclass -class DockSummary(RoborockBase): - dust_collection_mode: DustCollectionMode | None = None - wash_towel_mode: WashTowelMode | None = None - smart_wash_params: SmartWashParams | None = None - - -@dataclass -class DeviceProp(RoborockBase): - status: Status = field(default_factory=Status) - clean_summary: CleanSummary = field(default_factory=CleanSummary) - consumable: Consumable = field(default_factory=Consumable) - last_clean_record: CleanRecord | None = None - dock_summary: DockSummary | None = None - dust_collection_mode_name: str | None = None - - def __post_init__(self) -> None: - if ( - self.dock_summary - and self.dock_summary.dust_collection_mode is not None - and self.dock_summary.dust_collection_mode.mode is not None - ): - self.dust_collection_mode_name = self.dock_summary.dust_collection_mode.mode.name - - def update(self, device_prop: Self) -> None: - if device_prop.status: - self.status = device_prop.status - if device_prop.clean_summary: - self.clean_summary = device_prop.clean_summary - if device_prop.consumable: - self.consumable = device_prop.consumable - if device_prop.last_clean_record: - self.last_clean_record = device_prop.last_clean_record - if device_prop.dock_summary: - self.dock_summary = device_prop.dock_summary - self.__post_init__() diff --git a/tests/data/v1/test_v1_containers.py b/tests/data/v1/test_v1_containers.py index 34b671e7..ca7c91d4 100644 --- a/tests/data/v1/test_v1_containers.py +++ b/tests/data/v1/test_v1_containers.py @@ -12,9 +12,6 @@ RoborockDockState, RoborockDockTypeCode, RoborockErrorCode, - RoborockFanSpeedS7MaxV, - RoborockMopIntensityS7, - RoborockMopModeS7, RoborockStateCode, ) from roborock.data.v1.v1_code_mappings import ClearWaterBoxStatus, DirtyWaterBoxStatus, DustBagStatus @@ -24,7 +21,6 @@ CleanSummary, Consumable, DnDTimer, - S7MaxVStatus, StatusV2, ) from tests.mock_data import ( @@ -49,7 +45,7 @@ def test_consumable(): def test_status(): - s = S7MaxVStatus.from_dict(STATUS) + s = StatusV2.from_dict(STATUS) assert s.msg_ver == 2 assert s.msg_seq == 458 assert s.state == RoborockStateCode.charging @@ -94,9 +90,9 @@ def test_status(): assert s.charge_status == RoborockChargeStatus.charging assert s.unsave_map_reason == 0 assert s.unsave_map_flag == 0 - assert s.fan_power == RoborockFanSpeedS7MaxV.balanced - assert s.mop_mode == RoborockMopModeS7.standard - assert s.water_box_mode == RoborockMopIntensityS7.intense + assert s.fan_power == 102 + assert s.mop_mode == 300 + assert s.water_box_mode == 203 assert s.dss == 169 assert s.clear_water_box_status == ClearWaterBoxStatus.okay assert s.dirty_water_box_status == DirtyWaterBoxStatus.okay @@ -129,7 +125,7 @@ def test_dss_status( def test_current_map() -> None: """Test the current map logic based on map status.""" - s = S7MaxVStatus.from_dict(STATUS) + s = StatusV2.from_dict(STATUS) assert s.map_status == 3 assert s.current_map == 0 @@ -257,7 +253,7 @@ def test_clean_record(): def test_no_value(): modified_status = STATUS.copy() modified_status["dock_type"] = 9999 - s = S7MaxVStatus.from_dict(modified_status) + s = StatusV2.from_dict(modified_status) assert s.dock_type == RoborockDockTypeCode.unknown assert -9999 not in RoborockDockTypeCode.keys() assert "missing" not in RoborockDockTypeCode.values() @@ -267,7 +263,7 @@ def test_qrevo_s5v_dock_type(): """Test that dock type code 22 (Qrevo S5V dock) is properly recognized.""" modified_status = STATUS.copy() modified_status["dock_type"] = 22 - s = S7MaxVStatus.from_dict(modified_status) + s = StatusV2.from_dict(modified_status) assert s.dock_type == RoborockDockTypeCode.shell_2e_dock assert s.dock_type.value == 22 @@ -276,7 +272,6 @@ def test_has_am_dss_zero_is_not_missing(): modified_status = STATUS.copy() modified_status["dss"] = 0 - assert S7MaxVStatus.from_dict(modified_status).has_am is False assert StatusV2.from_dict(modified_status).has_am is False @@ -334,9 +329,9 @@ def test_multi_maps_list_info(snapshot: SnapshotAssertion) -> None: def test_accurate_map_flag() -> None: """Test that we parse the map flag accurately.""" - s = S7MaxVStatus.from_dict(STATUS) + s = StatusV2.from_dict(STATUS) assert s.current_map == 0 - s = S7MaxVStatus.from_dict( + s = StatusV2.from_dict( { **STATUS, "map_status": 252, # Code for no map diff --git a/tests/devices/rpc/test_v1_channel.py b/tests/devices/rpc/test_v1_channel.py index 278a796b..301bf581 100644 --- a/tests/devices/rpc/test_v1_channel.py +++ b/tests/devices/rpc/test_v1_channel.py @@ -11,7 +11,7 @@ import pytest -from roborock.data import NetworkInfo, RoborockStateCode, S5MaxStatus, UserData +from roborock.data import NetworkInfo, RoborockStateCode, StatusV2, UserData from roborock.devices.cache import DeviceCache, DeviceCacheData, InMemoryCache from roborock.devices.rpc.v1_channel import V1Channel from roborock.devices.transport.local_channel import LocalSession @@ -341,7 +341,7 @@ async def test_v1_channel_send_command_local_preferred( mock_local_channel.response_queue.append(TEST_RESPONSE) result = await rpc_channel.send_command( RoborockCommand.GET_STATUS, - response_type=S5MaxStatus, + response_type=StatusV2, ) # Verify local response was parsed @@ -370,7 +370,7 @@ async def test_v1_channel_send_command_local_fails( # Send command result = await rpc_channel.send_command( RoborockCommand.GET_STATUS, - response_type=S5MaxStatus, + response_type=StatusV2, ) # Verify result @@ -419,7 +419,7 @@ async def test_v1_channel_send_pick_first_available( mock_local_channel.response_queue.extend(local_channel_responses) result = await rpc_channel.send_command( RoborockCommand.GET_STATUS, - response_type=S5MaxStatus, + response_type=StatusV2, ) # Verify only MQTT was used @@ -442,7 +442,7 @@ async def test_v1_channel_send_decoded_command_with_params( test_params = {"volume": 80} await rpc_channel.send_command( RoborockCommand.CHANGE_SOUND_VOLUME, - response_type=S5MaxStatus, + response_type=StatusV2, params=test_params, ) diff --git a/tests/devices/test_v1_device.py b/tests/devices/test_v1_device.py index c327bdf0..3e387086 100644 --- a/tests/devices/test_v1_device.py +++ b/tests/devices/test_v1_device.py @@ -8,7 +8,7 @@ import pytest from syrupy import SnapshotAssertion -from roborock.data import HomeData, NetworkInfo, S7MaxVStatus, UserData +from roborock.data import HomeData, NetworkInfo, StatusV2, UserData from roborock.devices.cache import DeviceCache, DeviceCacheData, InMemoryCache, NoCache from roborock.devices.device import RoborockDevice from roborock.devices.rpc.v1_channel import V1Channel @@ -23,7 +23,7 @@ USER_DATA = UserData.from_dict(mock_data.USER_DATA) HOME_DATA = HomeData.from_dict(mock_data.HOME_DATA_RAW) -STATUS = S7MaxVStatus.from_dict(mock_data.STATUS) +STATUS = StatusV2.from_dict(mock_data.STATUS) TESTDATA = pathlib.Path("tests/protocols/testdata/v1_protocol/") diff --git a/tests/devices/traits/v1/fixtures.py b/tests/devices/traits/v1/fixtures.py index f73a9b11..d35cc0eb 100644 --- a/tests/devices/traits/v1/fixtures.py +++ b/tests/devices/traits/v1/fixtures.py @@ -5,7 +5,7 @@ import pytest -from roborock.data import HomeData, HomeDataDevice, HomeDataProduct, RoborockDockTypeCode, S7MaxVStatus, UserData +from roborock.data import HomeData, HomeDataDevice, HomeDataProduct, RoborockDockTypeCode, StatusV2, UserData from roborock.devices.cache import Cache, DeviceCache, InMemoryCache from roborock.devices.device import RoborockDevice from roborock.devices.traits import v1 @@ -13,7 +13,7 @@ USER_DATA = UserData.from_dict(mock_data.USER_DATA) HOME_DATA = HomeData.from_dict(mock_data.HOME_DATA_RAW) -STATUS = S7MaxVStatus.from_dict(mock_data.STATUS) +STATUS = StatusV2.from_dict(mock_data.STATUS) @pytest.fixture(autouse=True, name="channel")