lifx 0.4.10 → 0.4.11
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 +4 -4
- data/lib/lifx/config.rb +2 -0
- data/lib/lifx/light.rb +9 -8
- data/lib/lifx/light_collection.rb +5 -4
- data/lib/lifx/light_target.rb +6 -12
- data/lib/lifx/network_context.rb +3 -2
- data/lib/lifx/protocol/light.rb +1 -1
- data/lib/lifx/routing_manager.rb +1 -0
- data/lib/lifx/tag_manager.rb +1 -1
- data/lib/lifx/version.rb +1 -1
- data/spec/integration/light_spec.rb +13 -2
- data/spec/integration/tags_spec.rb +7 -0
- data/spec/message_spec.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0570f28dd8c1392dd1f3d1602d128ac3c3595184
|
4
|
+
data.tar.gz: 3e58c32ab27c29eac2c5dd794d3ce778ddf77c9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d001b9118b4d9648758ff41ffa12bad61e37c1df1fe3068ed9bdc47a65d0ba094856562c7781937379a7e8bcd6a13264c813faf99ac5e1c4501f6194470dcc6
|
7
|
+
data.tar.gz: 46d2a75c7c97f304c8fd3f8394e70f5d58d1c80ac50ce0f7958f035158da012c00f87b410cdbe613066cfa2e6a21fa7c07180cbe8015103ad759223045951517
|
data/lib/lifx/config.rb
CHANGED
@@ -4,6 +4,8 @@ module LIFX
|
|
4
4
|
Config = Configatron::Store.new
|
5
5
|
|
6
6
|
Config.default_duration = 1
|
7
|
+
Config.message_wait_timeout = 3
|
8
|
+
Config.message_retry_interval = 0.5
|
7
9
|
Config.broadcast_ip = '255.255.255.255'
|
8
10
|
Config.allowed_transports = [:udp, :tcp]
|
9
11
|
Config.log_invalid_messages = false
|
data/lib/lifx/light.rb
CHANGED
@@ -98,11 +98,11 @@ module LIFX
|
|
98
98
|
# @raise [LabelTooLong] if label is greater than {MAX_LABEL_LENGTH}
|
99
99
|
# @return [Light] self
|
100
100
|
def set_label(label)
|
101
|
-
if label.length > MAX_LABEL_LENGTH
|
102
|
-
raise LabelTooLong.new("Label length must be below or equal to #{MAX_LABEL_LENGTH}")
|
101
|
+
if label.bytes.length > MAX_LABEL_LENGTH
|
102
|
+
raise LabelTooLong.new("Label length in bytes must be below or equal to #{MAX_LABEL_LENGTH}")
|
103
103
|
end
|
104
104
|
while self.label != label
|
105
|
-
send_message!(Protocol::Device::SetLabel.new(label: label), wait_for: Protocol::Device::StateLabel)
|
105
|
+
send_message!(Protocol::Device::SetLabel.new(label: label.encode('utf-8')), wait_for: Protocol::Device::StateLabel)
|
106
106
|
end
|
107
107
|
self
|
108
108
|
end
|
@@ -356,9 +356,10 @@ module LIFX
|
|
356
356
|
# Queues a message to be sent the Light
|
357
357
|
# @param payload [Protocol::Payload] the payload to send
|
358
358
|
# @param acknowledge: [Boolean] whether the device should respond
|
359
|
+
# @param at_time: [Integer] Unix epoch in milliseconds to run the payload. Only applicable to certain payload types.
|
359
360
|
# @return [Light] returns self for chaining
|
360
|
-
def send_message(payload, acknowledge: true)
|
361
|
-
context.send_message(target: Target.new(device_id: id, site_id: @site_id), payload: payload, acknowledge: acknowledge)
|
361
|
+
def send_message(payload, acknowledge: true, at_time: nil)
|
362
|
+
context.send_message(target: Target.new(device_id: id, site_id: @site_id), payload: payload, acknowledge: acknowledge, at_time: at_time)
|
362
363
|
end
|
363
364
|
|
364
365
|
# An exception for when synchronous messages take too long to receive a response
|
@@ -373,7 +374,7 @@ module LIFX
|
|
373
374
|
# @param block: [Proc] the block that is executed when the expected `wait_for` payload comes back. If the return value is false or nil, it will try to send the message again.
|
374
375
|
# @return [Object] the truthy result of `block` is returned.
|
375
376
|
# @raise [MessageTimeout] if the device doesn't respond in time
|
376
|
-
def send_message!(payload, wait_for: wait_for, wait_timeout:
|
377
|
+
def send_message!(payload, wait_for: wait_for, wait_timeout: Config.message_wait_timeout, retry_interval: Config.message_retry_interval, &block)
|
377
378
|
if Thread.current[:sync_enabled]
|
378
379
|
raise "Cannot use synchronous methods inside a sync block"
|
379
380
|
end
|
@@ -385,7 +386,7 @@ module LIFX
|
|
385
386
|
result = block.call(payload)
|
386
387
|
}
|
387
388
|
add_hook(wait_for, proc)
|
388
|
-
try_until -> { result }, signal: @message_signal do
|
389
|
+
try_until -> { result }, action_interval: retry_interval, signal: @message_signal do
|
389
390
|
send_message(payload)
|
390
391
|
end
|
391
392
|
result
|
@@ -405,7 +406,7 @@ module LIFX
|
|
405
406
|
|
406
407
|
def add_hooks
|
407
408
|
add_hook(Protocol::Device::StateLabel) do |payload|
|
408
|
-
@label = payload.label.to_s
|
409
|
+
@label = payload.label.to_s.force_encoding('utf-8')
|
409
410
|
seen!
|
410
411
|
end
|
411
412
|
|
@@ -22,7 +22,7 @@ module LIFX
|
|
22
22
|
# Creates a {LightCollection} instance. Should not be used directly.
|
23
23
|
# @api private
|
24
24
|
# @param context: [NetworkContext] NetworkContext this collection belongs to
|
25
|
-
# @param tag: [String] Tag
|
25
|
+
# @param tag: [String] Tag
|
26
26
|
def initialize(context: required!(:context), tag: nil)
|
27
27
|
@context = context
|
28
28
|
@tag = tag
|
@@ -31,13 +31,14 @@ module LIFX
|
|
31
31
|
# Queues a {Protocol::Payload} to be sent to bulbs in the collection
|
32
32
|
# @param payload [Protocol::Payload] Payload to be sent
|
33
33
|
# @param acknowledge: [Boolean] whether recipients should acknowledge message
|
34
|
+
# @param at_time: [Integer] Unix epoch in milliseconds to run the payload. Only applicable to certain payload types.
|
34
35
|
# @api private
|
35
36
|
# @return [LightCollection] self for chaining
|
36
|
-
def send_message(payload, acknowledge: false)
|
37
|
+
def send_message(payload, acknowledge: false, at_time: nil)
|
37
38
|
if tag
|
38
|
-
context.send_message(target: Target.new(tag: tag), payload: payload, acknowledge: acknowledge)
|
39
|
+
context.send_message(target: Target.new(tag: tag), payload: payload, acknowledge: acknowledge, at_time: at_time)
|
39
40
|
else
|
40
|
-
context.send_message(target: Target.new(broadcast: true), payload: payload, acknowledge: acknowledge)
|
41
|
+
context.send_message(target: Target.new(broadcast: true), payload: payload, acknowledge: acknowledge, at_time: at_time)
|
41
42
|
end
|
42
43
|
self
|
43
44
|
end
|
data/lib/lifx/light_target.rb
CHANGED
@@ -26,7 +26,7 @@ module LIFX
|
|
26
26
|
stream: 0,
|
27
27
|
transient: true,
|
28
28
|
period: 1.0,
|
29
|
-
|
29
|
+
skew_ratio: 0.5,
|
30
30
|
acknowledge: false)
|
31
31
|
send_message(Protocol::Light::SetWaveform.new(
|
32
32
|
color: color.to_hsbk,
|
@@ -35,7 +35,7 @@ module LIFX
|
|
35
35
|
stream: stream,
|
36
36
|
transient: transient,
|
37
37
|
period: (period * 1_000).to_i,
|
38
|
-
|
38
|
+
skew_ratio: (skew_ratio * 65535).round - 32768,
|
39
39
|
), acknowledge: acknowledge)
|
40
40
|
end
|
41
41
|
|
@@ -55,7 +55,7 @@ module LIFX
|
|
55
55
|
stream: 0)
|
56
56
|
set_waveform(color, waveform: Protocol::Light::Waveform::PULSE,
|
57
57
|
cycles: cycles,
|
58
|
-
|
58
|
+
skew_ratio: 1 - duty_cycle,
|
59
59
|
stream: stream,
|
60
60
|
transient: transient,
|
61
61
|
period: period)
|
@@ -77,7 +77,7 @@ module LIFX
|
|
77
77
|
stream: 0)
|
78
78
|
set_waveform(color, waveform: Protocol::Light::Waveform::SINE,
|
79
79
|
cycles: cycles,
|
80
|
-
|
80
|
+
skew_ratio: peak,
|
81
81
|
stream: stream,
|
82
82
|
transient: transient,
|
83
83
|
period: period)
|
@@ -112,10 +112,12 @@ module LIFX
|
|
112
112
|
# @note Marked as private pending bug fixes in firmware
|
113
113
|
def triangle(color, cycles: 1,
|
114
114
|
period: 1.0,
|
115
|
+
peak: 0.5,
|
115
116
|
transient: true,
|
116
117
|
stream: 0)
|
117
118
|
set_waveform(color, waveform: Protocol::Light::Waveform::TRIANGLE,
|
118
119
|
cycles: cycles,
|
120
|
+
skew_ratio: peak,
|
119
121
|
stream: stream,
|
120
122
|
transient: transient,
|
121
123
|
period: period)
|
@@ -197,13 +199,5 @@ module LIFX
|
|
197
199
|
def set_time(time = Time.now)
|
198
200
|
send_message(Protocol::Device::SetTime.new(time: (time.to_f * NSEC_IN_SEC).round))
|
199
201
|
end
|
200
|
-
|
201
|
-
|
202
|
-
# Attempts to reboots the light(s).
|
203
|
-
# This method cannot guarantee the message was received.
|
204
|
-
# @return [Light, LightCollection] self for chaining
|
205
|
-
def reboot!
|
206
|
-
send_message(Protocol::Device::Reboot.new)
|
207
|
-
end
|
208
202
|
end
|
209
203
|
end
|
data/lib/lifx/network_context.rb
CHANGED
@@ -61,11 +61,12 @@ module LIFX
|
|
61
61
|
# @param target: [Target] Target of the message
|
62
62
|
# @param payload: [Protocol::Payload] Message payload
|
63
63
|
# @param acknowledge: [Boolean] If recipients must acknowledge with a response
|
64
|
-
|
64
|
+
# @param at_time: [Integer] Unix epoch in milliseconds to run the payload. Only applicable to certain payload types.
|
65
|
+
def send_message(target: required!(:target), payload: required!(:payload), acknowledge: false, at_time: nil)
|
65
66
|
paths = @routing_manager.resolve_target(target)
|
66
67
|
|
67
68
|
messages = paths.map do |path|
|
68
|
-
Message.new(path: path, payload: payload, acknowledge: acknowledge)
|
69
|
+
Message.new(path: path, payload: payload, acknowledge: acknowledge, at_time: at_time)
|
69
70
|
end
|
70
71
|
|
71
72
|
if within_sync?
|
data/lib/lifx/protocol/light.rb
CHANGED
data/lib/lifx/routing_manager.rb
CHANGED
data/lib/lifx/tag_manager.rb
CHANGED
@@ -28,7 +28,7 @@ module LIFX
|
|
28
28
|
# we don't receive a StateTagLabels before another tag gets created
|
29
29
|
@tag_table.update_table(tag_id: id, label: label, site_id: site_id)
|
30
30
|
context.send_message(target: Target.new(site_id: site_id),
|
31
|
-
payload: Protocol::Device::SetTagLabels.new(tags: id_to_tags_field(id), label: label))
|
31
|
+
payload: Protocol::Device::SetTagLabels.new(tags: id_to_tags_field(id), label: label.encode('utf-8')))
|
32
32
|
end
|
33
33
|
|
34
34
|
def add_tag_to_device(tag: required!(:tag), device: required!(:device))
|
data/lib/lifx/version.rb
CHANGED
@@ -32,11 +32,22 @@ module LIFX
|
|
32
32
|
end
|
33
33
|
|
34
34
|
describe '#set_label' do
|
35
|
-
let(:
|
35
|
+
let!(:original_label) { light.label }
|
36
|
+
|
37
|
+
after do
|
38
|
+
light.set_label(original_label)
|
39
|
+
end
|
36
40
|
|
37
41
|
it 'sets the label of the light synchronously' do
|
42
|
+
label = light.label.sub(/\d+|$/, rand(100).to_s)
|
43
|
+
light.set_label(label)
|
44
|
+
expect(light.label).to eq(label)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'works with accented characters' do
|
48
|
+
label = 'tést'
|
38
49
|
light.set_label(label)
|
39
|
-
expect(light.label).to eq
|
50
|
+
expect(light.label).to eq(label)
|
40
51
|
end
|
41
52
|
end
|
42
53
|
end
|
@@ -29,5 +29,12 @@ module LIFX
|
|
29
29
|
lifx.purge_unused_tags!
|
30
30
|
expect(lifx.unused_tags).to be_empty
|
31
31
|
end
|
32
|
+
|
33
|
+
it 'handles non-ascii tags' do
|
34
|
+
light.add_tag('_tést')
|
35
|
+
expect(light.tags).to include('_tést')
|
36
|
+
light.remove_tag('_tést')
|
37
|
+
lifx.purge_unused_tags!
|
38
|
+
end
|
32
39
|
end
|
33
40
|
end
|
data/spec/message_spec.rb
CHANGED
@@ -48,7 +48,7 @@ describe LIFX::Message do
|
|
48
48
|
expect(payload.color.kelvin).to eq 3_500
|
49
49
|
expect(payload.period).to eq 200
|
50
50
|
expect(payload.cycles).to eq 1.0
|
51
|
-
expect(payload.
|
51
|
+
expect(payload.skew_ratio).to eq 0
|
52
52
|
expect(payload.waveform).to eq 0
|
53
53
|
end
|
54
54
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Chen (chendo)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -215,3 +215,4 @@ test_files:
|
|
215
215
|
- spec/spec_helper.rb
|
216
216
|
- spec/transport/udp_spec.rb
|
217
217
|
- spec/transport_spec.rb
|
218
|
+
has_rdoc:
|