1212"""
1313
1414from datetime import datetime , timedelta
15+ from queue import Empty , PriorityQueue
1516import logging
16- import queue
1717import threading
1818import time
1919
2222from .constants import (
2323 MESSAGE_RETRY ,
2424 MESSAGE_TIME_OUT ,
25+ PRIORITY_MEDIUM ,
2526 REQUEST_FAILED ,
2627 REQUEST_SUCCESS ,
2728 SLEEP_TIME ,
@@ -77,7 +78,7 @@ def connect_to_stick(self, callback=None) -> bool:
7778 if self .connection .connect ():
7879 _LOGGER .debug ("Starting message controller threads..." )
7980 # send daemon
80- self ._send_message_queue = queue . Queue ()
81+ self ._send_message_queue = PriorityQueue ()
8182 self ._run_send_message_thread = True
8283 self ._send_message_thread = threading .Thread (
8384 None , self ._send_message_loop , "send_messages_thread" , (), {}
@@ -96,20 +97,32 @@ def connect_to_stick(self, callback=None) -> bool:
9697 _LOGGER .warning ("Failed to connect to USB stick" )
9798 return self .connection .is_connected ()
9899
99- def send (self , request : NodeRequest , callback = None , retry_counter = 0 ):
100+ def send (
101+ self ,
102+ request : NodeRequest ,
103+ callback = None ,
104+ retry_counter = 0 ,
105+ priority = PRIORITY_MEDIUM ,
106+ ):
100107 """Queue request message to be sent into Plugwise Zigbee network."""
101108 _LOGGER .debug (
102- "Queue %s to be send with retry counter %s" ,
109+ "Queue %s to be send with retry counter %s and priority %s " ,
103110 request .__class__ .__name__ ,
104111 str (retry_counter ),
112+ str (priority ),
105113 )
106114 self ._send_message_queue .put (
107- [
108- request ,
109- callback ,
115+ (
116+ priority ,
110117 retry_counter ,
111- None ,
112- ]
118+ datetime .now (),
119+ [
120+ request ,
121+ callback ,
122+ retry_counter ,
123+ None ,
124+ ],
125+ )
113126 )
114127
115128 def resend (self , seq_id ):
@@ -180,8 +193,10 @@ def _send_message_loop(self):
180193 """Daemon to send messages waiting in queue."""
181194 while self ._run_send_message_thread :
182195 try :
183- request_set = self ._send_message_queue .get (block = True , timeout = 1 )
184- except queue .Empty :
196+ _prio , _retry , _dt , request_set = self ._send_message_queue .get (
197+ block = True , timeout = 1
198+ )
199+ except Empty :
185200 time .sleep (SLEEP_TIME )
186201 else :
187202 # Calc next seq_id based last received ack message
0 commit comments