lights 0.8.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.
@@ -0,0 +1,21 @@
1
+ class Bridge
2
+
3
+ attr_reader :id, :ip, :name, :mac
4
+
5
+ def initialize(data = {})
6
+ @id = data["id"]
7
+ @ip = data["internalipaddress"]
8
+ @mac = data["macaddress"]
9
+ @name = data["name"]
10
+ end
11
+
12
+ def data
13
+ data = {}
14
+ data["id"] = @id if @id
15
+ data["internalipaddress"] = @ip if @ip
16
+ data["macaddress"] = @mac if @mac
17
+ data["name"] = @name if @name
18
+ data
19
+ end
20
+ end
21
+
@@ -0,0 +1,25 @@
1
+ require 'lights/bulbstate'
2
+
3
+ class Bulb
4
+
5
+ attr_reader :id, :name, :type, :swversion,
6
+ :state
7
+
8
+ def initialize(id,data = {})
9
+ @id = id
10
+ @name = data["name"]
11
+ @type = data["type"]
12
+ @swversion = data["type"]
13
+ @state = BulbState.new data["state"]
14
+ end
15
+
16
+ def data
17
+ data = {}
18
+ data["name"] = @name if @name
19
+ data["type"] = @type if @type
20
+ data["swversion"] = @swversion if @swversion
21
+ data["state"] = @state.data if !@state.data.empty?
22
+ data
23
+ end
24
+ end
25
+
@@ -0,0 +1,183 @@
1
+ class BulbState
2
+
3
+ MAX_CT = 500
4
+ MIN_CT = 153
5
+ MAX_BRI = 255
6
+ MIN_BRI = 0
7
+ MAX_SAT = 255
8
+ MIN_SAT = 0
9
+ MAX_HUE = 65535
10
+ MIN_HUE = 0
11
+ MIN_TRANSITION_TIME = 0
12
+ MAX_XY = 1.0
13
+ MIN_XY = 0.0
14
+
15
+ module Effect
16
+ NONE = "none"
17
+ COLORLOOP = "colorloop"
18
+ end
19
+
20
+ module Alert
21
+ NONE = "none"
22
+ SELECT = "select"
23
+ LSELECT = "lselect"
24
+ end
25
+
26
+ module ColorMode
27
+ HS = "hs"
28
+ XY = "xy"
29
+ CT = "ct"
30
+ end
31
+
32
+ attr_reader :on, :bri, :hue, :sat, :xy, :ct,
33
+ :alert, :effect, :color_mode,
34
+ :reachable, :transition_time
35
+
36
+ def initialize( data = {} )
37
+ data = {} if data == nil
38
+ @on = data["on"]
39
+ set_bri data["bri"]
40
+ set_hue data["hue"]
41
+ set_sat data["sat"]
42
+ set_xy data["xy"]
43
+ set_ct data["ct"]
44
+ set_alert data["alert"]
45
+ set_effect data["effect"]
46
+ set_color_mode data["colormode"]
47
+ @reachable = data["reachable"]
48
+ set_transition_time data["transitiontime"]
49
+ end
50
+
51
+ def color_mode=(value) set_color_mode(value) end
52
+ def set_color_mode(value)
53
+ if value.nil? || value == ColorMode::XY \
54
+ || value == ColorMode::HS \
55
+ || value == ColorMode::CT
56
+ @color_mode = value
57
+ else
58
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires 'hs', 'xy', or 'ct'"
59
+ end
60
+ end
61
+
62
+ def alert=(value) set_alert(value) end
63
+ def set_alert(value)
64
+ if value.nil? || value == Alert::NONE \
65
+ || value == Alert::SELECT \
66
+ || value == Alert::LSELECT
67
+ @alert = value
68
+ else
69
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires 'none', 'select', or 'lselect'"
70
+ end
71
+ end
72
+
73
+ def effect=(value) set_effect(value) end
74
+ def set_effect(value)
75
+ if value.nil? || value == Effect::NONE || value == Effect::COLORLOOP
76
+ @effect = value
77
+ else
78
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires 'none' or 'colorloop'"
79
+ end
80
+ end
81
+
82
+ def on=(value) set_on(value) end
83
+ def set_on(value)
84
+ # Tests if value is boolean
85
+ if !!value == value
86
+ @on = value
87
+ else
88
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires boolean, got #{value.class}"
89
+ end
90
+ end
91
+
92
+ def bri=(value); set_bri(value) end
93
+ def set_bri(value)
94
+ if value.nil? || value.between?(MIN_BRI,MAX_BRI)
95
+ @bri = value
96
+ else
97
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be [#{MIN_BRI},#{MAX_BRI}]"
98
+ end
99
+ end
100
+
101
+ def ct=(value); set_ct(value) end
102
+ def set_ct(value)
103
+ if !value.nil? && (!value.is_a? Integer)
104
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires integer, got #{value.class}"
105
+ elsif value.nil? || value.between?(MIN_CT,MAX_CT)
106
+ @ct = value
107
+ else
108
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be [#{MIN_CT},#{MAX_CT}]"
109
+ end
110
+ end
111
+
112
+ def sat=(value); set_sat(value) end
113
+ def set_sat(value)
114
+ if !value.nil? && (!value.is_a? Integer)
115
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires integer, got #{value.class}"
116
+ elsif value.nil? || value.between?(MIN_SAT,MAX_SAT)
117
+ @sat = value
118
+ else
119
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be [#{MIN_SAT},#{MAX_SAT}]"
120
+ end
121
+ end
122
+
123
+ def hue=(value); set_hue(value) end
124
+ def set_hue(value)
125
+ if !value.nil? && (!value.is_a? Integer)
126
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires integer, got #{value.class}"
127
+ elsif value.nil? || value.between?(MIN_HUE,MAX_HUE)
128
+ @hue = value
129
+ else
130
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be [#{MIN_HUE},#{MAX_HUE}]"
131
+ end
132
+ end
133
+
134
+ def transition_time=(value); set_transition_time(value) end
135
+ def set_transition_time(value)
136
+ if !value.nil? && (!value.is_a? Numeric)
137
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires decimal, got #{value.class}"
138
+ elsif value.nil? || value >= MIN_TRANSITION_TIME
139
+ @transition_time = value
140
+ else
141
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be > #{MIN_TRANSITION_TIME}"
142
+ end
143
+ end
144
+
145
+ def xy=(value); set_xy(value) end
146
+ def set_xy(value)
147
+ if !value.nil? && (!value.is_a? Array)
148
+ raise BulbStateValueTypeException, "Value has incorrect type. Requires array, got #{value.class}"
149
+ elsif value.nil?
150
+ return
151
+ elsif value.length == 2 && value[0].to_f.is_a?(Numeric) \
152
+ && value[1].to_f.is_a?(Numeric) && value[0].to_f >= MIN_XY \
153
+ && value[0].to_f <= MAX_XY && value[1].to_f >= MIN_XY \
154
+ && value[1].to_f <= MAX_XY
155
+ @xy = []
156
+ @xy[0] = value[0].to_f
157
+ @xy[1] = value[1].to_f
158
+ else
159
+ raise BulbStateValueOutOfRangeException, "Value out of range. Must be [#{MIN_XY},#{MAX_XY}]"
160
+ end
161
+ end
162
+
163
+ def data
164
+ data = {}
165
+ data["on"] = @on if (@on!=nil)
166
+ data["bri"] = @bri if @bri
167
+ data["hue"] = @hue if @hue
168
+ data["sat"] = @sat if @sat
169
+ data["xy"] = @xy if @xy
170
+ data["ct"] = @ct if @ct
171
+ data["alert"] = @alert if @alert
172
+ data["effect"] = @effect if @effect
173
+ data["colormode"] = @color_mode if @color_mode
174
+ data["reachable"] = @reachable if @reachable
175
+ data["transitiontime"] = @transition_time if @transition_time
176
+ data
177
+ end
178
+
179
+ def to_json
180
+ data.to_json
181
+ end
182
+ end
183
+
@@ -0,0 +1,23 @@
1
+ class BridgeConnectException < Exception
2
+ def initialize(msg = "Press the button on the Hue bridge and try again.")
3
+ super
4
+ end
5
+ end
6
+
7
+ class UsernameException < Exception
8
+ def initialize(msg = "Please register username and try again.")
9
+ super
10
+ end
11
+ end
12
+
13
+ class BulbStateValueOutOfRangeException < Exception
14
+ def initalize(msg = "Value out of range.")
15
+ super(msg)
16
+ end
17
+ end
18
+
19
+ class BulbStateValueTypeException < Exception
20
+ def initialize(msg = "Value is of incorrect type.")
21
+ super
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ class Group
2
+
3
+ attr_reader :id, :data, :name, :lights
4
+ def initialize( id, data = {} )
5
+ @id = id
6
+ @data = data
7
+ @action = BulbState.new(data["action"])
8
+ @name = data["name"]
9
+ @lights = data["lights"]
10
+ end
11
+
12
+ def action
13
+ @action.data
14
+ end
15
+
16
+ end
@@ -0,0 +1,5 @@
1
+ require 'logger'
2
+
3
+ module LoggerConfig
4
+ LIGHTS_LEVEL = Logger::FATAL
5
+ end
@@ -0,0 +1,31 @@
1
+ class SensorState
2
+ attr_reader :data, :last_updated
3
+ def initialize(data)
4
+ @data = data
5
+ @last_updated = data["lastupdated"]
6
+ end
7
+ end
8
+
9
+ class TapState < SensorState
10
+ attr_reader :button_event
11
+ def initialize(data)
12
+ @button_event = data["button_event"]
13
+ super
14
+ end
15
+ end
16
+
17
+ class Sensor
18
+ attr_reader :id, :data, :name, :type, :model_id, :manufacturer_name, :unique_id, :sw_version, :state
19
+ def initialize( id, data = {} )
20
+ @id = id
21
+ @data = data
22
+ @name = data["name"]
23
+ @type = data["type"]
24
+ @model_id = data["modelid"]
25
+ @manufacturer_name = data["manufacturername"]
26
+ @unique_id = data["uniqueid"]
27
+ @sw_version = data["swversion"]
28
+ @state = SensorState.new(data["state"])
29
+ #@config = SensorConfig.new(data["config"])
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module LightsConst
2
+ VERSION = "0.8.0"
3
+ end
data/lights.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lights/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = 'lights'
8
+ s.version = LightsConst::VERSION
9
+ s.authors = ["Brady Turner"]
10
+ s.email = 'bradyaturner@gmail.com'
11
+ s.description = "Client library and CLI for controlling Phillips Hue lights."
12
+ s.summary = "lights"
13
+ s.homepage = 'http://rubygems.org/gems/lights'
14
+ s.license = 'MIT'
15
+ s.date = '2014-08-17'
16
+
17
+ s.files = `git ls-files`.split($/)
18
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency "bundler", "~> 1.3"
23
+ s.add_development_dependency "rake"
24
+ s.add_development_dependency "rspec", "~> 2.6"
25
+ s.add_development_dependency "cucumber"
26
+ s.add_development_dependency "aruba"
27
+ end
@@ -0,0 +1,28 @@
1
+ require 'lights'
2
+
3
+ describe Bridge do
4
+ it "properly parse input parameters" do
5
+ data = {
6
+ "id" => "test id",
7
+ "internalipaddress" => "192.168.1.27",
8
+ "macaddress" => "01:23:45:67:89:AB",
9
+ "name" => "test name",
10
+ }
11
+ bridge = Bridge.new(data)
12
+ bridge.id.should eql "test id"
13
+ bridge.ip.should eql "192.168.1.27"
14
+ bridge.mac.should eql "01:23:45:67:89:AB"
15
+ bridge.name.should eql "test name"
16
+ end
17
+
18
+ it "properly reconstructs object hash" do
19
+ data = {
20
+ "id" => "test id",
21
+ "internalipaddress" => "192.168.1.27",
22
+ "macaddress" => "01:23:45:67:89:AB",
23
+ "name" => "test name",
24
+ }
25
+ bridge = Bridge.new(data)
26
+ bridge.data.should eql data
27
+ end
28
+ end
data/spec/bulb_spec.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'lights'
2
+
3
+ describe Bulb do
4
+ it "properly parse input parameters" do
5
+ data = { "name" => "test name" }
6
+ bulb = Bulb.new(1,data)
7
+ bulb.name.should eql "test name"
8
+ end
9
+
10
+ it "properly creates state object" do
11
+ data = {
12
+ "name" => "test name",
13
+ "state" => {
14
+ "on" => true
15
+ }
16
+ }
17
+ bulb = Bulb.new(1,data)
18
+ bulb.state.on.should eql true
19
+ bulb.state.data.should eql data["state"]
20
+ end
21
+
22
+ it "properly reconstucts object hash" do
23
+ data = {
24
+ "name" => "test name",
25
+ "state" => {
26
+ "on" => true
27
+ }
28
+ }
29
+ bulb = Bulb.new(1,data)
30
+ bulb.data.should eql data
31
+ end
32
+ end
@@ -0,0 +1,432 @@
1
+ require 'lights'
2
+
3
+ describe BulbState do
4
+
5
+ it "properly reconstructs object hash" do
6
+ data = { "on" => true }
7
+ state = BulbState.new(data)
8
+ state.data.should eql data
9
+ end
10
+
11
+ it "properly reconstructs object hash" do
12
+ data = { "on" => false }
13
+ state = BulbState.new(data)
14
+ state.data.should eql data
15
+ end
16
+
17
+ # ON
18
+ it "should properly set on value in constructor" do
19
+ data = { "on" => true }
20
+ bulb = BulbState.new(data)
21
+ bulb.on.should eql true
22
+ end
23
+ it "should properly set on value" do
24
+ b = BulbState.new
25
+ b.on = true
26
+ b.on.should eq true
27
+ end
28
+ it "should raise exception when on has invalid type" do
29
+ b = BulbState.new
30
+ expect { b.on = "test state" }.to raise_error
31
+ end
32
+
33
+ # BRI
34
+ it "should properly set brightness value in constructor" do
35
+ data = { "bri" => BulbState::MAX_BRI }
36
+ b = BulbState.new(data)
37
+ b.bri.should eq BulbState::MAX_BRI
38
+ end
39
+
40
+ it "should properly set brightness value in constructor" do
41
+ data = { "bri" => BulbState::MIN_BRI }
42
+ b = BulbState.new(data)
43
+ b.bri.should eq BulbState::MIN_BRI
44
+ end
45
+
46
+ it "should properly set brightness value" do
47
+ b = BulbState.new
48
+ b.bri = BulbState::MAX_BRI
49
+ b.bri.should eq BulbState::MAX_BRI
50
+ end
51
+
52
+ it "should properly set brightness value" do
53
+ b = BulbState.new
54
+ b.bri = BulbState::MIN_BRI
55
+ b.bri.should eq BulbState::MIN_BRI
56
+ end
57
+
58
+ it "should raise exception when brightness value is not an integer" do
59
+ data = { "bri" => "test value" }
60
+ expect { BulbState.new(data) }.to raise_error
61
+ end
62
+
63
+ it "should raise exception when initial brightness is out of range (high)" do
64
+ data = { "bri" => BulbState::MAX_BRI + 1 }
65
+ expect { BulbState.new(data) }.to raise_error
66
+ end
67
+
68
+ it "should raise exception when initial brightness is out of range (low)" do
69
+ data = { "bri" => BulbState::MIN_BRI - 1 }
70
+ expect { BulbState.new(data) }.to raise_error
71
+ end
72
+
73
+ it "should raise exception when set brightness is out of range (high)" do
74
+ b = BulbState.new()
75
+ expect { b.bri = BulbState::MAX_BRI + 1 }.to raise_error
76
+ end
77
+
78
+ it "should raise exception when set brightness is out of range (LOW)" do
79
+ b = BulbState.new()
80
+ expect { b.bri = BulbState::MIN_BRI - 1 }.to raise_error
81
+ end
82
+
83
+ # SAT
84
+ it "should properly set saturation value in constructor" do
85
+ data = { "sat" => BulbState::MAX_SAT }
86
+ b = BulbState.new(data)
87
+ b.sat.should eq BulbState::MAX_SAT
88
+ end
89
+
90
+ it "should properly set saturation value in constructor" do
91
+ data = { "sat" => BulbState::MIN_SAT }
92
+ b = BulbState.new(data)
93
+ b.sat.should eq BulbState::MIN_SAT
94
+ end
95
+
96
+ it "should properly set saturation value" do
97
+ b = BulbState.new
98
+ b.sat = BulbState::MAX_SAT
99
+ b.sat.should eq BulbState::MAX_SAT
100
+ end
101
+
102
+ it "should properly set saturation value" do
103
+ b = BulbState.new
104
+ b.sat = BulbState::MIN_SAT
105
+ b.sat.should eq BulbState::MIN_SAT
106
+ end
107
+
108
+ it "should raise exception when sat value is not an integer" do
109
+ data = { "sat" => "test value" }
110
+ expect { BulbState.new(data) }.to raise_error
111
+ end
112
+
113
+ it "should raise exception when initial saturation is out of range (high)" do
114
+ data = { "sat" => BulbState::MAX_SAT + 1 }
115
+ expect { BulbState.new(data) }.to raise_error
116
+ end
117
+
118
+ it "should raise exception when initial saturation is out of range (low)" do
119
+ data = { "sat" => BulbState::MIN_SAT - 1 }
120
+ expect { BulbState.new(data) }.to raise_error
121
+ end
122
+
123
+ it "should raise exception when set saturation is out of range (high)" do
124
+ b = BulbState.new()
125
+ expect { b.sat = BulbState::MAX_SAT + 1 }.to raise_error
126
+ end
127
+
128
+ it "should raise exception when set saturation is out of range (LOW)" do
129
+ b = BulbState.new()
130
+ expect { b.sat = BulbState::MIN_SAT - 1 }.to raise_error
131
+ end
132
+
133
+ # HUE
134
+ it "should properly set hue value in constructor" do
135
+ data = { "hue" => BulbState::MAX_HUE }
136
+ b = BulbState.new(data)
137
+ b.hue.should eq BulbState::MAX_HUE
138
+ end
139
+
140
+ it "should properly set hue value in constructor" do
141
+ data = { "hue" => BulbState::MIN_HUE }
142
+ b = BulbState.new(data)
143
+ b.hue.should eq BulbState::MIN_HUE
144
+ end
145
+
146
+ it "should properly set hue value" do
147
+ b = BulbState.new
148
+ b.hue = BulbState::MAX_HUE
149
+ b.hue.should eq BulbState::MAX_HUE
150
+ end
151
+
152
+ it "should properly set hue value" do
153
+ b = BulbState.new
154
+ b.hue = BulbState::MIN_HUE
155
+ b.hue.should eq BulbState::MIN_HUE
156
+ end
157
+
158
+ it "should raise exception when hue value is not an integer" do
159
+ data = { "hue" => "test value" }
160
+ expect { BulbState.new(data) }.to raise_error
161
+ end
162
+
163
+ it "should raise exception when initial hue is out of range (high)" do
164
+ data = { "hue" => BulbState::MAX_HUE + 1 }
165
+ expect { BulbState.new(data) }.to raise_error
166
+ end
167
+
168
+ it "should raise exception when initial hue is out of range (low)" do
169
+ data = { "hue" => BulbState::MIN_HUE - 1 }
170
+ expect { BulbState.new(data) }.to raise_error
171
+ end
172
+
173
+ it "should raise exception when set hue is out of range (high)" do
174
+ b = BulbState.new()
175
+ expect { b.hue = BulbState::MAX_HUE + 1 }.to raise_error
176
+ end
177
+
178
+ it "should raise exception when set hue is out of range (LOW)" do
179
+ b = BulbState.new()
180
+ expect { b.hue = BulbState::MIN_HUE - 1 }.to raise_error
181
+ end
182
+
183
+ # CT
184
+ it "should properly set color temperature value in constructor" do
185
+ data = { "ct" => BulbState::MAX_CT }
186
+ b = BulbState.new(data)
187
+ b.ct.should eq BulbState::MAX_CT
188
+ end
189
+
190
+ it "should properly set color temperature value in constructor" do
191
+ data = { "ct" => BulbState::MIN_CT }
192
+ b = BulbState.new(data)
193
+ b.ct.should eq BulbState::MIN_CT
194
+ end
195
+
196
+ it "should properly set color temperature value" do
197
+ b = BulbState.new
198
+ b.ct = BulbState::MAX_CT
199
+ b.ct.should eq BulbState::MAX_CT
200
+ end
201
+
202
+ it "should properly set color temperature value" do
203
+ b = BulbState.new
204
+ b.ct = BulbState::MIN_CT
205
+ b.ct.should eq BulbState::MIN_CT
206
+ end
207
+
208
+ it "should raise exception when color temperature value is not an integer" do
209
+ data = { "ct" => "test value" }
210
+ expect { BulbState.new(data) }.to raise_error
211
+ end
212
+
213
+ it "should raise exception when initial color temperature is out of range (high)" do
214
+ data = { "ct" => BulbState::MAX_CT + 1 }
215
+ expect { BulbState.new(data) }.to raise_error
216
+ end
217
+
218
+ it "should raise exception when initial color temperature is out of range (low)" do
219
+ data = { "ct" => BulbState::MIN_CT - 1 }
220
+ expect { BulbState.new(data) }.to raise_error
221
+ end
222
+
223
+ it "should raise exception when set color temperature is out of range (high)" do
224
+ b = BulbState.new()
225
+ expect { b.ct = BulbState::MAX_CT + 1 }.to raise_error
226
+ end
227
+
228
+ it "should raise exception when set color temperature is out of range (LOW)" do
229
+ b = BulbState.new()
230
+ expect { b.ct = BulbState::MIN_CT - 1 }.to raise_error
231
+ end
232
+
233
+ # EFFECT
234
+ it "should properly set effect value in constructor" do
235
+ data = { "effect" => BulbState::Effect::COLORLOOP }
236
+ b = BulbState.new(data)
237
+ b.effect.should eq BulbState::Effect::COLORLOOP
238
+ end
239
+
240
+ it "should properly set effect value in constructor" do
241
+ data = { "effect" => BulbState::Effect::COLORLOOP }
242
+ b = BulbState.new(data)
243
+ b.effect.should eq BulbState::Effect::COLORLOOP
244
+ end
245
+
246
+ it "should properly set effect value" do
247
+ b = BulbState.new
248
+ b.effect = BulbState::Effect::COLORLOOP
249
+ b.effect.should eq BulbState::Effect::COLORLOOP
250
+ end
251
+
252
+ it "should properly set effect value" do
253
+ b = BulbState.new
254
+ b.effect = BulbState::Effect::NONE
255
+ b.effect.should eq BulbState::Effect::NONE
256
+ end
257
+
258
+ it "should raise exception when effect value is invalid" do
259
+ data = { "effect" => "test value" }
260
+ expect { BulbState.new(data) }.to raise_error
261
+ end
262
+
263
+ # TRANSITION TIME
264
+ it "should properly set transition time value in constructor" do
265
+ data = { "transitiontime" => 0.1 }
266
+ b = BulbState.new(data)
267
+ b.transition_time.should eq 0.1
268
+ end
269
+
270
+ it "should properly set transition time value" do
271
+ b = BulbState.new
272
+ b.transition_time = BulbState::MIN_TRANSITION_TIME
273
+ b.transition_time.should eq BulbState::MIN_TRANSITION_TIME
274
+ end
275
+
276
+ it "should raise exception when transition time value is invalid" do
277
+ data = { "transitiontime" => "test value" }
278
+ expect { BulbState.new(data) }.to raise_error
279
+ end
280
+
281
+ it "should raise exception when transition time is out of range (LOW)" do
282
+ data = { "transitiontime" => -1 }
283
+ expect { BulbState.new(data) }.to raise_error
284
+ end
285
+
286
+ # ALERT
287
+ it "should properly set alert value in constructor" do
288
+ data = { "alert" => BulbState::Alert::SELECT }
289
+ b = BulbState.new(data)
290
+ b.alert.should eq BulbState::Alert::SELECT
291
+ end
292
+
293
+ it "should properly set alert value" do
294
+ b = BulbState.new
295
+ b.alert = BulbState::Alert::LSELECT
296
+ b.alert.should eq BulbState::Alert::LSELECT
297
+ end
298
+
299
+ it "should properly set alert value" do
300
+ b = BulbState.new
301
+ b.alert = BulbState::Alert::NONE
302
+ b.alert.should eq BulbState::Alert::NONE
303
+ end
304
+
305
+ it "should raise exception when alert value is invalid" do
306
+ data = { "alert" => "test value" }
307
+ expect { BulbState.new(data) }.to raise_error
308
+ end
309
+
310
+ # COLORMODE
311
+ it "should properly set color mode value in constructor" do
312
+ data = { "colormode" => BulbState::ColorMode::HS }
313
+ b = BulbState.new(data)
314
+ b.color_mode.should eq BulbState::ColorMode::HS
315
+ end
316
+
317
+ it "should properly set color mode value" do
318
+ b = BulbState.new
319
+ b.color_mode = BulbState::ColorMode::XY
320
+ b.color_mode.should eq BulbState::ColorMode::XY
321
+ end
322
+
323
+ it "should properly set color mode value" do
324
+ b = BulbState.new
325
+ b.color_mode = BulbState::ColorMode::CT
326
+ b.color_mode.should eq BulbState::ColorMode::CT
327
+ end
328
+
329
+ it "should raise exception when alert value is invalid" do
330
+ data = { "colormode" => "test value" }
331
+ expect { BulbState.new(data) }.to raise_error
332
+ end
333
+
334
+ # XY
335
+ it "should properly set xy value in constructor" do
336
+ xy = [BulbState::MAX_XY,BulbState::MAX_XY]
337
+ data = { "xy" => xy }
338
+ b = BulbState.new(data)
339
+ b.xy.should eq xy
340
+ end
341
+
342
+ it "should properly set xy value in constructor" do
343
+ xy = [BulbState::MIN_XY,BulbState::MIN_XY]
344
+ data = { "xy" => xy }
345
+ b = BulbState.new(data)
346
+ b.xy.should eq xy
347
+ end
348
+
349
+ it "should properly set xy value" do
350
+ b = BulbState.new
351
+ xy = [BulbState::MAX_XY,BulbState::MAX_XY]
352
+ b.xy = xy
353
+ b.xy.should eq xy
354
+ end
355
+
356
+ it "should properly set xy value" do
357
+ b = BulbState.new
358
+ xy = [BulbState::MIN_XY,BulbState::MIN_XY]
359
+ b.xy = xy
360
+ b.xy.should eq xy
361
+ end
362
+
363
+ it "should raise exception when xy value is not an array" do
364
+ xy = {}
365
+ data = { "xy" => xy }
366
+ expect { BulbState.new(data) }.to raise_error
367
+ end
368
+
369
+ # XY - X
370
+ it "should raise exception when x value is not a number" do
371
+ xy = ["test value",BulbState::MIN_XY]
372
+ data = { "xy" => xy }
373
+ expect { BulbState.new(data) }.to raise_error
374
+ end
375
+
376
+ it "should raise exception when initial xy is out of range (X,HIGH)" do
377
+ xy = [BulbState::MAX_XY+1,BulbState::MIN_XY]
378
+ data = { "xy" => xy }
379
+ expect { BulbState.new(data) }.to raise_error
380
+ end
381
+
382
+ it "should raise exception when initial xy is out of range (X,LOW)" do
383
+ xy = [BulbState::MIN_XY-1,BulbState::MIN_XY]
384
+ data = { "xy" => xy }
385
+ expect { BulbState.new(data) }.to raise_error
386
+ end
387
+
388
+ it "should raise exception when set xy is out of range (X,HIGH)" do
389
+ xy = [BulbState::MAX_XY+1,BulbState::MIN_XY]
390
+ b = BulbState.new()
391
+ expect { b.xy = xy }.to raise_error
392
+ end
393
+
394
+ it "should raise exception when set xy is out of range (X,LOW)" do
395
+ xy = [BulbState::MIN_XY-1,BulbState::MIN_XY]
396
+ b = BulbState.new()
397
+ expect { b.xy = xy }.to raise_error
398
+ end
399
+
400
+ # XY - Y
401
+ it "should raise exception when y value is not a number" do
402
+ xy = [BulbState::MIN_XY,"test value"]
403
+ data = { "xy" => xy }
404
+ expect { BulbState.new(data) }.to raise_error
405
+ end
406
+
407
+ it "should raise exception when initial xy is out of range (Y,HIGH)" do
408
+ xy = [BulbState::MIN_XY,BulbState::MAX_XY+1]
409
+ data = { "xy" => xy }
410
+ expect { BulbState.new(data) }.to raise_error
411
+ end
412
+
413
+ it "should raise exception when initial xy is out of range (Y,LOW)" do
414
+ xy = [BulbState::MIN_XY,BulbState::MIN_XY-1]
415
+ data = { "xy" => xy }
416
+ expect { BulbState.new(data) }.to raise_error
417
+ end
418
+
419
+ it "should raise exception when set xy is out of range (Y,HIGH)" do
420
+ xy = [BulbState::MAX_XY,BulbState::MAX_XY+1]
421
+ b = BulbState.new()
422
+ expect { b.xy = xy }.to raise_error
423
+ end
424
+
425
+ it "should raise exception when set xy is out of range (Y,LOW)" do
426
+ xy = [BulbState::MIN_XY,BulbState::MIN_XY-1]
427
+ b = BulbState.new()
428
+ expect { b.xy = xy }.to raise_error
429
+ end
430
+
431
+ end
432
+