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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19a356cb48b70e999a4dda4d697fe20f178f19c1e86de2fbc4c2d0eda6cc2b40
4
- data.tar.gz: 7f831138bcf91c456ed380e3a2661e52abfcdfed308fc5587618c202a7102c12
3
+ metadata.gz: 353f714b82fb803a5a816781e39f1e952fea04485fa09d32f36f363b003bcfd3
4
+ data.tar.gz: 70b12365ae3f13cfca0fd70104d552efee6b520985e2844795a480130ae42929
5
5
  SHA512:
6
- metadata.gz: e15907a96a287316f1631ad43db6f510dc7353bd985d5343017078d8742fb830085b13eaf2f128db0c409525b7b533d83dcd19f70d4a830372b24c78b0285be2
7
- data.tar.gz: ed4b561646b9885005ad9c327f46dcaac5abd86cf20ceb1ac1f147bc19afb57c56f0344c23d88716fef53127e6a45c0c7a61f321bc843ade914eb23068f728ce
6
+ metadata.gz: 40937d99b2c3cc6044f6ddfda7ef3c8e789192e31e7ca47e5057f18c4deeb5b33a745bcef155a0c78bc35ce598f631e5d3a9bbbb18bb3b739d0aab7c4b87e2c7
7
+ data.tar.gz: 4c7e83279bce76b4baa09d74b5b56394822405694fbcecc3b8674caedb9eef9e0baeea518305e1268ac39c719e411010c9d78c00ab1cccb9b0378763b0809873
@@ -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("#{@home.topic}/$modbus/response", result, retain: false, qos: 1)
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
- @homie_abc["compressor-speed"].value = @abc.compressor_speed
74
- @homie_abc["current-mode"].value = @abc.current_mode
75
- @homie_abc["dhw-water-temperature"].value = @abc.dhw_water_temperature
76
- @homie_abc["entering-air-temperature"].value = @abc.entering_air_temperature
77
- @homie_abc["entering-water-temperature"].value = @abc.entering_water_temperature
78
- @homie_abc["fan-speed"].value = @abc.fan_speed
79
- @homie_abc["leaving-air-temperature"].value = @abc.leaving_air_temperature
80
- @homie_abc["leaving-water-temperature"].value = @abc.leaving_water_temperature
81
- @homie_abc["outdoor-temperature"].value = @abc.outdoor_temperature
82
- @homie_abc["relative-humidity"].value = @abc.relative_humidity
83
- @homie_abc["waterflow"].value = @abc.waterflow
84
- @homie_abc["fp1"].value = @abc.fp1
85
- @homie_abc["fp2"].value = @abc.fp2
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.iz2_zones.each do |z|
94
+ @abc.zones.each do |z|
88
95
  homie_zone = @homie["zone#{z.zone_number}"]
89
- homie_zone["target-mode"].value = z.target_mode
90
- homie_zone["current-mode"].value = z.current_mode
91
- homie_zone["target-fan-mode"].value = z.target_fan_mode
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.iz2_zones.each do |zone|
135
- @homie.node("zone#{zone.zone_number}", "Zone #{zone.zone_number}", "IntelliZone 2 Zone") do |node|
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
- node.property("current-mode", "Current Heating/Cooling Mode Requested", :enum, zone.current_mode,
143
- format: %w[standby h1 h2 h3 c1 c2])
144
- node.property("target-fan-mode", "Target Fan Mode", :enum, zone.target_fan_mode,
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
- node.property("current-fan-mode", "Current Fan Status", :boolean, zone.current_fan_mode)
149
- node.property("fan-intermittent-on", "Fan Intermittent Mode On Duration", :enum, zone.fan_intermittent_on,
150
- unit: "M", format: %w[0 5 10 15 20]) do |value, property|
151
- @mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
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
- node.property("fan-intermittent-off", "Fan Intermittent Mode Off Duration", :enum, zone.fan_intermittent_on,
154
- unit: "M", format: %w[0 5 10 15 20 25 30 35 40]) do |value, property|
155
- @mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
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|
@@ -3,7 +3,7 @@
3
3
  module Aurora
4
4
  class ABCClient
5
5
  attr_reader :modbus_slave,
6
- :iz2_zones,
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
- @iz2_zones = (0...iz2_zone_count).map { |i| IZ2Zone.new(self, i + 1) }
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
- # IZ2 zones
32
- iz2_zones.each_with_index do |_z, i|
33
- base1 = 21_203 + i * 9
34
- base2 = 31_007 + i * 3
35
- base3 = 31_200 + i * 3
36
- registers_to_read << (base1..(base1 + 1))
37
- registers_to_read << (base2..(base2 + 2))
38
- registers_to_read << base3
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
- iz2_zones.each do |z|
93
+ zones.each do |z|
76
94
  z.refresh(registers)
77
95
  end
78
96
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aurora
4
+ module Inflector
5
+ def titleize
6
+ gsub(/\b(?<!\w['â`])[a-z]/, &:capitalize)
7
+ end
8
+ end
9
+ end
10
+ String.include(Aurora::Inflector)
@@ -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
- @abc = abc
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
- value = Aurora::HEATING_MODE.invert[value]
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] = value
49
- @target_mode = Aurora::HEATING_MODE[@abc.modbus_slave.holding_registers[21_202 + (zone_number - 1) * 9]]
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
- value = Aurora::FAN_MODE.invert[value]
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] = value
57
- registers = @abc.modbus_slave.read_multiple_holding_registers(31_008 + (zone_number - 1) * 3)
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
- registers = @abc.modbus_slave.read_multiple_holding_registers(31_008 + (zone_number - 1) * 3)
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
- registers = @abc.modbus_slave.read_multiple_holding_registers(31_008 + (zone_number - 1) * 3)
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
- value = (value * 10).to_i
84
- @abc.modbus_slave.holding_registers[21_203 + (zone_number - 1) * 9] = value
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
- value = (value * 10).to_i
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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aurora
4
- VERSION = "0.2.2"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/aurora.rb CHANGED
@@ -4,6 +4,7 @@ require "rmodbus"
4
4
 
5
5
  require "aurora/abc_client"
6
6
  require "aurora/iz2_zone"
7
+ require "aurora/thermostat"
7
8
  require "aurora/modbus/server"
8
9
  require "aurora/modbus/slave"
9
10
  require "aurora/registers"
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.2.2
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-25 00:00:00.000000000 Z
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.1
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.1
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