waterfurnace_aurora 1.0.0 → 1.0.1
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 +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