@@ -73,18 +73,23 @@ async def _set_value(self, device_id, uid, value):
7373 """Internal method to send a value to the device."""
7474 raise NotImplementedError ()
7575
76- async def _send_command (self , command : str ):
76+ async def _send_command (self , command : str , * , wait_for_response : bool = True ):
7777 try :
7878 _LOGGER .debug ("Preparing to send command: %s" , command )
79- self ._received_response .clear ()
80- if not self ._writer :
79+ if wait_for_response :
80+ self ._received_response .clear ()
81+ if not self ._writer or self ._writer .is_closing ():
8182 _LOGGER .error ("No writer available. Cannot send command." )
83+ self ._connected = False
8284 return
8385 _LOGGER .debug ("Writer state: %r" , self ._writer )
8486 encoded_command = command .encode ("ascii" )
8587 _LOGGER .debug ("Encoded command: %r (length: %d)" , encoded_command , len (encoded_command ))
8688 self ._writer .write (encoded_command )
8789 await self ._writer .drain ()
90+ if not wait_for_response :
91+ _LOGGER .debug ("Command sent without waiting for response." )
92+ return
8893 _LOGGER .debug ("Command sent and drained. Waiting for response event." )
8994 timeout = 15.0
9095 start_time = asyncio .get_event_loop ().time ()
@@ -161,6 +166,18 @@ async def _data_received(self):
161166 finally :
162167 self ._connected = False
163168 self ._connecting = False
169+ if self ._keepalive_task :
170+ await self ._cancel_task_if_exists (self ._keepalive_task )
171+ self ._keepalive_task = None
172+ if self ._writer :
173+ self ._writer .close ()
174+ try :
175+ await self ._writer .wait_closed ()
176+ except Exception as exc : # pylint: disable=broad-except
177+ _LOGGER .debug ("Error while waiting for writer to close: %s" , exc )
178+ self ._writer = None
179+ self ._reader = None
180+ self ._receive_task = None
164181 await self ._send_update_callback ()
165182
166183 def _update_device_state (self , device_id , uid , value ):
@@ -197,7 +214,9 @@ async def stop(self):
197214 """Public method for shutting down connectivity."""
198215 self ._connected = False
199216 await self ._cancel_task_if_exists (self ._receive_task )
217+ self ._receive_task = None
200218 await self ._cancel_task_if_exists (self ._keepalive_task )
219+ self ._keepalive_task = None
201220 if self ._writer :
202221 self ._writer .close ()
203222 await self ._writer .wait_closed ()
0 commit comments