diff --git a/roborock/api.py b/roborock/api.py index 6716a0b..ba307b2 100644 --- a/roborock/api.py +++ b/roborock/api.py @@ -26,6 +26,7 @@ DeviceData, DnDTimer, DustCollectionMode, + FlowLedStatus, HomeData, ModelStatus, MultiMapsList, @@ -101,10 +102,15 @@ def __init__(self, endpoint: str, device_info: DeviceData) -> None: self._last_device_msg_in = self.time_func() self._last_disconnection = self.time_func() self.keep_alive = KEEPALIVE + self._diagnostic_data: dict[str, dict[str, Any]] = {} def __del__(self) -> None: self.sync_disconnect() + @property + def diagnostic_data(self) -> dict: + return self._diagnostic_data + @property def time_func(self) -> Callable[[], float]: try: @@ -364,6 +370,11 @@ async def get_child_lock_status(self) -> ChildLockStatus | None: """Gets current child lock status.""" return await self.send_command(RoborockCommand.GET_CHILD_LOCK_STATUS, return_type=ChildLockStatus) + @fallback_cache + async def get_flow_led_status(self) -> FlowLedStatus | None: + """Gets current flow led status.""" + return await self.send_command(RoborockCommand.GET_FLOW_LED_STATUS, return_type=FlowLedStatus) + @fallback_cache async def get_sound_volume(self) -> int | None: """Gets current volume level.""" diff --git a/roborock/cloud_api.py b/roborock/cloud_api.py index 384a69f..2085660 100644 --- a/roborock/cloud_api.py +++ b/roborock/cloud_api.py @@ -165,6 +165,7 @@ async def send_command( msg = MessageParser.build(roborock_message, local_key, False) self._send_msg_raw(msg) (response, err) = await self._async_response(request_id, response_protocol) + self._diagnostic_data[method.name] = {"params": params, "response": response, "error": err} if err: raise CommandVacuumError(method, err) from err if response_protocol == 301: diff --git a/roborock/containers.py b/roborock/containers.py index c9488a8..c0f897e 100644 --- a/roborock/containers.py +++ b/roborock/containers.py @@ -505,6 +505,11 @@ class ChildLockStatus(RoborockBase): lock_status: int +@dataclass +class FlowLedStatus(RoborockBase): + status: int + + @dataclass class BroadcastMessage(RoborockBase): duid: str diff --git a/roborock/local_api.py b/roborock/local_api.py index f6aeb14..3c6d6e9 100644 --- a/roborock/local_api.py +++ b/roborock/local_api.py @@ -147,6 +147,11 @@ async def async_local_response(self, roborock_message: RoborockMessage): if request_id is None: raise RoborockException(f"Failed build message {roborock_message}") (response, err) = await self._async_response(request_id, response_protocol) + self._diagnostic_data[method if method is not None else "unknown"] = { + "params": roborock_message.get_params(), + "response": response, + "error": err, + } if err: raise CommandVacuumError("", err) from err if roborock_message.protocol == 4: diff --git a/roborock/roborock_typing.py b/roborock/roborock_typing.py index c1bfdb0..15a1f13 100644 --- a/roborock/roborock_typing.py +++ b/roborock/roborock_typing.py @@ -10,6 +10,7 @@ Consumable, DnDTimer, DustCollectionMode, + RoborockBase, SmartWashParams, Status, WashTowelMode, @@ -301,14 +302,14 @@ class CommandInfo: @dataclass -class DockSummary: +class DockSummary(RoborockBase): dust_collection_mode: Optional[DustCollectionMode] = None wash_towel_mode: Optional[WashTowelMode] = None smart_wash_params: Optional[SmartWashParams] = None @dataclass -class DeviceProp: +class DeviceProp(RoborockBase): status: Optional[Status] = None dnd_timer: Optional[DnDTimer] = None clean_summary: Optional[CleanSummary] = None