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 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