waterfurnace_aurora 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|