waterfurnace_aurora 0.4.1 → 0.4.2
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 +24 -8
- data/lib/aurora/abc_client.rb +24 -11
- data/lib/aurora/blower.rb +99 -0
- data/lib/aurora/component.rb +17 -0
- data/lib/aurora/registers.rb +0 -7
- data/lib/aurora/thermostat.rb +3 -5
- data/lib/aurora/version.rb +1 -1
- data/lib/aurora.rb +0 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e43967c61aa8b5c445ec2a6024e9da5ba8cc94205cc853ff07fed0374827dc3
|
4
|
+
data.tar.gz: 875004f5c9835f25f7c18d7e7e7d632f0877db6ac7a3fc8215fa28b68c5ce2b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5d48422906f8dbac8aa83645ab3f46a9481f96d7e4720b75772dfbf2be2cf8456753f5d364a4cde3ad69fb778fd3ba29f23249ec08010806339039264bcbefc
|
7
|
+
data.tar.gz: 3a78e33d93f256e0153ae98b7f8df92da2f3138c246e1b5ef47550f4759d5502725a1d52acb6fe3f084b8a158962538ed73a3c1acf072cc151bf18ad9db2f75d
|
data/exe/aurora_mqtt_bridge
CHANGED
@@ -78,6 +78,10 @@ class MQTTBridge
|
|
78
78
|
property.value = @abc.public_send(property.id.tr("-", "_"))
|
79
79
|
end
|
80
80
|
|
81
|
+
@blower.each do |property|
|
82
|
+
property.value = @abc.blower.public_send(property.id.tr("-", "_"))
|
83
|
+
end
|
84
|
+
|
81
85
|
if @abc.dhw?
|
82
86
|
@dhw["enabled"].value = @abc.dhw_enabled
|
83
87
|
@dhw["water-temperature"].value = @abc.dhw_water_temperature
|
@@ -113,7 +117,6 @@ class MQTTBridge
|
|
113
117
|
unit: "ºF")
|
114
118
|
node.property("entering-water-temperature", "Entering Water Temperature", :float,
|
115
119
|
@abc.entering_water_temperature, unit: "ºF")
|
116
|
-
node.property("fan-speed", "Fan Speed", :integer, @abc.fan_speed, format: 0..11)
|
117
120
|
node.property("leaving-air-temperature", "Leaving Air Temperature", :float, @abc.leaving_air_temperature,
|
118
121
|
unit: "ºF")
|
119
122
|
node.property("leaving-water-temperature", "Leaving Water Temperature", :float, @abc.leaving_water_temperature,
|
@@ -126,19 +129,32 @@ class MQTTBridge
|
|
126
129
|
node.property("waterflow", "Waterflow", :float, @abc.waterflow, unit: "gpm")
|
127
130
|
node.property("fp1", "FP1 Sensor", :float, @abc.fp1, unit: "ºF")
|
128
131
|
node.property("fp2", "FP2 Sensor", :float, @abc.fp2, unit: "ºF")
|
129
|
-
%i[compressor
|
132
|
+
%i[compressor aux_heat loop_pump total].each do |component|
|
130
133
|
component = "#{component}_watts"
|
131
134
|
node.property(component.tr("_", "-"), component.tr("_", " ").titleize, :integer,
|
132
135
|
@abc.public_send(component), unit: "W")
|
133
136
|
end
|
137
|
+
end
|
134
138
|
|
135
|
-
|
136
|
-
|
137
|
-
|
139
|
+
@blower = @homie.node("blower", "Blower", @abc.blower.type) do |node|
|
140
|
+
if @abc.blower.respond_to?(:running)
|
141
|
+
node.property("running", "Blower is running", :boolean, @abc.blower.running?)
|
142
|
+
else
|
143
|
+
node.property("speed", "Current blower speed", :integer, @abc.blower.speed, format: @abc.blower.speed_range)
|
138
144
|
end
|
139
|
-
node.property("
|
140
|
-
|
141
|
-
|
145
|
+
node.property("watts", "Energy Usage", :integer, @abc.blower.watts, unit: "W") if @abc.energy_monitoring?
|
146
|
+
if @abc.blower.is_a?(Aurora::Blower::ECM)
|
147
|
+
%w[blower-only low-compressor high-compressor aux-heat].each do |setting|
|
148
|
+
field = "#{setting.tr('-', '_')}_speed"
|
149
|
+
node.property("#{setting}-speed", "#{setting.tr('-', ' ').titleize} Speed", :integer,
|
150
|
+
@abc.blower.public_send(field), format: 1..12) do |value, property|
|
151
|
+
@mutex.synchronize { property.value = @abc.blower.public_send("#{field}=", value) }
|
152
|
+
end
|
153
|
+
end
|
154
|
+
if @abc.iz2?
|
155
|
+
node.property("iz2-desired-speed", "IZ2 Desired Speed", :integer, @abc.blower.iz2_desired_speed,
|
156
|
+
format: 0..100, unit: "%")
|
157
|
+
end
|
142
158
|
end
|
143
159
|
end
|
144
160
|
|
data/lib/aurora/abc_client.rb
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
require "yaml"
|
4
4
|
require "uri"
|
5
5
|
|
6
|
+
require "aurora/blower"
|
7
|
+
require "aurora/iz2_zone"
|
8
|
+
require "aurora/thermostat"
|
9
|
+
|
6
10
|
module Aurora
|
7
11
|
class ABCClient
|
8
12
|
class << self
|
@@ -35,9 +39,9 @@ module Aurora
|
|
35
39
|
attr_reader :modbus_slave,
|
36
40
|
:serial_number,
|
37
41
|
:zones,
|
42
|
+
:blower,
|
38
43
|
:faults,
|
39
44
|
:current_mode,
|
40
|
-
:fan_speed,
|
41
45
|
:dhw_enabled,
|
42
46
|
:dhw_setpoint,
|
43
47
|
:entering_air_temperature,
|
@@ -51,10 +55,7 @@ module Aurora
|
|
51
55
|
:outdoor_temperature,
|
52
56
|
:fp1,
|
53
57
|
:fp2,
|
54
|
-
:blower_only_ecm_speed,
|
55
|
-
:aux_heat_ecm_speed,
|
56
58
|
:compressor_watts,
|
57
|
-
:blower_watts,
|
58
59
|
:aux_heat_watts,
|
59
60
|
:loop_pump_watts,
|
60
61
|
:total_watts
|
@@ -63,10 +64,18 @@ module Aurora
|
|
63
64
|
@modbus_slave = self.class.open_modbus_slave(uri)
|
64
65
|
@modbus_slave.read_retry_timeout = 15
|
65
66
|
@modbus_slave.read_retries = 2
|
66
|
-
|
67
|
+
raw_registers = @modbus_slave.holding_registers[88..91, 105...110, 404, 412, 1114]
|
68
|
+
registers = Aurora.transform_registers(raw_registers.dup)
|
67
69
|
@program = registers[88]
|
68
70
|
@serial_number = registers[105]
|
69
71
|
@dhw_water_temperature = registers[1114]
|
72
|
+
@energy_monitor = raw_registers[412]
|
73
|
+
|
74
|
+
@blower = case raw_registers[404]
|
75
|
+
when 1, 2 then Blower::ECM.new(self, registers[404])
|
76
|
+
when 3 then Blower::FiveSpeed.new(self, registers[404])
|
77
|
+
else; Blower::PSC.new(self, registers[404])
|
78
|
+
end
|
70
79
|
|
71
80
|
@zones = if iz2?
|
72
81
|
iz2_zone_count = @modbus_slave.holding_registers[483]
|
@@ -112,9 +121,10 @@ module Aurora
|
|
112
121
|
end
|
113
122
|
|
114
123
|
def refresh
|
115
|
-
registers_to_read = [6, 19..20, 25, 30,
|
124
|
+
registers_to_read = [6, 19..20, 25, 30, 344, 740..741, 900, 1110..1111, 1114, 1117, 1147..1153, 1165,
|
116
125
|
31_003]
|
117
126
|
registers_to_read << (400..401) if dhw?
|
127
|
+
registers_to_read.concat(blower.registers_to_read)
|
118
128
|
registers_to_read.concat([362, 3001]) if vs_drive?
|
119
129
|
|
120
130
|
if zones.first.is_a?(IZ2Zone)
|
@@ -138,7 +148,6 @@ module Aurora
|
|
138
148
|
|
139
149
|
outputs = registers[30]
|
140
150
|
|
141
|
-
@fan_speed = registers[344]
|
142
151
|
@dhw_enabled = registers[400]
|
143
152
|
@dhw_setpoint = registers[401]
|
144
153
|
@entering_air_temperature = registers[740]
|
@@ -164,10 +173,7 @@ module Aurora
|
|
164
173
|
@error = registers[25] & 0x7fff
|
165
174
|
@derated = (41..46).include?(@error)
|
166
175
|
@safe_mode = [47, 48, 49, 72, 74].include?(@error)
|
167
|
-
@blower_only_ecm_speed = registers[340]
|
168
|
-
@aux_heat_ecm_speed = registers[347]
|
169
176
|
@compressor_watts = registers[1147]
|
170
|
-
@blower_watts = registers[1149]
|
171
177
|
@aux_heat_watts = registers[1151]
|
172
178
|
@loop_pump_watts = registers[1165]
|
173
179
|
@total_watts = registers[1153]
|
@@ -190,6 +196,8 @@ module Aurora
|
|
190
196
|
:standby
|
191
197
|
end
|
192
198
|
|
199
|
+
blower.refresh(registers)
|
200
|
+
|
193
201
|
zones.each do |z|
|
194
202
|
z.refresh(registers)
|
195
203
|
end
|
@@ -277,6 +285,10 @@ module Aurora
|
|
277
285
|
@modbus_slave.holding_registers[323] = pump_speed == :with_compressor ? 0x7fff : pump_speed
|
278
286
|
end
|
279
287
|
|
288
|
+
def energy_monitoring?
|
289
|
+
@energy_monitor == 2
|
290
|
+
end
|
291
|
+
|
280
292
|
def vs_drive?
|
281
293
|
@program == "ABCVSP"
|
282
294
|
end
|
@@ -289,7 +301,8 @@ module Aurora
|
|
289
301
|
{ thermostat: 800, axb: 806, iz2: 812, aoc: 815, moc: 818, eev2: 824 }.each do |(component, register)|
|
290
302
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
291
303
|
def #{component}?
|
292
|
-
|
304
|
+
return @#{component} if instance_variable_defined?(:@#{component})
|
305
|
+
@#{component} = @modbus_slave.holding_registers[#{register}] != 3
|
293
306
|
end
|
294
307
|
|
295
308
|
def add_#{component}
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "aurora/component"
|
4
|
+
|
5
|
+
module Aurora
|
6
|
+
module Blower
|
7
|
+
class GenericBlower < Component
|
8
|
+
attr_reader :type, :watts
|
9
|
+
|
10
|
+
def initialize(abc, type)
|
11
|
+
super(abc)
|
12
|
+
@type = type
|
13
|
+
end
|
14
|
+
|
15
|
+
def registers_to_read
|
16
|
+
if abc.energy_monitoring?
|
17
|
+
[1148..1149]
|
18
|
+
else
|
19
|
+
[]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def refresh(registers)
|
24
|
+
@watts = registers[1148] if abc.energy_monitoring?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class PSC < GenericBlower
|
29
|
+
attr_reader :running
|
30
|
+
alias running? running
|
31
|
+
|
32
|
+
def refresh(registers)
|
33
|
+
@running = registers[30].include?(:g)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class FiveSpeed < GenericBlower
|
38
|
+
attr_reader :speed
|
39
|
+
|
40
|
+
def speed_range
|
41
|
+
0..4
|
42
|
+
end
|
43
|
+
|
44
|
+
def refresh(registers)
|
45
|
+
outputs = registers[30]
|
46
|
+
@speed = if outputs.include?(:eh1)
|
47
|
+
4
|
48
|
+
elsif outputs.include?(:cc2)
|
49
|
+
3
|
50
|
+
elsif outputs.include?(:cc)
|
51
|
+
2
|
52
|
+
elsif outputs.include?(:g)
|
53
|
+
1
|
54
|
+
else
|
55
|
+
0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class ECM < GenericBlower
|
61
|
+
attr_reader :speed, :blower_only_speed, :low_compressor_speed, :high_compressor_speed, :aux_heat_speed,
|
62
|
+
:iz2_desired_speed
|
63
|
+
|
64
|
+
def speed_range
|
65
|
+
0..12
|
66
|
+
end
|
67
|
+
|
68
|
+
def registers_to_read
|
69
|
+
result = super + [340..342, 344, 347]
|
70
|
+
result << 565 if abc.iz2?
|
71
|
+
result
|
72
|
+
end
|
73
|
+
|
74
|
+
def refresh(registers)
|
75
|
+
super
|
76
|
+
|
77
|
+
@speed = registers[344]
|
78
|
+
@blower_only_speed = registers[340]
|
79
|
+
@low_compressor_speed = registers[341]
|
80
|
+
@high_compressor_speed = registers[342]
|
81
|
+
@aux_heat_speed = registers[347]
|
82
|
+
@iz2_desired_speed = registers[565] if abc.iz2?
|
83
|
+
end
|
84
|
+
|
85
|
+
{ blower_only: 340,
|
86
|
+
low_compressor: 341,
|
87
|
+
high_compressor: 342,
|
88
|
+
aux_heat: 347 }.each do |(setting, register)|
|
89
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
90
|
+
def #{setting}_speed=(value)
|
91
|
+
raise ArgumentError unless (1..12).include?(value)
|
92
|
+
|
93
|
+
holding_registers[#{register}] = value
|
94
|
+
end
|
95
|
+
RUBY
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/aurora/registers.rb
CHANGED
data/lib/aurora/thermostat.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "aurora/component"
|
4
|
+
|
3
5
|
module Aurora
|
4
|
-
class Thermostat
|
6
|
+
class Thermostat < Component
|
5
7
|
attr_reader :target_mode,
|
6
8
|
:target_fan_mode,
|
7
9
|
:ambient_temperature,
|
8
10
|
:cooling_target_temperature,
|
9
11
|
:heating_target_temperature
|
10
12
|
|
11
|
-
def initialize(abc)
|
12
|
-
@abc = abc
|
13
|
-
end
|
14
|
-
|
15
13
|
def refresh(registers)
|
16
14
|
@ambient_temperature = registers[502]
|
17
15
|
@heating_target_temperature = registers[746]
|
data/lib/aurora/version.rb
CHANGED
data/lib/aurora.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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
@@ -134,6 +134,8 @@ files:
|
|
134
134
|
- exe/web_aid_tool
|
135
135
|
- lib/aurora.rb
|
136
136
|
- lib/aurora/abc_client.rb
|
137
|
+
- lib/aurora/blower.rb
|
138
|
+
- lib/aurora/component.rb
|
137
139
|
- lib/aurora/core_ext/string.rb
|
138
140
|
- lib/aurora/iz2_zone.rb
|
139
141
|
- lib/aurora/mock_abc.rb
|