lora-rb 0.13.0 → 0.14.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c69af1bb8d861091a38f5520a8e5363283da9c7c
4
- data.tar.gz: be29e3ee50a7c565592c1edbd3f3f4f33c17ee56
3
+ metadata.gz: 235226d726a9323c2c3ccd296f08ca7193001179
4
+ data.tar.gz: 3602887c6d1d351785ce3c9249e88cf56ea25e90
5
5
  SHA512:
6
- metadata.gz: b8f950c4d83d6b92c2cc16077f644d6de03ef0e61fea00530bfe94a985c761c95045cf1e12aba1f0c73c9b8b54355f12a323f888cd1cfa586ab2ceee4b799750
7
- data.tar.gz: d7c5730946bee3ad5eadb5ebcc412329a5a3347403e2b262fcf469e4bb0cf14e7d222070c8be2a40c411aebc38793da00413d8fd8cd9f021d20f162ba9b34b9e
6
+ metadata.gz: 1b52de77fbcace7cc959ed9cf7534bd7348510b6464f39e3bf2006827e144c22e7a02f38365134b615baabefcdbcaf7b2043cc0e432246faaaf53152ad424dfe
7
+ data.tar.gz: 191e3fbdd9abd4157cc98e6c057a19f55f56399af25c7b0177cac2b0f06a56887b68f11ad47df651c29d1620451d73540908bd67a4af151dfb7352a0739f4f89
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ v0.14.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.13.0..v0.14.0) September 28th, 2017
2
+ ------------------------------
3
+ * Mqtt: read data and listen does not add eui and port anymore if they are nil
4
+
1
5
  v0.13.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.12.0..v0.13.0) September 12th, 2017
2
6
  ------------------------------
3
7
  * Mqtt: in the send_cmd, qos parameter is not set by default anymore
data/README.md CHANGED
@@ -26,8 +26,8 @@ among which you can choose to connect to the lora network.
26
26
 
27
27
  This version supports:
28
28
 
29
- 1. TLS protocol with [Loriot](http://loriot.io)
30
- 2. Http push with [Resiot](http://resiot.io)
29
+ 1. TLS protocol with [Loriot](http://loriot.io) (No longer supported)
30
+ 2. Http push with [Resiot](http://resiot.io) (No longer supported)
31
31
  3. MQTT with [A2aSmartCity](http://www.a2asmartcity.io/)
32
32
 
33
33
  ## Configuration
@@ -151,6 +151,7 @@ you should receive the instance with variables depending on protocol:
151
151
  lora.send_cmd(eui: 'Insert here your device eui', confirmed: true, data: '0101')
152
152
  ```
153
153
 
154
+ Add **debug: true** to get a trace of the operations. Use the value __:full__ to get more information.
154
155
  The response depend on the provider.
155
156
  This is an example using tls protocol and the provider Loriot.io:
156
157
 
@@ -196,6 +197,8 @@ This is an example provided using mqtt protocol and the provider A2a:
196
197
  {"reply"=>{"confirmed"=>false, "id"=>150, "payload"=>"0100", "port"=>40, "priority"=>0}, "status"=>200, "eui"=>nil, "port"=>nil}
197
198
  ```
198
199
 
200
+ #### Implemented only on Mqtt
201
+
199
202
  Using MQTT, by default the param wait_response is true. This means after publishing a message it waits the response
200
203
  on dedicated topic.
201
204
 
@@ -219,6 +222,33 @@ lora.send_cmd(eui: 'Insert here your device eui',
219
222
  wait_response: false)
220
223
  ```
221
224
 
225
+ The param delete_previous_enqueued_commands is true by default as well. It means previous enqueued messages to the node
226
+ are deleted (the queue is emptied) before sending a new one.
227
+
228
+ If you need to keep the queue:
229
+
230
+ ```ruby
231
+ lora.send_cmd(eui: 'Insert here your device eui', confirmed: true, data: '0100', delete_previous_enqueued_commands: false)
232
+ ```
233
+
234
+ To get enqueued messages:
235
+
236
+ ```ruby
237
+ lora.get_enqueued_messages(eui: 'Insert here your device eui')
238
+ ```
239
+
240
+ To explicitly delete enqueued messages:
241
+
242
+ ```ruby
243
+ lora.delete_enqueued_messages(eui: 'Insert here your device eui')
244
+ ```
245
+
246
+ or passing the id to delete ony that message:
247
+
248
+ ```ruby
249
+ lora.delete_enqueued_messages(eui: 'Insert here your device eui', id: 1234)
250
+ ```
251
+
222
252
  ### Uplink: receive data from devices
223
253
 
224
254
  To listen your devices:
data/lib/config/config.rb CHANGED
@@ -12,7 +12,9 @@ LoraRb.configure do |config|
12
12
  config.port = 8883
13
13
  config.uplink_url = '/sub/v1/users/{username}/apps/{appid}/devices/+/uplink/+'
14
14
  config.downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/post/reply/{clientid}/id/{requestid}'
15
- config.timeout = 10.0
15
+ config.delete_enqueued_downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/{id}/delete/reply/{clientid}/id/{requestid}'
16
+ config.enqueued_downlinks_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/get/reply/{clientid}/id/{requestid}'
17
+ config.timeout = 60.0
16
18
  # If you expect more than one response in a topic, add an item with url=nil to not subscribe it newly
17
19
  config.downlink_response_urls = [
18
20
  { name: :queued, url: 'reply/{clientid}/id/{requestid}'},
@@ -8,12 +8,12 @@ defaults: &defaults
8
8
  #connector_id: "69643d32"
9
9
  # A2a
10
10
  #appid: "a1b2c3d4e5f60001"
11
- appid: "9955"
11
+ appid: "9956" # SSG dev
12
12
  token: "2B7E151628AED2A6ABF7158809CF4F3C"
13
13
  username: "fractalgarden"
14
14
  password: "fr4ctalg4rden"
15
15
 
16
- test_eui: "be7a00000000123c"
16
+ test_eui: "be7a0000000010cf"
17
17
  #foo: add every variable you need and use it with => LoraRb::Settings.foo
18
18
  # bar: sub variable are accessible with hash => LoraRb::Settings.foo[:bar]
19
19
 
@@ -3,7 +3,7 @@ module LoraRb
3
3
  # attr_writer :allow_sign_up
4
4
 
5
5
  attr_accessor :protocol, :host, :port, :uplink_url, :downlink_url, :downlink_response_urls, :ssl, :ssl_file, :env,
6
- :timeout
6
+ :timeout, :enqueued_downlinks_url, :delete_enqueued_downlink_url
7
7
 
8
8
  def initialize
9
9
  @protocol = nil
@@ -11,7 +11,9 @@ module LoraRb
11
11
  @port = nil
12
12
  @uplink_url = nil
13
13
  @downlink_url = nil
14
+ @enqueued_downlinks_url = nil
14
15
  @downlink_response_urls = nil
16
+ @delete_enqueued_downlink_url = nil
15
17
  @ssl = nil # True if uses tls
16
18
  @ssl_file = nil # The certificate's path
17
19
  @env = 'development'
data/lib/lora-rb/base.rb CHANGED
@@ -16,7 +16,9 @@ class LoraClient
16
16
  port: LoraRb.configuration.port,
17
17
  uplink_url: LoraRb.configuration.uplink_url,
18
18
  downlink_url: LoraRb.configuration.downlink_url,
19
+ enqueued_downlinks_url: LoraRb.configuration.enqueued_downlinks_url,
19
20
  downlink_response_urls: LoraRb.configuration.downlink_response_urls,
21
+ delete_enqueued_downlink_url: LoraRb.configuration.delete_enqueued_downlink_url,
20
22
  username: LoraRb::Settings.username,
21
23
  password: LoraRb::Settings.password,
22
24
  ssl: LoraRb.configuration.ssl,
@@ -26,6 +28,8 @@ class LoraClient
26
28
  @token = options[:token]
27
29
  @appid = options[:appid]
28
30
 
31
+ require 'philter'
32
+ require 'securerandom'
29
33
  welcome_response = sub_initialize(options)
30
34
 
31
35
  raise("Lora-rb: Cannot connect to host #{options[:host]}:#{options[:port]}") unless welcome_response.key?('hello')
@@ -67,6 +71,25 @@ class LoraClient
67
71
  sub_listen(options, &block)
68
72
  end
69
73
 
74
+ # It returns enqueued message ready to delivery to node
75
+ # ['topic', {'reply' => [ { ... } ], 'status' => 200}]
76
+ def get_enqueued_messages(eui:, request_id: nil, debug: false)
77
+ res = sub_get_enqueued_messages(eui: eui,
78
+ request_id: request_id,
79
+ debug: debug)
80
+ puts "get_enqueued_message #{res}" if @debug
81
+ res
82
+ end
83
+
84
+ # It returns enqueued message ready to delivery to node
85
+ # ['topic', [ {'reply' => { ... }, 'status' => 200 ] ]
86
+ def delete_enqueued_messages(eui:, id: nil, debug: false)
87
+ res = sub_delete_enqueued_messages(eui: eui,
88
+ id: id,
89
+ debug: debug)
90
+ puts "delete_enqueued_message #{res}" if @debug
91
+ res
92
+ end
70
93
  # Close the secure connection with the cloud
71
94
  def quit
72
95
  sub_quit
@@ -48,6 +48,16 @@ module LoraRb
48
48
  raise('In http protocol, it expects data with an http server. Lora Network server must exec an http push ')
49
49
  end
50
50
 
51
+ # Pending ...
52
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
53
+ raise "Pending..."
54
+ end
55
+
56
+ # Pending ...
57
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
58
+ raise "Pending..."
59
+ end
60
+
51
61
  # Blank method. No need to close a connection with the http protocol
52
62
  def sub_quit
53
63
  end
@@ -21,7 +21,6 @@ module LoraRb
21
21
 
22
22
  @username = options[:username]
23
23
  @client_id = "#{@username}::ssg#{generate_request_id}"
24
- @downlink_response_urls = options[:downlink_response_urls]
25
24
 
26
25
  @client = MQTT::Client.connect(
27
26
  host: options[:host],
@@ -38,7 +37,10 @@ module LoraRb
38
37
  appid: @appid },
39
38
  { debug: options[:debug] })
40
39
 
41
- @downlink_url = merge_tags_to_url(options[:downlink_url])
40
+ @downlink_url = options[:downlink_url]
41
+ @downlink_response_urls = options[:downlink_response_urls]
42
+ @enqueued_downlinks_url = options[:enqueued_downlinks_url]
43
+ @delete_enqueued_downlink_url = options[:delete_enqueued_downlink_url]
42
44
  @timeout = options[:timeout]
43
45
  @wait_response = options.has_key?(:wait_response) ? options[:wait_response] : true
44
46
  {'hello' => 'Lora-Rb: Ready to start!'}
@@ -46,21 +48,16 @@ module LoraRb
46
48
 
47
49
  # Send the request to device
48
50
  def sub_send_cmd(options={})
49
- options = { wait_response: @wait_response }.merge(options)
51
+ options = { wait_response: @wait_response, delete_previous_enqueued_commands: true }.merge(options)
52
+
53
+ sub_delete_enqueued_messages(eui: options[:eui], debug: options[:debug]) if options[:delete_previous_enqueued_commands]
54
+
50
55
  h_request = {
51
56
  "port": options[:port], # Port where the message should be sent
52
57
  "payload": options[:data], # Message payload
53
58
  "confirmed": options[:confirmed], # (Optional) Tells whether a confirmed downlink is requested. Default: false
54
59
  "window": options[:window] || "BOTH", # (Optional) Specifies which rx window should be used: RX1, RX2 or any(BOTH). Default: BOTH
55
60
  "priority": options[:priority] || 0, # (Optional) Message priority, used to sort messages in the queue. Default: 0
56
- #"qos": options[:qos] || 1 # (Optional) Quality Of Service:
57
- # 0 - Best effort. The message will be transmitted to the devices
58
- # of the group that satisfy the multicast profile requirements
59
- # (they should have been activated and have sent at least one
60
- # uplink, they should be class C devices, etc..).
61
- # 1 - Transmission guaranteed. No message will be transmitted if
62
- # some devices do not satisfy the multicast profile requirements.
63
- # Default: 1 */
64
61
  }
65
62
  request_id = generate_request_id
66
63
  publish_url = merge_tags_to_url(@downlink_url,
@@ -70,9 +67,9 @@ module LoraRb
70
67
  clientid: @client_id,
71
68
  requestid: request_id)
72
69
 
73
- puts "#{Time.now} publish #{h_request.to_json} to #{publish_url}" if options[:debug]
74
-
70
+ puts " publish #{h_request.to_json} to #{publish_url}" if options[:debug]
75
71
  responses = []
72
+ response_topics = []
76
73
  # thr_response = nil
77
74
  if options[:wait_response]
78
75
  @downlink_response_urls.each do |dru_hash|
@@ -86,9 +83,12 @@ module LoraRb
86
83
  deveui: options[:eui],
87
84
  clientid: @client_id,
88
85
  requestid: request_id)
89
- puts " [x] Subscribing response #{response_topic}" if options[:debug] == :full
90
- @client.subscribe(response_topic)
86
+ puts " Subscribing response #{response_topic}" if options[:debug] == :full
87
+ response_topics << response_topic
91
88
  end
89
+
90
+ raise "cannot subscribe without topic, response_topics is empty!" if response_topics.empty?
91
+ @client.subscribe(*response_topics)
92
92
  end
93
93
 
94
94
  @client.publish(publish_url, h_request.to_json, false)
@@ -98,11 +98,13 @@ module LoraRb
98
98
  # thr_responses.each { |thr_response| thr_response.join }
99
99
  # thr_response.join
100
100
  @downlink_response_urls.each do |dru_hash|
101
- response_topic, response_message = sub_read_data(topic: nil)
101
+ response_topic, response_message = sub_read_data(topic: nil, debug: options[:debug])
102
102
  response = { topic: response_topic, json: response_message }
103
- puts " [x] Found response #{response} " if options[:debug] == :full
103
+ puts " Found response #{response} " if options[:debug] == :full
104
104
  responses << response
105
105
  end
106
+
107
+ @client.unsubscribe(*response_topics)
106
108
  end
107
109
  responses
108
110
  end
@@ -110,11 +112,12 @@ module LoraRb
110
112
  # Receive the payload from the network
111
113
  # There is a timeout. Use this method only to retrieve data from the queue. If you have to waiting data
112
114
  # please use listen.
115
+ # If topic is nil it uses subscribed topics
113
116
  def sub_read_data(options={})
114
117
  topic = options.has_key?(:topic) ? options[:topic] : @topic
115
118
  if topic
116
119
  topic = topic.dup
117
- puts " [x] Reading topic #{topic}..." if options[:debug]
120
+ puts " Reading topic #{topic}..." if options[:debug]
118
121
  end
119
122
 
120
123
  message = nil
@@ -128,8 +131,10 @@ module LoraRb
128
131
 
129
132
  message = JSON.parse(message)
130
133
  if message.respond_to? '[]'
131
- message['eui'] ||= get_eui_from_topic(topic)
132
- message['port'] ||= get_port_from_topic(topic)
134
+ eui = get_eui_from_topic(topic)
135
+ message['eui'] ||= eui if eui
136
+ port = get_port_from_topic(topic)
137
+ message['port'] ||= port if port
133
138
  end
134
139
  return topic, message
135
140
  end
@@ -139,18 +144,20 @@ module LoraRb
139
144
  topic = options.has_key?(:topic) ? options[:topic] : @topic
140
145
  if topic
141
146
  topic = topic.dup
142
- puts " [*] Waiting for messages in #{topic}. To exit press CTRL+C" if options[:debug]
147
+ puts " Waiting for messages in #{topic}. To exit press CTRL+C" if options[:debug]
143
148
  end
144
149
 
145
150
  @client.get(topic) do |topic, message|
146
151
  # Block is executed for every message received
147
- puts " [x] #{topic}: #{message}" if options[:debug]
152
+ puts " original json: #{topic}: #{message}" if options[:debug] == :full
148
153
  message = JSON.parse(message)
149
154
  if message.respond_to? '[]'
150
- message['eui'] ||= get_eui_from_topic(topic)
151
- message['port'] ||= get_port_from_topic(topic)
155
+ eui = get_eui_from_topic(topic)
156
+ message['eui'] ||= eui if eui
157
+ port = get_port_from_topic(topic)
158
+ message['port'] ||= port if port
152
159
  end
153
- puts " [x] after rework: #{message}" if options[:debug]
160
+ puts " #{message}" if options[:debug] #After reworking
154
161
  block.call(topic, message) if block_given?
155
162
  break if options[:test]
156
163
  end
@@ -161,7 +168,80 @@ module LoraRb
161
168
  @client.disconnect
162
169
  end
163
170
 
164
- private
171
+ # Get enqueued messages from the network queue
172
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
173
+ request_id ||= generate_request_id
174
+ raise "eui cannot be empty!" unless eui
175
+
176
+ queued_response_url = @downlink_response_urls.philter({name: :queued}, get: :url).first
177
+ raise "queued_topic not found in the config yml!" unless queued_response_url
178
+ queued_response_url = merge_tags_to_url(queued_response_url,
179
+ username: @username,
180
+ appid: @appid,
181
+ deveui: eui,
182
+ clientid: @client_id,
183
+ requestid: request_id)
184
+ puts " queued_response_url #{queued_response_url}" if debug
185
+ @client.subscribe(queued_response_url)
186
+
187
+ # Check if there are previous messages to clear
188
+ enqueued_downlinks_url = merge_tags_to_url(@enqueued_downlinks_url,
189
+ username: @username,
190
+ appid: @appid,
191
+ deveui: eui,
192
+ clientid: @client_id,
193
+ requestid: request_id)
194
+ puts " enqueued_downlinks_url #{enqueued_downlinks_url}" if debug
195
+ # Request enqueued items
196
+ @client.publish(enqueued_downlinks_url, ''.to_json, false)
197
+
198
+ response_topic, response_message = sub_read_data(topic: nil, debug: debug)
199
+ puts " Topic #{response_topic} response #{response_message} " if debug == :full
200
+
201
+ @client.unsubscribe(queued_response_url)
202
+
203
+ return response_topic, response_message
204
+ end
205
+
206
+ # Delete one or all enqueued messages from the network queue
207
+ def sub_delete_enqueued_messages(eui:, id: nil, debug: false)
208
+ request_id = generate_request_id
209
+ ids_to_delete = id ? [id] : all_enqueued_downlink_id(eui: eui, request_id: request_id, debug: debug)
210
+ queued_response_url = @downlink_response_urls.philter({name: :queued}, get: :url).first
211
+ raise "queued_topic not found in the config yml!" unless queued_response_url
212
+ queued_response_url = merge_tags_to_url(queued_response_url,
213
+ username: @username,
214
+ appid: @appid,
215
+ deveui: eui,
216
+ clientid: @client_id,
217
+ requestid: request_id)
218
+
219
+ puts " response_topic #{queued_response_url}" if debug
220
+ @client.subscribe(queued_response_url)
221
+
222
+ responses = []
223
+ ids_to_delete.each do |id_to_delete|
224
+ # Check if there are previous messages to clear
225
+ delete_enqueued_downlink_url = merge_tags_to_url(@delete_enqueued_downlink_url,
226
+ username: @username,
227
+ appid: @appid,
228
+ deveui: eui,
229
+ id: id_to_delete,
230
+ clientid: @client_id,
231
+ requestid: request_id)
232
+ puts " delete_enqueued_downlink_url #{delete_enqueued_downlink_url}" if debug
233
+ # Request enqueued items
234
+ @client.publish(delete_enqueued_downlink_url, ''.to_json, false)
235
+
236
+ queued_response_url, response_message = sub_read_data(topic: nil, debug: debug)
237
+ puts " Found response #{response_message} " if debug == :full
238
+ responses << response_message
239
+ end
240
+
241
+ @client.unsubscribe(queued_response_url)
242
+
243
+ return queued_response_url, responses
244
+ end
165
245
 
166
246
  def get_eui_from_topic(topic)
167
247
  res = topic&.match(/devices\/(\w{16})/)
@@ -174,7 +254,29 @@ module LoraRb
174
254
  end
175
255
 
176
256
  def generate_request_id
177
- Time.now.strftime('%y%m%d%H%M%S')
257
+ "#{Time.now.strftime('%y%m%d%H%M%S')}#{SecureRandom.hex(1)}"
258
+ end
259
+
260
+ # It returns and array of ids from enqueued downlink response
261
+ # Response example:
262
+ # {"reply"=>[
263
+ # {"confirmed"=>true, "id"=>5034, "payload"=>"0200", "port"=>40, "priority"=>0},
264
+ # {"confirmed"=>true, "id"=>5035, "payload"=>"0200", "port"=>40, "priority"=>0},
265
+ # {"confirmed"=>true, "id"=>5036, "payload"=>"0200", "port"=>40, "priority"=>0},
266
+ # {"confirmed"=>true, "id"=>5037, "payload"=>"0200", "port"=>40, "priority"=>0}],
267
+ # "status"=>200}]
268
+ # Returns:
269
+ # [5034, 5035, 5036, 5037]
270
+ def all_enqueued_downlink_id(enqueued_messages:nil, eui:nil, request_id:nil, debug:false)
271
+ enqueued_messages ||= sub_get_enqueued_messages(eui: eui, request_id: request_id, debug: debug).last
272
+ raise "Cannot process enqueued messages since status=#{enqueued_messages['status']}" unless enqueued_messages['status'] == 200
273
+ return [] if enqueued_messages['reply'].nil?
274
+ raise "An array was expected not: #{enqueued_messages['reply']}" unless enqueued_messages['reply'].is_a?(Array)
275
+ res = enqueued_messages['reply'].map do |message|
276
+ message['id']
277
+ end
278
+ puts "#{res}" if debug == :full
279
+ res
178
280
  end
179
281
 
180
282
  end
@@ -43,6 +43,16 @@ module LoraRb
43
43
  end
44
44
  end
45
45
 
46
+ # Pending ...
47
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
48
+ raise "Pending..."
49
+ end
50
+
51
+ # Pending ...
52
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
53
+ raise "Pending..."
54
+ end
55
+
46
56
  # Close the connection
47
57
  def sub_quit
48
58
  @connection.close
@@ -75,6 +75,16 @@ module LoraRb
75
75
  end while response && !options[:test]
76
76
  end
77
77
 
78
+ # Pending ...
79
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
80
+ raise "Pending..."
81
+ end
82
+
83
+ # Pending ...
84
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
85
+ raise "Pending..."
86
+ end
87
+
78
88
  # Close the connection
79
89
  def sub_quit
80
90
  @ssl_socket.close
@@ -16,4 +16,8 @@ module LoraRb
16
16
  url
17
17
  end
18
18
  end
19
+
20
+ def puts(message)
21
+ Kernel.puts "[#{self.class.name}##{__method__}] #{Time.now} #{message}"
22
+ end
19
23
  end
data/lib/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module LoraRb
2
2
  def self.version
3
- "0.13.0"
3
+ "0.14.0"
4
4
  end
5
5
  def self.updated_at
6
- "2017-09-12"
6
+ "2017-09-29"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lora-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Mastrodonato
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-09-12 00:00:00.000000000 Z
13
+ date: 2017-09-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -26,6 +26,34 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: '2.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: mqtt
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: 0.5.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 0.5.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: philter
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.2.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.2.0
29
57
  - !ruby/object:Gem::Dependency
30
58
  name: test-unit
31
59
  requirement: !ruby/object:Gem::Requirement