lifx 0.4.6.1 → 0.4.7

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: a0d7ac636c1a3c658b1859dbf7074fd845cd41e1
4
- data.tar.gz: 112e36f614f01183d57d322d83d07807b58fe398
3
+ metadata.gz: e74701d68bb9de49cf00008a94e46f8721c5d3e6
4
+ data.tar.gz: 8dd72e9b4f78d2bc70d042142879b3c98df2b172
5
5
  SHA512:
6
- metadata.gz: 3693b61a7c84222e379dd535e6ccdb80f5e5381f4ac4f0893c0821f8c5ef4a269b19e0f76837158e1a4b5b42bff4b22c988e4b0d0ddf62f749b770a15eaacd90
7
- data.tar.gz: 48a3b388801194eccccf878097c8f60ae83bab085e2e6dfa3d291baa6fb31780dcc6dacfd1b9f86214d7cda0e7a7e71e25ac66cae89af088e291a8718e727da2
6
+ metadata.gz: 8c620c92cf6dd96dac5b2abac78563e3e7276fa7a3a08b17f010eb7fd123320a3cce52d807c6c6eb7cd46d595800e8fba539625cf287cb858888ef812566e148
7
+ data.tar.gz: 98187dcc6c15b1d53c48ae6cd7ed95dc86c781b3218e2ab79a51d8bf4c56570b1b3152b97091b56f3e41ee3455cde8449c1eed5b408cad1d75b88dc48df227f8
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.4.7
2
+
3
+ - Only create Light devices when a Light::State is received
4
+ - Message rate checker only checks lights considered alive
5
+
1
6
  ### 0.4.6.1
2
7
 
3
8
  - Fix `Time.parse` issue
@@ -14,7 +14,7 @@ module LIFX
14
14
  #
15
15
  # @return [Client] A LAN LIFX::Client
16
16
  def lan
17
- @lan ||= new
17
+ @lan ||= new(transport_manager: TransportManager::LAN.new)
18
18
  end
19
19
  end
20
20
 
@@ -25,9 +25,9 @@ module LIFX
25
25
  # @return [NetworkContext] Enclosed network context
26
26
  attr_reader :context
27
27
 
28
- # @param transport: [:lan] Specify which transport to use
29
- def initialize(transport: :lan)
30
- @context = NetworkContext.new(transport: transport)
28
+ # @param transport_manager: [TransportManager] Specify the {TransportManager}
29
+ def initialize(transport_manager: required!('transport_manager'))
30
+ @context = NetworkContext.new(transport_manager: transport_manager)
31
31
  end
32
32
 
33
33
  # Default timeout in seconds for discovery
@@ -133,5 +133,10 @@ module LIFX
133
133
  def flush(timeout: nil)
134
134
  context.flush(timeout: timeout)
135
135
  end
136
+
137
+ # Stops everything and cleans up.
138
+ def stop
139
+ context.stop
140
+ end
136
141
  end
137
142
  end
@@ -10,7 +10,6 @@ module LIFX
10
10
  class MessageError < StandardError; end
11
11
  class UnpackError < MessageError; end
12
12
  class PackError < MessageError; end
13
- class NoPath < MessageError; end
14
13
 
15
14
  class InvalidFrame < UnpackError; end
16
15
  class UnsupportedProtocolVersion < UnpackError; end
@@ -88,13 +87,13 @@ module LIFX
88
87
  alias_method :addressable?, :addressable
89
88
 
90
89
  def_delegators :path, :device_id, :site_id, :tagged
91
-
90
+
92
91
  attr_accessor :path, :payload
93
92
  def initialize(*args)
94
- if args.count == 3
93
+ if args.count == 3
95
94
  @path, @message, @payload = args
96
95
  elsif (hash = args.first).is_a?(Hash)
97
- path = hash.delete(:path)
96
+ path = hash.delete(:path) || ProtocolPath.new
98
97
  payload = hash.delete(:payload)
99
98
 
100
99
  check_valid_fields!(hash)
@@ -124,7 +123,6 @@ module LIFX
124
123
 
125
124
  def pack
126
125
  raise NoPayload if !payload
127
- raise NoPath if !path
128
126
  @message.raw_site = path.raw_site
129
127
  @message.raw_target = path.raw_target
130
128
  @message.tagged = path.tagged?
@@ -150,7 +148,7 @@ module LIFX
150
148
  %Q{#<LIFX::Message #{attrs}>}
151
149
  end
152
150
  alias_method :inspect, :to_s
153
-
151
+
154
152
  protected
155
153
 
156
154
  def check_valid_fields!(hash)
@@ -7,7 +7,6 @@ require 'lifx/protocol_path'
7
7
 
8
8
  module LIFX
9
9
  class NetworkContext
10
- include Timers
11
10
  include Logging
12
11
  include Utilities
13
12
  include RequiredKeywordArguments
@@ -15,16 +14,12 @@ module LIFX
15
14
 
16
15
  # NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager
17
16
  attr_reader :transport_manager, :tag_manager, :routing_manager
18
-
19
- def initialize(transport: :lan)
17
+
18
+ def initialize(transport_manager: required!('transport_manager'))
20
19
  @devices = {}
21
20
 
22
- @transport_manager = case transport
23
- when :lan
24
- TransportManager::LAN.new
25
- else
26
- raise ArgumentError.new("Unknown transport method: #{transport}")
27
- end
21
+ @transport_manager = transport_manager
22
+ @transport_manager.context = self
28
23
  @transport_manager.add_observer(self) do |message: nil, ip: nil, transport: nil|
29
24
  handle_message(message, ip, transport)
30
25
  end
@@ -32,9 +27,6 @@ module LIFX
32
27
  reset!
33
28
 
34
29
  @threads = []
35
- @threads << initialize_timer_thread
36
- initialize_periodic_refresh
37
- initialize_message_rate_updater
38
30
  end
39
31
 
40
32
  def discover
@@ -106,7 +98,7 @@ module LIFX
106
98
  time = light && light.time
107
99
  end
108
100
 
109
- delay = (messages.count + 1) * (1.0 / message_rate)
101
+ delay = (messages.count + 1) * (1.0 / message_rate)
110
102
  at_time = ((time.to_f + delay) * 1_000_000_000).to_i
111
103
  messages.each do |m|
112
104
  m.at_time = at_time
@@ -146,16 +138,8 @@ module LIFX
146
138
  @routing_manager.tags_for_device_id(device.id)
147
139
  end
148
140
 
149
- def gateways
150
- transport_manager.gateways.map(&:keys).flatten.map { |id| lights.with_id(id) }
151
- end
152
-
153
- def gateway_connections
154
- transport_manager.gateways.map(&:values).flatten
155
- end
156
-
157
141
  def to_s
158
- %Q{#<LIFX::NetworkContext connections=#{gateway_connections}>}
142
+ %Q{#<LIFX::NetworkContext transport_manager=#{transport_manager}>}
159
143
  end
160
144
  alias_method :inspect, :to_s
161
145
 
@@ -166,44 +150,13 @@ module LIFX
166
150
 
167
151
  @routing_manager.update_from_message(message)
168
152
  if !message.tagged?
169
- if @devices[message.device_id].nil?
153
+ if @devices[message.device_id].nil? && message.payload.is_a?(Protocol::Light::State)
170
154
  device = Light.new(context: self, id: message.device_id, site_id: message.site_id)
171
- register_device(device)
172
155
  end
173
156
  device = @devices[message.device_id]
174
157
  return if !device # Virgin bulb
175
158
  device.handle_message(message, ip, transport)
176
159
  end
177
160
  end
178
-
179
- def initialize_periodic_refresh
180
- timers.every(10) do
181
- refresh
182
- end
183
- end
184
-
185
- def initialize_message_rate_updater
186
- timers.every(5) do
187
- missing_mesh_firmware = lights.select { |l| l.mesh_firmware(fetch: false).nil? }
188
- if missing_mesh_firmware.count > 10
189
- send_message(target: Target.new(broadcast: true), payload: Protocol::Device::GetMeshFirmware.new)
190
- elsif missing_mesh_firmware.count > 0
191
- missing_mesh_firmware.each { |l| l.send_message(Protocol::Device::GetMeshFirmware.new) }
192
- else
193
- @message_rate = lights.all? do |light|
194
- m = light.mesh_firmware(fetch: false)
195
- m && m >= '1.2'
196
- end ? 20 : 5
197
- gateway_connections.each do |connection|
198
- connection.set_message_rate(@message_rate)
199
- end
200
- end
201
- end
202
- end
203
-
204
- DEFAULT_MESSAGING_RATE = 5 # per second
205
- def message_rate
206
- @message_rate || 5
207
- end
208
161
  end
209
162
  end
@@ -6,6 +6,7 @@ module LIFX
6
6
  class Base
7
7
  include Logging
8
8
  include Observable
9
+ attr_accessor :context
9
10
 
10
11
  def initialize(**args)
11
12
  end
@@ -3,15 +3,20 @@ require 'lifx/site'
3
3
  module LIFX
4
4
  module TransportManager
5
5
  class LAN < Base
6
+ include Timers
6
7
  def initialize(bind_ip: '0.0.0.0', send_ip: Config.broadcast_ip, port: 56700, peer_port: 56750)
7
8
  super
8
9
  @bind_ip = bind_ip
9
10
  @send_ip = send_ip
10
11
  @port = port
11
12
  @peer_port = peer_port
12
-
13
+
13
14
  @sites = {}
15
+ @threads = []
16
+ @threads << initialize_timer_thread
14
17
  initialize_transports
18
+ initialize_periodic_refresh
19
+ initialize_message_rate_updater
15
20
  end
16
21
 
17
22
  def flush(**options)
@@ -49,6 +54,7 @@ module LIFX
49
54
 
50
55
  def stop
51
56
  stop_discovery
57
+ @threads.each(&:kill)
52
58
  @transport.close
53
59
  @sites.values.each do |site|
54
60
  site.stop
@@ -103,8 +109,42 @@ module LIFX
103
109
  @sites.values.map(&:gateways)
104
110
  end
105
111
 
112
+ def gateway_connections
113
+ gateways.map(&:values).flatten
114
+ end
115
+
106
116
  protected
107
117
 
118
+ def initialize_periodic_refresh
119
+ timers.every(10) do
120
+ context.refresh
121
+ end
122
+ end
123
+
124
+ def initialize_message_rate_updater
125
+ timers.every(5) do
126
+ missing_mesh_firmware = context.lights.alive.select { |l| l.mesh_firmware(fetch: false).nil? }
127
+ if missing_mesh_firmware.count > 10
128
+ context.send_message(target: Target.new(broadcast: true), payload: Protocol::Device::GetMeshFirmware.new)
129
+ elsif missing_mesh_firmware.count > 0
130
+ missing_mesh_firmware.each { |l| l.send_message(Protocol::Device::GetMeshFirmware.new) }
131
+ else
132
+ @message_rate = context.lights.alive.all? do |light|
133
+ m = light.mesh_firmware(fetch: false)
134
+ m && m >= '1.2'
135
+ end ? 20 : 5
136
+ gateway_connections.each do |connection|
137
+ connection.set_message_rate(@message_rate)
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ DEFAULT_MESSAGING_RATE = 5 # per second
144
+ def message_rate
145
+ @message_rate || 5
146
+ end
147
+
108
148
  def initialize_transports
109
149
  create_broadcast_transport
110
150
  create_peer_transport
@@ -1,3 +1,3 @@
1
1
  module LIFX
2
- VERSION = "0.4.6.1"
2
+ VERSION = "0.4.7"
3
3
  end
@@ -69,8 +69,10 @@ describe LIFX::Message do
69
69
  context 'no path' do
70
70
  let(:msg) { LIFX::Message.new(payload: LIFX::Protocol::Device::SetPower.new) }
71
71
 
72
- it 'throws an exception' do
73
- expect { msg.pack }.to raise_error(LIFX::Message::NoPath)
72
+ it 'defaults to null site and target' do
73
+ unpacked = LIFX::Message.unpack(msg.pack)
74
+ expect(unpacked.path.site_id).to eq('000000000000')
75
+ expect(unpacked.path.device_id).to eq('000000000000')
74
76
  end
75
77
  end
76
78
 
@@ -14,10 +14,10 @@ shared_context 'integration', integration: true do
14
14
  c = LIFX::Client.lan
15
15
  begin
16
16
  c.discover! do
17
- c.tags.include?('Test') && c.lights.with_tag('Test').count > 0
17
+ c.tags.include?('_Test') && c.lights.with_tag('_Test').count > 0
18
18
  end
19
19
  rescue Timeout::Error
20
- raise "Could not find any lights with tag Test in #{c.lights.inspect}"
20
+ raise "Could not find any lights with tag _Test in #{c.lights.inspect}"
21
21
  end
22
22
  c
23
23
  end
@@ -27,7 +27,7 @@ shared_context 'integration', integration: true do
27
27
  lifx.flush
28
28
  end
29
29
 
30
- let(:lights) { lifx.lights.with_tag('Test') }
30
+ let(:lights) { lifx.lights.with_tag('_Test') }
31
31
  let(:light) { lights.first }
32
32
  end
33
33
 
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.6.1
4
+ version: 0.4.7
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-04-02 00:00:00.000000000 Z
11
+ date: 2014-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata