waterfurnace_aurora 0.4.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a429ac21f24ff82252a574e3e9bcd5c1c02c5d819f236f1b2fe05d1517a9039a
4
- data.tar.gz: ce6bd7dae57e4d2862191ce2c65e9483655aa489ee4b03824457709fea73a6ec
3
+ metadata.gz: 0e43967c61aa8b5c445ec2a6024e9da5ba8cc94205cc853ff07fed0374827dc3
4
+ data.tar.gz: 875004f5c9835f25f7c18d7e7e7d632f0877db6ac7a3fc8215fa28b68c5ce2b9
5
5
  SHA512:
6
- metadata.gz: 5cef31050d0c211a6fce8f22a47f0a09e5bc17c09f685b45a52faccd39b4bbc40413822abcdc78e0b272b35648672457f3e2880c44d7664c2f6d88ec75fc9437
7
- data.tar.gz: 45861b6d6a49dc88f68a9f7ca4b3d5ac15517cbe413b6f5dfd8578963df65b9fc14f6fbd44101b773137269f25a6f06acb6901f1b409067d9f99e81c8bf38af7
6
+ metadata.gz: f5d48422906f8dbac8aa83645ab3f46a9481f96d7e4720b75772dfbf2be2cf8456753f5d364a4cde3ad69fb778fd3ba29f23249ec08010806339039264bcbefc
7
+ data.tar.gz: 3a78e33d93f256e0153ae98b7f8df92da2f3138c246e1b5ef47550f4759d5502725a1d52acb6fe3f084b8a158962538ed73a3c1acf072cc151bf18ad9db2f75d
@@ -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 blower aux_heat loop_pump total].each do |component|
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
- node.property("blower-only-ecm-speed", "Blower Only ECM Speed", :integer, @abc.blower_only_ecm_speed,
136
- format: 1..12) do |value, property|
137
- @mutex.synchronize { property.value = @abc.blower_only_ecm_speed = value }
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("aux-heat-ecm-speed", "Aux Heat ECM Speed", :integer, @abc.aux_heat_ecm_speed,
140
- format: 1..12) do |value, property|
141
- @mutex.synchronize { property.value = @abc.aux_heat_ecm_speed = value }
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
 
@@ -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
- registers = Aurora.transform_registers(@modbus_slave.holding_registers[88..91, 105...110, 1114])
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, 340, 344, 347, 740..741, 900, 1110..1111, 1114, 1117, 1147..1153, 1165,
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
- @modbus_slave.holding_registers[#{register}] != 3
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
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aurora
4
+ class Component
5
+ def initialize(abc)
6
+ @abc = abc
7
+ end
8
+
9
+ private
10
+
11
+ attr_reader :abc
12
+
13
+ def holding_registers
14
+ abc.modbus_slave.holding_registers
15
+ end
16
+ end
17
+ end
@@ -234,13 +234,6 @@ module Aurora
234
234
  0x800 => :alarm
235
235
  }.freeze
236
236
 
237
- # 5-speed ECM shows
238
- # Aux if eh1 is on
239
- # High if cc2 is on
240
- # Med if cc1 is on
241
- # Low if blower is on
242
- # Off
243
-
244
237
  SYSTEM_INPUTS = {
245
238
  0x01 => :y1,
246
239
  0x02 => :y2,
@@ -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]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aurora
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.2"
5
5
  end
data/lib/aurora.rb CHANGED
@@ -3,9 +3,7 @@
3
3
  require "rmodbus"
4
4
 
5
5
  require "aurora/abc_client"
6
- require "aurora/iz2_zone"
7
6
  require "aurora/mock_abc"
8
- require "aurora/thermostat"
9
7
  require "aurora/modbus/server"
10
8
  require "aurora/modbus/slave"
11
9
  require "aurora/registers"
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.1
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