waterfurnace_aurora 0.5.1 → 0.5.2
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 +4 -4
- data/exe/aurora_mqtt_bridge +15 -2
- data/lib/aurora/abc_client.rb +3 -1
- data/lib/aurora/mqtt_modbus.rb +47 -0
- data/lib/aurora/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c89c3d73941d7574fbe1088bf792676f772abfb98dab07be0de27a61323ec96
|
4
|
+
data.tar.gz: 13a5a82be919ee67bbbc87357eac1cf6aaba1b34514fbd808b9411dfc37bcb45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce768bdc79fc4cd2a406ebf15757f587d373030cec21efc64076b3951a7c97f631f1e47a0e810005b24553fdd78eb4aec869022c8e0f6f33e409522f473e942b
|
7
|
+
data.tar.gz: ab5cba75479435f32a42bca6fd8155a5954674996b75a4a2afe397241bce519720a083aaaf0ccf3976a8c289170ec39553f63e9ba036248bdadcf408022e7ffb
|
data/exe/aurora_mqtt_bridge
CHANGED
@@ -46,8 +46,20 @@ class MQTTBridge
|
|
46
46
|
when /\$modbus$/
|
47
47
|
registers = @abc.query_registers(value)
|
48
48
|
Aurora.print_registers(registers) do |register, v|
|
49
|
-
@homie.mqtt.publish("#{@homie.topic}/$modbus/#{register}", v,
|
49
|
+
@homie.mqtt.publish("#{@homie.topic}/$modbus/#{register}", v, qos: 1)
|
50
50
|
end
|
51
|
+
when %r{\$modbus/getregs}
|
52
|
+
query_id, query = value.split(":")
|
53
|
+
queries = query.split(";").map do |range|
|
54
|
+
start, length = range.split(",").map(&:to_i)
|
55
|
+
next start if length.nil?
|
56
|
+
|
57
|
+
start...(start + length)
|
58
|
+
end
|
59
|
+
registers = @abc.modbus_slave.read_multiple_holding_registers(*queries)
|
60
|
+
result = registers.values.join(",")
|
61
|
+
@homie.mqtt.publish("#{@homie.topic}/$modbus/getregs/response",
|
62
|
+
"#{query_id}:#{result}", qos: 1)
|
51
63
|
when %r{\$modbus/(\d+)/set$}
|
52
64
|
register = $1.to_i
|
53
65
|
value = case value
|
@@ -59,7 +71,7 @@ class MQTTBridge
|
|
59
71
|
@abc.modbus_slave.holding_registers[register] = value if value
|
60
72
|
registers = { register => @abc.modbus_slave.holding_registers[register] }
|
61
73
|
Aurora.print_registers(registers) do |r, v|
|
62
|
-
@homie.mqtt.publish("#{@homie.topic}/$modbus/#{r}", v,
|
74
|
+
@homie.mqtt.publish("#{@homie.topic}/$modbus/#{r}", v, qos: 1)
|
63
75
|
end
|
64
76
|
end
|
65
77
|
end
|
@@ -261,6 +273,7 @@ class MQTTBridge
|
|
261
273
|
|
262
274
|
# direct access to modbus registers for debugging purposes
|
263
275
|
@homie.mqtt.subscribe("#{@homie.topic}/$modbus")
|
276
|
+
@homie.mqtt.subscribe("#{@homie.topic}/$modbus/getregs")
|
264
277
|
@homie.mqtt.subscribe("#{@homie.topic}/$modbus/+/set")
|
265
278
|
@homie.publish
|
266
279
|
end
|
data/lib/aurora/abc_client.rb
CHANGED
@@ -26,7 +26,9 @@ module Aurora
|
|
26
26
|
port: uri.port || 23,
|
27
27
|
baud: 19_200,
|
28
28
|
parity: :even)
|
29
|
-
|
29
|
+
when "mqtt", "mqtts"
|
30
|
+
require "aurora/mqtt_modbus"
|
31
|
+
return Aurora::MQTTModBus.new(uri)
|
30
32
|
else
|
31
33
|
return Aurora::MockABC.new(YAML.load_file(uri.path)) if File.file?(uri.path)
|
32
34
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mqtt"
|
4
|
+
require "securerandom"
|
5
|
+
|
6
|
+
module Aurora
|
7
|
+
class MQTTModBus
|
8
|
+
attr_accessor :logger
|
9
|
+
|
10
|
+
def initialize(uri)
|
11
|
+
@mqtt = MQTT::Client.new(uri)
|
12
|
+
@mqtt.connect
|
13
|
+
|
14
|
+
@base_topic = uri.path[1..]
|
15
|
+
@mqtt.subscribe("#{@base_topic}/getregs/response")
|
16
|
+
end
|
17
|
+
|
18
|
+
def read_multiple_holding_registers(*queries)
|
19
|
+
query_id = SecureRandom.uuid
|
20
|
+
mqtt_query = queries.map { |m| m.is_a?(Range) ? "#{m.begin},#{m.count}" : m }.join(";")
|
21
|
+
@mqtt.publish("#{@base_topic}/getregs", "#{query_id}:#{mqtt_query}", qos: 1)
|
22
|
+
Timeout.timeout(15) do
|
23
|
+
result = {}
|
24
|
+
loop do
|
25
|
+
packet = @mqtt.get
|
26
|
+
response_id, registers_flat = packet.payload.split(":")
|
27
|
+
next unless response_id == query_id
|
28
|
+
|
29
|
+
values = registers_flat.split(",").map(&:to_i)
|
30
|
+
result_index = 0
|
31
|
+
queries.each do |query|
|
32
|
+
Array(query).each do |i|
|
33
|
+
result[i] = values[result_index]
|
34
|
+
result_index += 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
break
|
38
|
+
end
|
39
|
+
result
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def write_holding_register(addr, value)
|
44
|
+
@mqtt.publish("#{@base_topic}/#{addr}/set", value, qos: 1)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/aurora/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: waterfurnace_aurora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ccutrer-serialport
|
@@ -143,6 +143,7 @@ files:
|
|
143
143
|
- lib/aurora/mock_abc.rb
|
144
144
|
- lib/aurora/modbus/server.rb
|
145
145
|
- lib/aurora/modbus/slave.rb
|
146
|
+
- lib/aurora/mqtt_modbus.rb
|
146
147
|
- lib/aurora/pump.rb
|
147
148
|
- lib/aurora/registers.rb
|
148
149
|
- lib/aurora/thermostat.rb
|