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 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: