1313# limitations under the License.
1414
1515import asyncio
16- from threading import Thread
17- from time import sleep , monotonic
16+ from time import monotonic
1817from typing import TYPE_CHECKING , Dict , Union
1918
2019from _asyncio import Future
6261 from thingsboard_gateway .connectors .modbus .entities .master import Master
6362
6463
65- class Slave ( Thread ) :
64+ class Slave :
6665 def __init__ (self , connector : 'ModbusConnector' , logger , config ):
67- super ().__init__ ()
68- self .daemon = True
6966 self .stopped = False
7067 self ._log = logger
7168 self .connector = connector
@@ -132,7 +129,7 @@ def __init__(self, connector: 'ModbusConnector', logger, config):
132129 for attr_config in self .attributes_updates_config :
133130 self .shared_attributes_keys .append (attr_config [TAG_PARAMETER ])
134131
135- def __timer (self ):
132+ async def __timer (self ):
136133 if self .__master is not None :
137134 self .__send_callback (monotonic ())
138135 next_poll_time = monotonic () + self .poll_period
@@ -144,7 +141,7 @@ def __timer(self):
144141 next_poll_time = current_time + self .poll_period
145142
146143 sleep_time = max (0.0 , next_poll_time - monotonic ())
147- sleep (sleep_time )
144+ await asyncio . sleep (sleep_time )
148145
149146 def __send_callback (self , current_monotonic ):
150147 self .last_polled_time = current_monotonic
@@ -154,17 +151,18 @@ def __send_callback(self, current_monotonic):
154151 except Exception as e :
155152 self ._log .exception ('Error sending slave callback: %s' , e )
156153
157- def run (self ):
154+ async def run (self ):
158155 if self .uplink_converter_config .is_readable ():
159- self .__timer ()
156+ await self .__timer ()
160157
161158 def close (self , loop ):
159+ self .stopped = True
160+
162161 future = asyncio .run_coroutine_threadsafe (self .disconnect (), loop )
163162 try :
164163 future .result (timeout = 5 )
165164 except Exception as e :
166165 self ._log .error ('Failed to disconnect from %s: %s' , self , e )
167- self .stopped = True
168166
169167 def get_name (self ):
170168 return self .device_name
0 commit comments