ecobee 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ecobee.rb +4 -1
- data/lib/ecobee/http.rb +2 -0
- data/lib/ecobee/token.rb +41 -26
- data/lib/ecobee/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 575fc2d302100473a36bfa0f69baa2e526411299
|
4
|
+
data.tar.gz: e51eddbffa9c14644f42b50c593e364ee29af2f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a69f91e5d21bdefd5bee37ee9ad4972b673a7c8c70a03479f5ac97ef4db283f75f426b11e2898e8d02470ff852f7566755be5f658a6928ce05732d66de54070c
|
7
|
+
data.tar.gz: c4905da53e6d28f7744008caa34267224f945e3b60396c87190b2b3d8a4af4b1c33267d5514b5b7b816c0cc17fc0a20eb573f8e72f1c101d4fd56182c379fc87
|
data/lib/ecobee.rb
CHANGED
@@ -14,6 +14,8 @@ module Ecobee
|
|
14
14
|
|
15
15
|
class AuthError < HTTPError ; end
|
16
16
|
|
17
|
+
class RetryAuthError < AuthError ; end
|
18
|
+
|
17
19
|
API_HOST = 'api.ecobee.com'
|
18
20
|
API_PORT = 443
|
19
21
|
API_URI_BASE= "https://#{API_HOST}:#{API_PORT}"
|
@@ -40,7 +42,8 @@ module Ecobee
|
|
40
42
|
|
41
43
|
MAX_LOG_LENGTH = 1200
|
42
44
|
|
43
|
-
|
45
|
+
AUTH_PAD = 30
|
46
|
+
REFRESH_PAD = 240
|
44
47
|
|
45
48
|
SCOPES = [:smartWrite, :smartRead]
|
46
49
|
DEFAULT_SCOPE = SCOPES[1]
|
data/lib/ecobee/http.rb
CHANGED
data/lib/ecobee/token.rb
CHANGED
@@ -7,7 +7,6 @@ module Ecobee
|
|
7
7
|
:callbacks,
|
8
8
|
:http,
|
9
9
|
:pin,
|
10
|
-
:refresh_token,
|
11
10
|
:result,
|
12
11
|
:status,
|
13
12
|
:scope,
|
@@ -51,11 +50,12 @@ module Ecobee
|
|
51
50
|
end
|
52
51
|
|
53
52
|
def access_token
|
53
|
+
config_load if access_token_expired?
|
54
54
|
if @access_token
|
55
55
|
if access_token_expired?
|
56
56
|
if @refresh_token
|
57
57
|
@http.log "access_token: refreshing #{@access_token}, #{@access_token_expire}, #{Time.now.to_i}"
|
58
|
-
|
58
|
+
refresh_access_token_wrapper
|
59
59
|
else
|
60
60
|
@http.log "access_token: token_register"
|
61
61
|
token_register
|
@@ -90,6 +90,7 @@ module Ecobee
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def config_load
|
93
|
+
# TODO: track file mod time & last_read to avoid excessive rereads
|
93
94
|
config = config_read_our_section
|
94
95
|
if @callbacks[:load].respond_to? :call
|
95
96
|
config = @callbacks[:load].call(config)
|
@@ -116,34 +117,44 @@ module Ecobee
|
|
116
117
|
"enter the PIN #{@pin || ''}"
|
117
118
|
end
|
118
119
|
|
119
|
-
def refresh_access_token
|
120
|
+
def refresh_access_token(retries: 0)
|
120
121
|
arg = sprintf("?grant_type=refresh_token&refresh_token=%s&client_id=%s",
|
121
|
-
|
122
|
+
refresh_token,
|
122
123
|
@app_key)
|
123
124
|
result = @http.post(arg: arg,
|
124
125
|
no_auth: true,
|
125
126
|
resource_prefix: 'token',
|
126
127
|
validate_status: false)
|
127
128
|
if result.key? 'error'
|
129
|
+
if retries > 0 && result['error'] == 'invalid_grant'
|
130
|
+
raise Ecobee::RetryAuthError.new
|
131
|
+
end
|
128
132
|
@access_token, @access_token_expire, @pin, @scope, @refresh_token = nil
|
129
133
|
config_save
|
130
|
-
raise Ecobee::AuthError.new(
|
131
|
-
|
132
|
-
|
133
|
-
)
|
134
|
+
raise Ecobee::AuthError.new("Result Error: (%s) %s" % [
|
135
|
+
result['error'],
|
136
|
+
result['error_description']])
|
134
137
|
else
|
135
|
-
|
136
|
-
@access_token_expire = Time.now.to_i + result['expires_in']
|
137
|
-
@pin = nil
|
138
|
-
@refresh_token = result['refresh_token']
|
139
|
-
@scope = result['scope']
|
140
|
-
@token_type = result['token_type']
|
141
|
-
@status = :ready
|
142
|
-
config_save
|
143
|
-
@access_token
|
138
|
+
result_load_to_memory result
|
144
139
|
end
|
145
140
|
end
|
146
141
|
|
142
|
+
def refresh_access_token_wrapper
|
143
|
+
retries = 3
|
144
|
+
retries.times do |attempt|
|
145
|
+
begin
|
146
|
+
refresh_access_token(retries: retries - attempt)
|
147
|
+
rescue Ecobee::RetryAuthError.new
|
148
|
+
sleep 10
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def refresh_token
|
154
|
+
config_load
|
155
|
+
@refresh_token
|
156
|
+
end
|
157
|
+
|
147
158
|
def register_callback(type, *callback, &block)
|
148
159
|
if block_given?
|
149
160
|
puts "Registering #{type}"
|
@@ -205,18 +216,22 @@ module Ecobee
|
|
205
216
|
)
|
206
217
|
end
|
207
218
|
else
|
208
|
-
|
209
|
-
@access_token = result['access_token']
|
210
|
-
@token_type = result['token_type']
|
211
|
-
@access_token_expire = Time.now.to_i + result['expires_in']
|
212
|
-
@refresh_token = result['refresh_token']
|
213
|
-
@scope = result['scope']
|
214
|
-
@pin = nil
|
215
|
-
config_save
|
216
|
-
@access_token
|
219
|
+
result_load_to_memory result
|
217
220
|
end
|
218
221
|
end
|
219
222
|
|
223
|
+
def result_load_to_memory(result)
|
224
|
+
@status = :ready
|
225
|
+
@access_token = result['access_token']
|
226
|
+
@access_token_expire = Time.now.to_i + result['expires_in']
|
227
|
+
@pin = nil
|
228
|
+
@refresh_token = result['refresh_token']
|
229
|
+
@scope = result['scope']
|
230
|
+
@token_type = result['token_type']
|
231
|
+
config_save
|
232
|
+
@access_token
|
233
|
+
end
|
234
|
+
|
220
235
|
def config_load_to_memory(config)
|
221
236
|
@app_key ||= config['app_key']
|
222
237
|
if !@access_token
|
data/lib/ecobee/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecobee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Zwissler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|