waterfurnace_aurora 0.2.2 → 0.3.0
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 +53 -43
- data/lib/aurora/abc_client.rb +31 -13
- data/lib/aurora/core_ext/string.rb +10 -0
- data/lib/aurora/iz2_zone.rb +18 -42
- data/lib/aurora/registers.rb +12 -5
- data/lib/aurora/thermostat.rb +57 -0
- data/lib/aurora/version.rb +1 -1
- data/lib/aurora.rb +1 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 353f714b82fb803a5a816781e39f1e952fea04485fa09d32f36f363b003bcfd3
|
4
|
+
data.tar.gz: 70b12365ae3f13cfca0fd70104d552efee6b520985e2844795a480130ae42929
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40937d99b2c3cc6044f6ddfda7ef3c8e789192e31e7ca47e5057f18c4deeb5b33a745bcef155a0c78bc35ce598f631e5d3a9bbbb18bb3b739d0aab7c4b87e2c7
|
7
|
+
data.tar.gz: 4c7e83279bce76b4baa09d74b5b56394822405694fbcecc3b8674caedb9eef9e0baeea518305e1268ac39c719e411010c9d78c00ab1cccb9b0378763b0809873
|
data/exe/aurora_mqtt_bridge
CHANGED
@@ -5,6 +5,7 @@ require "aurora"
|
|
5
5
|
require "homie-mqtt"
|
6
6
|
require "ccutrer-serialport"
|
7
7
|
require "uri"
|
8
|
+
require "aurora/core_ext/string"
|
8
9
|
|
9
10
|
uri = URI.parse(ARGV[0])
|
10
11
|
mqtt_uri = ARGV[1]
|
@@ -48,7 +49,7 @@ class MQTTBridge
|
|
48
49
|
registers.merge!(@abc.modbus_slave.read_multiple_holding_registers(*subquery))
|
49
50
|
end
|
50
51
|
result = Aurora.print_registers(registers)
|
51
|
-
@homie.mqtt.publish("#{@
|
52
|
+
@homie.mqtt.publish("#{@homie.topic}/$modbus/response", result, retain: false, qos: 1)
|
52
53
|
when %r{\$modbus/(\d+)$}
|
53
54
|
register = Regexp.last_match(1).to_i
|
54
55
|
value = case value
|
@@ -70,34 +71,31 @@ class MQTTBridge
|
|
70
71
|
begin
|
71
72
|
@mutex.synchronize do
|
72
73
|
@abc.refresh
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
74
|
+
%i[compressor_speed
|
75
|
+
current_mode
|
76
|
+
dhw_water_temperature
|
77
|
+
entering_air_temperature
|
78
|
+
fan_speed
|
79
|
+
leaving_air_temperature
|
80
|
+
leaving_water_temperature
|
81
|
+
outdoor_temperature
|
82
|
+
relative_humidity
|
83
|
+
waterflow
|
84
|
+
fp1
|
85
|
+
fp2
|
86
|
+
compressor_watts
|
87
|
+
blower_watts
|
88
|
+
aux_heat_watts
|
89
|
+
loop_pump_watts
|
90
|
+
total_watts].each do |property|
|
91
|
+
@homie_abc[property.to_s.tr("_", "-")].value = @abc.public_send(property)
|
92
|
+
end
|
86
93
|
|
87
|
-
@abc.
|
94
|
+
@abc.zones.each do |z|
|
88
95
|
homie_zone = @homie["zone#{z.zone_number}"]
|
89
|
-
homie_zone
|
90
|
-
|
91
|
-
|
92
|
-
homie_zone["current-fan-mode"].value = z.current_fan_mode
|
93
|
-
homie_zone["fan-intermittent-on"].value = z.fan_intermittent_on
|
94
|
-
homie_zone["fan-intermittent-off"].value = z.fan_intermittent_off
|
95
|
-
homie_zone["priority"].value = z.priority
|
96
|
-
homie_zone["size"].value = z.size
|
97
|
-
homie_zone["normalized-size"].value = z.normalized_size
|
98
|
-
homie_zone["ambient-temperature"].value = z.ambient_temperature
|
99
|
-
homie_zone["heating-target-temperature"].value = z.heating_target_temperature
|
100
|
-
homie_zone["cooling-target-temperature"].value = z.cooling_target_temperature
|
96
|
+
homie_zone.each do |property|
|
97
|
+
property.value = z.public_send(property.id.tr("-", "_"))
|
98
|
+
end
|
101
99
|
end
|
102
100
|
end
|
103
101
|
rescue => e
|
@@ -129,34 +127,46 @@ class MQTTBridge
|
|
129
127
|
node.property("waterflow", "Waterflow", :float, unit: "gpm")
|
130
128
|
node.property("fp1", "FP1 Sensor", :float, @abc.fp1, unit: "ºF")
|
131
129
|
node.property("fp2", "FP2 Sensor", :float, @abc.fp2, unit: "ºF")
|
130
|
+
%i[compressor blower aux_heat loop_pump total].each do |component|
|
131
|
+
component = "#{component}_watts"
|
132
|
+
node.property(component.tr("_", "-"), component.tr("_", " ").titleize, :integer,
|
133
|
+
@abc.public_send(component), unit: "W")
|
134
|
+
end
|
132
135
|
end
|
133
136
|
|
134
|
-
@abc.
|
135
|
-
|
137
|
+
@abc.zones.each do |zone|
|
138
|
+
type = zone.is_a?(Aurora::IZ2Zone) ? "IntelliZone 2 Zone" : "Thermostat"
|
139
|
+
@homie.node("zone#{zone.zone_number}", "Zone #{zone.zone_number}", type) do |node|
|
136
140
|
allowed_modes = %w[off auto cool heat]
|
137
|
-
allowed_modes << "eheat" if zone.zone_number == 1
|
141
|
+
allowed_modes << "eheat" if !zone.respond_to?(:zone_number) || zone.zone_number == 1
|
138
142
|
node.property("target-mode", "Target Heating/Cooling Mode", :enum, zone.target_mode,
|
139
143
|
format: allowed_modes) do |value, property|
|
140
144
|
@mutex.synchronize { property.value = zone.target_mode = value.to_sym }
|
141
145
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
146
|
+
if zone.respond_to?(:current_mode) # TODO: implement for non-IZ2
|
147
|
+
node.property("current-mode", "Current Heating/Cooling Mode Requested", :enum, zone.current_mode,
|
148
|
+
format: %w[standby h1 h2 h3 c1 c2])
|
149
|
+
end
|
150
|
+
node.property("target-fan-mode", "Target Fan Mode", :enum, zone.target_fan_mode,
|
145
151
|
format: %w[auto continuous intermittent]) do |value, property|
|
146
152
|
@mutex.synchronize { property.value = zone.target_fan_mode = value.to_sym }
|
147
153
|
end
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
154
|
+
if zone.respond_to?(:current_fan_mode) # TODO: implement for non-IZ2
|
155
|
+
node.property("current-fan-mode", "Current Fan Status", :boolean, zone.current_fan_mode)
|
156
|
+
node.property("fan-intermittent-on", "Fan Intermittent Mode On Duration", :enum, zone.fan_intermittent_on,
|
157
|
+
unit: "M", format: %w[0 5 10 15 20]) do |value, property|
|
158
|
+
@mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
|
159
|
+
end
|
160
|
+
node.property("fan-intermittent-off", "Fan Intermittent Mode Off Duration", :enum, zone.fan_intermittent_on,
|
161
|
+
unit: "M", format: %w[0 5 10 15 20 25 30 35 40]) do |value, property|
|
162
|
+
@mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
|
163
|
+
end
|
152
164
|
end
|
153
|
-
|
154
|
-
|
155
|
-
|
165
|
+
if zone.is_a?(Aurora::IZ2Zone)
|
166
|
+
node.property("priority", "Zone Priority", :enum, zone.priority, format: %w[economy comfort])
|
167
|
+
node.property("size", "Size", :enum, zone.size, format: %w[0 25 45 70])
|
168
|
+
node.property("normalized-size", "Normalized Size", :integer, zone.normalized_size, unit: "%", format: 0..100)
|
156
169
|
end
|
157
|
-
node.property("priority", "Zone Priority", :enum, zone.priority, format: %w[economy comfort])
|
158
|
-
node.property("size", "Size", :enum, zone.size, format: %w[0 25 45 70])
|
159
|
-
node.property("normalized-size", "Normalized Size", :integer, zone.normalized_size, unit: "%", format: 0..100)
|
160
170
|
node.property("ambient-temperature", "Ambient Temperature", :float, zone.ambient_temperature, unit: "ºF")
|
161
171
|
node.property("heating-target-temperature", "Heating Target Temperature", :integer,
|
162
172
|
zone.heating_target_temperature, unit: "ºF", format: 40..90) do |value, property|
|
data/lib/aurora/abc_client.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module Aurora
|
4
4
|
class ABCClient
|
5
5
|
attr_reader :modbus_slave,
|
6
|
-
:
|
6
|
+
:zones,
|
7
7
|
:current_mode,
|
8
8
|
:fan_speed,
|
9
9
|
:entering_air_temperature,
|
@@ -16,26 +16,39 @@ module Aurora
|
|
16
16
|
:compressor_speed,
|
17
17
|
:outdoor_temperature,
|
18
18
|
:fp1,
|
19
|
-
:fp2
|
19
|
+
:fp2,
|
20
|
+
:compressor_watts,
|
21
|
+
:blower_watts,
|
22
|
+
:aux_heat_watts,
|
23
|
+
:loop_pump_watts,
|
24
|
+
:total_watts
|
20
25
|
|
21
26
|
def initialize(modbus_slave)
|
22
27
|
@modbus_slave = modbus_slave
|
23
28
|
@modbus_slave.read_retry_timeout = 15
|
24
29
|
@modbus_slave.read_retries = 2
|
25
30
|
iz2_zone_count = @modbus_slave.holding_registers[483]
|
26
|
-
|
31
|
+
# TODO: better detect IZ2/Non-IZ2
|
32
|
+
@zones = if iz2_zone_count > 1
|
33
|
+
(0...iz2_zone_count).map { |i| IZ2Zone.new(self, i + 1) }
|
34
|
+
else
|
35
|
+
[Thermostat.new(self)]
|
36
|
+
end
|
27
37
|
end
|
28
38
|
|
29
39
|
def refresh
|
30
|
-
registers_to_read = [19..20, 30, 344, 740..741, 900, 1110..1111, 1114, 1117, 3027, 31_003]
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
40
|
+
registers_to_read = [19..20, 30, 344, 740..741, 900, 1110..1111, 1114, 1117, 1147..1153, 1165, 3027, 31_003]
|
41
|
+
if zones.first.is_a?(IZ2Zone)
|
42
|
+
zones.each_with_index do |_z, i|
|
43
|
+
base1 = 21_203 + i * 9
|
44
|
+
base2 = 31_007 + i * 3
|
45
|
+
base3 = 31_200 + i * 3
|
46
|
+
registers_to_read << (base1..(base1 + 1))
|
47
|
+
registers_to_read << (base2..(base2 + 2))
|
48
|
+
registers_to_read << base3
|
49
|
+
end
|
50
|
+
else
|
51
|
+
registers_to_read << 745..747
|
39
52
|
end
|
40
53
|
|
41
54
|
registers = @modbus_slave.holding_registers[*registers_to_read]
|
@@ -54,6 +67,11 @@ module Aurora
|
|
54
67
|
@fp1 = registers[19]
|
55
68
|
@fp2 = registers[20]
|
56
69
|
@locked_out = registers[1117]
|
70
|
+
@compressor_watts = registers[1147]
|
71
|
+
@blower_watts = registers[1149]
|
72
|
+
@aux_heat_watts = registers[1151]
|
73
|
+
@loop_pump_watts = registers[1165]
|
74
|
+
@total_watts = registers[1153]
|
57
75
|
|
58
76
|
outputs = registers[30]
|
59
77
|
@current_mode = if outputs.include?(:lockout)
|
@@ -72,7 +90,7 @@ module Aurora
|
|
72
90
|
:standby
|
73
91
|
end
|
74
92
|
|
75
|
-
|
93
|
+
zones.each do |z|
|
76
94
|
z.refresh(registers)
|
77
95
|
end
|
78
96
|
end
|
data/lib/aurora/iz2_zone.rb
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "aurora/thermostat"
|
4
|
+
|
3
5
|
module Aurora
|
4
|
-
class IZ2Zone
|
6
|
+
class IZ2Zone < Thermostat
|
5
7
|
attr_reader :zone_number,
|
6
|
-
:target_mode,
|
7
8
|
:current_mode,
|
8
|
-
:target_fan_mode,
|
9
9
|
:current_fan_mode,
|
10
10
|
:fan_intermittent_on,
|
11
11
|
:fan_intermittent_off,
|
12
12
|
:priority,
|
13
|
-
:size, :normalized_size
|
14
|
-
:ambient_temperature,
|
15
|
-
:cooling_target_temperature,
|
16
|
-
:heating_target_temperature
|
13
|
+
:size, :normalized_size
|
17
14
|
|
18
15
|
def initialize(abc, zone_number)
|
19
|
-
|
16
|
+
super(abc)
|
20
17
|
@zone_number = zone_number
|
21
18
|
end
|
22
19
|
|
@@ -42,68 +39,47 @@ module Aurora
|
|
42
39
|
end
|
43
40
|
|
44
41
|
def target_mode=(value)
|
45
|
-
|
46
|
-
return unless value
|
42
|
+
return unless (raw_value = Aurora::HEATING_MODE.invert[value])
|
47
43
|
|
48
|
-
@abc.modbus_slave.holding_registers[21_202 + (zone_number - 1) * 9] =
|
49
|
-
@target_mode =
|
44
|
+
@abc.modbus_slave.holding_registers[21_202 + (zone_number - 1) * 9] = raw_value
|
45
|
+
@target_mode = value
|
50
46
|
end
|
51
47
|
|
52
48
|
def target_fan_mode=(value)
|
53
|
-
|
54
|
-
return unless value
|
49
|
+
return unless (raw_value = Aurora::FAN_MODE.invert[value])
|
55
50
|
|
56
|
-
@abc.modbus_slave.holding_registers[21_205 + (zone_number - 1) * 9] =
|
57
|
-
|
58
|
-
Aurora.transform_registers(registers)
|
59
|
-
@target_fan_mode = registers.first.last[:fan]
|
51
|
+
@abc.modbus_slave.holding_registers[21_205 + (zone_number - 1) * 9] = raw_value
|
52
|
+
@target_fan_mode = value
|
60
53
|
end
|
61
54
|
|
62
55
|
def fan_intermittent_on=(value)
|
63
56
|
return unless value >= 0 && value <= 25 && (value % 5).zero?
|
64
57
|
|
65
58
|
@abc.modbus_slave.holding_registers[21_206 + (zone_number - 1) * 9] = value
|
66
|
-
|
67
|
-
Aurora.transform_registers(registers)
|
68
|
-
@fan_intermittent_on = registers.first.last[:on_time]
|
59
|
+
@fan_intermittent_on = value
|
69
60
|
end
|
70
61
|
|
71
62
|
def fan_intermittent_off=(value)
|
72
63
|
return unless value >= 0 && value <= 40 && (value % 5).zero?
|
73
64
|
|
74
65
|
@abc.modbus_slave.holding_registers[21_207 + (zone_number - 1) * 9] = value
|
75
|
-
|
76
|
-
Aurora.transform_registers(registers)
|
77
|
-
@fan_intermittent_on = registers.first.last[:off_time]
|
66
|
+
@fan_intermittent_off = value
|
78
67
|
end
|
79
68
|
|
80
69
|
def heating_target_temperature=(value)
|
81
70
|
return unless value >= 40 && value <= 90
|
82
71
|
|
83
|
-
|
84
|
-
@abc.modbus_slave.holding_registers[21_203 + (zone_number - 1) * 9] =
|
85
|
-
|
86
|
-
base = 31_008 + (zone_number - 1) * 3
|
87
|
-
registers = @abc.modbus_slave.read_multiple_holding_registers(base..(base + 1))
|
88
|
-
Aurora.transform_registers(registers)
|
89
|
-
registers[base + 1][:heating_target_temperature]
|
72
|
+
raw_value = (value * 10).to_i
|
73
|
+
@abc.modbus_slave.holding_registers[21_203 + (zone_number - 1) * 9] = raw_value
|
74
|
+
@heating_target_temperature = value
|
90
75
|
end
|
91
76
|
|
92
77
|
def cooling_target_temperature=(value)
|
93
78
|
return unless value >= 54 && value <= 99
|
94
79
|
|
95
|
-
|
80
|
+
raw_value = (value * 10).to_i
|
96
81
|
@abc.modbus_slave.holding_registers[21_204 + (zone_number - 1) * 9] = value
|
97
|
-
|
98
|
-
registers = @abc.modbus_slave.read_multiple_holding_registers(31_008 + (zone_number - 1) * 3)
|
99
|
-
Aurora.transform_registers(registers)
|
100
|
-
registers.first.last[:cooling_target_temperature]
|
101
|
-
end
|
102
|
-
|
103
|
-
def inspect
|
104
|
-
"#<Aurora::IZ2Zone #{(instance_variables - [:@abc]).map do |iv|
|
105
|
-
"#{iv}=#{instance_variable_get(iv).inspect}"
|
106
|
-
end.join(', ')}>"
|
82
|
+
@cooling_target_temperature = raw_value
|
107
83
|
end
|
108
84
|
end
|
109
85
|
end
|
data/lib/aurora/registers.rb
CHANGED
@@ -323,7 +323,8 @@ module Aurora
|
|
323
323
|
REGISTER_CONVERTERS = {
|
324
324
|
TO_HUNDREDTHS => [2, 3, 807, 813, 816, 817, 819, 820, 825, 828],
|
325
325
|
method(:dipswitch_settings) => [4, 33],
|
326
|
-
TO_TENTHS => [19, 20, 401, 567, 740, 745, 746, 900, 1105, 1106, 1107, 1108, 1110, 1111, 1114, 1117, 1134, 1136,
|
326
|
+
TO_TENTHS => [19, 20, 401, 567, 740, 745, 746, 747, 900, 1105, 1106, 1107, 1108, 1110, 1111, 1114, 1117, 1134, 1136,
|
327
|
+
12_619, 12_620,
|
327
328
|
21_203, 21_204,
|
328
329
|
21_212, 21_213,
|
329
330
|
21_221, 21_222,
|
@@ -348,8 +349,8 @@ module Aurora
|
|
348
349
|
->(v) { from_bitmask(v, AXB_INPUTS) } => [1103],
|
349
350
|
->(v) { from_bitmask(v, AXB_OUTPUTS) } => [1104],
|
350
351
|
->(v) { TO_TENTHS.call(NEGATABLE.call(v)) } => [1136],
|
351
|
-
->(v) { HEATING_MODE[v] } => [21_202, 21_211, 21_220, 21_229, 21_238, 21_247],
|
352
|
-
->(v) { FAN_MODE[v] } => [21_205, 21_214, 21_223, 21_232, 21_241, 21_250],
|
352
|
+
->(v) { HEATING_MODE[v] } => [12_602, 21_202, 21_211, 21_220, 21_229, 21_238, 21_247],
|
353
|
+
->(v) { FAN_MODE[v] } => [12_621, 21_205, 21_214, 21_223, 21_232, 21_241, 21_250],
|
353
354
|
->(v) { from_bitmask(v, HUMIDIFIER_SETTINGS) } => [31_109],
|
354
355
|
->(v) { { humidification_target: v >> 8, dehumidification_target: v & 0xff } } => [31_110],
|
355
356
|
method(:iz2_demand) => [31_005],
|
@@ -367,7 +368,8 @@ module Aurora
|
|
367
368
|
REGISTER_FORMATS = {
|
368
369
|
"%ds" => [1, 6, 9, 15, 84, 85],
|
369
370
|
"%dV" => [16, 112],
|
370
|
-
"%0.1fºF" => [19, 20, 401, 567, 740, 745, 746, 900, 1110, 1111, 1114, 1134, 1136,
|
371
|
+
"%0.1fºF" => [19, 20, 401, 567, 740, 745, 746, 747, 900, 1110, 1111, 1114, 1134, 1136,
|
372
|
+
12_619, 12_620,
|
371
373
|
21_203, 21_204,
|
372
374
|
21_212, 21_213,
|
373
375
|
21_221, 21_222,
|
@@ -398,7 +400,7 @@ module Aurora
|
|
398
400
|
base2 = 31_007 + (i - 1) * 3
|
399
401
|
base3 = 31_200 + (i - 1) * 3
|
400
402
|
{
|
401
|
-
base1 => "Zone #{i} Heating Mode",
|
403
|
+
base1 => "Zone #{i} Heating Mode (write)",
|
402
404
|
(base1 + 1) => "Zone #{i} Heating Setpoint (write)",
|
403
405
|
(base1 + 2) => "Zone #{i} Cooling Setpoint (write)",
|
404
406
|
(base1 + 3) => "Zone #{i} Fan Mode (write)",
|
@@ -579,6 +581,7 @@ module Aurora
|
|
579
581
|
741 => "Relative Humidity",
|
580
582
|
745 => "Heating Set Point",
|
581
583
|
746 => "Cooling Set Point",
|
584
|
+
747 => "Ambient Temperature",
|
582
585
|
807 => "AXB Version",
|
583
586
|
813 => "IZ2 Version?",
|
584
587
|
816 => "AOC Version 1?",
|
@@ -607,6 +610,10 @@ module Aurora
|
|
607
610
|
1153 => "Total Watts",
|
608
611
|
1157 => "Ht of Rej",
|
609
612
|
1165 => "VS Pump Watts",
|
613
|
+
12_602 => "Heating Mode (write)",
|
614
|
+
12_619 => "Heating Setpoint (write)",
|
615
|
+
12_620 => "Cooling Setpoint (write)",
|
616
|
+
12_621 => "Fan Mode (write)",
|
610
617
|
3027 => "Compressor Speed",
|
611
618
|
31_003 => "Outdoor Temp",
|
612
619
|
31_005 => "IZ2 Demand",
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aurora
|
4
|
+
class Thermostat
|
5
|
+
attr_reader :target_mode,
|
6
|
+
:target_fan_mode,
|
7
|
+
:ambient_temperature,
|
8
|
+
:cooling_target_temperature,
|
9
|
+
:heating_target_temperature
|
10
|
+
|
11
|
+
def initialize(abc)
|
12
|
+
@abc = abc
|
13
|
+
end
|
14
|
+
|
15
|
+
def refresh(registers)
|
16
|
+
@ambient_temperature = registers[747]
|
17
|
+
@heating_target_temperature = registers[746]
|
18
|
+
@cooling_target_temperature = registers[745]
|
19
|
+
end
|
20
|
+
|
21
|
+
def target_mode=(value)
|
22
|
+
return unless (raw_value = HEATING_MODE.invert[value])
|
23
|
+
|
24
|
+
@abc.modbus_slave.holding_registers[12_602] = raw_value
|
25
|
+
@target_mode = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def target_fan_mode=(value)
|
29
|
+
return unless (raw_value = FAN_MODE.invert[value])
|
30
|
+
|
31
|
+
@abc.modbus_slave.holding_registers[12_621] = raw_value
|
32
|
+
@target_fan_mode = value
|
33
|
+
end
|
34
|
+
|
35
|
+
def heating_target_temperature=(value)
|
36
|
+
return unless value >= 40 && value <= 90
|
37
|
+
|
38
|
+
raw_value = (value * 10).to_i
|
39
|
+
@abc.modbus_slave.holding_registers[12_619] = raw_value
|
40
|
+
@heating_target_temperature = value
|
41
|
+
end
|
42
|
+
|
43
|
+
def cooling_target_temperature=(value)
|
44
|
+
return unless value >= 54 && value <= 99
|
45
|
+
|
46
|
+
raw_value = (value * 10).to_i
|
47
|
+
@abc.modbus_slave.holding_registers[12_620] = raw_value
|
48
|
+
@cooling_target_temperature = value
|
49
|
+
end
|
50
|
+
|
51
|
+
def inspect
|
52
|
+
"#<Aurora::#{self.class.name} #{(instance_variables - [:@abc]).map do |iv|
|
53
|
+
"#{iv}=#{instance_variable_get(iv).inspect}"
|
54
|
+
end.join(', ')}>"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/aurora/version.rb
CHANGED
data/lib/aurora.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: waterfurnace_aurora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ccutrer-serialport
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.4.
|
33
|
+
version: 1.4.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.4.
|
40
|
+
version: 1.4.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: net-telnet-rfc2217
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,10 +125,12 @@ files:
|
|
125
125
|
- exe/registers.yml
|
126
126
|
- lib/aurora.rb
|
127
127
|
- lib/aurora/abc_client.rb
|
128
|
+
- lib/aurora/core_ext/string.rb
|
128
129
|
- lib/aurora/iz2_zone.rb
|
129
130
|
- lib/aurora/modbus/server.rb
|
130
131
|
- lib/aurora/modbus/slave.rb
|
131
132
|
- lib/aurora/registers.rb
|
133
|
+
- lib/aurora/thermostat.rb
|
132
134
|
- lib/aurora/version.rb
|
133
135
|
- lib/waterfurnace_aurora.rb
|
134
136
|
homepage: https://github.com/ccutrer/waterfurnace
|