Skip to content

Commit 8f592f5

Browse files
sprinklerzagy
andauthored
Update Netatmo parser to use a pre-generated access/refresh token (#38)
Generating those tokens is offered in the Netatmo UI so this is rather easy to get. I assume an initial expiry of 1h (3600s) of the access token. see https://support.rainmachine.com/hc/en-us/community/posts/4433188885271-Failed-to-get-oAuth-token-NETATMO-Authentication-failure- for a potential official fix Co-authored-by: Christian Zagrodnick <cz@flyingcircus.io>
1 parent 010df91 commit 8f592f5

File tree

1 file changed

+11
-44
lines changed

1 file changed

+11
-44
lines changed

sdk-parsers/RMParserFramework/parsers/personalnetatmo-parser.py

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@ class PersonalNetatmo(RMParser):
1616
parserInterval = 6 * 3600
1717

1818
refreshToken = None
19-
username = None
20-
password = None
2119

2220
params = {
23-
"username": ""
24-
, "password": ""
21+
"accessToken": ""
22+
, "refreshToken": ""
2523
, "clientID": ""
2624
, "clientSecret": ""
2725
, "useSpecifiedModules": False
@@ -45,30 +43,19 @@ def perform(self):
4543
self.clientSecret = self.params["clientSecret"]
4644
self.clientID = self.params["clientID"]
4745

48-
if self.username is None:
49-
self.username = self.params["username"]
50-
self.password = self.params["password"]
51-
52-
if self.password is None or self.username is None:
53-
self.lastKnownError = "Error: Invalid username or password."
54-
log.error(self.lastKnownError)
55-
return
56-
57-
if self.username != self.params["username"]:
58-
self.username = self.params["username"]
59-
self.password = self.params["password"]
60-
self.clientOauth()
6146
if self.accessToken is not None:
6247
self.renewAccesTokenIfNeeded()
6348

6449
if self.accessToken is None:
6550
log.info("Doing full auth")
66-
self.clientOauth()
51+
self.accessToken = self.params['accessToken']
52+
self.refreshToken = self.params['refreshToken']
53+
self.accessTokenExpiration = time.time() + 3600
6754

68-
if self.accessToken is None:
69-
self.lastKnownError = "Error: Authentication failure"
70-
log.error(self.lastKnownError)
71-
return
55+
# if self.accessToken is None:
56+
# self.lastKnownError = "Error: Authentication failure"
57+
# log.error(self.lastKnownError)
58+
# return
7259

7360
self.getData()
7461
tsStartOfDayUTC = rmCurrentDayTimestamp()
@@ -213,8 +200,8 @@ def renewAccesTokenIfNeeded(self):
213200
"client_secret" : self.clientSecret
214201
}
215202
response = self.postRequest(self.authReq, postParams)
216-
self.accessToken = response['access_token']
217-
self.refreshToken = response['refresh_token']
203+
self.accessToken = self.params['accessToken'] =response['access_token']
204+
self.refreshToken = self.params['refreshToken'] = response['refresh_token']
218205
self.accessTokenExpiration = int(response['expire_in']) + time.time()
219206
return True
220207
except:
@@ -225,26 +212,6 @@ def renewAccesTokenIfNeeded(self):
225212

226213
return False
227214

228-
def clientOauth(self):
229-
postParams = {
230-
"grant_type" : "password",
231-
"client_id" : self.clientID,
232-
"client_secret" : self.clientSecret,
233-
"username" : self.username,
234-
"password" : self.password,
235-
"scope" : "read_station"
236-
}
237-
try:
238-
resp = self.postRequest(self.authReq, postParams)
239-
self.accessToken = resp['access_token']
240-
self.refreshToken = resp['refresh_token']
241-
self.accessTokenExpiration = int(resp['expire_in']) + time.time()
242-
except:
243-
log.error("Failed to get oAuth token")
244-
return False
245-
246-
return True
247-
248215
def getData(self):
249216
postParams = {
250217
"access_token" : self.accessToken,

0 commit comments

Comments
 (0)