Skip to content

Commit eb6da93

Browse files
authored
fix: Fix "retry" error handling (#436)
1 parent 0a14e2a commit eb6da93

File tree

6 files changed

+27
-27
lines changed

6 files changed

+27
-27
lines changed

roborock/protocols/v1_protocol.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from roborock.containers import RRiot
1616
from roborock.exceptions import RoborockException
1717
from roborock.protocol import Utils
18-
from roborock.roborock_message import MessageRetry, RoborockMessage, RoborockMessageProtocol
18+
from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol
1919
from roborock.roborock_typing import RoborockCommand
2020
from roborock.util import get_next_int
2121

@@ -102,15 +102,10 @@ def encode_local_payload(method: CommandType, params: ParamsType) -> RoborockMes
102102
request = RequestMessage(method=method, params=params)
103103
payload = request.as_payload(security_data=None)
104104

105-
message_retry: MessageRetry | None = None
106-
if method == RoborockCommand.RETRY_REQUEST and isinstance(params, dict):
107-
message_retry = MessageRetry(method=method, retry_id=params["retry_id"])
108-
109105
return RoborockMessage(
110106
timestamp=request.timestamp,
111107
protocol=RoborockMessageProtocol.GENERAL_REQUEST,
112108
payload=payload,
113-
message_retry=message_retry,
114109
)
115110

116111

roborock/roborock_message.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,6 @@ class RoborockB01Props(StrEnum):
239239
]
240240

241241

242-
@dataclass
243-
class MessageRetry:
244-
method: str
245-
retry_id: int
246-
247-
248242
@dataclass
249243
class RoborockMessage:
250244
protocol: RoborockMessageProtocol
@@ -253,7 +247,6 @@ class RoborockMessage:
253247
version: bytes = b"1.0"
254248
random: int = field(default_factory=lambda: get_next_int(10000, 99999))
255249
timestamp: int = field(default_factory=lambda: math.floor(time.time()))
256-
message_retry: MessageRetry | None = None
257250

258251
def get_request_id(self) -> int | None:
259252
if self.payload:
@@ -264,14 +257,7 @@ def get_request_id(self) -> int | None:
264257
return data_point_response.get("id")
265258
return None
266259

267-
def get_retry_id(self) -> int | None:
268-
if self.message_retry:
269-
return self.message_retry.retry_id
270-
return self.get_request_id()
271-
272260
def get_method(self) -> str | None:
273-
if self.message_retry:
274-
return self.message_retry.method
275261
protocol = self.protocol
276262
if self.payload and protocol in [4, 5, 101, 102]:
277263
payload = json.loads(self.payload.decode())

roborock/version_1_apis/roborock_local_client_v1.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,5 @@ async def send_message(self, roborock_message: RoborockMessage):
6969
if roborock_message.protocol == RoborockMessageProtocol.GENERAL_REQUEST:
7070
self._logger.debug(f"id={request_id} Response from method {roborock_message.get_method()}: {response}")
7171
if response == "retry":
72-
retry_id = roborock_message.get_retry_id()
73-
return self.send_command(
74-
RoborockCommand.RETRY_REQUEST, {"retry_id": retry_id, "retry_count": 8, "method": method}
75-
)
72+
raise RoborockException(f"Command {method} failed with 'retry' message; Device is busy, try again later")
7673
return response

tests/protocols/test_v1_protocol.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ def test_decode_rpc_response(payload: bytes, expected: RoborockBase) -> None:
119119
version=b"1.0",
120120
random=97431,
121121
timestamp=1652547161,
122-
message_retry=None,
123122
)
124123
decoded_message = decode_rpc_response(message)
125124
assert decoded_message == expected

tests/test_local_api_v1.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import pytest
1010

1111
from roborock.containers import RoomMapping
12+
from roborock.exceptions import RoborockException
1213
from roborock.protocol import MessageParser
1314
from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol
1415
from roborock.version_1_apis import RoborockLocalClientV1
@@ -93,3 +94,27 @@ async def test_get_room_mapping(
9394
RoomMapping(segment_id=16, iot_id="2362048"),
9495
RoomMapping(segment_id=17, iot_id="2362044"),
9596
]
97+
98+
99+
async def test_retry_request(
100+
received_requests: Queue,
101+
response_queue: Queue,
102+
connected_local_client: RoborockLocalClientV1,
103+
) -> None:
104+
"""Test sending an arbitrary MQTT message and parsing the response."""
105+
106+
test_request_id = 5050
107+
108+
retry_message = build_rpc_response(
109+
seq=test_request_id,
110+
message={
111+
"id": test_request_id,
112+
"result": "retry",
113+
},
114+
)
115+
response_queue.put(retry_message)
116+
117+
with patch("roborock.protocols.v1_protocol.get_next_int", return_value=test_request_id), pytest.raises(
118+
RoborockException, match="Device is busy, try again later"
119+
):
120+
await connected_local_client.get_room_mapping()

tests/test_roborock_message.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ def test_roborock_message() -> None:
1111
message1 = RoborockMessage(
1212
protocol=RoborockMessageProtocol.RPC_REQUEST,
1313
payload=json.dumps({"dps": {"101": json.dumps({"id": 4321})}}).encode(),
14-
message_retry=None,
1514
)
1615
assert message1.get_request_id() == 4321
1716

1817
with freeze_time("2025-01-20T11:00:00"): # Back in time 1hr to test timestamp
1918
message2 = RoborockMessage(
2019
protocol=RoborockMessageProtocol.RPC_RESPONSE,
2120
payload=json.dumps({"dps": {"94": json.dumps({"id": 444}), "102": json.dumps({"id": 333})}}).encode(),
22-
message_retry=None,
2321
)
2422
assert message2.get_request_id() == 333
2523

0 commit comments

Comments
 (0)