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 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