Skip to content

Commit 251b3f9

Browse files
authored
chore: avoid re-parsing RoborockMessages and replace with passing explicit arguments (#439)
1 parent 3a79b8d commit 251b3f9

File tree

3 files changed

+39
-64
lines changed

3 files changed

+39
-64
lines changed

roborock/roborock_message.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -256,23 +256,3 @@ def get_request_id(self) -> int | None:
256256
data_point_response = json.loads(data_point)
257257
return data_point_response.get("id")
258258
return None
259-
260-
def get_method(self) -> str | None:
261-
protocol = self.protocol
262-
if self.payload and protocol in [4, 5, 101, 102]:
263-
payload = json.loads(self.payload.decode())
264-
for data_point_number, data_point in payload.get("dps").items():
265-
if data_point_number in ["101", "102"]:
266-
data_point_response = json.loads(data_point)
267-
return data_point_response.get("method")
268-
return None
269-
270-
def get_params(self) -> list | dict | None:
271-
protocol = self.protocol
272-
if self.payload and protocol in [4, 101, 102]:
273-
payload = json.loads(self.payload.decode())
274-
for data_point_number, data_point in payload.get("dps").items():
275-
if data_point_number in ["101", "102"]:
276-
data_point_response = json.loads(data_point)
277-
return data_point_response.get("params")
278-
return None

roborock/version_1_apis/roborock_local_client_v1.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@
1818
_LOGGER = logging.getLogger(__name__)
1919

2020

21+
_HELLO_REQUEST_MESSAGE = RoborockMessage(
22+
protocol=RoborockMessageProtocol.HELLO_REQUEST,
23+
seq=1,
24+
random=22,
25+
)
26+
27+
_PING_REQUEST_MESSAGE = RoborockMessage(
28+
protocol=RoborockMessageProtocol.PING_REQUEST,
29+
seq=2,
30+
random=23,
31+
)
32+
33+
2134
@dataclass
2235
class _LocalProtocol(asyncio.Protocol):
2336
"""Callbacks for the Roborock local client transport."""
@@ -109,29 +122,13 @@ async def async_disconnect(self) -> None:
109122
self._sync_disconnect()
110123

111124
async def hello(self):
112-
request_id = 1
113-
protocol = RoborockMessageProtocol.HELLO_REQUEST
114125
try:
115-
return await self._send_message(
116-
RoborockMessage(
117-
protocol=protocol,
118-
seq=request_id,
119-
random=22,
120-
)
121-
)
126+
return await self._send_message(_HELLO_REQUEST_MESSAGE)
122127
except Exception as e:
123128
self._logger.error(e)
124129

125130
async def ping(self) -> None:
126-
request_id = 2
127-
protocol = RoborockMessageProtocol.PING_REQUEST
128-
return await self._send_message(
129-
RoborockMessage(
130-
protocol=protocol,
131-
seq=request_id,
132-
random=23,
133-
)
134-
)
131+
await self._send_message(_PING_REQUEST_MESSAGE)
135132

136133
def _send_msg_raw(self, data: bytes):
137134
try:
@@ -151,12 +148,15 @@ async def _send_command(
151148

152149
roborock_message = encode_local_payload(method, params)
153150
self._logger.debug("Building message id %s for method %s", roborock_message.get_request_id(), method)
154-
return await self._send_message(roborock_message)
151+
return await self._send_message(roborock_message, method, params)
155152

156-
async def _send_message(self, roborock_message: RoborockMessage):
153+
async def _send_message(
154+
self,
155+
roborock_message: RoborockMessage,
156+
method: str | None = None,
157+
params: list | dict | int | None = None,
158+
) -> RoborockMessage:
157159
await self.validate_connection()
158-
method = roborock_message.get_method()
159-
params = roborock_message.get_params()
160160
request_id: int | None
161161
if not method or not method.startswith("get"):
162162
request_id = roborock_message.seq
@@ -177,16 +177,16 @@ async def _send_message(self, roborock_message: RoborockMessage):
177177
response = await async_response
178178
except VacuumError as err:
179179
self._diagnostic_data[diagnostic_key] = {
180-
"params": roborock_message.get_params(),
180+
"params": params,
181181
"error": err,
182182
}
183183
raise CommandVacuumError(method, err) from err
184184
self._diagnostic_data[diagnostic_key] = {
185-
"params": roborock_message.get_params(),
185+
"params": params,
186186
"response": response,
187187
}
188188
if roborock_message.protocol == RoborockMessageProtocol.GENERAL_REQUEST:
189-
self._logger.debug(f"id={request_id} Response from method {roborock_message.get_method()}: {response}")
189+
self._logger.debug(f"id={request_id} Response from method {method}: {response}")
190190
if response == "retry":
191191
raise RoborockException(f"Command {method} failed with 'retry' message; Device is busy, try again later")
192192
return response

roborock/version_1_apis/roborock_mqtt_client_v1.py

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from ..protocol import Utils
1414
from ..protocols.v1_protocol import SecurityData, create_mqtt_payload_encoder
1515
from ..roborock_message import (
16-
RoborockMessage,
1716
RoborockMessageProtocol,
1817
)
1918
from ..roborock_typing import RoborockCommand
@@ -41,10 +40,19 @@ def __init__(self, user_data: UserData, device_info: DeviceData, queue_timeout:
4140
SecurityData(endpoint=self._endpoint, nonce=self._nonce),
4241
)
4342

44-
async def send_message(self, roborock_message: RoborockMessage):
43+
async def _send_command(
44+
self,
45+
method: RoborockCommand | str,
46+
params: list | dict | int | None = None,
47+
):
48+
if method in CUSTOM_COMMANDS:
49+
# When we have more custom commands do something more complicated here
50+
return await self._get_calibration_points()
51+
52+
roborock_message = self._payload_encoder(method, params)
53+
self._logger.debug("Building message id %s for method %s", roborock_message.get_request_id, method)
54+
4555
await self.validate_connection()
46-
method = roborock_message.get_method()
47-
params = roborock_message.get_params()
4856
request_id = roborock_message.get_request_id()
4957
if request_id is None:
5058
raise RoborockException(f"Failed build message {roborock_message}")
@@ -60,12 +68,12 @@ async def send_message(self, roborock_message: RoborockMessage):
6068
response = await async_response
6169
except VacuumError as err:
6270
self._diagnostic_data[diagnostic_key] = {
63-
"params": roborock_message.get_params(),
71+
"params": params,
6472
"error": err,
6573
}
6674
raise CommandVacuumError(method, err) from err
6775
self._diagnostic_data[diagnostic_key] = {
68-
"params": roborock_message.get_params(),
76+
"params": params,
6977
"response": response,
7078
}
7179
if response_protocol == RoborockMessageProtocol.MAP_RESPONSE:
@@ -74,19 +82,6 @@ async def send_message(self, roborock_message: RoborockMessage):
7482
self._logger.debug(f"id={request_id} Response from {method}: {response}")
7583
return response
7684

77-
async def _send_command(
78-
self,
79-
method: RoborockCommand | str,
80-
params: list | dict | int | None = None,
81-
):
82-
if method in CUSTOM_COMMANDS:
83-
# When we have more custom commands do something more complicated here
84-
return await self._get_calibration_points()
85-
86-
roborock_message = self._payload_encoder(method, params)
87-
self._logger.debug("Building message id %s for method %s", roborock_message.get_request_id, method)
88-
return await self.send_message(roborock_message)
89-
9085
async def _get_calibration_points(self):
9186
map: bytes = await self.send_command(RoborockCommand.GET_MAP_V1)
9287
parser = RoborockMapDataParser(ColorsPalette(), Sizes(), [], ImageConfig(), [])

0 commit comments

Comments
 (0)