Skip to content

Commit 6fedba3

Browse files
committed
Move request for unknown check
1 parent a79770e commit 6fedba3

File tree

4 files changed

+21
-36
lines changed

4 files changed

+21
-36
lines changed

Diff for: roborock/cloud_api.py

+7-15
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,24 @@ def __init__(self, user_data: UserData, device_info: DeviceData) -> None:
7676

7777
def _mqtt_on_connect(self, *args, **kwargs):
7878
_, __, ___, rc, ____ = args
79-
connection_queue = self._waiting_queue.safe_pop(RequestKey(CONNECT_REQUEST_ID))
79+
if not (connection_queue := self._waiting_queue.safe_pop(RequestKey(CONNECT_REQUEST_ID), "connect")):
80+
self._logger.info("Received unexpected connect event")
81+
return
8082
if rc != mqtt.MQTT_ERR_SUCCESS:
8183
message = f"Failed to connect ({mqtt.error_string(rc)})"
8284
self._logger.error(message)
83-
if connection_queue:
84-
connection_queue.set_exception(VacuumError(message))
85-
else:
86-
self._logger.debug("Failed to notify connect future, not in queue")
85+
connection_queue.set_exception(VacuumError(message))
8786
return
8887
self._logger.info(f"Connected to mqtt {self._mqtt_host}:{self._mqtt_port}")
8988
topic = f"rr/m/o/{self._mqtt_user}/{self._hashed_user}/{self.device_info.device.duid}"
9089
(result, mid) = self._mqtt_client.subscribe(topic)
9190
if result != 0:
9291
message = f"Failed to subscribe ({mqtt.error_string(rc)})"
9392
self._logger.error(message)
94-
if connection_queue:
95-
connection_queue.set_exception(VacuumError(message))
93+
connection_queue.set_exception(VacuumError(message))
9694
return
9795
self._logger.info(f"Subscribed to topic {topic}")
98-
if connection_queue:
99-
connection_queue.set_result(True)
100-
else:
101-
self._logger.debug("Connected but no connect future")
96+
connection_queue.set_result(True)
10297

10398
def _mqtt_on_message(self, *args, **kwargs):
10499
client, __, msg = args
@@ -113,11 +108,8 @@ def _mqtt_on_disconnect(self, *args, **kwargs):
113108
try:
114109
exc = RoborockException(mqtt.error_string(rc)) if rc != mqtt.MQTT_ERR_SUCCESS else None
115110
super().on_connection_lost(exc)
116-
connection_queue = self._waiting_queue.safe_pop(RequestKey(DISCONNECT_REQUEST_ID))
117-
if connection_queue:
111+
if connection_queue := self._waiting_queue.safe_pop(RequestKey(DISCONNECT_REQUEST_ID), "disconnect"):
118112
connection_queue.set_result(True)
119-
else:
120-
self._logger.debug("Disconnected but no disconnect future")
121113
except Exception as ex:
122114
self._logger.exception(ex)
123115

Diff for: roborock/roborock_future.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from .roborock_message import RoborockMessageProtocol
1313

1414
_LOGGER = logging.getLogger(__name__)
15-
_TRIES = 3
1615

1716

1817
@dataclass(frozen=True)
@@ -43,11 +42,17 @@ def put(self, request_key: RequestKey, future: RoborockFuture) -> None:
4342
raise ValueError(f"Request key {request_key} already exists in the queue")
4443
self._queue[request_key] = future
4544

46-
def safe_pop(self, request_key: RequestKey) -> RoborockFuture | None:
47-
"""Get the future from the queue if it has not yet been popped, otherwise ignore."""
48-
_LOGGER.debug("Popping request key %s from the queue", request_key)
45+
def safe_pop(self, request_key: RequestKey, label: str | None = None) -> RoborockFuture | None:
46+
"""Get the future from the queue if it has not yet been popped, otherwise ignore.
47+
48+
The label is used for logging when the request key is not found in the queue.
49+
"""
50+
_LOGGER.debug("Popping request key %s (%s) from the queue", request_key, label)
4951
with self._lock:
50-
return self._queue.pop(request_key, None)
52+
future = self._queue.pop(request_key, None)
53+
if future is None and label is not None:
54+
_LOGGER.warning("Received message for key %s (%s) not found in the queue", request_key, label)
55+
return future
5156

5257

5358
class RoborockFuture:

Diff for: roborock/version_1_apis/roborock_client_v1.py

+3-12
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,7 @@ def on_message_received(self, messages: list[RoborockMessage]) -> None:
393393
data_point_response = json.loads(data_point)
394394
request_id = data_point_response.get("id")
395395
request_key = RequestKey(request_id, protocol)
396-
queue = self._waiting_queue.safe_pop(request_key)
397-
if queue:
396+
if queue := self._waiting_queue.safe_pop(request_key, "v1_rpc"):
398397
error = data_point_response.get("error")
399398
if error:
400399
queue.set_exception(
@@ -408,8 +407,6 @@ def on_message_received(self, messages: list[RoborockMessage]) -> None:
408407
if isinstance(result, list) and len(result) == 1:
409408
result = result[0]
410409
queue.set_result(result)
411-
else:
412-
self._logger.debug("Received response for unknown request id %s", request_key)
413410
else:
414411
try:
415412
data_protocol = RoborockDataProtocol(int(data_point_number))
@@ -470,20 +467,14 @@ def on_message_received(self, messages: list[RoborockMessage]) -> None:
470467
raise RoborockException(f"Failed to decode {data.payload!r} for {data.protocol}") from err
471468
decompressed = Utils.decompress(decrypted)
472469
request_key = RequestKey(request_id, protocol)
473-
queue = self._waiting_queue.safe_pop(request_key)
474-
if queue:
470+
if queue := self._waiting_queue.safe_pop(request_key, "v1_map"):
475471
if isinstance(decompressed, list):
476472
decompressed = decompressed[0]
477473
queue.set_result(decompressed)
478-
else:
479-
self._logger.debug("Received response for unknown request id %s", request_key)
480474
else:
481475
request_key = RequestKey(data.seq, protocol)
482-
queue = self._waiting_queue.safe_pop(request_key)
483-
if queue:
476+
if queue := self._waiting_queue.safe_pop(request_key, "v1_other"):
484477
queue.set_result(data.payload)
485-
else:
486-
self._logger.debug("Received response for unknown request id %s", request_key)
487478
except Exception as ex:
488479
self._logger.exception(ex)
489480

Diff for: roborock/version_a01_apis/roborock_client_a01.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,8 @@ def on_message_received(self, messages: list[RoborockMessage]) -> None:
144144
# Auto convert into data struct we want.
145145
converted_response = entries[data_point_protocol].post_process_fn(data_point)
146146
request_key = RequestKey(int(data_point_number), protocol)
147-
future = self._waiting_queue.safe_pop(request_key)
148-
if future is not None:
147+
if future := self._waiting_queue.safe_pop(request_key, "a01"):
149148
future.set_result(converted_response)
150-
else:
151-
self._logger.debug(f"Got response for {request_key} but no future found")
152149

153150
@abstractmethod
154151
async def update_values(

0 commit comments

Comments
 (0)