ewelink 3.2.0 → 3.3.0

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
  SHA256:
3
- metadata.gz: c9b83156bba48622088845d22bd8fc3b559d6e8732acf4664ba35886c6c19d35
4
- data.tar.gz: d69303e93b04b56fd713fc27220d15c4ab66ca767190a289d6440932dc468532
3
+ metadata.gz: 0663d2b0ebc1394f91996e8b8ee54954c8bf02b07b7cdec7448a7c0d2816a715
4
+ data.tar.gz: 4ad467928041577a73e382a241575c4ad9524c4c9d141df1e5689b673353bede
5
5
  SHA512:
6
- metadata.gz: fa3fd8b8a36ad7e4570db2941ebdffc1d134106ea40ce93866eaebe7b81a4cc0a35920f5366a48c0a9141476101cc03be42adf244b15bcf98eeec64b0e77a312
7
- data.tar.gz: d98f59eaec9c582dd0627a52a392c45e98e351676b69d36f081df4ec819153bd32e340ced77440152c674d58013f413d8e42a5e86a50f65d57efce5782f26943
6
+ metadata.gz: 529c2969099aa2db41238b5f4380f7a7dd69a68cf7e043546cc297fb43b8146b6fbe34ff1df19865de8bcf5b04d8bffbb20e274da7cb22da42b310cf808628b1
7
+ data.tar.gz: 6d74b68ecc5abfae875808286c1666ac793e1970104ea59e87ce34ccd3c0446baf82e0101e9406bbf6e6e08c23c957b275904d924ed480f11f3db4108901b4f7
data/README.mdown CHANGED
@@ -77,6 +77,9 @@ api.press_rf_bridge_button!(button[:uuid])
77
77
 
78
78
  ### Additional options
79
79
 
80
+ - `async_actions` (`true` | `false`): To perform actions (pressing an RF
81
+ bridge button or turning a switch on/off) in asynchronous mode. (default:
82
+ `false`).
80
83
  - `update_devices_status_on_connect` (`true` | `false`): To update devices
81
84
  status (on, off) when connecting to Ewelink API (default: `false`).
82
85
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.0
1
+ 3.3.0
data/ewelink.gemspec CHANGED
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.add_dependency 'activesupport', '>= 6.0.0', '< 7.0.0'
19
19
  s.add_dependency 'faye-websocket', '>= 0.11.0', '< 0.12.0'
20
20
  s.add_dependency 'httparty', '>= 0.18.0', '< 0.19.0'
21
+ s.add_dependency 'thread', '>= 0.2.0', '< 0.3.0'
21
22
 
22
23
  s.add_development_dependency 'byebug', '>= 11.0.0', '< 12.0.0'
23
- s.add_development_dependency 'rake', '>= 12.0.0', '< 13.0.0'
24
+ s.add_development_dependency 'rake', '>= 13.0.0', '< 14.0.0'
24
25
  end
data/lib/ewelink.rb CHANGED
@@ -10,6 +10,7 @@ require 'logger'
10
10
  require 'openssl'
11
11
  require 'optparse'
12
12
  require 'set'
13
+ require 'thread/pool'
13
14
  require 'timeout'
14
15
 
15
16
  module Ewelink
data/lib/ewelink/api.rb CHANGED
@@ -18,7 +18,8 @@ module Ewelink
18
18
 
19
19
  attr_reader :email, :password, :phone_number
20
20
 
21
- def initialize(email: nil, password:, phone_number: nil, update_devices_status_on_connect: false)
21
+ def initialize(async_actions: false, email: nil, password:, phone_number: nil, update_devices_status_on_connect: false)
22
+ @async_actions = async_actions.present?
22
23
  @email = email.presence.try(:strip)
23
24
  @mutexs = {}
24
25
  @password = password.presence || raise(Error.new(":password must be specified"))
@@ -32,25 +33,31 @@ module Ewelink
32
33
  start_web_socket_authentication_check_thread
33
34
  end
34
35
 
36
+ def async_actions?
37
+ @async_actions
38
+ end
39
+
35
40
  def press_rf_bridge_button!(uuid)
36
- synchronize(:press_rf_bridge_button) do
37
- button = find_rf_bridge_button!(uuid)
38
- web_socket_wait_for(-> { web_socket_authenticated? }, initialize_web_socket: true) do
39
- params = {
40
- 'action' => 'update',
41
- 'apikey' => button[:api_key],
42
- 'deviceid' => button[:device_id],
43
- 'params' => {
44
- 'cmd' => 'transmit',
45
- 'rfChl' => button[:channel],
46
- },
47
- 'sequence' => web_socket_sequence,
48
- 'ts' => 0,
49
- 'userAgent' => 'app',
50
- }
51
- Ewelink.logger.debug(self.class.name) { "Pressing RF bridge button #{button[:uuid].inspect}" }
52
- send_to_web_socket(JSON.generate(params))
53
- true
41
+ process_action do
42
+ synchronize(:press_rf_bridge_button) do
43
+ button = find_rf_bridge_button!(uuid)
44
+ web_socket_wait_for(-> { web_socket_authenticated? }, initialize_web_socket: true) do
45
+ params = {
46
+ 'action' => 'update',
47
+ 'apikey' => button[:api_key],
48
+ 'deviceid' => button[:device_id],
49
+ 'params' => {
50
+ 'cmd' => 'transmit',
51
+ 'rfChl' => button[:channel],
52
+ },
53
+ 'sequence' => web_socket_sequence,
54
+ 'ts' => 0,
55
+ 'userAgent' => 'app',
56
+ }
57
+ Ewelink.logger.debug(self.class.name) { "Pressing RF bridge button #{button[:uuid].inspect}" }
58
+ send_to_web_socket(JSON.generate(params))
59
+ true
60
+ end
54
61
  end
55
62
  end
56
63
  end
@@ -172,31 +179,33 @@ module Ewelink
172
179
  end
173
180
 
174
181
  def turn_switch!(uuid, on)
175
- if ['on', :on, 'true'].include?(on)
176
- on = true
177
- elsif ['off', :off, 'false'].include?(on)
178
- on = false
179
- end
180
- switch = find_switch!(uuid)
181
- @web_socket_switches_statuses[switch[:uuid]] = nil
182
- web_socket_wait_for(-> { web_socket_authenticated? }, initialize_web_socket: true) do
183
- params = {
184
- 'action' => 'update',
185
- 'apikey' => switch[:api_key],
186
- 'deviceid' => switch[:device_id],
187
- 'params' => {
188
- 'switch' => on ? 'on' : 'off',
189
- },
190
- 'sequence' => web_socket_sequence,
191
- 'ts' => 0,
192
- 'userAgent' => 'app',
193
- }
194
- Ewelink.logger.debug(self.class.name) { "Turning switch #{switch[:uuid].inspect} #{on ? 'on' : 'off'}" }
195
- send_to_web_socket(JSON.generate(params))
182
+ process_action do
183
+ if ['on', :on, 'true'].include?(on)
184
+ on = true
185
+ elsif ['off', :off, 'false'].include?(on)
186
+ on = false
187
+ end
188
+ switch = find_switch!(uuid)
189
+ @web_socket_switches_statuses[switch[:uuid]] = nil
190
+ web_socket_wait_for(-> { web_socket_authenticated? }, initialize_web_socket: true) do
191
+ params = {
192
+ 'action' => 'update',
193
+ 'apikey' => switch[:api_key],
194
+ 'deviceid' => switch[:device_id],
195
+ 'params' => {
196
+ 'switch' => on ? 'on' : 'off',
197
+ },
198
+ 'sequence' => web_socket_sequence,
199
+ 'ts' => 0,
200
+ 'userAgent' => 'app',
201
+ }
202
+ Ewelink.logger.debug(self.class.name) { "Turning switch #{switch[:uuid].inspect} #{on ? 'on' : 'off'}" }
203
+ send_to_web_socket(JSON.generate(params))
204
+ end
205
+ sleep(SWITCH_STATUS_CHANGE_CHECK_TIMEOUT)
206
+ switch_on?(switch[:uuid]) # Waiting for switch status update
207
+ true
196
208
  end
197
- sleep(SWITCH_STATUS_CHANGE_CHECK_TIMEOUT)
198
- switch_on?(switch[:uuid]) # Waiting for switch status update
199
- true
200
209
  end
201
210
 
202
211
  def update_devices_status_on_connect?
@@ -289,6 +298,13 @@ module Ewelink
289
298
  SecureRandom.hex[0, 8]
290
299
  end
291
300
 
301
+ def process_action(&block)
302
+ return yield unless async_actions?
303
+ @async_actions_thread_pool ||= Thread.pool(1)
304
+ @async_actions_thread_pool.process(&block)
305
+ nil
306
+ end
307
+
292
308
  def region
293
309
  @region ||= DEFAULT_REGION
294
310
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ewelink
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexis Toulotte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2021-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -70,6 +70,26 @@ dependencies:
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: 0.19.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: thread
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.2.0
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.3.0
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.2.0
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 0.3.0
73
93
  - !ruby/object:Gem::Dependency
74
94
  name: byebug
75
95
  requirement: !ruby/object:Gem::Requirement
@@ -96,20 +116,20 @@ dependencies:
96
116
  requirements:
97
117
  - - ">="
98
118
  - !ruby/object:Gem::Version
99
- version: 12.0.0
119
+ version: 13.0.0
100
120
  - - "<"
101
121
  - !ruby/object:Gem::Version
102
- version: 13.0.0
122
+ version: 14.0.0
103
123
  type: :development
104
124
  prerelease: false
105
125
  version_requirements: !ruby/object:Gem::Requirement
106
126
  requirements:
107
127
  - - ">="
108
128
  - !ruby/object:Gem::Version
109
- version: 12.0.0
129
+ version: 13.0.0
110
130
  - - "<"
111
131
  - !ruby/object:Gem::Version
112
- version: 13.0.0
132
+ version: 14.0.0
113
133
  description: Manage eWeLink smart home devices
114
134
  email: al@alweb.org
115
135
  executables: