@@ -156,6 +156,9 @@ class AuthFailure( Exception ):
156
156
pass
157
157
158
158
159
+ class outOfScope ( Exception ):
160
+ pass
161
+
159
162
class ClientAuth :
160
163
"""
161
164
Request authentication and keep access token available through token method. Renew it automatically if necessary
@@ -188,7 +191,7 @@ def renew_token(self):
188
191
"client_id" : self ._clientId ,
189
192
"client_secret" : self ._clientSecret
190
193
}
191
- resp = postRequest (_AUTH_REQ , postParams )
194
+ resp = postRequest ("authentication" , _AUTH_REQ , postParams )
192
195
if self .refreshToken != resp ['refresh_token' ]:
193
196
print ("New refresh token:" , resp ['refresh_token' ])
194
197
self ._accessToken = resp ['access_token' ]
@@ -209,7 +212,7 @@ def __init__(self, authData):
209
212
postParams = {
210
213
"access_token" : authData .accessToken
211
214
}
212
- resp = postRequest (_GETSTATIONDATA_REQ , postParams )
215
+ resp = postRequest ("Weather station" , _GETSTATIONDATA_REQ , postParams )
213
216
self .rawData = resp ['body' ]
214
217
self .devList = self .rawData ['devices' ]
215
218
self .ownerMail = self .rawData ['user' ]['mail' ]
@@ -243,7 +246,7 @@ def __init__(self, authData, home=None):
243
246
postParams = {
244
247
"access_token" : self .getAuthToken
245
248
}
246
- resp = postRequest (_GETTHERMOSTATDATA_REQ , postParams )
249
+ resp = postRequest ("Thermostat" , _GETTHERMOSTATDATA_REQ , postParams )
247
250
self .rawData = resp ['body' ]['devices' ]
248
251
if not self .rawData : raise NoDevice ("No thermostat available" )
249
252
self .thermostatData = filter_home_data (self .rawData , home )
@@ -283,7 +286,7 @@ def __init__(self, authData, home=None, station=None):
283
286
postParams = {
284
287
"access_token" : self .getAuthToken
285
288
}
286
- resp = postRequest (_GETSTATIONDATA_REQ , postParams )
289
+ resp = postRequest ("Weather station" , _GETSTATIONDATA_REQ , postParams )
287
290
self .rawData = resp ['body' ]['devices' ]
288
291
# Weather data
289
292
if not self .rawData : raise NoDevice ("No weather station in any homes" )
@@ -400,7 +403,7 @@ def getMeasure(self, device_id, scale, mtype, module_id=None, date_begin=None, d
400
403
if limit : postParams ['limit' ] = limit
401
404
postParams ['optimize' ] = "true" if optimize else "false"
402
405
postParams ['real_time' ] = "true" if real_time else "false"
403
- return postRequest (_GETMEASURE_REQ , postParams )
406
+ return postRequest ("Weather station" , _GETMEASURE_REQ , postParams )
404
407
405
408
def MinMaxTH (self , module = None , frame = "last24" ):
406
409
s = self .default_station_data
@@ -454,7 +457,7 @@ def __init__(self, authData, home=None):
454
457
postParams = {
455
458
"access_token" : self .getAuthToken
456
459
}
457
- resp = postRequest (_GETHOMEDATA_REQ , postParams )
460
+ resp = postRequest ("Home data" , _GETHOMEDATA_REQ , postParams )
458
461
self .rawData = resp ['body' ]
459
462
# Collect homes
460
463
self .homes = { d ['id' ] : d for d in self .rawData ['homes' ] }
@@ -535,10 +538,10 @@ def cameraUrls(self, camera=None, home=None, cid=None):
535
538
camera_data = self .cameraByName (camera = camera , home = home )
536
539
if camera_data :
537
540
vpn_url = camera_data ['vpn_url' ]
538
- resp = postRequest (vpn_url + '/command/ping' )
541
+ resp = postRequest ("Camera" , vpn_url + '/command/ping' )
539
542
temp_local_url = resp ['local_url' ]
540
543
try :
541
- resp = postRequest (temp_local_url + '/command/ping' ,timeout = 1 )
544
+ resp = postRequest ("Camera" , temp_local_url + '/command/ping' ,timeout = 1 )
542
545
if resp and temp_local_url == resp ['local_url' ]:
543
546
local_url = temp_local_url
544
547
except : # On this particular request, vithout errors from previous requests, error is timeout
@@ -573,7 +576,7 @@ def getCameraPicture(self, image_id, key):
573
576
"image_id" : image_id ,
574
577
"key" : key
575
578
}
576
- resp = postRequest (_GETCAMERAPICTURE_REQ , postParams )
579
+ resp = postRequest ("Camera" , _GETCAMERAPICTURE_REQ , postParams )
577
580
image_type = imghdr .what ('NONE.FILE' ,resp )
578
581
return resp , image_type
579
582
@@ -607,7 +610,7 @@ def updateEvent(self, event=None, home=None):
607
610
"home_id" : home_data ['id' ],
608
611
"event_id" : event ['id' ]
609
612
}
610
- resp = postRequest (_GETEVENTSUNTIL_REQ , postParams )
613
+ resp = postRequest ("Camera" , _GETEVENTSUNTIL_REQ , postParams )
611
614
eventList = resp ['body' ]['events_list' ]
612
615
for e in eventList :
613
616
self .events [ e ['camera_id' ] ][ e ['time' ] ] = e
@@ -712,7 +715,7 @@ def presenceSetAction(self, camera=None, home=None, cid=None,
712
715
"home_id" : camera ["home_id" ],
713
716
"presence_settings[presence_record_%s]" % eventType : _PRES_DETECTION_SETUP .index (action )
714
717
}
715
- resp = postRequest (_POST_UPDATE_HOME_REQ , postParams )
718
+ resp = postRequest ("Camera" , _POST_UPDATE_HOME_REQ , postParams )
716
719
self .rawData = resp ['body' ]
717
720
718
721
def getLiveSnapshot (self , camera = None , home = None , cid = None ):
@@ -746,9 +749,9 @@ def filter_home_data(rawData, home):
746
749
747
750
def cameraCommand (cameraUrl , commande , parameters = None , timeout = 3 ):
748
751
url = cameraUrl + ( commande % parameters if parameters else commande )
749
- return postRequest (url , timeout = timeout )
752
+ return postRequest ("Camera" , url , timeout = timeout )
750
753
751
- def postRequest (url , params = None , timeout = 10 ):
754
+ def postRequest (topic , url , params = None , timeout = 10 ):
752
755
if PYTHON3 :
753
756
req = urllib .request .Request (url )
754
757
if params :
@@ -757,7 +760,10 @@ def postRequest(url, params=None, timeout=10):
757
760
try :
758
761
resp = urllib .request .urlopen (req , params , timeout = timeout ) if params else urllib .request .urlopen (req , timeout = timeout )
759
762
except urllib .error .HTTPError as err :
760
- logger .error ("code=%s, reason=%s, body=%s" % (err .code , err .reason , err .fp .read ()))
763
+ if err .code == 403 :
764
+ logger .warning ("Your current token scope do not allow access to %s" % topic )
765
+ else :
766
+ logger .error ("code=%s, reason=%s, body=%s" % (err .code , err .reason , err .fp .read ()))
761
767
return None
762
768
else :
763
769
if params :
@@ -767,7 +773,10 @@ def postRequest(url, params=None, timeout=10):
767
773
try :
768
774
resp = urllib2 .urlopen (req , timeout = timeout )
769
775
except urllib2 .HTTPError as err :
770
- logger .error ("code=%s, reason=%s" % (err .code , err .reason ))
776
+ if err .code == 403 :
777
+ logger .warning ("Your current token scope do not allow access to %s" % topic )
778
+ else :
779
+ logger .error ("code=%s, reason=%s" % (err .code , err .reason ))
771
780
return None
772
781
data = b""
773
782
for buff in iter (lambda : resp .read (65535 ), b'' ): data += buff
0 commit comments