waterfurnace_aurora 0.4.2 → 0.4.3

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