@@ -35,36 +35,112 @@ def __init__(self, transport, auth):
3535 self ._transport = transport
3636 self ._token = Token (self , auth )
3737 self ._connected = True
38- self ._subscription_calls = {self .subscribe_insert_commands : set (),
39- self .subscribe_update_commands : set (),
40- self .subscribe_notifications : set ()}
38+ self ._subscriptions = set ()
4139 self .server_timestamp = None
4240
43- @staticmethod
44- def _hashable_args (args ):
45- args = list (args )
46- for i in range (len (args )):
47- if not isinstance (args [i ], list ):
48- continue
49- args [i ] = tuple (args [i ])
50- return tuple (args )
51-
52- def _set_subscription_call (self , call , args ):
53- args = self ._hashable_args (args )
54- if args in self ._subscription_calls [call ]:
41+ def _subscribe_insert_commands (self , device_id = None , network_ids = (),
42+ device_type_ids = (), names = (),
43+ timestamp = None ):
44+ action = 'command/insert'
45+ join_names = ',' .join (map (str , names ))
46+ join_network_ids = ',' .join (map (str , network_ids ))
47+ join_device_type_ids = ',' .join (map (str , device_type_ids ))
48+ if not timestamp :
49+ timestamp = self .server_timestamp
50+ auth_subscription_api_request = AuthSubscriptionApiRequest (self )
51+ auth_subscription_api_request .action (action )
52+ auth_subscription_api_request .url ('device/command/poll' )
53+ auth_subscription_api_request .param ('deviceId' , device_id )
54+ auth_subscription_api_request .param ('networkIds' , join_network_ids )
55+ auth_subscription_api_request .param ('deviceTypeIds' ,
56+ join_device_type_ids )
57+ auth_subscription_api_request .param ('names' , join_names )
58+ auth_subscription_api_request .param ('timestamp' , timestamp )
59+ auth_subscription_api_request .response_key ('command' )
60+ api_request = ApiRequest (self )
61+ api_request .action ('command/subscribe' )
62+ api_request .set ('deviceId' , device_id )
63+ api_request .set ('networkIds' , network_ids )
64+ api_request .set ('deviceTypeIds' , device_type_ids )
65+ api_request .set ('names' , names )
66+ api_request .set ('timestamp' , timestamp )
67+ api_request .subscription_request (auth_subscription_api_request )
68+ return api_request .execute ('Subscribe insert commands failure.' )
69+
70+ def _subscribe_update_commands (self , device_id = None , network_ids = (),
71+ device_type_ids = (), names = (),
72+ timestamp = None ):
73+ action = 'command/update'
74+ join_names = ',' .join (map (str , names ))
75+ join_network_ids = ',' .join (map (str , network_ids ))
76+ join_device_type_ids = ',' .join (map (str , device_type_ids ))
77+ if not timestamp :
78+ timestamp = self .server_timestamp
79+ auth_subscription_api_request = AuthSubscriptionApiRequest (self )
80+ auth_subscription_api_request .action (action )
81+ auth_subscription_api_request .url ('device/command/poll' )
82+ auth_subscription_api_request .param ('returnUpdatedCommands' , True )
83+ auth_subscription_api_request .param ('deviceId' , device_id )
84+ auth_subscription_api_request .param ('networkIds' , join_network_ids )
85+ auth_subscription_api_request .param ('deviceTypeIds' ,
86+ join_device_type_ids )
87+ auth_subscription_api_request .param ('names' , join_names )
88+ auth_subscription_api_request .param ('timestamp' , timestamp )
89+ auth_subscription_api_request .response_timestamp_key ('lastUpdated' )
90+ auth_subscription_api_request .response_key ('command' )
91+ api_request = ApiRequest (self )
92+ api_request .action ('command/subscribe' )
93+ api_request .set ('returnUpdatedCommands' , True )
94+ api_request .set ('deviceId' , device_id )
95+ api_request .set ('networkIds' , network_ids )
96+ api_request .set ('deviceTypeIds' , device_type_ids )
97+ api_request .set ('names' , names )
98+ api_request .set ('timestamp' , timestamp )
99+ api_request .subscription_request (auth_subscription_api_request )
100+ return api_request .execute ('Subscribe update commands failure.' )
101+
102+ def _subscribe_notifications (self , device_id = None , network_ids = (),
103+ device_type_ids = (), names = (),
104+ timestamp = None ):
105+ action = 'notification/insert'
106+ join_names = ',' .join (map (str , names ))
107+ join_network_ids = ',' .join (map (str , network_ids ))
108+ join_device_type_ids = ',' .join (map (str , device_type_ids ))
109+ if not timestamp :
110+ timestamp = self .server_timestamp
111+ auth_subscription_api_request = AuthSubscriptionApiRequest (self )
112+ auth_subscription_api_request .action (action )
113+ auth_subscription_api_request .url ('device/notification/poll' )
114+ auth_subscription_api_request .param ('deviceId' , device_id )
115+ auth_subscription_api_request .param ('networkIds' , join_network_ids )
116+ auth_subscription_api_request .param ('deviceTypeIds' ,
117+ join_device_type_ids )
118+ auth_subscription_api_request .param ('names' , join_names )
119+ auth_subscription_api_request .param ('timestamp' , timestamp )
120+ auth_subscription_api_request .response_key ('notification' )
121+ api_request = ApiRequest (self )
122+ api_request .action ('notification/subscribe' )
123+ api_request .set ('deviceId' , device_id )
124+ api_request .set ('networkIds' , network_ids )
125+ api_request .set ('deviceTypeIds' , device_type_ids )
126+ api_request .set ('names' , names )
127+ api_request .set ('timestamp' , timestamp )
128+ api_request .subscription_request (auth_subscription_api_request )
129+ return api_request .execute ('Subscribe notifications failure.' )
130+
131+ def _add_subscription (self , subscription ):
132+ if subscription in self ._subscriptions :
55133 return
56- self ._subscription_calls [ call ] .add (args )
134+ self ._subscriptions .add (subscription )
57135
58- def remove_subscription_call (self , call , args ):
59- args = self ._hashable_args (args )
60- if args not in self ._subscription_calls [call ]:
136+ def remove_subscription (self , subscription ):
137+ if subscription not in self ._subscriptions :
61138 return
62- self ._subscription_calls [ call ] .remove (args )
139+ self ._subscriptions .remove (subscription )
63140
64141 def apply_subscription_calls (self ):
65- for call in self ._subscription_calls :
66- for args in self ._subscription_calls [call ]:
67- call (* args )
142+ for subscription in self ._subscriptions :
143+ subscription .subscribe ()
68144
69145 @property
70146 def transport (self ):
@@ -150,115 +226,32 @@ def refresh_token(self):
150226 return self ._token .access_token
151227
152228 def subscribe_insert_commands (self , device_id = None , network_ids = (),
153- device_type_ids = (), names = (),
154- timestamp = None ):
155- action = 'command/insert'
156- join_names = ',' .join (map (str , names ))
157- join_network_ids = ',' .join (map (str , network_ids ))
158- join_device_type_ids = ',' .join (map (str , device_type_ids ))
159- request_timestamp = None
160- if not timestamp :
161- request_timestamp = self .server_timestamp
162- auth_subscription_api_request = AuthSubscriptionApiRequest (self )
163- auth_subscription_api_request .action (action )
164- auth_subscription_api_request .url ('device/command/poll' )
165- auth_subscription_api_request .param ('deviceId' , device_id )
166- auth_subscription_api_request .param ('networkIds' , join_network_ids )
167- auth_subscription_api_request .param ('deviceTypeIds' ,
168- join_device_type_ids )
169- auth_subscription_api_request .param ('names' , join_names )
170- auth_subscription_api_request .param ('timestamp' , request_timestamp )
171- auth_subscription_api_request .response_key ('command' )
172- api_request = ApiRequest (self )
173- api_request .action ('command/subscribe' )
174- api_request .set ('deviceId' , device_id )
175- api_request .set ('networkIds' , network_ids )
176- api_request .set ('deviceTypeIds' , device_type_ids )
177- api_request .set ('names' , names )
178- api_request .set ('timestamp' , request_timestamp )
179- api_request .subscription_request (auth_subscription_api_request )
180- subscription = api_request .execute ('Subscribe insert commands failure.' )
181- call = self .subscribe_insert_commands
229+ device_type_ids = (), names = (), timestamp = None ):
230+ call = self ._subscribe_insert_commands
182231 args = (device_id , network_ids , device_type_ids , names , timestamp )
183- commands_subscription = CommandsSubscription (self , subscription ,
184- call , args )
185- self ._set_subscription_call ( call , args )
232+ commands_subscription = CommandsSubscription (self , call , args )
233+ commands_subscription . subscribe ( )
234+ self ._add_subscription ( commands_subscription )
186235 return commands_subscription
187236
188237 def subscribe_update_commands (self , device_id = None , network_ids = (),
189238 device_type_ids = (), names = (),
190239 timestamp = None ):
191- action = 'command/update'
192- join_names = ',' .join (map (str , names ))
193- join_network_ids = ',' .join (map (str , network_ids ))
194- join_device_type_ids = ',' .join (map (str , device_type_ids ))
195- request_timestamp = None
196- if not timestamp :
197- request_timestamp = self .server_timestamp
198- auth_subscription_api_request = AuthSubscriptionApiRequest (self )
199- auth_subscription_api_request .action (action )
200- auth_subscription_api_request .url ('device/command/poll' )
201- auth_subscription_api_request .param ('returnUpdatedCommands' , True )
202- auth_subscription_api_request .param ('deviceId' , device_id )
203- auth_subscription_api_request .param ('networkIds' , join_network_ids )
204- auth_subscription_api_request .param ('deviceTypeIds' ,
205- join_device_type_ids )
206- auth_subscription_api_request .param ('names' , join_names )
207- auth_subscription_api_request .param ('timestamp' , request_timestamp )
208- auth_subscription_api_request .response_timestamp_key ('lastUpdated' )
209- auth_subscription_api_request .response_key ('command' )
210- api_request = ApiRequest (self )
211- api_request .action ('command/subscribe' )
212- api_request .set ('returnUpdatedCommands' , True )
213- api_request .set ('deviceId' , device_id )
214- api_request .set ('networkIds' , network_ids )
215- api_request .set ('deviceTypeIds' , device_type_ids )
216- api_request .set ('names' , names )
217- api_request .set ('timestamp' , request_timestamp )
218- api_request .subscription_request (auth_subscription_api_request )
219- subscription = api_request .execute ('Subscribe update commands failure.' )
220- call = self .subscribe_update_commands
240+ call = self ._subscribe_update_commands
221241 args = (device_id , network_ids , device_type_ids , names , timestamp )
222- commands_subscription = CommandsSubscription (self , subscription ,
223- call , args )
224- self ._set_subscription_call ( call , args )
242+ commands_subscription = CommandsSubscription (self , call , args )
243+ commands_subscription . subscribe ( )
244+ self ._add_subscription ( commands_subscription )
225245 return commands_subscription
226246
227247 def subscribe_notifications (self , device_id = None , network_ids = (),
228248 device_type_ids = (), names = (),
229249 timestamp = None ):
230- action = 'notification/insert'
231- join_names = ',' .join (map (str , names ))
232- join_network_ids = ',' .join (map (str , network_ids ))
233- join_device_type_ids = ',' .join (map (str , device_type_ids ))
234- request_timestamp = None
235- if not timestamp :
236- request_timestamp = self .server_timestamp
237- auth_subscription_api_request = AuthSubscriptionApiRequest (self )
238- auth_subscription_api_request .action (action )
239- auth_subscription_api_request .url ('device/notification/poll' )
240- auth_subscription_api_request .param ('deviceId' , device_id )
241- auth_subscription_api_request .param ('networkIds' , join_network_ids )
242- auth_subscription_api_request .param ('deviceTypeIds' ,
243- join_device_type_ids )
244- auth_subscription_api_request .param ('names' , join_names )
245- auth_subscription_api_request .param ('timestamp' , request_timestamp )
246- auth_subscription_api_request .response_key ('notification' )
247- api_request = ApiRequest (self )
248- api_request .action ('notification/subscribe' )
249- api_request .set ('deviceId' , device_id )
250- api_request .set ('networkIds' , network_ids )
251- api_request .set ('deviceTypeIds' , device_type_ids )
252- api_request .set ('names' , names )
253- api_request .set ('timestamp' , request_timestamp )
254- api_request .subscription_request (auth_subscription_api_request )
255- subscription = api_request .execute ('Subscribe notifications failure.' )
256- call = self .subscribe_notifications
250+ call = self ._subscribe_notifications
257251 args = (device_id , network_ids , device_type_ids , names , timestamp )
258- notifications_subscription = NotificationsSubscription (self ,
259- subscription ,
260- call , args )
261- self ._set_subscription_call (call , args )
252+ notifications_subscription = NotificationsSubscription (self , call , args )
253+ notifications_subscription .subscribe ()
254+ self ._add_subscription (notifications_subscription )
262255 return notifications_subscription
263256
264257 def list_devices (self , name = None , name_pattern = None , network_id = None ,
0 commit comments