ruby_hue 0.0.1 → 0.1.0
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.
- data/CHANGELOG.md +3 -0
- data/README.md +51 -2
- data/lib/ruby_hue.rb +9 -9
- data/lib/ruby_hue/bridge.rb +3 -4
- data/lib/ruby_hue/light/basic_state.rb +45 -0
- data/lib/ruby_hue/light/state.rb +1 -39
- data/lib/ruby_hue/lights_collection.rb +27 -0
- data/lib/ruby_hue/lights_collection_state.rb +23 -0
- data/lib/ruby_hue/version.rb +1 -1
- data/spec/ruby_hue/bridge_spec.rb +2 -7
- data/spec/ruby_hue/light/state_spec.rb +2 -25
- data/spec/ruby_hue/lights_collection_spec.rb +36 -0
- data/spec/ruby_hue/lights_collection_state_spec.rb +23 -0
- data/spec/support/behavior/state_examples.rb +25 -0
- metadata +12 -7
- data/lib/ruby_hue/configuration.rb +0 -5
- data/spec/ruby_hue/configuration_spec.rb +0 -13
- data/spec/ruby_hue/ruby_hue_spec.rb +0 -9
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# RubyHue
|
2
2
|
|
3
|
-
|
3
|
+
RubyHue is a library to interact with Hue lights.
|
4
|
+
|
5
|
+
http://meethue.com/
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -18,7 +20,54 @@ Or install it yourself as:
|
|
18
20
|
|
19
21
|
## Usage
|
20
22
|
|
21
|
-
|
23
|
+
RubyHue starts mostly at the Bridge class.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
bridge = RubyHue::Bridge.new("192.168.1.100", "yourbridgeusername")
|
27
|
+
```
|
28
|
+
|
29
|
+
To get all lights for the bridge:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
bridge = RubyHue::Bridge.new("192.168.1.100", "yourbridgeusername")
|
33
|
+
lights = bridge.lights
|
34
|
+
|
35
|
+
lights.state.on = true
|
36
|
+
lights.state.save # This will turn on all lights on the bridge
|
37
|
+
```
|
38
|
+
|
39
|
+
### Light Usage
|
40
|
+
|
41
|
+
RubyHue comes with a Light class that you initialize with an ID and Bridge instance. Most interactions will happen with an instance of this class.
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
bridge = RubyHue::Bridge.new("192.168.1.100", "yourbridgeusername")
|
45
|
+
light = RubyHue::Light.new("1", bridge)
|
46
|
+
```
|
47
|
+
|
48
|
+
Now you're ready to ask for the current state of the light (on, brightness, hue, etc...)
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
light = RubyHue::Light.new("1", bridge)
|
52
|
+
light.state.brightness
|
53
|
+
# => 50
|
54
|
+
|
55
|
+
light.state.brightness = 255
|
56
|
+
light.state.save
|
57
|
+
#=> [{"success"=>{"/lights/1/state/bri"=>255}}, ....
|
58
|
+
```
|
59
|
+
|
60
|
+
Here's the list of states you can change:
|
61
|
+
|
62
|
+
* `on` (true, false)
|
63
|
+
* `brightness` (0..255)
|
64
|
+
* `hue` (0..65535)
|
65
|
+
* `saturation` (0..255)
|
66
|
+
* `xy` See http://developers.meethue.com/coreconcepts.html#color_gets_more_complicated
|
67
|
+
* `color_temperature`
|
68
|
+
* `alert` ("none", "select", "lselect")
|
69
|
+
* `effect` ("none", "colorloop")
|
70
|
+
|
22
71
|
|
23
72
|
## Contributing
|
24
73
|
|
data/lib/ruby_hue.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require "ruby_hue/version"
|
2
|
-
require "ruby_hue/client"
|
3
|
-
require "ruby_hue/configuration"
|
4
|
-
require "ruby_hue/model"
|
5
|
-
require "ruby_hue/light"
|
6
|
-
require "ruby_hue/light/state"
|
7
|
-
require "ruby_hue/bridge"
|
8
2
|
|
9
3
|
module RubyHue
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
autoload :Client, "ruby_hue/client"
|
5
|
+
autoload :Bridge, "ruby_hue/bridge"
|
6
|
+
autoload :Model, "ruby_hue/model"
|
7
|
+
autoload :Light, "ruby_hue/light"
|
8
|
+
autoload :LightsCollection, "ruby_hue/lights_collection"
|
9
|
+
autoload :LightsCollectionState, "ruby_hue/lights_collection_state"
|
13
10
|
end
|
11
|
+
|
12
|
+
require "ruby_hue/light/basic_state"
|
13
|
+
require "ruby_hue/light/state"
|
data/lib/ruby_hue/bridge.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module RubyHue
|
2
2
|
class Bridge
|
3
|
-
attr_reader :ip_address
|
3
|
+
attr_reader :ip_address
|
4
|
+
attr_accessor :username
|
4
5
|
|
5
6
|
class << self
|
6
7
|
def all
|
@@ -20,9 +21,7 @@ module RubyHue
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def lights
|
23
|
-
|
24
|
-
RubyHue::Light.new(id, self)
|
25
|
-
end
|
24
|
+
@lights ||= LightsCollection.new(self)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module RubyHue
|
2
|
+
class Light
|
3
|
+
module BasicState
|
4
|
+
MAPPING = {
|
5
|
+
on: :on,
|
6
|
+
bri: :brightness,
|
7
|
+
hue: :hue,
|
8
|
+
sat: :saturation,
|
9
|
+
xy: :xy,
|
10
|
+
ct: :color_temperature,
|
11
|
+
alert: :alert,
|
12
|
+
effect: :effect,
|
13
|
+
colormode: :color_mode,
|
14
|
+
reachable: :reachable
|
15
|
+
}
|
16
|
+
|
17
|
+
IMMUTABLE_KEYS = %w(colormode reachable)
|
18
|
+
|
19
|
+
attr_writer :state
|
20
|
+
|
21
|
+
def updateable_state
|
22
|
+
state.reject do |key, value|
|
23
|
+
IMMUTABLE_KEYS.include? key
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def state
|
28
|
+
@state ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
MAPPING.each do |hue_key, method_name|
|
32
|
+
hue_key = hue_key.to_s
|
33
|
+
define_method method_name do
|
34
|
+
state[hue_key]
|
35
|
+
end
|
36
|
+
|
37
|
+
unless IMMUTABLE_KEYS.include?(hue_key)
|
38
|
+
define_method "#{method_name}=".to_sym do |new_value|
|
39
|
+
state[hue_key] = new_value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/ruby_hue/light/state.rb
CHANGED
@@ -3,22 +3,7 @@ require "json"
|
|
3
3
|
module RubyHue
|
4
4
|
class Light
|
5
5
|
class State
|
6
|
-
|
7
|
-
on: :on,
|
8
|
-
bri: :brightness,
|
9
|
-
hue: :hue,
|
10
|
-
sat: :saturation,
|
11
|
-
xy: :xy,
|
12
|
-
ct: :color_temperature,
|
13
|
-
alert: :alert,
|
14
|
-
effect: :effect,
|
15
|
-
colormode: :color_mode,
|
16
|
-
reachable: :reachable
|
17
|
-
}
|
18
|
-
|
19
|
-
IMMUTABLE_KEYS = %w(colormode reachable)
|
20
|
-
|
21
|
-
attr_writer :state
|
6
|
+
include BasicState
|
22
7
|
attr_reader :light
|
23
8
|
|
24
9
|
def initialize(light, state)
|
@@ -26,10 +11,6 @@ module RubyHue
|
|
26
11
|
@state = state
|
27
12
|
end
|
28
13
|
|
29
|
-
def state
|
30
|
-
@state ||= {}
|
31
|
-
end
|
32
|
-
|
33
14
|
def save
|
34
15
|
url = bridge.resource_url_for("lights/#{light.id}/state")
|
35
16
|
body = JSON.generate updateable_state
|
@@ -39,25 +20,6 @@ module RubyHue
|
|
39
20
|
def bridge
|
40
21
|
light.bridge
|
41
22
|
end
|
42
|
-
|
43
|
-
def updateable_state
|
44
|
-
@state.reject do |key, value|
|
45
|
-
IMMUTABLE_KEYS.include? key
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
MAPPING.each do |hue_key, method_name|
|
50
|
-
hue_key = hue_key.to_s
|
51
|
-
define_method method_name do
|
52
|
-
@state[hue_key]
|
53
|
-
end
|
54
|
-
|
55
|
-
unless IMMUTABLE_KEYS.include?(hue_key)
|
56
|
-
define_method "#{method_name}=".to_sym do |new_value|
|
57
|
-
@state[hue_key] = new_value
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
23
|
end
|
62
24
|
end
|
63
25
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RubyHue
|
2
|
+
class LightsCollection
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :bridge
|
6
|
+
|
7
|
+
def initialize(bridge)
|
8
|
+
@bridge = bridge
|
9
|
+
end
|
10
|
+
|
11
|
+
def lights
|
12
|
+
Client.get_and_parse(bridge.resource_url_for("lights")).map do |id, light|
|
13
|
+
RubyHue::Light.new(id, self)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def state
|
18
|
+
@state ||= LightsCollectionState.new(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
lights.each do |light|
|
23
|
+
yield light
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RubyHue
|
2
|
+
class LightsCollectionState
|
3
|
+
include Light::BasicState
|
4
|
+
|
5
|
+
attr_reader :collection
|
6
|
+
|
7
|
+
def initialize(collection)
|
8
|
+
@collection = collection
|
9
|
+
end
|
10
|
+
|
11
|
+
def bridge
|
12
|
+
collection.bridge
|
13
|
+
end
|
14
|
+
|
15
|
+
def save
|
16
|
+
collection.each do |light|
|
17
|
+
url = bridge.resource_url_for("lights/#{light.id}/state")
|
18
|
+
body = JSON.generate updateable_state
|
19
|
+
Client.put_and_parse(url, body: body)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ruby_hue/version.rb
CHANGED
@@ -35,13 +35,8 @@ describe RubyHue::Bridge do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe "#lights" do
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
it "returns a collection of light objects" do
|
43
|
-
RubyHue::Light.should_receive(:new).with(kind_of(String), kind_of(RubyHue::Bridge)).exactly(3).times
|
44
|
-
bridge.lights
|
38
|
+
it "returns a light collection" do
|
39
|
+
expect(bridge.lights).to be_kind_of RubyHue::LightsCollection
|
45
40
|
end
|
46
41
|
end
|
47
42
|
end
|
@@ -10,6 +10,8 @@ describe RubyHue::Light::State do
|
|
10
10
|
to_return(body: fixture("light_1.json"))
|
11
11
|
end
|
12
12
|
|
13
|
+
it_behaves_like "basic state"
|
14
|
+
|
13
15
|
describe "#initialize" do
|
14
16
|
let(:instance) { described_class.new(light, state_hash) }
|
15
17
|
|
@@ -28,23 +30,6 @@ describe RubyHue::Light::State do
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
describe "getter methods" do
|
32
|
-
let(:method_mapping) { method_mapping = described_class::MAPPING }
|
33
|
-
|
34
|
-
it "responds to all keys available for a state" do
|
35
|
-
method_mapping.each do |hue_key, ruby_hue_method|
|
36
|
-
expect(subject.state).to have_key hue_key.to_s
|
37
|
-
expect(subject).to respond_to ruby_hue_method
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
it "returns the value for a state" do
|
42
|
-
method_mapping.each do |hue_key, ruby_hue_method|
|
43
|
-
expect(subject.send(ruby_hue_method)).to eq(subject.state[hue_key.to_s])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
33
|
describe "#save" do
|
49
34
|
let!(:state_request_stub) do
|
50
35
|
stub_request(:put, bridge.resource_url_for("lights/#{light.id}/state")).to_return(body: "{}")
|
@@ -55,12 +40,4 @@ describe RubyHue::Light::State do
|
|
55
40
|
expect(state_request_stub).to have_been_requested
|
56
41
|
end
|
57
42
|
end
|
58
|
-
|
59
|
-
describe "#updateable_state" do
|
60
|
-
it "does not include immutable values" do
|
61
|
-
described_class::IMMUTABLE_KEYS.each do |key|
|
62
|
-
expect(subject.updateable_state.keys).not_to include key
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
43
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RubyHue::LightsCollection do
|
4
|
+
let(:bridge) { RubyHue::Bridge.new("127.0.0.1", "username") }
|
5
|
+
subject { described_class.new(bridge) }
|
6
|
+
|
7
|
+
describe "#initialize" do
|
8
|
+
it "accepts a bridge" do
|
9
|
+
expect { described_class.new(bridge) }.to_not raise_error
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#lights" do
|
14
|
+
before do
|
15
|
+
stub_request(:get, bridge.resource_url_for("lights")).to_return(body: fixture("lights.json"))
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns 3 light objects" do
|
19
|
+
expect(subject).to have(3).lights
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#state" do
|
24
|
+
it "returns a collection state object" do
|
25
|
+
expect(subject.state).to be_kind_of RubyHue::LightsCollectionState
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#each" do
|
30
|
+
before { subject.stub(lights: [RubyHue::Light.new(1, bridge)]) }
|
31
|
+
|
32
|
+
it "yields a light object" do
|
33
|
+
expect {|b| subject.each(&b) }.to yield_with_args(kind_of(RubyHue::Light))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RubyHue::LightsCollectionState do
|
4
|
+
let(:bridge) { RubyHue::Bridge.new("127.0.0.1", "username") }
|
5
|
+
let(:light_collection) { RubyHue::LightsCollection.new(bridge) }
|
6
|
+
subject { described_class.new(light_collection) }
|
7
|
+
|
8
|
+
it_behaves_like "basic state"
|
9
|
+
|
10
|
+
describe "#save" do
|
11
|
+
let(:light) { double("light", id: 1) }
|
12
|
+
let!(:state_request_stub) do
|
13
|
+
stub_request(:put, bridge.resource_url_for("lights/#{light.id}/state")).to_return(body: "{}")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "changes the state for all of the lights" do
|
17
|
+
light_collection.stub(lights: [light])
|
18
|
+
subject.on = true
|
19
|
+
subject.save
|
20
|
+
expect(state_request_stub).to have_been_requested
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
shared_examples_for "basic state" do
|
2
|
+
describe "getter methods" do
|
3
|
+
let(:method_mapping) { method_mapping = RubyHue::Light::BasicState::MAPPING }
|
4
|
+
|
5
|
+
it "responds to all keys available for a state" do
|
6
|
+
method_mapping.each do |hue_key, ruby_hue_method|
|
7
|
+
expect(subject).to respond_to ruby_hue_method
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "returns the value for a state" do
|
12
|
+
method_mapping.each do |hue_key, ruby_hue_method|
|
13
|
+
expect(subject.send(ruby_hue_method)).to eq(subject.state[hue_key.to_s])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#updateable_state" do
|
19
|
+
it "does not include immutable values" do
|
20
|
+
RubyHue::Light::BasicState::IMMUTABLE_KEYS.each do |key|
|
21
|
+
expect(subject.updateable_state.keys).not_to include key
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_hue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -132,6 +132,7 @@ extra_rdoc_files: []
|
|
132
132
|
files:
|
133
133
|
- .gitignore
|
134
134
|
- .rspec
|
135
|
+
- CHANGELOG.md
|
135
136
|
- Gemfile
|
136
137
|
- Guardfile
|
137
138
|
- LICENSE.txt
|
@@ -140,9 +141,11 @@ files:
|
|
140
141
|
- lib/ruby_hue.rb
|
141
142
|
- lib/ruby_hue/bridge.rb
|
142
143
|
- lib/ruby_hue/client.rb
|
143
|
-
- lib/ruby_hue/configuration.rb
|
144
144
|
- lib/ruby_hue/light.rb
|
145
|
+
- lib/ruby_hue/light/basic_state.rb
|
145
146
|
- lib/ruby_hue/light/state.rb
|
147
|
+
- lib/ruby_hue/lights_collection.rb
|
148
|
+
- lib/ruby_hue/lights_collection_state.rb
|
146
149
|
- lib/ruby_hue/model.rb
|
147
150
|
- lib/ruby_hue/version.rb
|
148
151
|
- ruby_hue.gemspec
|
@@ -152,12 +155,13 @@ files:
|
|
152
155
|
- spec/fixtures/responses/lights.json
|
153
156
|
- spec/ruby_hue/bridge_spec.rb
|
154
157
|
- spec/ruby_hue/client_spec.rb
|
155
|
-
- spec/ruby_hue/configuration_spec.rb
|
156
158
|
- spec/ruby_hue/light/state_spec.rb
|
157
159
|
- spec/ruby_hue/light_spec.rb
|
160
|
+
- spec/ruby_hue/lights_collection_spec.rb
|
161
|
+
- spec/ruby_hue/lights_collection_state_spec.rb
|
158
162
|
- spec/ruby_hue/model_spec.rb
|
159
|
-
- spec/ruby_hue/ruby_hue_spec.rb
|
160
163
|
- spec/spec_helper.rb
|
164
|
+
- spec/support/behavior/state_examples.rb
|
161
165
|
- spec/support/complete_hue_model.rb
|
162
166
|
- spec/support/fixture_helpers.rb
|
163
167
|
- spec/support/light_bridge_helpers.rb
|
@@ -192,12 +196,13 @@ test_files:
|
|
192
196
|
- spec/fixtures/responses/lights.json
|
193
197
|
- spec/ruby_hue/bridge_spec.rb
|
194
198
|
- spec/ruby_hue/client_spec.rb
|
195
|
-
- spec/ruby_hue/configuration_spec.rb
|
196
199
|
- spec/ruby_hue/light/state_spec.rb
|
197
200
|
- spec/ruby_hue/light_spec.rb
|
201
|
+
- spec/ruby_hue/lights_collection_spec.rb
|
202
|
+
- spec/ruby_hue/lights_collection_state_spec.rb
|
198
203
|
- spec/ruby_hue/model_spec.rb
|
199
|
-
- spec/ruby_hue/ruby_hue_spec.rb
|
200
204
|
- spec/spec_helper.rb
|
205
|
+
- spec/support/behavior/state_examples.rb
|
201
206
|
- spec/support/complete_hue_model.rb
|
202
207
|
- spec/support/fixture_helpers.rb
|
203
208
|
- spec/support/light_bridge_helpers.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe RubyHue::Configuration do
|
4
|
-
it "has a bridge_ip" do
|
5
|
-
expect(subject).to respond_to :bridge_ip
|
6
|
-
expect(subject).to respond_to :bridge_ip=
|
7
|
-
end
|
8
|
-
|
9
|
-
it "has a api_username" do
|
10
|
-
expect(subject).to respond_to :api_username
|
11
|
-
expect(subject).to respond_to :api_username=
|
12
|
-
end
|
13
|
-
end
|