hue_switch 1.0.4 → 1.0.5

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: 64adcd5e85bbb5a263ef1fa50f507a3e03332577
4
- data.tar.gz: edb437f0c473f4a26f5e1836cc5bb74caa854f6e
3
+ metadata.gz: 0436b41204a89e0553f8014d4e2e1765f5a72c8b
4
+ data.tar.gz: 4a0e10572daa901e68c7efaf76285e90f07ed93c
5
5
  SHA512:
6
- metadata.gz: fdcffe7324e1f9a864b209a42cd0b89ab803aa8ff0ada99b941f77b067569c82efc7254a75ed712f83ae7753304ffddb926785c3c012745d87145dc2cb1690a8
7
- data.tar.gz: 2739f12f7e324e388b2449e68151807a1420c4c850ef918f914ec7fe794c2c4298bb295ceb0c341b189cbd21bad6db873c83fefd0c45dd9e7c9925f02fcda709
6
+ metadata.gz: aa736f8cfdf609b955eaa7111aad12c9f65e14345da7760095153fc10121dd94ef9b2093d59f28f256904210287e85cb569abf6e03222112dd04662bbe0b2c65
7
+ data.tar.gz: 7b111dc0b67e3445cd9f31a1f0caf0e293dde6a8c2b9a16a3096c08b98da3d2ef39507e5070bec77ddf7e985b53caee737c512ec96e0eefc40dba3ca804ca091
data/Gemfile.lock ADDED
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hue_switch (1.0.5)
5
+ chronic (~> 0.10.0)
6
+ chronic_duration (~> 0)
7
+ httparty (~> 0.13.0)
8
+ numbers_in_words (~> 0.2.0)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ activesupport (4.2.4)
14
+ i18n (~> 0.7)
15
+ json (~> 1.7, >= 1.7.7)
16
+ minitest (~> 5.1)
17
+ thread_safe (~> 0.3, >= 0.3.4)
18
+ tzinfo (~> 1.1)
19
+ chronic (0.10.2)
20
+ chronic_duration (0.10.6)
21
+ numerizer (~> 0.1.1)
22
+ diff-lcs (1.1.3)
23
+ httparty (0.13.5)
24
+ json (~> 1.8)
25
+ multi_xml (>= 0.5.2)
26
+ i18n (0.7.0)
27
+ json (1.8.3)
28
+ minitest (5.8.0)
29
+ multi_xml (0.5.5)
30
+ numbers_in_words (0.2.0)
31
+ activesupport
32
+ numerizer (0.1.1)
33
+ rake (10.4.2)
34
+ rspec (2.4.0)
35
+ rspec-core (~> 2.4.0)
36
+ rspec-expectations (~> 2.4.0)
37
+ rspec-mocks (~> 2.4.0)
38
+ rspec-core (2.4.0)
39
+ rspec-expectations (2.4.0)
40
+ diff-lcs (~> 1.1.2)
41
+ rspec-mocks (2.4.0)
42
+ thread_safe (0.3.5)
43
+ tzinfo (1.2.2)
44
+ thread_safe (~> 0.1)
45
+
46
+ PLATFORMS
47
+ ruby
48
+
49
+ DEPENDENCIES
50
+ bundler (~> 1.9)
51
+ hue_switch!
52
+ rake (~> 10.0)
53
+ rspec (~> 2.4, >= 2.4.0)
54
+
55
+ BUNDLED WITH
56
+ 1.10.3
@@ -1,3 +1,3 @@
1
1
  module HueSwitch
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
data/lib/hue_switch.rb CHANGED
@@ -3,13 +3,26 @@ require 'chronic_duration'
3
3
  require 'httparty'
4
4
  require 'numbers_in_words'
5
5
  require 'numbers_in_words/duck_punch'
6
+ require 'timeout'
6
7
 
7
8
  class Switch
8
9
  attr_accessor :command, :lights_array, :_group, :body, :schedule_params, :schedule_ids
9
10
  def initialize(command = "", _group = 0, &block)
10
11
 
11
12
  @user = "1234567890"
12
- @ip = HTTParty.get("https://www.meethue.com/api/nupnp").first["internalipaddress"]
13
+ begin
14
+ Timeout::timeout(5) {
15
+ @ip = HTTParty.get("https://www.meethue.com/api/nupnp").first["internalipaddress"]
16
+ }
17
+ rescue Timeout::Error
18
+ "Time Out"
19
+ rescue NoMethodError
20
+ "Cannot Find Bridge"
21
+ rescue Errno::ECONNREFUSED
22
+ "connection refused"
23
+ rescue SocketError
24
+ "Cannot connect to local network"
25
+ end
13
26
 
14
27
  authorize_user
15
28
  populate_switch
@@ -23,22 +36,6 @@ class Switch
23
36
  instance_eval(&block) if block_given?
24
37
  end
25
38
 
26
- def authorize_user
27
- unless HTTParty.get("http://#{@ip}/api/#{@user}/config").include?("whitelist")
28
- if HTTParty.post("http://#{@ip}/api", :body => ({:devicetype => "Hue_Switch", :username=>"1234567890"}).to_json).first.include?("error")
29
- raise "You need to press the link button on the bridge and run again"
30
- end
31
- end
32
- end
33
-
34
- def populate_switch
35
- @colors = {red: 65280, pink: 56100, purple: 52180, violet: 47188, blue: 46920, turquoise: 31146, green: 25500, yellow: 12750, orange: 8618}
36
- @mired_colors = {candle: 500, relax: 467, reading: 346, neutral: 300, concentrate: 231, energize: 136}
37
- @scenes = [] ; HTTParty.get("http://#{@ip}/api/#{@user}/scenes").keys.each { |k| @scenes.push(k) }
38
- @groups = {} ; HTTParty.get("http://#{@ip}/api/#{@user}/groups").each { |k,v| @groups["#{v['name']}".downcase] = k } ; @groups["all"] = "0"
39
- @lights = {} ; HTTParty.get("http://#{@ip}/api/#{@user}/lights").each { |k,v| @lights["#{v['name']}".downcase] = k }
40
- end
41
-
42
39
  def hue (numeric_value)
43
40
  clear_attributes
44
41
  self.body[:hue] = numeric_value
@@ -51,8 +48,11 @@ class Switch
51
48
 
52
49
  def color(color_name)
53
50
  clear_attributes
54
- @colors.keys.include?(color_name.to_sym) ?
55
- self.body[:hue] = @colors[color_name.to_sym] : self.body[:ct] = @mired_colors[color_name.to_sym]
51
+ if @colors.keys.include?(color_name.to_sym)
52
+ self.body[:hue] = @colors[color_name.to_sym]
53
+ else
54
+ self.body[:ct] = @mired_colors[color_name.to_sym]
55
+ end
56
56
  end
57
57
 
58
58
  def saturation(depth)
@@ -149,38 +149,7 @@ class Switch
149
149
 
150
150
  # Parses times in words (e.g., "eight forty five") to standard HH:MM format
151
151
 
152
- def numbers_to_times(numbers)
153
- numbers.map!(&:in_numbers)
154
- numbers.map!(&:to_s)
155
- numbers.push("0") if numbers[1] == nil
156
- numbers = numbers.shift + ':' + (numbers[0].to_i + numbers[1].to_i).to_s
157
- numbers.gsub!(':', ':0') if numbers.split(":")[1].length < 2
158
- numbers
159
- end
160
-
161
- def parse_time(string)
162
- string.sub!(" noon", " twelve in the afternoon")
163
- string.sub!("midnight", "twelve in the morning")
164
- time_modifier = string.downcase.scan(/(evening)|(night|tonight)|(afternoon)|(pm)|(a.m.)|(morning)|(today)/).flatten.compact.first
165
- guess = Time.now.strftime('%H').to_i >= 12 ? "p.m." : "a.m."
166
- time_modifier = time_modifier.nil? ? guess : time_modifier
167
- day_modifier = string.scan(/(tomorrow)|(next )?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)/).flatten.compact.join(' ')
168
- numbers_in_words = string.scan(Regexp.union((1..59).map(&:in_words)))
169
- set_time = numbers_to_times(numbers_in_words)
170
- set_time = Chronic.parse(day_modifier + ' ' + set_time + ' ' + time_modifier)
171
- end
172
-
173
- def set_time(string)
174
- if string.scan(/ seconds?| minutes?| hours?| days?| weeks?/).any?
175
- set_time = Time.now + ChronicDuration.parse(string)
176
- elsif string.scan(/\d/).any?
177
- set_time = Chronic.parse(string)
178
- else
179
- set_time = parse_time(string)
180
- end
181
- end
182
-
183
- def schedule (on_or_off = :default, string)
152
+ def schedule (string, on_or_off = :default)
184
153
  self.body[:on] = true if on_or_off == :on
185
154
  self.body[:on] = false if on_or_off == :off
186
155
  set_time = set_time(string)
@@ -253,7 +222,24 @@ class Switch
253
222
  self.voice command
254
223
  end
255
224
 
256
- #The rest of the methods allow access to most of the Switch class functionality by supplying a single string.
225
+ #The rest of the methods allow access to most of the Switch class functionality by supplying a single string
226
+
227
+ def voice(string)
228
+ self.reset
229
+ self.command << string
230
+
231
+ parse_voice(string)
232
+
233
+ if self.command.include?("schedule")
234
+ state = string.match(/off|on/)[0].to_sym rescue nil
235
+ self.send("schedule", *[string, state])
236
+ else
237
+ string.include?(' off') ? self.send("off") : self.send("on")
238
+ end
239
+ end
240
+
241
+ private
242
+
257
243
  def parse_leading(methods)
258
244
  methods.each do |l|
259
245
  capture = (self.command.match (/\b#{l}\s\w+/)).to_s.split(' ')
@@ -282,7 +268,6 @@ class Switch
282
268
 
283
269
  def parse_scene(scene_name)
284
270
  scene_name.gsub!(' ','-') if scene_name.size > 1
285
- p scene_name
286
271
  self.send("scene", scene_name)
287
272
  end
288
273
 
@@ -305,18 +290,57 @@ class Switch
305
290
  parse_save_scene if self.command.scan(/save (scene|seen) as/).length > 0
306
291
  end
307
292
 
308
- def voice(string)
309
- self.reset
310
- self.command << string
293
+ def numbers_to_times(numbers)
294
+ numbers.map!(&:in_numbers)
295
+ numbers.map!(&:to_s)
296
+ numbers.push("0") if numbers[1] == nil
297
+ numbers = numbers.shift + ':' + (numbers[0].to_i + numbers[1].to_i).to_s
298
+ numbers.gsub!(':', ':0') if numbers.split(":")[1].length < 2
299
+ numbers
300
+ end
311
301
 
312
- parse_voice(string)
302
+ def parse_time(string)
303
+ string.sub!(" noon", " twelve in the afternoon")
304
+ string.sub!("midnight", "twelve in the morning")
305
+ time_modifier = string.downcase.scan(/(evening)|(night|tonight)|(afternoon)|(pm)|(a.m.)|(am)|(p.m.)|(morning)|(today)/).flatten.compact.first
306
+ guess = Time.now.strftime('%H').to_i >= 12 ? "p.m." : "a.m."
307
+ time_modifier = time_modifier.nil? ? guess : time_modifier
308
+ day_modifier = string.scan(/(tomorrow)|(next )?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)/).flatten.compact.join(' ')
309
+ numbers_in_words = string.scan(Regexp.union((1..59).map(&:in_words)))
310
+ set_time = numbers_to_times(numbers_in_words)
311
+ set_time = Chronic.parse(day_modifier + ' ' + set_time + ' ' + time_modifier)
312
+ end
313
313
 
314
- if self.command.include?("schedule")
315
- self.body[:on] = true if string.include?(' on')
316
- self.body[:on] = false if string.include?(' off')
317
- self.send("schedule", string)
314
+ def set_time(string)
315
+ if string.scan(/ seconds?| minutes?| hours?| days?| weeks?/).any?
316
+ set_time = string.partition("in").last.strip!
317
+ set_time = Time.now + ChronicDuration.parse(string)
318
+ elsif string.scan(/\d/).any?
319
+ set_time = string.partition("at").last.strip!
320
+ set_time = Chronic.parse(set_time)
318
321
  else
319
- string.include?(' off') ? self.send("off") : self.send("on")
320
- end
322
+ set_time = string.partition("at").last.strip!
323
+ set_time = parse_time(set_time)
324
+ end
325
+ end
326
+
327
+ def authorize_user
328
+ begin
329
+ unless HTTParty.get("http://#{@ip}/api/#{@user}/config").include?("whitelist")
330
+ if HTTParty.post("http://#{@ip}/api", :body => ({:devicetype => "Hue_Switch", :username=>"1234567890"}).to_json).first.include?("error")
331
+ raise "You need to press the link button on the bridge and run again"
332
+ end
333
+ end
334
+ rescue Errno::ECONNREFUSED
335
+ "Cannot Reach Bridge"
336
+ end
337
+ end
338
+
339
+ def populate_switch
340
+ @colors = {red: 65280, pink: 56100, purple: 52180, violet: 47188, blue: 46920, turquoise: 31146, green: 25500, yellow: 12750, orange: 8618}
341
+ @mired_colors = {candle: 500, relax: 467, reading: 346, neutral: 300, concentrate: 231, energize: 136}
342
+ @scenes = [] ; HTTParty.get("http://#{@ip}/api/#{@user}/scenes").keys.each { |k| @scenes.push(k) }
343
+ @groups = {} ; HTTParty.get("http://#{@ip}/api/#{@user}/groups").each { |k,v| @groups["#{v['name']}".downcase] = k } ; @groups["all"] = "0"
344
+ @lights = {} ; HTTParty.get("http://#{@ip}/api/#{@user}/lights").each { |k,v| @lights["#{v['name']}".downcase] = k }
321
345
  end
322
346
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hue_switch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - sarkonovich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-06-11 00:00:00.000000000 Z
11
+ date: 2015-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chronic
@@ -122,9 +122,8 @@ executables: []
122
122
  extensions: []
123
123
  extra_rdoc_files: []
124
124
  files:
125
- - ".gitignore"
126
- - ".travis.yml"
127
125
  - Gemfile
126
+ - Gemfile.lock
128
127
  - README.md
129
128
  - Rakefile
130
129
  - bin/console
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
data/.travis.yml DELETED
@@ -1,3 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.1