lifx 0.4.10 → 0.4.11

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
  SHA1:
3
- metadata.gz: 86bc4e0b28d94c9b3d1d0bf22b5f550988c5cab3
4
- data.tar.gz: ffc2b6c71d1f4efd5a6bd9732403599b6b357c69
3
+ metadata.gz: 0570f28dd8c1392dd1f3d1602d128ac3c3595184
4
+ data.tar.gz: 3e58c32ab27c29eac2c5dd794d3ce778ddf77c9e
5
5
  SHA512:
6
- metadata.gz: f580ff26c0612fa04dff785c06f770b0bcbd262c463f826dc0795e2339ed61d5ef28a0bd13563b592b636e6ad57086a0d2702147b4b07430a7c910550ea91fc5
7
- data.tar.gz: b6a20e239ac5a9b97fc2f8fad4f794937438b6b07439aabcb4c9bf28295b3eec5c3c8b35c973cb023f4a0c787a3ea2f0e8f811fb10b09f10690895b2aa025b0a
6
+ metadata.gz: 5d001b9118b4d9648758ff41ffa12bad61e37c1df1fe3068ed9bdc47a65d0ba094856562c7781937379a7e8bcd6a13264c813faf99ac5e1c4501f6194470dcc6
7
+ data.tar.gz: 46d2a75c7c97f304c8fd3f8394e70f5d58d1c80ac50ce0f7958f035158da012c00f87b410cdbe613066cfa2e6a21fa7c07180cbe8015103ad759223045951517
@@ -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
@@ -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: 3, &block)
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
@@ -26,7 +26,7 @@ module LIFX
26
26
  stream: 0,
27
27
  transient: true,
28
28
  period: 1.0,
29
- duty_cycle: 0.5,
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
- duty_cycle: (duty_cycle * 65535).round - 32768
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
- duty_cycle: duty_cycle,
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
- duty_cycle: peak,
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
@@ -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
- def send_message(target: required!(:target), payload: required!(:payload), acknowledge: false)
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?
@@ -40,7 +40,7 @@ module LIFX
40
40
  hsbk :color
41
41
  uint32 :period # Milliseconds per cycle.
42
42
  float :cycles
43
- int16 :duty_cycle
43
+ int16 :skew_ratio
44
44
  uint8 :waveform
45
45
  end
46
46
 
@@ -53,6 +53,7 @@ module LIFX
53
53
 
54
54
  def tags_for_device_id(device_id)
55
55
  entry = @routing_table.entry_for_device_id(device_id)
56
+ return [] if entry.nil?
56
57
  entry.tag_ids.map do |tag_id|
57
58
  tag = @tag_table.entry_with(site_id: entry.site_id, tag_id: tag_id)
58
59
  tag && tag.label
@@ -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))
@@ -1,3 +1,3 @@
1
1
  module LIFX
2
- VERSION = "0.4.10"
2
+ VERSION = "0.4.11"
3
3
  end
@@ -32,11 +32,22 @@ module LIFX
32
32
  end
33
33
 
34
34
  describe '#set_label' do
35
- let(:label) { light.label.sub(/\d+|$/, rand(100).to_s) }
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 label
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
@@ -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.duty_cycle).to eq 0
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.10
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-05-20 00:00:00.000000000 Z
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: