Skip to content

Commit c2ba673

Browse files
fix: connection_lost
1 parent 31b0cdd commit c2ba673

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

roborock/local_api.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def data_received(self, message):
4040
self.on_message_received(parser_msg)
4141

4242
def connection_lost(self, exc: Optional[Exception]):
43-
self.loop.run_until_complete(self.async_disconnect())
43+
self.sync_disconnect()
4444
self.on_connection_lost(exc)
4545

4646
def is_connected(self):
@@ -53,27 +53,29 @@ async def keep_alive_func(self, _=None):
5353
async def async_connect(self) -> None:
5454
async with self._mutex:
5555
try:
56-
is_connected = self.is_connected()
57-
if not is_connected:
56+
if not self.is_connected():
57+
self.sync_disconnect()
5858
async with async_timeout.timeout(QUEUE_TIMEOUT):
5959
_LOGGER.info(f"Connecting to {self.host}")
6060
self.transport, _ = await self.loop.create_connection( # type: ignore
6161
lambda: self, self.host, 58867
6262
)
6363
_LOGGER.info(f"Connected to {self.host}")
64+
await self.hello()
65+
await self.keep_alive_func()
6466
except Exception as e:
6567
raise RoborockConnectionException(f"Failed connecting to {self.host}") from e
66-
if not is_connected:
67-
await self.hello()
68-
await self.keep_alive_func()
68+
69+
def sync_disconnect(self) -> None:
70+
if self.transport and self.loop.is_running():
71+
_LOGGER.debug(f"Disconnecting from {self.host}")
72+
self.transport.close()
73+
if self.keep_alive_task:
74+
self.keep_alive_task.cancel()
6975

7076
async def async_disconnect(self) -> None:
7177
async with self._mutex:
72-
if self.transport and self.loop.is_running():
73-
_LOGGER.debug(f"Disconnecting from {self.host}")
74-
self.transport.close()
75-
if self.keep_alive_task:
76-
self.keep_alive_task.cancel()
78+
self.sync_disconnect()
7779

7880
def build_roborock_message(self, method: RoborockCommand, params: Optional[list | dict] = None) -> RoborockMessage:
7981
secured = True if method in COMMANDS_SECURED else False
@@ -98,7 +100,7 @@ async def hello(self):
98100
protocol = RoborockMessageProtocol.HELLO_REQUEST
99101
_LOGGER.debug(f"id={request_id} Requesting protocol {protocol.name}")
100102
try:
101-
return await self.send_message(
103+
return await self._send_message(
102104
RoborockMessage(protocol=protocol, payload=None, seq=request_id, version=b"1.0", random=22)
103105
)
104106
except Exception as e:
@@ -110,7 +112,7 @@ async def ping(self):
110112
protocol = RoborockMessageProtocol.PING_REQUEST
111113
_LOGGER.debug(f"id={request_id} Requesting protocol {protocol.name}")
112114
try:
113-
return await self.send_message(
115+
return await self._send_message(
114116
RoborockMessage(protocol=protocol, payload=None, seq=request_id, version=b"1.0", random=23)
115117
)
116118
except Exception as e:
@@ -150,8 +152,7 @@ def _send_msg_raw(self, data: bytes):
150152
except Exception as e:
151153
raise RoborockException(e) from e
152154

153-
async def send_message(self, roborock_messages: list[RoborockMessage] | RoborockMessage):
154-
await self.validate_connection()
155+
async def _send_message(self, roborock_messages: list[RoborockMessage] | RoborockMessage):
155156
if isinstance(roborock_messages, RoborockMessage):
156157
roborock_messages = [roborock_messages]
157158
local_key = self.device_info.device.local_key
@@ -170,3 +171,7 @@ async def send_message(self, roborock_messages: list[RoborockMessage] | Roborock
170171
if exception:
171172
raise exception
172173
return responses
174+
175+
async def send_message(self, roborock_messages: list[RoborockMessage] | RoborockMessage):
176+
await self.validate_connection()
177+
return await self._send_message(roborock_messages)

0 commit comments

Comments
 (0)