homie-mqtt 1.4.4 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/homie-mqtt.rb +1 -14
- data/lib/mqtt/homie/base.rb +8 -7
- data/lib/mqtt/homie/device.rb +34 -19
- data/lib/mqtt/homie/node.rb +22 -5
- data/lib/mqtt/homie/property.rb +122 -68
- data/lib/mqtt/homie/version.rb +1 -1
- data/lib/mqtt/homie.rb +16 -0
- metadata +68 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d70ea4b44d22d3f2b5348e3e30b4ec4d624b0e3679f9f8da28813563a9296616
|
4
|
+
data.tar.gz: 1a7d48f60cc074d9f38a1190fd60e2a6df53f815ca733610ce32aef58c494a1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0119a668ccb19e5568d52c8dad148f882a9a17b8913c6f523e5b84c32f738c87437e0d765d780e771bc0b477cbf4bc9287e3004f258185ee1e6b9595de3c1641'
|
7
|
+
data.tar.gz: 4be69c2086e1ad51e67972858a6f3d37a84b73ca247c2e37ae6a436934b87130499e04f9fd9e813f626f1a6e667c60e424c5360b45f18bc0b386717ea5738f69
|
data/lib/homie-mqtt.rb
CHANGED
@@ -1,16 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
module Homie
|
5
|
-
class << self
|
6
|
-
def escape_id(id)
|
7
|
-
id.downcase.gsub(/[^a-z0-9\-]/, '-').sub(/^[^a-z0-9]+/, '')
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
require 'mqtt/homie/base'
|
14
|
-
require 'mqtt/homie/device'
|
15
|
-
require 'mqtt/homie/node'
|
16
|
-
require 'mqtt/homie/property'
|
3
|
+
require "mqtt/homie"
|
data/lib/mqtt/homie/base.rb
CHANGED
@@ -9,18 +9,19 @@ module MQTT
|
|
9
9
|
|
10
10
|
def initialize(id, name)
|
11
11
|
raise ArgumentError, "Invalid Homie ID '#{id}'" unless id.is_a?(String) && id =~ Regexp.new("^#{REGEX}$")
|
12
|
+
|
12
13
|
@id = id
|
13
14
|
@name = name
|
14
15
|
end
|
15
16
|
|
16
17
|
def name=(value)
|
17
|
-
if name
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
return if name == value
|
19
|
+
|
20
|
+
name = value
|
21
|
+
return unless @published
|
22
|
+
|
23
|
+
device.init do
|
24
|
+
mqtt.publish("#{topic}/$name", name, retain: true, qos: 1)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
data/lib/mqtt/homie/device.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "mqtt"
|
4
|
+
require "ruby2_keywords"
|
4
5
|
|
5
6
|
module MQTT
|
6
7
|
module Homie
|
7
8
|
class Device < Base
|
9
|
+
# the Homie spec version
|
10
|
+
VERSION = "4.0.0"
|
11
|
+
|
8
12
|
attr_reader :root_topic, :state, :mqtt
|
9
|
-
attr_accessor :logger
|
10
|
-
attr_accessor :out_of_band_topic_proc
|
13
|
+
attr_accessor :logger, :out_of_band_topic_proc
|
11
14
|
|
12
15
|
def initialize(id, name, root_topic: nil, mqtt: nil, clear_topics: true, &block)
|
13
16
|
super(id, name)
|
14
|
-
@root_topic =
|
17
|
+
@root_topic = root_topic || "homie"
|
15
18
|
@state = :init
|
16
19
|
@nodes = {}
|
17
20
|
@published = false
|
@@ -22,9 +25,7 @@ module MQTT
|
|
22
25
|
|
23
26
|
@mqtt.on_reconnect do
|
24
27
|
each do |node|
|
25
|
-
node.each
|
26
|
-
property.subscribe
|
27
|
-
end
|
28
|
+
node.each(&:subscribe)
|
28
29
|
end
|
29
30
|
mqtt.publish("#{topic}/$state", :init, retain: true, qos: 1)
|
30
31
|
mqtt.publish("#{topic}/$state", state, retain: true, qos: 1) unless state == :init
|
@@ -34,6 +35,10 @@ module MQTT
|
|
34
35
|
self.clear_topics if clear_topics
|
35
36
|
end
|
36
37
|
|
38
|
+
def inspect
|
39
|
+
"#<MQTT::Homie::Device #{topic} name=#{name.inspect}, $state=#{state.inspect}>"
|
40
|
+
end
|
41
|
+
|
37
42
|
def device
|
38
43
|
self
|
39
44
|
end
|
@@ -42,11 +47,11 @@ module MQTT
|
|
42
47
|
"#{root_topic}/#{id}"
|
43
48
|
end
|
44
49
|
|
45
|
-
def node(id, *args
|
50
|
+
ruby2_keywords def node(id, *args)
|
46
51
|
raise ArgumentError, "Node '#{id}' already exists" if @nodes.key?(id)
|
47
52
|
|
48
53
|
init do |prior_state|
|
49
|
-
node = Node.new(self, id, *args
|
54
|
+
node = Node.new(self, id, *args)
|
50
55
|
|
51
56
|
@nodes[id] = node
|
52
57
|
yield node if block_given?
|
@@ -60,10 +65,11 @@ module MQTT
|
|
60
65
|
|
61
66
|
def remove_node(id)
|
62
67
|
return false unless (node = @nodes[id])
|
68
|
+
|
63
69
|
init do
|
64
70
|
node.unpublish
|
65
71
|
@nodes.delete(id)
|
66
|
-
mqtt.publish("#{topic}/$nodes", @nodes.keys.join(","), retain: true, qos: 1) if
|
72
|
+
mqtt.publish("#{topic}/$nodes", @nodes.keys.join(","), retain: true, qos: 1) if published?
|
67
73
|
end
|
68
74
|
true
|
69
75
|
end
|
@@ -76,11 +82,19 @@ module MQTT
|
|
76
82
|
@nodes.each_value(&block)
|
77
83
|
end
|
78
84
|
|
85
|
+
def count
|
86
|
+
@nodes.count
|
87
|
+
end
|
88
|
+
|
89
|
+
def published?
|
90
|
+
@published
|
91
|
+
end
|
92
|
+
|
79
93
|
def publish
|
80
|
-
return if
|
94
|
+
return if published?
|
81
95
|
|
82
96
|
mqtt.batch_publish do
|
83
|
-
mqtt.publish("#{topic}/$homie",
|
97
|
+
mqtt.publish("#{topic}/$homie", VERSION, retain: true, qos: 1)
|
84
98
|
mqtt.publish("#{topic}/$name", name, retain: true, qos: 1)
|
85
99
|
mqtt.publish("#{topic}/$state", @state.to_s, retain: true, qos: 1)
|
86
100
|
|
@@ -105,6 +119,9 @@ module MQTT
|
|
105
119
|
|
106
120
|
mqtt.publish("#{topic}/$nodes", @nodes.keys.join(","), retain: true, qos: 1)
|
107
121
|
@nodes.each_value(&:publish)
|
122
|
+
|
123
|
+
yield if block_given?
|
124
|
+
|
108
125
|
mqtt.publish("#{topic}/$state", (@state = :ready).to_s, retain: true, qos: 1)
|
109
126
|
end
|
110
127
|
|
@@ -125,26 +142,24 @@ module MQTT
|
|
125
142
|
end
|
126
143
|
|
127
144
|
def init
|
128
|
-
if state == :init
|
129
|
-
return yield state
|
130
|
-
end
|
145
|
+
return yield state if state == :init
|
131
146
|
|
132
147
|
prior_state = state
|
133
|
-
mqtt.publish("#{topic}/$state", (state = :init).to_s, retain: true, qos: 1)
|
148
|
+
mqtt.publish("#{topic}/$state", (@state = :init).to_s, retain: true, qos: 1)
|
134
149
|
result = nil
|
135
150
|
mqtt.batch_publish do
|
136
151
|
result = yield prior_state
|
137
152
|
end
|
138
|
-
mqtt.publish("#{topic}/$state", (state = :ready).to_s, retain: true, qos: 1)
|
153
|
+
mqtt.publish("#{topic}/$state", (@state = :ready).to_s, retain: true, qos: 1)
|
139
154
|
result
|
140
155
|
end
|
141
156
|
|
142
157
|
def clear_topics
|
143
|
-
raise ArgumentError, "cannot clear topics once published" if
|
158
|
+
raise ArgumentError, "cannot clear topics once published" if published?
|
144
159
|
|
145
160
|
@mqtt.subscribe("#{topic}/#")
|
146
161
|
@mqtt.unsubscribe("#{topic}/#", wait_for_ack: true)
|
147
|
-
|
162
|
+
until @mqtt.queue_empty?
|
148
163
|
packet = @mqtt.get
|
149
164
|
@mqtt.publish(packet.topic, retain: true, qos: 0)
|
150
165
|
end
|
data/lib/mqtt/homie/node.rb
CHANGED
@@ -13,14 +13,25 @@ module MQTT
|
|
13
13
|
@published = false
|
14
14
|
end
|
15
15
|
|
16
|
+
def inspect
|
17
|
+
"#<MQTT::Homie::Node #{topic} name=#{full_name.inspect}, type=#{type.inspect}>"
|
18
|
+
end
|
19
|
+
|
20
|
+
def full_name
|
21
|
+
return name if device.count == 1
|
22
|
+
|
23
|
+
"#{device.name} #{name}"
|
24
|
+
end
|
25
|
+
|
16
26
|
def topic
|
17
27
|
"#{device.topic}/#{id}"
|
18
28
|
end
|
19
29
|
|
20
|
-
def property(*args,
|
30
|
+
ruby2_keywords def property(*args, &block)
|
21
31
|
device.init do |prior_state|
|
22
|
-
property = Property.new(self, *args,
|
32
|
+
property = Property.new(self, *args, &block)
|
23
33
|
raise ArgumentError, "Property '#{property.id}' already exists on '#{id}'" if @properties.key?(property.id)
|
34
|
+
|
24
35
|
@properties[property.id] = property
|
25
36
|
property.publish if prior_state == :ready
|
26
37
|
property
|
@@ -29,10 +40,11 @@ module MQTT
|
|
29
40
|
|
30
41
|
def remove_property(id)
|
31
42
|
return false unless (property = @properties[id])
|
43
|
+
|
32
44
|
init do
|
33
45
|
property.unpublish
|
34
46
|
@properties.delete(id)
|
35
|
-
mqtt.publish("#{topic}/$properties", @properties.keys.join(","), retain: true, qos: 1) if
|
47
|
+
mqtt.publish("#{topic}/$properties", @properties.keys.join(","), retain: true, qos: 1) if published?
|
36
48
|
end
|
37
49
|
true
|
38
50
|
end
|
@@ -58,9 +70,13 @@ module MQTT
|
|
58
70
|
end
|
59
71
|
end
|
60
72
|
|
73
|
+
def published?
|
74
|
+
@published
|
75
|
+
end
|
76
|
+
|
61
77
|
def publish
|
62
78
|
mqtt.batch_publish do
|
63
|
-
unless
|
79
|
+
unless published?
|
64
80
|
mqtt.publish("#{topic}/$name", name, retain: true, qos: 1)
|
65
81
|
mqtt.publish("#{topic}/$type", @type.to_s, retain: true, qos: 1)
|
66
82
|
@published = true
|
@@ -72,7 +88,8 @@ module MQTT
|
|
72
88
|
end
|
73
89
|
|
74
90
|
def unpublish
|
75
|
-
return unless
|
91
|
+
return unless published?
|
92
|
+
|
76
93
|
@published = false
|
77
94
|
|
78
95
|
mqtt.publish("#{topic}/$name", retain: true, qos: 0)
|
data/lib/mqtt/homie/property.rb
CHANGED
@@ -1,37 +1,67 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "time"
|
4
|
+
|
3
5
|
module MQTT
|
4
6
|
module Homie
|
5
7
|
class Property < Base
|
6
8
|
attr_reader :node, :datatype, :format, :unit, :value
|
7
9
|
|
8
|
-
def initialize(node,
|
9
|
-
|
10
|
+
def initialize(node,
|
11
|
+
id,
|
12
|
+
name,
|
13
|
+
datatype,
|
14
|
+
value = nil,
|
15
|
+
format: nil,
|
16
|
+
retained: true,
|
17
|
+
unit: nil,
|
18
|
+
non_standard_value_check: nil,
|
19
|
+
&block)
|
20
|
+
raise ArgumentError, "Invalid Homie datatype" unless %i[string
|
21
|
+
integer
|
22
|
+
float
|
23
|
+
boolean
|
24
|
+
enum
|
25
|
+
color
|
26
|
+
datetime
|
27
|
+
duration].include?(datatype)
|
10
28
|
raise ArgumentError, "retained must be boolean" unless [true, false].include?(retained)
|
11
|
-
format = format.join(",") if format.is_a?(Array) && datatype == :enum
|
12
|
-
if %i{integer float}.include?(datatype) && format.is_a?(Range)
|
13
|
-
raise ArgumentError "only inclusive ranges are supported" if format.exclude_end?
|
14
|
-
format = "#{format.begin}:#{format.end}"
|
15
|
-
end
|
16
|
-
raise ArgumentError, "format must be nil or a string" unless format.nil? || format.is_a?(String)
|
17
29
|
raise ArgumentError, "unit must be nil or a string" unless unit.nil? || unit.is_a?(String)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
raise ArgumentError, "an initial value cannot be provided for a non-retained property" if !value.nil? && !retained
|
30
|
+
if !value.nil? && !retained
|
31
|
+
raise ArgumentError, "an initial value cannot be provided for a non-retained property"
|
32
|
+
end
|
22
33
|
|
23
34
|
super(id, name)
|
24
35
|
|
25
36
|
@node = node
|
26
37
|
@datatype = datatype
|
27
|
-
|
38
|
+
self.format = format
|
28
39
|
@retained = retained
|
29
40
|
@unit = unit
|
30
41
|
@value = value
|
31
42
|
@published = false
|
43
|
+
@non_standard_value_check = non_standard_value_check
|
32
44
|
@block = block
|
33
45
|
end
|
34
46
|
|
47
|
+
def inspect
|
48
|
+
result = +"#<MQTT::Homie::Property #{topic} name=#{full_name.inspect}, datatype=#{datatype.inspect}"
|
49
|
+
result << ", format=#{format.inspect}" if format
|
50
|
+
result << ", unit=#{unit.inspect}" if unit
|
51
|
+
result << ", settable=true" if settable?
|
52
|
+
result << if retained?
|
53
|
+
", value=#{value.inspect}"
|
54
|
+
else
|
55
|
+
", retained=false"
|
56
|
+
end
|
57
|
+
result << ">"
|
58
|
+
result.freeze
|
59
|
+
end
|
60
|
+
|
61
|
+
def full_name
|
62
|
+
"#{node.full_name} #{name}"
|
63
|
+
end
|
64
|
+
|
35
65
|
def device
|
36
66
|
node.device
|
37
67
|
end
|
@@ -49,89 +79,112 @@ module MQTT
|
|
49
79
|
end
|
50
80
|
|
51
81
|
def value=(value)
|
52
|
-
if @value
|
53
|
-
|
54
|
-
|
55
|
-
|
82
|
+
return if @value == value
|
83
|
+
|
84
|
+
@value = value if retained?
|
85
|
+
publish_value if published?
|
56
86
|
end
|
57
87
|
|
58
88
|
def unit=(unit)
|
59
|
-
if unit
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
89
|
+
return if unit == @unit
|
90
|
+
|
91
|
+
@unit = unit
|
92
|
+
return unless published?
|
93
|
+
|
94
|
+
device.init do
|
95
|
+
mqtt.publish("#{topic}/$unit", unit.to_s, retain: true, qos: 1)
|
66
96
|
end
|
67
97
|
end
|
68
98
|
|
69
99
|
def format=(format)
|
70
|
-
if format
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
100
|
+
return if format == @format
|
101
|
+
|
102
|
+
format = format.join(",") if format.is_a?(Array) && datatype == :enum
|
103
|
+
if %i[integer float].include?(datatype) && format.is_a?(Range)
|
104
|
+
raise ArgumentError, "only inclusive ranges are supported" if format.last.is_a?(Float) && format.exclude_end?
|
105
|
+
|
106
|
+
last = format.end
|
107
|
+
last -= 1 if format.exclude_end?
|
108
|
+
|
109
|
+
format = "#{format.begin}:#{last}"
|
110
|
+
end
|
111
|
+
raise ArgumentError, "format must be nil or a string" unless format.nil? || format.is_a?(String)
|
112
|
+
raise ArgumentError, "format is required for enums" if datatype == :enum && format.nil?
|
113
|
+
raise ArgumentError, "format is required for colors" if datatype == :color && format.nil?
|
114
|
+
if datatype == :color && !%w[rgb hsv].include?(format.to_s)
|
115
|
+
raise ArgumentError, "format must be either rgb or hsv for colors"
|
116
|
+
end
|
117
|
+
|
118
|
+
@format = format
|
119
|
+
return unless published?
|
120
|
+
|
121
|
+
device.init do
|
122
|
+
mqtt.publish("#{topic}/$format", format.to_s, retain: true, qos: 1)
|
77
123
|
end
|
78
124
|
end
|
79
125
|
|
80
126
|
def range
|
127
|
+
return nil unless format
|
128
|
+
|
81
129
|
case datatype
|
82
|
-
when :enum
|
83
|
-
when :integer
|
84
|
-
when :float
|
130
|
+
when :enum then format.split(",")
|
131
|
+
when :integer then Range.new(*format.split(":").map(&:to_i))
|
132
|
+
when :float then Range.new(*format.split(":").map(&:to_f))
|
85
133
|
else; raise MethodNotImplemented
|
86
134
|
end
|
87
135
|
end
|
88
136
|
|
89
137
|
def set(value)
|
138
|
+
casted_value = case datatype
|
139
|
+
when :boolean
|
140
|
+
%w[true false].include?(value) ? value == "true" : nil
|
141
|
+
when :integer
|
142
|
+
/^-?\d+$/.match?(value) && value.to_i
|
143
|
+
when :float
|
144
|
+
/^-?(?:\d+|\d+\.|\.\d+|\d+\.\d+)(?:[eE]-?\d+)?$/.match?(value) && value.to_f
|
145
|
+
when :enum
|
146
|
+
value
|
147
|
+
when :color
|
148
|
+
/^\d{1,3},\d{1,3},\d{1,3}$/.match?(value) && value = value.split(",").map(&:to_i)
|
149
|
+
when :datetime
|
150
|
+
begin
|
151
|
+
value = Time.parse(value)
|
152
|
+
rescue ArgumentError
|
153
|
+
nil
|
154
|
+
end
|
155
|
+
when :duration
|
156
|
+
begin
|
157
|
+
value = ActiveSupport::Duration.parse(value)
|
158
|
+
rescue ActiveSupport::Duration::ISO8601Parser::ParsingError
|
159
|
+
nil
|
160
|
+
end
|
161
|
+
end
|
90
162
|
case datatype
|
91
|
-
when :
|
92
|
-
|
93
|
-
value = value == 'true'
|
94
|
-
when :integer
|
95
|
-
return unless value =~ /^-?\d+$/
|
96
|
-
value = value.to_i
|
97
|
-
return unless range.include?(value) if format
|
98
|
-
when :float
|
99
|
-
return unless value =~ /^-?(?:\d+|\d+\.|\.\d+|\d+\.\d+)(?:[eE]-?\d+)?$/
|
100
|
-
value = value.to_f
|
101
|
-
return unless range.include?(value) if format
|
163
|
+
when :integer, :float
|
164
|
+
casted_value = nil if format && !range.cover?(casted_value)
|
102
165
|
when :enum
|
103
|
-
|
166
|
+
casted_value = nil if format && !range.include?(casted_value)
|
104
167
|
when :color
|
105
|
-
|
106
|
-
|
107
|
-
if format == 'rgb'
|
108
|
-
return if value.max > 255
|
109
|
-
elsif format == 'hsv'
|
110
|
-
return if value.first > 360 || value[1..2].max > 100
|
111
|
-
end
|
112
|
-
when :datetime
|
113
|
-
begin
|
114
|
-
value = Time.parse(value)
|
115
|
-
rescue ArgumentError
|
116
|
-
return
|
117
|
-
end
|
118
|
-
when :duration
|
119
|
-
begin
|
120
|
-
value = ActiveSupport::Duration.parse(value)
|
121
|
-
rescue ActiveSupport::Duration::ISO8601Parser::ParsingError
|
122
|
-
return
|
123
|
-
end
|
168
|
+
casted_value = nil if (format == "rgb" && value.max > 255) ||
|
169
|
+
(format == "hsb" && (value.first > 360 || value[1..2].max > 100))
|
124
170
|
end
|
125
171
|
|
126
|
-
|
172
|
+
casted_value = @non_standard_value_check&.call(value) if casted_value.nil?
|
173
|
+
return if casted_value.nil?
|
174
|
+
|
175
|
+
@block.arity == 2 ? @block.call(casted_value, self) : @block.call(casted_value)
|
127
176
|
end
|
128
177
|
|
129
178
|
def mqtt
|
130
179
|
node.mqtt
|
131
180
|
end
|
132
181
|
|
182
|
+
def published?
|
183
|
+
@published
|
184
|
+
end
|
185
|
+
|
133
186
|
def publish
|
134
|
-
return if
|
187
|
+
return if published?
|
135
188
|
|
136
189
|
mqtt.batch_publish do
|
137
190
|
mqtt.publish("#{topic}/$name", name, retain: true, qos: 1)
|
@@ -152,7 +205,8 @@ module MQTT
|
|
152
205
|
end
|
153
206
|
|
154
207
|
def unpublish
|
155
|
-
return unless
|
208
|
+
return unless published?
|
209
|
+
|
156
210
|
@published = false
|
157
211
|
|
158
212
|
mqtt.publish("#{topic}/$name", retain: true, qos: 0)
|
data/lib/mqtt/homie/version.rb
CHANGED
data/lib/mqtt/homie.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MQTT
|
4
|
+
module Homie
|
5
|
+
class << self
|
6
|
+
def escape_id(id)
|
7
|
+
id.downcase.gsub(/[^a-z0-9\-]/, "-").sub(/^[^a-z0-9]+/, "")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require "mqtt/homie/base"
|
14
|
+
require "mqtt/homie/device"
|
15
|
+
require "mqtt/homie/node"
|
16
|
+
require "mqtt/homie/property"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: homie-mqtt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mqtt-ccutrer
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.1
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,6 +27,23 @@ dependencies:
|
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '1.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: ruby2_keywords
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.0.5
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.0.5
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
48
|
name: byebug
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +72,48 @@ dependencies:
|
|
52
72
|
- - "~>"
|
53
73
|
- !ruby/object:Gem::Version
|
54
74
|
version: '13.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '1.23'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '1.23'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rubocop-performance
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.12'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.12'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rubocop-rake
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.6'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0.6'
|
55
117
|
description:
|
56
118
|
email: cody@cutrer.com'
|
57
119
|
executables: []
|
@@ -59,6 +121,7 @@ extensions: []
|
|
59
121
|
extra_rdoc_files: []
|
60
122
|
files:
|
61
123
|
- lib/homie-mqtt.rb
|
124
|
+
- lib/mqtt/homie.rb
|
62
125
|
- lib/mqtt/homie/base.rb
|
63
126
|
- lib/mqtt/homie/device.rb
|
64
127
|
- lib/mqtt/homie/node.rb
|
@@ -67,7 +130,8 @@ files:
|
|
67
130
|
homepage: https://github.com/ccutrer/homie-mqtt
|
68
131
|
licenses:
|
69
132
|
- MIT
|
70
|
-
metadata:
|
133
|
+
metadata:
|
134
|
+
rubygems_mfa_required: 'true'
|
71
135
|
post_install_message:
|
72
136
|
rdoc_options: []
|
73
137
|
require_paths:
|
@@ -76,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
140
|
requirements:
|
77
141
|
- - ">="
|
78
142
|
- !ruby/object:Gem::Version
|
79
|
-
version: '
|
143
|
+
version: '2.5'
|
80
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
145
|
requirements:
|
82
146
|
- - ">="
|