waterfurnace_aurora 1.0.0 → 1.0.1
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 +37 -37
- data/lib/aurora/abc_client.rb +10 -2
- data/lib/aurora/aux_heat.rb +10 -10
- data/lib/aurora/dhw.rb +0 -1
- data/lib/aurora/humidistat.rb +0 -4
- data/lib/aurora/iz2_zone.rb +0 -6
- data/lib/aurora/registers.rb +5 -2
- data/lib/aurora/thermostat.rb +0 -6
- data/lib/aurora/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8311d85ee1e300bcfbb3228a65cb98a69301f25f27569c36d898faf97c25fbd5
|
4
|
+
data.tar.gz: 86eab096d17d12aa01bb56f253022d64bb806d5aec3b55c6efc16a895b75d111
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7edd9fd909c0b9fe316f306bf00a56eff1108f467718d71c1645596675938abd67c5e727b4f6312d79c1d706df0f22f7d65f475c35061f7b66405add92eec342
|
7
|
+
data.tar.gz: b0a6f4af036ebcd003557777e1fd276e33e56e1cbfbde268ad42a5a5bfa729c9ffa718dd3fd08917aad8beba2bf4d894519de128a5ba1519b5988ba5ddc707f7
|
data/exe/aurora_mqtt_bridge
CHANGED
@@ -132,7 +132,7 @@ class MQTTBridge
|
|
132
132
|
}
|
133
133
|
|
134
134
|
@homie_abc = @homie.node("abc", "Heat Pump", "ABC") do |node|
|
135
|
-
allowed_modes = %w[lockout standby blower heating cooling waiting]
|
135
|
+
allowed_modes = %w[lockout standby blower heating heating_with_aux emergency_heat cooling waiting]
|
136
136
|
allowed_modes << "dehumidify" if @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
|
137
137
|
node.property("current-mode",
|
138
138
|
"Current Heating/Cooling Mode",
|
@@ -190,8 +190,8 @@ class MQTTBridge
|
|
190
190
|
:integer,
|
191
191
|
@abc.line_voltage,
|
192
192
|
format: 90..635,
|
193
|
-
unit: "V") do |value
|
194
|
-
@mutex.synchronize {
|
193
|
+
unit: "V") do |value|
|
194
|
+
@mutex.synchronize { @abc.line_voltage = value }
|
195
195
|
end
|
196
196
|
node.property("fp1",
|
197
197
|
"FP1 Sensor",
|
@@ -337,8 +337,8 @@ class MQTTBridge
|
|
337
337
|
:integer,
|
338
338
|
@abc.blower.public_send(field),
|
339
339
|
format: 1..12,
|
340
|
-
hass: { number: { entity_category: :config } }) do |value
|
341
|
-
@mutex.synchronize {
|
340
|
+
hass: { number: { entity_category: :config } }) do |value|
|
341
|
+
@mutex.synchronize { @abc.blower.public_send("#{field}=", value) }
|
342
342
|
end
|
343
343
|
end
|
344
344
|
|
@@ -383,8 +383,8 @@ class MQTTBridge
|
|
383
383
|
"Manual Control",
|
384
384
|
:boolean,
|
385
385
|
@abc.pump.manual_control?,
|
386
|
-
hass: { switch: { entity_category: :diagnostic } }) do |value
|
387
|
-
@mutex.synchronize {
|
386
|
+
hass: { switch: { entity_category: :diagnostic } }) do |value|
|
387
|
+
@mutex.synchronize { @abc.pump.manual_control = value }
|
388
388
|
end
|
389
389
|
node.property("minimum-speed",
|
390
390
|
"Actual Minimum Speed",
|
@@ -392,8 +392,8 @@ class MQTTBridge
|
|
392
392
|
@abc.pump.minimum_speed,
|
393
393
|
format: 0..100,
|
394
394
|
unit: "%",
|
395
|
-
hass: { number: { entity_category: :config } }) do |value
|
396
|
-
@mutex.synchronize {
|
395
|
+
hass: { number: { entity_category: :config } }) do |value|
|
396
|
+
@mutex.synchronize { @abc.pump.minimum_speed = value }
|
397
397
|
end
|
398
398
|
node.property("maximum-speed",
|
399
399
|
"Actual Maximum Speed",
|
@@ -401,8 +401,8 @@ class MQTTBridge
|
|
401
401
|
@abc.pump.minimum_speed,
|
402
402
|
format: 0..100,
|
403
403
|
unit: "%",
|
404
|
-
hass: { number: { entity_category: :config } }) do |value
|
405
|
-
@mutex.synchronize {
|
404
|
+
hass: { number: { entity_category: :config } }) do |value|
|
405
|
+
@mutex.synchronize { @abc.pump.maximum_speed = value }
|
406
406
|
end
|
407
407
|
next unless @abc.awl_axb?
|
408
408
|
|
@@ -412,8 +412,8 @@ class MQTTBridge
|
|
412
412
|
@abc.pump.speed,
|
413
413
|
format: 0..100,
|
414
414
|
unit: "%",
|
415
|
-
hass: { number: { entity_category: :diagnostic } }) do |value
|
416
|
-
@mutex.synchronize {
|
415
|
+
hass: { number: { entity_category: :diagnostic } }) do |value|
|
416
|
+
@mutex.synchronize { @abc.pump.speed = value }
|
417
417
|
end
|
418
418
|
end
|
419
419
|
|
@@ -423,8 +423,8 @@ class MQTTBridge
|
|
423
423
|
"Enabled",
|
424
424
|
:boolean,
|
425
425
|
@abc.dhw.enabled,
|
426
|
-
hass: { switch: { icon: "mdi:water-boiler" } }) do |value
|
427
|
-
@mutex.synchronize {
|
426
|
+
hass: { switch: { icon: "mdi:water-boiler" } }) do |value|
|
427
|
+
@mutex.synchronize { @abc.dhw.enabled = value }
|
428
428
|
end
|
429
429
|
node.property("running",
|
430
430
|
"Pump Running",
|
@@ -444,8 +444,8 @@ class MQTTBridge
|
|
444
444
|
@abc.dhw.set_point,
|
445
445
|
format: 100..140,
|
446
446
|
unit: "°F",
|
447
|
-
hass: { number: { step: 5 } }) do |value
|
448
|
-
@mutex.synchronize {
|
447
|
+
hass: { number: { step: 5 } }) do |value|
|
448
|
+
@mutex.synchronize { @abc.dhw.set_point = value }
|
449
449
|
end
|
450
450
|
end
|
451
451
|
end
|
@@ -461,16 +461,16 @@ class MQTTBridge
|
|
461
461
|
"Humidifier Mode",
|
462
462
|
:enum,
|
463
463
|
@abc.humidistat.humidifier_mode,
|
464
|
-
format: %i[auto manual]) do |value
|
465
|
-
@mutex.synchronize {
|
464
|
+
format: %i[auto manual]) do |value|
|
465
|
+
@mutex.synchronize { @abc.humidistat.humidifier_mode = value.to_sym }
|
466
466
|
end
|
467
467
|
node.property("humidification-target",
|
468
468
|
"Humidification Target Relative Humidity",
|
469
469
|
:integer,
|
470
470
|
@abc.humidistat.humidification_target,
|
471
471
|
unit: "%",
|
472
|
-
format: 15..50) do |value
|
473
|
-
@mutex.synchronize {
|
472
|
+
format: 15..50) do |value|
|
473
|
+
@mutex.synchronize { @abc.humidistat.humidification_target = value }
|
474
474
|
end
|
475
475
|
node.hass_humidifier("humidifier-running",
|
476
476
|
target_property: "humidification-target",
|
@@ -493,16 +493,16 @@ class MQTTBridge
|
|
493
493
|
"Dehumidifier Mode",
|
494
494
|
:enum,
|
495
495
|
@abc.humidistat.dehumidifier_mode,
|
496
|
-
format: %i[auto manual]) do |value
|
497
|
-
@mutex.synchronize {
|
496
|
+
format: %i[auto manual]) do |value|
|
497
|
+
@mutex.synchronize { @abc.humidistat.dehumidifier_mode = value.to_sym }
|
498
498
|
end
|
499
499
|
node.property("dehumidification-target",
|
500
500
|
"Dehumidification Target Relative Humidity",
|
501
501
|
:integer,
|
502
502
|
@abc.humidistat.dehumidification_target,
|
503
503
|
unit: "%",
|
504
|
-
format: 35..65) do |value
|
505
|
-
@mutex.synchronize {
|
504
|
+
format: 35..65) do |value|
|
505
|
+
@mutex.synchronize { @abc.humidistat.dehumidification_target = value }
|
506
506
|
end
|
507
507
|
node.hass_humidifier("dehumidifier-running",
|
508
508
|
target_property: "dehumidification-target",
|
@@ -563,15 +563,15 @@ class MQTTBridge
|
|
563
563
|
"Target Heating/Cooling Mode",
|
564
564
|
:enum,
|
565
565
|
zone.target_mode,
|
566
|
-
format: allowed_modes) do |value
|
567
|
-
@mutex.synchronize {
|
566
|
+
format: allowed_modes) do |value|
|
567
|
+
@mutex.synchronize { zone.target_mode = value.to_sym }
|
568
568
|
end
|
569
569
|
node.property("target-fan-mode",
|
570
570
|
"Target Fan Mode",
|
571
571
|
:enum,
|
572
572
|
zone.target_fan_mode,
|
573
|
-
format: %w[auto continuous intermittent]) do |value
|
574
|
-
@mutex.synchronize {
|
573
|
+
format: %w[auto continuous intermittent]) do |value|
|
574
|
+
@mutex.synchronize { zone.target_fan_mode = value.to_sym }
|
575
575
|
end
|
576
576
|
node.property("fan-intermittent-on",
|
577
577
|
"Fan Intermittent Mode On Duration",
|
@@ -579,8 +579,8 @@ class MQTTBridge
|
|
579
579
|
zone.fan_intermittent_on,
|
580
580
|
unit: "M",
|
581
581
|
format: %w[0 5 10 15 20],
|
582
|
-
hass: { select: { entity_category: :config } }) do |value
|
583
|
-
@mutex.synchronize {
|
582
|
+
hass: { select: { entity_category: :config } }) do |value|
|
583
|
+
@mutex.synchronize { zone.fan_intermittent_on = value.to_i }
|
584
584
|
end
|
585
585
|
node.property("fan-intermittent-off",
|
586
586
|
"Fan Intermittent Mode Off Duration",
|
@@ -588,8 +588,8 @@ class MQTTBridge
|
|
588
588
|
zone.fan_intermittent_on,
|
589
589
|
unit: "M",
|
590
590
|
format: %w[0 5 10 15 20 25 30 35 40],
|
591
|
-
hass: { select: { entity_category: :config } }) do |value
|
592
|
-
@mutex.synchronize {
|
591
|
+
hass: { select: { entity_category: :config } }) do |value|
|
592
|
+
@mutex.synchronize { zone.fan_intermittent_on = value.to_i }
|
593
593
|
end
|
594
594
|
node.property("current-fan-mode",
|
595
595
|
"Current Fan Status",
|
@@ -630,15 +630,15 @@ class MQTTBridge
|
|
630
630
|
:integer,
|
631
631
|
zone.heating_target_temperature,
|
632
632
|
unit: "°F",
|
633
|
-
format: 40..90) do |value
|
634
|
-
@mutex.synchronize {
|
633
|
+
format: 40..90) do |value|
|
634
|
+
@mutex.synchronize { zone.heating_target_temperature = value }
|
635
635
|
end
|
636
636
|
node.property("cooling-target-temperature",
|
637
637
|
"Cooling Target Temperature", :integer,
|
638
638
|
zone.cooling_target_temperature,
|
639
639
|
unit: "°F",
|
640
|
-
format: 54..99) do |value
|
641
|
-
@mutex.synchronize {
|
640
|
+
format: 54..99) do |value|
|
641
|
+
@mutex.synchronize { zone.cooling_target_temperature = value }
|
642
642
|
end
|
643
643
|
node.hass_climate(action_property: "current-mode",
|
644
644
|
current_temperature_property: "ambient-temperature",
|
data/lib/aurora/abc_client.rb
CHANGED
@@ -202,10 +202,18 @@ module Aurora
|
|
202
202
|
elsif registers[362]
|
203
203
|
:dehumidify
|
204
204
|
elsif outputs.include?(:cc2) || outputs.include?(:cc)
|
205
|
-
outputs.include?(:rv)
|
205
|
+
if outputs.include?(:rv)
|
206
|
+
:cooling
|
207
|
+
elsif outputs.include?(:eh2) || outputs.include?(:eh1)
|
208
|
+
:heating_with_aux
|
209
|
+
else
|
210
|
+
:heating
|
211
|
+
end
|
212
|
+
elsif outputs.include?(:eh2) || outputs.include?(:eh1)
|
213
|
+
:emergency_heat
|
206
214
|
elsif outputs.include?(:blower)
|
207
215
|
:blower
|
208
|
-
elsif registers[6]
|
216
|
+
elsif !registers[6].zero?
|
209
217
|
:waiting
|
210
218
|
else
|
211
219
|
:standby
|
data/lib/aurora/aux_heat.rb
CHANGED
@@ -3,19 +3,19 @@
|
|
3
3
|
require "aurora/component"
|
4
4
|
|
5
5
|
module Aurora
|
6
|
-
class AuxHeat < Component
|
6
|
+
class AuxHeat < Component
|
7
7
|
attr_reader :stage, :watts
|
8
8
|
|
9
9
|
def refresh(registers)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
outputs = registers[30]
|
11
|
+
@stage = if outputs.include?(:eh2)
|
12
|
+
2
|
13
|
+
elsif outputs.include?(:eh1)
|
14
|
+
1
|
15
|
+
else
|
16
|
+
0
|
17
|
+
end
|
18
|
+
@watts = registers[1151] if abc.energy_monitoring?
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/aurora/dhw.rb
CHANGED
data/lib/aurora/humidistat.rb
CHANGED
@@ -75,8 +75,6 @@ module Aurora
|
|
75
75
|
raw_value |= 0x4000 if humidifier_mode == :auto
|
76
76
|
raw_value |= 0x8000 if dehumidifier_mode == :auto
|
77
77
|
holding_registers[abc.iz2? ? 21_114 : 12_309] = raw_value
|
78
|
-
@humidifier_mode = humidifier_mode
|
79
|
-
@dehumidifier_mode = dehumidifier_mode
|
80
78
|
end
|
81
79
|
|
82
80
|
def humidification_target=(value)
|
@@ -92,8 +90,6 @@ module Aurora
|
|
92
90
|
raise ArgumentError unless (35..65).cover?(dehumidification_target)
|
93
91
|
|
94
92
|
holding_registers[abc.iz2? ? 21_115 : 12_310] = (humidification_target << 8) + dehumidification_target
|
95
|
-
@humidification_target = humidification_target
|
96
|
-
@dehumidification_target = dehumidification_target
|
97
93
|
end
|
98
94
|
end
|
99
95
|
end
|
data/lib/aurora/iz2_zone.rb
CHANGED
@@ -46,28 +46,24 @@ module Aurora
|
|
46
46
|
return unless (raw_value = Aurora::HEATING_MODE.invert[value])
|
47
47
|
|
48
48
|
holding_registers[21_202 + ((zone_number - 1) * 9)] = raw_value
|
49
|
-
@target_mode = value
|
50
49
|
end
|
51
50
|
|
52
51
|
def target_fan_mode=(value)
|
53
52
|
return unless (raw_value = Aurora::FAN_MODE.invert[value])
|
54
53
|
|
55
54
|
holding_registers[21_205 + ((zone_number - 1) * 9)] = raw_value
|
56
|
-
@target_fan_mode = value
|
57
55
|
end
|
58
56
|
|
59
57
|
def fan_intermittent_on=(value)
|
60
58
|
return unless value >= 0 && value <= 25 && (value % 5).zero?
|
61
59
|
|
62
60
|
holding_registers[21_206 + ((zone_number - 1) * 9)] = value
|
63
|
-
@fan_intermittent_on = value
|
64
61
|
end
|
65
62
|
|
66
63
|
def fan_intermittent_off=(value)
|
67
64
|
return unless value >= 0 && value <= 40 && (value % 5).zero?
|
68
65
|
|
69
66
|
holding_registers[21_207 + ((zone_number - 1) * 9)] = value
|
70
|
-
@fan_intermittent_off = value
|
71
67
|
end
|
72
68
|
|
73
69
|
def heating_target_temperature=(value)
|
@@ -75,7 +71,6 @@ module Aurora
|
|
75
71
|
|
76
72
|
raw_value = (value * 10).to_i
|
77
73
|
holding_registers[21_203 + ((zone_number - 1) * 9)] = raw_value
|
78
|
-
@heating_target_temperature = value
|
79
74
|
end
|
80
75
|
|
81
76
|
def cooling_target_temperature=(value)
|
@@ -83,7 +78,6 @@ module Aurora
|
|
83
78
|
|
84
79
|
raw_value = (value * 10).to_i
|
85
80
|
holding_registers[21_204 + ((zone_number - 1) * 9)] = raw_value
|
86
|
-
@cooling_target_temperature = value
|
87
81
|
end
|
88
82
|
end
|
89
83
|
end
|
data/lib/aurora/registers.rb
CHANGED
@@ -229,6 +229,8 @@ module Aurora
|
|
229
229
|
0x08 => :blower,
|
230
230
|
0x10 => :eh1,
|
231
231
|
0x20 => :eh2,
|
232
|
+
# 0x40 => ??, # this turns on and off quite a bit during normal operation
|
233
|
+
# 0x80 => ??, # this turns on occasionally during normal operation; I've only seen it when aux heat is on
|
232
234
|
0x200 => :accessory,
|
233
235
|
0x400 => :lockout,
|
234
236
|
0x800 => :alarm
|
@@ -703,8 +705,9 @@ module Aurora
|
|
703
705
|
9 => "Compressor Minimum Run Time",
|
704
706
|
15 => "Blower Off Delay",
|
705
707
|
16 => "Line Voltage",
|
706
|
-
17 => "Aux/E Heat Stage", # this
|
707
|
-
#
|
708
|
+
17 => "Aux/E Heat Stage", # this is how long aux/eheat have been requested in seconds
|
709
|
+
# when in eheat mode (explicit on the thermostat), it will stage up to eh2 after 130s
|
710
|
+
# when in aux mode (thermostat set to heat; compressor at full capacity), it will stage up to eh2 after 310s
|
708
711
|
19 => "FP1 (Cooling Liquid Line) Temperature",
|
709
712
|
20 => "FP2",
|
710
713
|
21 => "Condensate", # >= 270 normal, otherwise fault
|
data/lib/aurora/thermostat.rb
CHANGED
@@ -48,14 +48,12 @@ module Aurora
|
|
48
48
|
return unless (raw_value = HEATING_MODE.invert[value])
|
49
49
|
|
50
50
|
@abc.modbus_slave.holding_registers[12_606] = raw_value
|
51
|
-
@target_mode = value
|
52
51
|
end
|
53
52
|
|
54
53
|
def target_fan_mode=(value)
|
55
54
|
return unless (raw_value = FAN_MODE.invert[value])
|
56
55
|
|
57
56
|
@abc.modbus_slave.holding_registers[12_621] = raw_value
|
58
|
-
@target_fan_mode = value
|
59
57
|
end
|
60
58
|
|
61
59
|
def heating_target_temperature=(value)
|
@@ -63,7 +61,6 @@ module Aurora
|
|
63
61
|
|
64
62
|
raw_value = (value * 10).to_i
|
65
63
|
@abc.modbus_slave.holding_registers[12_619] = raw_value
|
66
|
-
@heating_target_temperature = value
|
67
64
|
end
|
68
65
|
|
69
66
|
def cooling_target_temperature=(value)
|
@@ -71,21 +68,18 @@ module Aurora
|
|
71
68
|
|
72
69
|
raw_value = (value * 10).to_i
|
73
70
|
@abc.modbus_slave.holding_registers[12_620] = raw_value
|
74
|
-
@cooling_target_temperature = value
|
75
71
|
end
|
76
72
|
|
77
73
|
def fan_intermittent_on=(value)
|
78
74
|
return unless value >= 0 && value <= 25 && (value % 5).zero?
|
79
75
|
|
80
76
|
holding_registers[12_622] = value
|
81
|
-
@fan_intermittent_on = value
|
82
77
|
end
|
83
78
|
|
84
79
|
def fan_intermittent_off=(value)
|
85
80
|
return unless value >= 0 && value <= 40 && (value % 5).zero?
|
86
81
|
|
87
82
|
holding_registers[12_623] = value
|
88
|
-
@fan_intermittent_off = value
|
89
83
|
end
|
90
84
|
end
|
91
85
|
end
|
data/lib/aurora/version.rb
CHANGED