waterfurnace_aurora 0.4.2 → 0.4.3
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 +49 -24
- data/lib/aurora/abc_client.rb +13 -6
- data/lib/aurora/mock_abc.rb +1 -0
- data/lib/aurora/pump.rb +60 -0
- data/lib/aurora/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 290c5d09deda24b527dbe0b1a00e93481c0951a38ef0be40b36cfd5fb33a4e4a
|
4
|
+
data.tar.gz: 33b16f155897683cc0b9a3c915bc3edeb2cb78e869cbfbc7246bd1da01abac71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82efe304dfc3a00670c8b80b6c27aa304a0eab0f36ff108b7b1bc046b0d3fdd8c28ca028d7995c8910a8216dccd4e756bb0eadf8efd1c9ff9c0cfbd8a157cab0
|
7
|
+
data.tar.gz: 47f9d992e4bac6d79bdf514edbf987f48ea367cfd85d9fe8e7d3bcd63396093b7cebb077aaf7d7332c8208926e14ff9b833520bf7b197ce496d2d57de8f80354
|
data/exe/aurora_mqtt_bridge
CHANGED
@@ -74,12 +74,19 @@ class MQTTBridge
|
|
74
74
|
begin
|
75
75
|
@mutex.synchronize do
|
76
76
|
@abc.refresh
|
77
|
-
|
78
|
-
|
77
|
+
|
78
|
+
components = { @homie_abc => @abc,
|
79
|
+
@blower => @abc.blower,
|
80
|
+
@pump => @abc.pump }
|
81
|
+
@abc.zones.each_with_index do |z, idx|
|
82
|
+
homie_zone = @homie["zone#{idx + 1}"]
|
83
|
+
components[homie_zone] = z
|
79
84
|
end
|
80
85
|
|
81
|
-
|
82
|
-
|
86
|
+
components.each do |(node, object)|
|
87
|
+
node.each do |property|
|
88
|
+
property.value = object.public_send(property.id.tr("-", "_"))
|
89
|
+
end
|
83
90
|
end
|
84
91
|
|
85
92
|
if @abc.dhw?
|
@@ -91,13 +98,6 @@ class MQTTBridge
|
|
91
98
|
@abc.faults.each_with_index do |fault_count, i|
|
92
99
|
@faults["e#{i + 1}"].value = fault_count
|
93
100
|
end
|
94
|
-
|
95
|
-
@abc.zones.each_with_index do |z, idx|
|
96
|
-
homie_zone = @homie["zone#{idx + 1}"]
|
97
|
-
homie_zone.each do |property|
|
98
|
-
property.value = z.public_send(property.id.tr("-", "_"))
|
99
|
-
end
|
100
|
-
end
|
101
101
|
end
|
102
102
|
rescue => e
|
103
103
|
warn "got garbage: #{e}; #{e.backtrace}"
|
@@ -126,10 +126,9 @@ class MQTTBridge
|
|
126
126
|
end
|
127
127
|
node.property("relative-humidity", "Relative Humidity", :integer, @abc.relative_humidity, unit: "%",
|
128
128
|
format: 0..100)
|
129
|
-
node.property("waterflow", "Waterflow", :float, @abc.waterflow, unit: "gpm")
|
130
129
|
node.property("fp1", "FP1 Sensor", :float, @abc.fp1, unit: "ºF")
|
131
130
|
node.property("fp2", "FP2 Sensor", :float, @abc.fp2, unit: "ºF")
|
132
|
-
%i[compressor aux_heat
|
131
|
+
%i[compressor aux_heat total].each do |component|
|
133
132
|
component = "#{component}_watts"
|
134
133
|
node.property(component.tr("_", "-"), component.tr("_", " ").titleize, :integer,
|
135
134
|
@abc.public_send(component), unit: "W")
|
@@ -143,19 +142,45 @@ class MQTTBridge
|
|
143
142
|
node.property("speed", "Current blower speed", :integer, @abc.blower.speed, format: @abc.blower.speed_range)
|
144
143
|
end
|
145
144
|
node.property("watts", "Energy Usage", :integer, @abc.blower.watts, unit: "W") if @abc.energy_monitoring?
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
format: 0..100, unit: "%")
|
145
|
+
|
146
|
+
next unless @abc.blower.is_a?(Aurora::Blower::ECM)
|
147
|
+
|
148
|
+
presets = %w[blower-only aux-heat]
|
149
|
+
presets.concat %w[low-compressor high-compressor] unless @abc.iz2?
|
150
|
+
presets.each do |setting|
|
151
|
+
field = "#{setting.tr('-', '_')}_speed"
|
152
|
+
node.property("#{setting}-speed", "#{setting.tr('-', ' ').titleize} Preset Speed", :integer,
|
153
|
+
@abc.blower.public_send(field), format: 1..12) do |value, property|
|
154
|
+
@mutex.synchronize { property.value = @abc.blower.public_send("#{field}=", value) }
|
157
155
|
end
|
158
156
|
end
|
157
|
+
if @abc.iz2?
|
158
|
+
node.property("iz2-desired-speed", "IZ2 Desired Speed", :integer, @abc.blower.iz2_desired_speed,
|
159
|
+
format: 0..100, unit: "%")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
@pump = @homie.node("pump", "Loop Pump", @abc.pump.type) do |node|
|
164
|
+
node.property("waterflow", "Waterflow", :float, @abc.pump.waterflow, unit: "gpm")
|
165
|
+
node.property("watts", "Energy Usage", :integer, @abc.pump.watts, unit: "W") if @abc.energy_monitoring?
|
166
|
+
|
167
|
+
next unless @abc.pump.is_a?(Aurora::Pump::VSPump)
|
168
|
+
|
169
|
+
node.property("speed", "Speed", :integer, @abc.pump.speed, format: 0..100, unit: "%") do |value, property|
|
170
|
+
@mutex.synchronize { property.value = @abc.pump.speed = value }
|
171
|
+
end
|
172
|
+
node.property("manual-control", "If manual control is enabled", :boolean,
|
173
|
+
@abc.pump.manual_control?) do |value, property|
|
174
|
+
@mutex.synchronize { property.value = @abc.pump.manual_control = value }
|
175
|
+
end
|
176
|
+
node.property("minimum-speed", "Speed pump runs at compressor speed 0", :integer, @abc.pump.minimum_speed,
|
177
|
+
format: 0..100, unit: "%") do |value, property|
|
178
|
+
@mutex.synchronize { property.value = @abc.pump.minimum_speed = value }
|
179
|
+
end
|
180
|
+
node.property("maximum-speed", "Speed pump runs at compressor speed 12", :integer, @abc.pump.minimum_speed,
|
181
|
+
format: 0..100, unit: "%") do |value, property|
|
182
|
+
@mutex.synchronize { property.value = @abc.pump.maximum_speed = value }
|
183
|
+
end
|
159
184
|
end
|
160
185
|
|
161
186
|
if @abc.dhw?
|
data/lib/aurora/abc_client.rb
CHANGED
@@ -5,6 +5,7 @@ require "uri"
|
|
5
5
|
|
6
6
|
require "aurora/blower"
|
7
7
|
require "aurora/iz2_zone"
|
8
|
+
require "aurora/pump"
|
8
9
|
require "aurora/thermostat"
|
9
10
|
|
10
11
|
module Aurora
|
@@ -40,6 +41,7 @@ module Aurora
|
|
40
41
|
:serial_number,
|
41
42
|
:zones,
|
42
43
|
:blower,
|
44
|
+
:pump,
|
43
45
|
:faults,
|
44
46
|
:current_mode,
|
45
47
|
:dhw_enabled,
|
@@ -50,21 +52,19 @@ module Aurora
|
|
50
52
|
:leaving_water_temperature,
|
51
53
|
:entering_water_temperature,
|
52
54
|
:dhw_water_temperature,
|
53
|
-
:waterflow,
|
54
55
|
:compressor_speed,
|
55
56
|
:outdoor_temperature,
|
56
57
|
:fp1,
|
57
58
|
:fp2,
|
58
59
|
:compressor_watts,
|
59
60
|
:aux_heat_watts,
|
60
|
-
:loop_pump_watts,
|
61
61
|
:total_watts
|
62
62
|
|
63
63
|
def initialize(uri)
|
64
64
|
@modbus_slave = self.class.open_modbus_slave(uri)
|
65
65
|
@modbus_slave.read_retry_timeout = 15
|
66
66
|
@modbus_slave.read_retries = 2
|
67
|
-
raw_registers = @modbus_slave.holding_registers[88..91, 105...110, 404, 412, 1114]
|
67
|
+
raw_registers = @modbus_slave.holding_registers[88..91, 105...110, 404, 412..413, 1114]
|
68
68
|
registers = Aurora.transform_registers(raw_registers.dup)
|
69
69
|
@program = registers[88]
|
70
70
|
@serial_number = registers[105]
|
@@ -76,6 +76,13 @@ module Aurora
|
|
76
76
|
when 3 then Blower::FiveSpeed.new(self, registers[404])
|
77
77
|
else; Blower::PSC.new(self, registers[404])
|
78
78
|
end
|
79
|
+
@pump = if (3..5).include?(raw_registers[413])
|
80
|
+
Pump::VSPump.new(self,
|
81
|
+
registers[413])
|
82
|
+
else
|
83
|
+
Pump::GenericPump.new(self,
|
84
|
+
registers[413])
|
85
|
+
end
|
79
86
|
|
80
87
|
@zones = if iz2?
|
81
88
|
iz2_zone_count = @modbus_slave.holding_registers[483]
|
@@ -121,10 +128,11 @@ module Aurora
|
|
121
128
|
end
|
122
129
|
|
123
130
|
def refresh
|
124
|
-
registers_to_read = [6, 19..20, 25, 30, 344, 740..741, 900, 1110..1111, 1114,
|
131
|
+
registers_to_read = [6, 19..20, 25, 30, 344, 740..741, 900, 1110..1111, 1114, 1147..1153, 1165,
|
125
132
|
31_003]
|
126
133
|
registers_to_read << (400..401) if dhw?
|
127
134
|
registers_to_read.concat(blower.registers_to_read)
|
135
|
+
registers_to_read.concat(pump.registers_to_read)
|
128
136
|
registers_to_read.concat([362, 3001]) if vs_drive?
|
129
137
|
|
130
138
|
if zones.first.is_a?(IZ2Zone)
|
@@ -156,7 +164,6 @@ module Aurora
|
|
156
164
|
@leaving_water_temperature = registers[1110]
|
157
165
|
@entering_water_temperature = registers[1111]
|
158
166
|
@dhw_water_temperature = registers[1114]
|
159
|
-
@waterflow = registers[1117]
|
160
167
|
@compressor_speed = if vs_drive?
|
161
168
|
registers[3001]
|
162
169
|
elsif outputs.include?(:cc2)
|
@@ -175,7 +182,6 @@ module Aurora
|
|
175
182
|
@safe_mode = [47, 48, 49, 72, 74].include?(@error)
|
176
183
|
@compressor_watts = registers[1147]
|
177
184
|
@aux_heat_watts = registers[1151]
|
178
|
-
@loop_pump_watts = registers[1165]
|
179
185
|
@total_watts = registers[1153]
|
180
186
|
|
181
187
|
@current_mode = if outputs.include?(:lockout)
|
@@ -197,6 +203,7 @@ module Aurora
|
|
197
203
|
end
|
198
204
|
|
199
205
|
blower.refresh(registers)
|
206
|
+
pump.refresh(registers)
|
200
207
|
|
201
208
|
zones.each do |z|
|
202
209
|
z.refresh(registers)
|
data/lib/aurora/mock_abc.rb
CHANGED
data/lib/aurora/pump.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "aurora/component"
|
4
|
+
|
5
|
+
module Aurora
|
6
|
+
module Pump
|
7
|
+
class GenericPump < Component
|
8
|
+
attr_reader :type, :watts, :waterflow
|
9
|
+
|
10
|
+
def initialize(abc, type)
|
11
|
+
super(abc)
|
12
|
+
@type = type
|
13
|
+
end
|
14
|
+
|
15
|
+
def registers_to_read
|
16
|
+
result = [1117]
|
17
|
+
result.concat([1164..1165]) if abc.energy_monitoring?
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
def refresh(registers)
|
22
|
+
@waterflow = registers[1117]
|
23
|
+
@watts = registers[1164] if abc.energy_monitoring?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class VSPump < GenericPump
|
28
|
+
attr_reader :speed, :minimum_speed, :maximum_speed, :manual_control
|
29
|
+
alias manual_control? manual_control
|
30
|
+
|
31
|
+
def registers_to_read
|
32
|
+
super + [321..325]
|
33
|
+
end
|
34
|
+
|
35
|
+
def refresh(registers)
|
36
|
+
super
|
37
|
+
@minimum_speed = registers[321]
|
38
|
+
@maximum_speed = registers[322]
|
39
|
+
@manual_control = registers[323] != :off
|
40
|
+
@speed = registers[325]
|
41
|
+
end
|
42
|
+
|
43
|
+
def manual_control=(value)
|
44
|
+
holding_registers[323] = value ? speed : 0x7fff
|
45
|
+
end
|
46
|
+
|
47
|
+
{ speed: 323,
|
48
|
+
minimum_speed: 321,
|
49
|
+
maximum_speed: 322 }.each do |(setting, register)|
|
50
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
51
|
+
def #{setting}=(value)
|
52
|
+
raise ArgumentError unless (1..100).include?(value)
|
53
|
+
|
54
|
+
holding_registers[#{register}] = value
|
55
|
+
end
|
56
|
+
RUBY
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/aurora/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: waterfurnace_aurora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
@@ -141,6 +141,7 @@ files:
|
|
141
141
|
- lib/aurora/mock_abc.rb
|
142
142
|
- lib/aurora/modbus/server.rb
|
143
143
|
- lib/aurora/modbus/slave.rb
|
144
|
+
- lib/aurora/pump.rb
|
144
145
|
- lib/aurora/registers.rb
|
145
146
|
- lib/aurora/thermostat.rb
|
146
147
|
- lib/aurora/version.rb
|