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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e43967c61aa8b5c445ec2a6024e9da5ba8cc94205cc853ff07fed0374827dc3
4
- data.tar.gz: 875004f5c9835f25f7c18d7e7e7d632f0877db6ac7a3fc8215fa28b68c5ce2b9
3
+ metadata.gz: 290c5d09deda24b527dbe0b1a00e93481c0951a38ef0be40b36cfd5fb33a4e4a
4
+ data.tar.gz: 33b16f155897683cc0b9a3c915bc3edeb2cb78e869cbfbc7246bd1da01abac71
5
5
  SHA512:
6
- metadata.gz: f5d48422906f8dbac8aa83645ab3f46a9481f96d7e4720b75772dfbf2be2cf8456753f5d364a4cde3ad69fb778fd3ba29f23249ec08010806339039264bcbefc
7
- data.tar.gz: 3a78e33d93f256e0153ae98b7f8df92da2f3138c246e1b5ef47550f4759d5502725a1d52acb6fe3f084b8a158962538ed73a3c1acf072cc151bf18ad9db2f75d
6
+ metadata.gz: 82efe304dfc3a00670c8b80b6c27aa304a0eab0f36ff108b7b1bc046b0d3fdd8c28ca028d7995c8910a8216dccd4e756bb0eadf8efd1c9ff9c0cfbd8a157cab0
7
+ data.tar.gz: 47f9d992e4bac6d79bdf514edbf987f48ea367cfd85d9fe8e7d3bcd63396093b7cebb077aaf7d7332c8208926e14ff9b833520bf7b197ce496d2d57de8f80354
@@ -74,12 +74,19 @@ class MQTTBridge
74
74
  begin
75
75
  @mutex.synchronize do
76
76
  @abc.refresh
77
- @homie_abc.each do |property|
78
- property.value = @abc.public_send(property.id.tr("-", "_"))
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
- @blower.each do |property|
82
- property.value = @abc.blower.public_send(property.id.tr("-", "_"))
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 loop_pump total].each do |component|
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
- 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: "%")
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?
@@ -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, 1117, 1147..1153, 1165,
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)
@@ -44,5 +44,6 @@ module Aurora
44
44
  def write_holding_register(addr, value)
45
45
  @registers[addr] = value
46
46
  end
47
+ alias []= write_holding_register
47
48
  end
48
49
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aurora
4
- VERSION = "0.4.2"
4
+ VERSION = "0.4.3"
5
5
  end
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.2
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