ecobee 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b62f3e7da3fde7ec3f2b62407f1f4f656179ff29
4
- data.tar.gz: 39a2c7d8f683b4094052ce433bc94d97064e6026
3
+ metadata.gz: 575fc2d302100473a36bfa0f69baa2e526411299
4
+ data.tar.gz: e51eddbffa9c14644f42b50c593e364ee29af2f0
5
5
  SHA512:
6
- metadata.gz: bc42968dec571366c148e4c6ebaf365be8c587bfeaf31355aa833302b474776bd95e8c8fc04c61ea207a3a26d81e49dcd540154994e615fe67e2097fe0778236
7
- data.tar.gz: a1d941292c3b5be46861e8020f03c515d85f3810009ad4eb7efbaea2dab1bd613a96b733aec772324ab8553a6982ea1309aceb240d142b094acf2037b5084592
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
- REFRESH_PAD = 30
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
@@ -110,6 +110,8 @@ class HTTPError < StandardError ; end
110
110
  Net::HTTP.start(API_HOST, API_PORT)
111
111
  end
112
112
  @http
113
+ rescue SocketError => msg
114
+ raise Ecobee::HTTPError.new("HTTP.http SocketError => #{msg}")
113
115
  end
114
116
 
115
117
  def open_log(log_file)
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
- refresh_access_token
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
- @refresh_token,
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
- "Result Error: (%s) %s" % [result['error'],
132
- result['error_description']]
133
- )
134
+ raise Ecobee::AuthError.new("Result Error: (%s) %s" % [
135
+ result['error'],
136
+ result['error_description']])
134
137
  else
135
- @access_token = result['access_token']
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
- @status = :ready
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
@@ -1,3 +1,3 @@
1
1
  module Ecobee
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
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.1
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-19 00:00:00.000000000 Z
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler