waterfurnace_aurora 0.7.1 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8cb9189b26a420442c7cb7208ac5c955d6be8ed9296a73f62df320eec5ca69b4
4
- data.tar.gz: da661eea9277eef4f927e7714bf384f4377930a5e49df52632d7ed457df10fb5
3
+ metadata.gz: 037ee3ea9f7274fbc12400840c5f174a70e42361c686753728b31ef8c4c6faaf
4
+ data.tar.gz: 4ce5ddc17e4212d8a73f1c2f9255608d9d9a933da8d74e84af3552acd8bf7021
5
5
  SHA512:
6
- metadata.gz: 7a80d7049be630d2531e6acfa4d0a56693377555f46a102cb742e1c9e947454f67756ae0f8ca9c146a99e8bbf9acc32db821eae65aa57d4186ca9a5bdfe5280f
7
- data.tar.gz: 6fcc21eea70ab2a9a8d7169c68528b01635a2e16acdff5601feed205c80b816f398323cb24c77ec7d3df1193c121247302cedd4fd844312015f26be1959a2c81
6
+ metadata.gz: d21f026be0e2d578b0a12064b5f90c71e039636d6fa7c21cb2a30c87fae2f2a0cc9eb9ffc65ca025cf415800abab3c32185a52ecc1e86ed5c15b93fe9516391c
7
+ data.tar.gz: 2dc36c52c465c776f95e6581f60c20816b06c76d392d485c5c14b7c85a82c16b141b68da569eda8bfce1ddfed60bf1027166951b9bbf17383fe8f410506c3e39
@@ -124,57 +124,153 @@ class MQTTBridge
124
124
  end
125
125
 
126
126
  def publish_basic_attributes
127
+ @homie.home_assistant_device = {
128
+ manufacturer: "WaterFurnace",
129
+ sw_version: Aurora::VERSION,
130
+ model: @abc.model
131
+ }
132
+
127
133
  @homie_abc = @homie.node("abc", "Heat Pump", "ABC") do |node|
128
134
  allowed_modes = %w[lockout standby blower heating cooling eh1 eh2 emergency waiting]
129
135
  allowed_modes << "dehumidify" if @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
130
- node.property("current-mode", "Current Heating/Cooling Mode", :enum, @abc.current_mode,
131
- format: allowed_modes)
132
- node.property("entering-air-temperature", "Entering Air Temperature", :float, @abc.entering_air_temperature,
133
- unit: "°F")
134
- node.property("entering-water-temperature", "Entering Water Temperature", :float,
135
- @abc.entering_water_temperature, unit: "°F")
136
- node.property("leaving-air-temperature", "Leaving Air Temperature", :float, @abc.leaving_air_temperature,
137
- unit: "°F")
138
- node.property("leaving-water-temperature", "Leaving Water Temperature", :float, @abc.leaving_water_temperature,
139
- unit: "°F")
136
+ node.property("current-mode",
137
+ "Current Heating/Cooling Mode",
138
+ :enum,
139
+ @abc.current_mode,
140
+ format: allowed_modes,
141
+ hass: { sensor: { state_class: :measurement } })
142
+ node.property("entering-air-temperature",
143
+ "Entering Air Temperature",
144
+ :float,
145
+ @abc.entering_air_temperature,
146
+ unit: "°F",
147
+ hass: { sensor: { device_class: :temperature,
148
+ state_class: :measurement,
149
+ entity_category: :diagnostic } })
150
+ node.property("entering-water-temperature",
151
+ "Entering Water Temperature",
152
+ :float,
153
+ @abc.entering_water_temperature,
154
+ unit: "°F",
155
+ hass: { sensor: { device_class: :temperature,
156
+ state_class: :measurement,
157
+ entity_category: :diagnostic } })
158
+ node.property("leaving-air-temperature",
159
+ "Leaving Air Temperature",
160
+ :float,
161
+ @abc.leaving_air_temperature,
162
+ unit: "°F",
163
+ hass: { sensor: { device_class: :temperature,
164
+ state_class: :measurement,
165
+ entity_category: :diagnostic } })
166
+ node.property("leaving-water-temperature",
167
+ "Leaving Water Temperature",
168
+ :float,
169
+ @abc.leaving_water_temperature,
170
+ unit: "°F",
171
+ hass: { sensor: { device_class: :temperature,
172
+ state_class: :measurement,
173
+ entity_category: :diagnostic } })
140
174
  unless @abc.outdoor_temperature.zero? # TODO: figure out the config if this actually exists
141
- node.property("outdoor-temperature", "Outdoor Temperature", :float, @abc.outdoor_temperature, unit: "°F")
175
+ node.property("outdoor-temperature",
176
+ "Outdoor Temperature",
177
+ :float,
178
+ @abc.outdoor_temperature,
179
+ unit: "°F",
180
+ hass: { sensor: { device_class: :temperature,
181
+ state_class: :measurement } })
142
182
  end
143
183
 
144
- node.property("fp1", "FP1 Sensor", :float, @abc.fp1, unit: "°F")
145
- node.property("fp2", "FP2 Sensor", :float, @abc.fp2, unit: "°F")
184
+ node.property("fp1",
185
+ "FP1 Sensor",
186
+ :float,
187
+ @abc.fp1,
188
+ unit: "°F",
189
+ hass: { sensor: { device_class: :temperature,
190
+ state_class: :measurement,
191
+ entity_category: :diagnostic } })
192
+ node.property("fp2",
193
+ "FP2 Sensor",
194
+ :float,
195
+ @abc.fp2,
196
+ unit: "°F",
197
+ hass: { sensor: { device_class: :temperature,
198
+ state_class: :measurement,
199
+ entity_category: :diagnostic } })
146
200
  %i[aux_heat total].each do |component|
147
201
  component = "#{component}_watts"
148
202
  node.property(component.tr("_", "-"),
149
203
  component.sub("_watts", " Power Usage").tr("_", " ").titleize,
150
204
  :integer,
151
205
  @abc.public_send(component),
152
- unit: "W")
206
+ unit: "W",
207
+ hass: { sensor: { device_class: :power,
208
+ state_class: :measurement } })
153
209
  end
154
210
  end
155
211
 
156
212
  @compressor = @homie.node("compressor", "Compressor", @abc.compressor.type) do |node|
157
- node.property("speed", "Current Speed", :integer, @abc.compressor.speed,
158
- format: @abc.compressor.speed_range)
159
- node.property("watts", "Power Usage", :integer, @abc.compressor.watts, unit: "W") if @abc.energy_monitoring?
213
+ node.property("speed",
214
+ "Current Speed",
215
+ :integer,
216
+ @abc.compressor.speed,
217
+ format: @abc.compressor.speed_range,
218
+ hass: { sensor: { state_class: :measurement } })
219
+ if @abc.energy_monitoring?
220
+ node.property("watts",
221
+ "Power Usage",
222
+ :integer,
223
+ @abc.compressor.watts,
224
+ unit: "W",
225
+ hass: { sensor: { device_class: :power,
226
+ state_class: :measurement } })
227
+ end
160
228
 
161
229
  next unless @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
162
230
 
163
- node.property("ambient-temperature", "Ambient Temperature", :float,
164
- @abc.compressor.ambient_temperature, unit: "°F")
231
+ node.property("ambient-temperature",
232
+ "Ambient Temperature",
233
+ :float,
234
+ @abc.compressor.ambient_temperature,
235
+ unit: "°F",
236
+ hass: { sensor: { device_class: :temperature,
237
+ state_class: :measurement,
238
+ entity_category: :diagnostic } })
165
239
 
166
240
  next unless @abc.iz2?
167
241
 
168
- node.property("iz2-desired-speed", "IZ2 Desired Speed", :integer, @abc.compressor.iz2_desired_speed,
169
- format: 0..12)
242
+ node.property("iz2-desired-speed",
243
+ "IZ2 Desired Speed",
244
+ :integer,
245
+ @abc.compressor.iz2_desired_speed,
246
+ format: 0..12,
247
+ hass: { sensor: { state_class: :measurement,
248
+ entity_category: :diagnostic } })
170
249
  end
171
250
 
172
251
  @blower = @homie.node("blower", "Blower", @abc.blower.type) do |node|
173
- node.property("running", "Running", :boolean, @abc.blower.running?)
252
+ node.property("running",
253
+ "Running",
254
+ :boolean,
255
+ @abc.blower.running?,
256
+ hass: { binary_sensor: { device_class: :running } })
174
257
  if @abc.blower.respond_to?(:speed)
175
- node.property("speed", "Current Speed", :integer, @abc.blower.speed, format: @abc.blower.speed_range)
258
+ node.property("speed",
259
+ "Current Speed",
260
+ :integer,
261
+ @abc.blower.speed,
262
+ format: @abc.blower.speed_range,
263
+ hass: { sensor: { state_class: :measurement } })
264
+ end
265
+ if @abc.energy_monitoring?
266
+ node.property("watts",
267
+ "Power Usage",
268
+ :integer,
269
+ @abc.blower.watts,
270
+ unit: "W",
271
+ hass: { sensor: { device_class: :power,
272
+ state_class: :measurement } })
176
273
  end
177
- node.property("watts", "Power Usage", :integer, @abc.blower.watts, unit: "W") if @abc.energy_monitoring?
178
274
 
179
275
  next unless @abc.blower.is_a?(Aurora::Blower::ECM)
180
276
 
@@ -182,95 +278,209 @@ class MQTTBridge
182
278
  presets.concat %w[low-compressor high-compressor] unless @abc.iz2?
183
279
  presets.each do |setting|
184
280
  field = "#{setting.tr("-", "_")}_speed"
185
- node.property("#{setting}-speed", "#{setting.tr("-", " ").titleize} Preset Speed", :integer,
186
- @abc.blower.public_send(field), format: 1..12) do |value, property|
281
+ node.property("#{setting}-speed",
282
+ "#{setting.tr("-", " ").titleize} Preset Speed",
283
+ :integer,
284
+ @abc.blower.public_send(field),
285
+ format: 1..12,
286
+ hass: { number: { entity_category: :config } }) do |value, property|
187
287
  @mutex.synchronize { property.value = @abc.blower.public_send("#{field}=", value) }
188
288
  end
189
289
  end
190
290
 
191
291
  next unless @abc.iz2?
192
292
 
193
- node.property("iz2-desired-speed", "IZ2 Desired Speed", :integer, @abc.blower.iz2_desired_speed,
194
- format: 0..100, unit: "%")
293
+ node.property("iz2-desired-speed",
294
+ "IZ2 Desired Speed",
295
+ :integer,
296
+ @abc.blower.iz2_desired_speed,
297
+ format: 0..100,
298
+ unit: "%",
299
+ hass: { sensor: { state_class: :measurement,
300
+ entity_category: :diagnostic } })
195
301
  end
196
302
 
197
303
  @pump = @homie.node("pump", "Loop Pump", @abc.pump.type) do |node|
198
- node.property("waterflow", "Waterflow", :float, @abc.pump.waterflow, unit: "gpm")
199
- node.property("watts", "Power Usage", :integer, @abc.pump.watts, unit: "W") if @abc.energy_monitoring?
304
+ node.property("waterflow",
305
+ "Waterflow",
306
+ :float,
307
+ @abc.pump.waterflow,
308
+ unit: "gpm",
309
+ hass: { sensor: { state_class: :measurement,
310
+ entity_category: :diagnostic } })
311
+ if @abc.energy_monitoring?
312
+ node.property("watts",
313
+ "Power Usage",
314
+ :integer,
315
+ @abc.pump.watts,
316
+ unit: "W",
317
+ hass: { sensor: { device_class: :power,
318
+ state_class: :measurement } })
319
+ end
200
320
 
201
321
  next unless @abc.pump.is_a?(Aurora::Pump::VSPump)
202
322
 
203
- node.property("running", "Running", :boolean, @abc.pump.running)
204
- node.property("speed", "Speed", :integer, @abc.pump.speed, format: 0..100, unit: "%") do |value, property|
323
+ node.property("running",
324
+ "Running",
325
+ :boolean,
326
+ @abc.pump.running,
327
+ hass: { binary_sensor: { device_class: :running } })
328
+ node.property("speed",
329
+ "Speed",
330
+ :integer,
331
+ @abc.pump.speed,
332
+ format: 0..100,
333
+ unit: "%",
334
+ hass: { number: { entity_category: :diagnostic } }) do |value, property|
205
335
  @mutex.synchronize { property.value = @abc.pump.speed = value }
206
336
  end
207
- node.property("manual-control", "Manual Control", :boolean,
208
- @abc.pump.manual_control?) do |value, property|
337
+ node.property("manual-control",
338
+ "Manual Control",
339
+ :boolean,
340
+ @abc.pump.manual_control?,
341
+ hass: { switch: { entity_category: :diagnostic } }) do |value, property|
209
342
  @mutex.synchronize { property.value = @abc.pump.manual_control = value }
210
343
  end
211
- node.property("minimum-speed", "Actual Minimum Speed", :integer, @abc.pump.minimum_speed,
212
- format: 0..100, unit: "%") do |value, property|
344
+ node.property("minimum-speed",
345
+ "Actual Minimum Speed",
346
+ :integer,
347
+ @abc.pump.minimum_speed,
348
+ format: 0..100,
349
+ unit: "%",
350
+ hass: { number: { entity_category: :config } }) do |value, property|
213
351
  @mutex.synchronize { property.value = @abc.pump.minimum_speed = value }
214
352
  end
215
- node.property("maximum-speed", "Actual Maximum Speed", :integer, @abc.pump.minimum_speed,
216
- format: 0..100, unit: "%") do |value, property|
353
+ node.property("maximum-speed",
354
+ "Actual Maximum Speed",
355
+ :integer,
356
+ @abc.pump.minimum_speed,
357
+ format: 0..100,
358
+ unit: "%",
359
+ hass: { number: { entity_category: :config } }) do |value, property|
217
360
  @mutex.synchronize { property.value = @abc.pump.maximum_speed = value }
218
361
  end
219
362
  end
220
363
 
221
364
  if @abc.dhw
222
365
  @dhw = @homie.node("dhw", "Domestic Hot Water Generator", "DHW") do |node|
223
- node.property("enabled", "Enabled", :boolean, @abc.dhw.enabled) do |value, property|
366
+ node.property("enabled",
367
+ "Enabled",
368
+ :boolean,
369
+ @abc.dhw.enabled,
370
+ hass: { switch: { icon: "mdi:water-boiler" } }) do |value, property|
224
371
  @mutex.synchronize { property.value = @abc.dhw.enabled = value }
225
372
  end
226
- node.property("running", "Pump Running", :boolean, @abc.dhw.running?)
227
- node.property("water-temperature", "Water Temperature", :float,
228
- @abc.dhw.water_temperature, unit: "°F")
229
- node.property("set-point", "Set Point", :float, @abc.dhw.set_point, format: 100..140,
230
- unit: "°F") do |value, property|
373
+ node.property("running",
374
+ "Pump Running",
375
+ :boolean,
376
+ @abc.dhw.running?,
377
+ hass: { binary_sensor: { device_class: :running } })
378
+ node.property("water-temperature",
379
+ "Water Temperature",
380
+ :float,
381
+ @abc.dhw.water_temperature,
382
+ unit: "°F",
383
+ hass: { sensor: { device_class: :temperature,
384
+ state_class: :measurement } })
385
+ node.property("set-point",
386
+ "Set Point",
387
+ :float,
388
+ @abc.dhw.set_point,
389
+ format: 100..140,
390
+ unit: "°F",
391
+ hass: :number) do |value, property|
231
392
  @mutex.synchronize { property.value = @abc.dhw.set_point = value }
232
393
  end
233
394
  end
234
395
  end
235
396
 
236
397
  @humidistat = @homie.node("humidistat", "Humidistat", "Humidistat") do |node|
237
- node.property("relative-humidity", "Relative Humidity", :integer, @abc.humidistat.relative_humidity,
238
- unit: "%", format: 0..100)
398
+ node.property("relative-humidity",
399
+ "Relative Humidity",
400
+ :integer,
401
+ @abc.humidistat.relative_humidity,
402
+ unit: "%",
403
+ format: 0..100,
404
+ hass: { sensor: { device_class: :humidity,
405
+ state_class: :measurement } })
239
406
  if @abc.humidistat.humidifier?
240
- node.property("humidifier-running", "Humidifier Running", :boolean, @abc.humidistat.humidifier_running?)
241
- node.property("humidifier-mode", "Humidifier Mode", :enum, @abc.humidistat.humidifier_mode,
407
+ node.property("humidifier-running",
408
+ "Humidifier Running",
409
+ :boolean,
410
+ @abc.humidistat.humidifier_running?)
411
+ node.property("humidifier-mode",
412
+ "Humidifier Mode",
413
+ :enum,
414
+ @abc.humidistat.humidifier_mode,
242
415
  format: %i[auto manual]) do |value, property|
243
416
  @mutex.synchronize { property.value = @abc.humidistat.humidifier_mode = value.to_sym }
244
417
  end
245
- node.property("humidification-target", "Humidification Target Relative Humidity", :integer,
246
- @abc.humidistat.humidification_target, unit: "%", format: 15..50) do |value, property|
418
+ node.property("humidification-target",
419
+ "Humidification Target Relative Humidity",
420
+ :integer,
421
+ @abc.humidistat.humidification_target,
422
+ unit: "%",
423
+ format: 15..50) do |value, property|
247
424
  @mutex.synchronize { property.value = @abc.humidistat.humidification_target = value }
248
425
  end
426
+ node.hass_humidifier("humidifier-running",
427
+ target_property: "humidification-target",
428
+ mode_property: "humidifier-mode",
429
+ id: "humidifier",
430
+ name: "Humidifier",
431
+ device_class: :humidifier)
249
432
  end
250
433
 
251
434
  # VSDrive can perform active dehumidification, even without a dedicated dehumidifier
252
- if @abc.humidistat.dehumidifier? || @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
253
- node.property("dehumidifier-running", "Dehumidifier Running", :boolean, @abc.humidistat.dehumidifier_running?)
254
- node.property("dehumidifier-mode", "Dehumidifier Mode", :enum, @abc.humidistat.dehumidifier_mode,
435
+ if @abc.humidistat.dehumidifier? ||
436
+ @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
437
+ node.property("dehumidifier-running",
438
+ "Dehumidifier Running",
439
+ :boolean,
440
+ @abc.humidistat.dehumidifier_running?)
441
+ node.property("dehumidifier-mode",
442
+ "Dehumidifier Mode",
443
+ :enum,
444
+ @abc.humidistat.dehumidifier_mode,
255
445
  format: %i[auto manual]) do |value, property|
256
446
  @mutex.synchronize { property.value = @abc.humidistat.dehumidifier_mode = value.to_sym }
257
447
  end
258
- node.property("dehumidification-target", "Dehumidification Target Relative Humidity", :integer,
259
- @abc.humidistat.dehumidification_target, unit: "%", format: 35..65) do |value, property|
448
+ node.property("dehumidification-target",
449
+ "Dehumidification Target Relative Humidity",
450
+ :integer,
451
+ @abc.humidistat.dehumidification_target,
452
+ unit: "%",
453
+ format: 35..65) do |value, property|
260
454
  @mutex.synchronize { property.value = @abc.humidistat.dehumidification_target = value }
261
455
  end
456
+ node.hass_humidifier("dehumidifier-running",
457
+ target_property: "dehumidification-target",
458
+ mode_property: "dehumidifier-mode",
459
+ id: "dehumidifier",
460
+ name: "Dehumidifier",
461
+ device_class: :dehumidifier)
262
462
  end
263
463
  end
264
464
 
265
465
  @faults = @homie.node("faults", "Fault History", "ABC") do |node|
266
- node.property("clear-history", "Reset Fault Counts", :enum, retained: false, format: "clear") do |_|
466
+ node.property("clear-history",
467
+ "Reset Fault Counts",
468
+ :enum,
469
+ retained: false,
470
+ format: "clear",
471
+ hass: :scene) do |_|
267
472
  @mutex.synchronize { @abc.clear_fault_history }
268
473
  end
269
474
  @abc.faults.each_with_index do |count, i|
270
475
  next if count == 0xffff
271
476
 
272
477
  name = Aurora::FAULTS[i + 1]
273
- node.property("e#{i + 1}", name || "E#{i + 1}", :integer, count)
478
+ node.property("e#{i + 1}",
479
+ name || "E#{i + 1}",
480
+ :integer,
481
+ count,
482
+ hass: { sensor: { state_class: :total_increasing,
483
+ entity_category: :diagnostic } })
274
484
  end
275
485
  end
276
486
 
@@ -279,39 +489,109 @@ class MQTTBridge
279
489
  @homie.node("zone#{i + 1}", "Zone #{i + 1}", type) do |node|
280
490
  allowed_modes = %w[off auto cool heat]
281
491
  allowed_modes << "eheat" if i.zero?
282
- node.property("target-mode", "Target Heating/Cooling Mode", :enum, zone.target_mode,
492
+ node.property("target-mode",
493
+ "Target Heating/Cooling Mode",
494
+ :enum,
495
+ zone.target_mode,
283
496
  format: allowed_modes) do |value, property|
284
497
  @mutex.synchronize { property.value = zone.target_mode = value.to_sym }
285
498
  end
286
- node.property("current-mode", "Current Heating/Cooling Mode Requested", :enum, zone.current_mode,
499
+ node.property("current-mode",
500
+ "Current Heating/Cooling Mode Requested",
501
+ :enum,
502
+ zone.current_mode,
287
503
  format: %w[standby h1 h2 h3 c1 c2])
288
- node.property("target-fan-mode", "Target Fan Mode", :enum, zone.target_fan_mode,
504
+ node.property("target-fan-mode",
505
+ "Target Fan Mode",
506
+ :enum,
507
+ zone.target_fan_mode,
289
508
  format: %w[auto continuous intermittent]) do |value, property|
290
509
  @mutex.synchronize { property.value = zone.target_fan_mode = value.to_sym }
291
510
  end
292
- node.property("fan-intermittent-on", "Fan Intermittent Mode On Duration", :enum, zone.fan_intermittent_on,
293
- unit: "M", format: %w[0 5 10 15 20]) do |value, property|
511
+ node.property("fan-intermittent-on",
512
+ "Fan Intermittent Mode On Duration",
513
+ :enum,
514
+ zone.fan_intermittent_on,
515
+ unit: "M",
516
+ format: %w[0 5 10 15 20],
517
+ hass: { select: { entity_category: :config } }) do |value, property|
294
518
  @mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
295
519
  end
296
- node.property("fan-intermittent-off", "Fan Intermittent Mode Off Duration", :enum, zone.fan_intermittent_on,
297
- unit: "M", format: %w[0 5 10 15 20 25 30 35 40]) do |value, property|
520
+ node.property("fan-intermittent-off",
521
+ "Fan Intermittent Mode Off Duration",
522
+ :enum,
523
+ zone.fan_intermittent_on,
524
+ unit: "M",
525
+ format: %w[0 5 10 15 20 25 30 35 40],
526
+ hass: { select: { entity_category: :config } }) do |value, property|
298
527
  @mutex.synchronize { property.value = zone.fan_intermittent_on = value.to_i }
299
528
  end
300
- node.property("current-fan-mode", "Current Fan Status", :boolean, zone.current_fan_mode)
529
+ node.property("current-fan-mode",
530
+ "Current Fan Status",
531
+ :boolean,
532
+ zone.current_fan_mode,
533
+ hass: { binary_sensor: { device_class: :running } })
301
534
  if zone.is_a?(Aurora::IZ2Zone)
302
- node.property("priority", "Zone Priority", :enum, zone.priority, format: %w[economy comfort])
303
- node.property("size", "Size", :enum, zone.size, format: %w[0 25 45 70])
304
- node.property("normalized-size", "Normalized Size", :integer, zone.normalized_size, unit: "%", format: 0..100)
535
+ node.property("priority",
536
+ "Zone Priority",
537
+ :enum,
538
+ zone.priority,
539
+ format: %w[economy comfort],
540
+ hass: { sensor: { state_class: :measurement,
541
+ entity_category: :diagnostic } })
542
+ node.property("size",
543
+ "Size",
544
+ :enum,
545
+ zone.size,
546
+ format: %w[0 25 45 70],
547
+ hass: { sensor: { state_class: :measurement,
548
+ entity_category: :diagnostic } })
549
+ node.property("normalized-size",
550
+ "Normalized Size",
551
+ :integer,
552
+ zone.normalized_size,
553
+ unit: "%",
554
+ format: 0..100,
555
+ hass: { sensor: { state_class: :measurement,
556
+ entity_category: :diagnostic } })
305
557
  end
306
- node.property("ambient-temperature", "Ambient Temperature", :float, zone.ambient_temperature, unit: "°F")
307
- node.property("heating-target-temperature", "Heating Target Temperature", :integer,
308
- zone.heating_target_temperature, unit: "°F", format: 40..90) do |value, property|
558
+ node.property("ambient-temperature",
559
+ "Ambient Temperature",
560
+ :float,
561
+ zone.ambient_temperature,
562
+ unit: "°F")
563
+ node.property("heating-target-temperature",
564
+ "Heating Target Temperature",
565
+ :integer,
566
+ zone.heating_target_temperature,
567
+ unit: "°F",
568
+ format: 40..90) do |value, property|
309
569
  @mutex.synchronize { property.value = zone.heating_target_temperature = value }
310
570
  end
311
- node.property("cooling-target-temperature", "Cooling Target Temperature", :integer,
312
- zone.cooling_target_temperature, unit: "°F", format: 54..99) do |value, property|
571
+ node.property("cooling-target-temperature",
572
+ "Cooling Target Temperature", :integer,
573
+ zone.cooling_target_temperature,
574
+ unit: "°F",
575
+ format: 54..99) do |value, property|
313
576
  @mutex.synchronize { property.value = zone.cooling_target_temperature = value }
314
577
  end
578
+ node.hass_climate(action_property: "current-mode",
579
+ current_temperature_property: "ambient-temperature",
580
+ fan_mode_property: "target-fan-mode",
581
+ mode_property: "target-mode",
582
+ temperature_high_property: "cooling-target-temperature",
583
+ temperature_low_property: "heating-target-temperature",
584
+ templates: {
585
+ action_template: <<~JINJA
586
+ {% if value.startswith('h') %}
587
+ heating
588
+ {% elif value.startswith('c') %}
589
+ cooling
590
+ {% elif value == 'standby' %}
591
+ idle
592
+ {% endif %}
593
+ JINJA
594
+ })
315
595
  end
316
596
  end
317
597
 
@@ -319,169 +599,7 @@ class MQTTBridge
319
599
  @homie.mqtt.subscribe("#{@homie.topic}/$modbus")
320
600
  @homie.mqtt.subscribe("#{@homie.topic}/$modbus/getregs")
321
601
  @homie.mqtt.subscribe("#{@homie.topic}/$modbus/+/set")
322
- @homie.publish do
323
- # do HASS publishes in this block so they're done in bulk
324
-
325
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["current-mode"],
326
- device_class: :power)
327
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["entering-air-temperature"],
328
- device_class: :temperature,
329
- entity_category: :diagnostic)
330
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["entering-water-temperature"],
331
- device_class: :temperature,
332
- entity_category: :diagnostic)
333
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["leaving-air-temperature"],
334
- device_class: :temperature,
335
- entity_category: :diagnostic)
336
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["leaving-water-temperature"],
337
- device_class: :temperature,
338
- entity_category: :diagnostic)
339
- unless @abc.outdoor_temperature.zero?
340
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["outdoor-temperature"],
341
- device_class: :temperature)
342
- end
343
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["fp1"],
344
- device_class: :temperature,
345
- entity_category: :diagnostic)
346
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["fp2"],
347
- device_class: :temperature,
348
- entity_category: :diagnostic)
349
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["aux-heat-watts"],
350
- device_class: :power)
351
- MQTT::HomeAssistant.publish_sensor(@homie["abc"]["total-watts"],
352
- device_class: :power)
353
-
354
- MQTT::HomeAssistant.publish_sensor(@homie["compressor"]["speed"])
355
- MQTT::HomeAssistant.publish_sensor(@homie["compressor"]["watts"],
356
- device_class: :power)
357
-
358
- if @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
359
- MQTT::HomeAssistant.publish_sensor(@homie["compressor"]["ambient-temperature"],
360
- device_class: :temperature,
361
- entity_category: :diagnostic)
362
-
363
- if @abc.iz2?
364
- MQTT::HomeAssistant.publish_sensor(@homie["compressor"]["iz2-desired-speed"],
365
- entity_category: :diagnostic)
366
- end
367
- end
368
-
369
- MQTT::HomeAssistant.publish_binary_sensor(@homie["blower"]["running"],
370
- device_class: :running)
371
- MQTT::HomeAssistant.publish_sensor(@homie["blower"]["speed"]) if @abc.blower.respond_to?(:speed)
372
- MQTT::HomeAssistant.publish_sensor(@homie["blower"]["watts"],
373
- device_class: :power)
374
- MQTT::HomeAssistant.publish_number(@homie["blower"]["blower-only-speed"],
375
- entity_category: :config)
376
- MQTT::HomeAssistant.publish_number(@homie["blower"]["aux-heat-speed"],
377
- entity_category: :config)
378
- if @abc.iz2?
379
- MQTT::HomeAssistant.publish_sensor(@homie["blower"]["iz2-desired-speed"])
380
- else
381
- MQTT::HomeAssistant.publish_number(@homie["blower"]["low-compressor-speed"],
382
- entity_category: :config)
383
- MQTT::HomeAssistant.publish_number(@homie["blower"]["high-compressor-speed"],
384
- entity_category: :config)
385
- end
386
-
387
- MQTT::HomeAssistant.publish_sensor(@homie["pump"]["waterflow"],
388
- entity_category: :diagnostic)
389
- MQTT::HomeAssistant.publish_sensor(@homie["pump"]["watts"],
390
- device_class: :power)
391
-
392
- if @abc.pump.is_a?(Aurora::Pump::VSPump)
393
- MQTT::HomeAssistant.publish_binary_sensor(@homie["pump"]["running"],
394
- device_class: :running)
395
- MQTT::HomeAssistant.publish_number(@homie["pump"]["speed"],
396
- entity_category: :diagnostic)
397
-
398
- MQTT::HomeAssistant.publish_switch(@homie["pump"]["manual-control"],
399
- entity_category: :diagnostic)
400
- MQTT::HomeAssistant.publish_number(@homie["pump"]["minimum-speed"],
401
- entity_category: :config)
402
- MQTT::HomeAssistant.publish_number(@homie["pump"]["maximum-speed"],
403
- entity_category: :config)
404
- end
405
-
406
- MQTT::HomeAssistant.publish_scene(@homie["faults"]["clear-history"])
407
- @homie["faults"].each do |property|
408
- next if property.id == "clear-history"
409
-
410
- MQTT::HomeAssistant.publish_sensor(property,
411
- entity_category: :diagnostic)
412
- end
413
-
414
- if @abc.dhw
415
- MQTT::HomeAssistant.publish_switch(@homie["dhw"]["enabled"],
416
- icon: "mdi:water-boiler")
417
- MQTT::HomeAssistant.publish_binary_sensor(@homie["dhw"]["running"],
418
- device_class: :running)
419
- MQTT::HomeAssistant.publish_sensor(@homie["dhw"]["water-temperature"],
420
- device_class: :temperature)
421
- MQTT::HomeAssistant.publish_number(@homie["dhw"]["set-point"])
422
- end
423
-
424
- MQTT::HomeAssistant.publish_sensor(@homie["humidistat"]["relative-humidity"],
425
- device_class: :humidity)
426
- if @abc.humidistat.humidifier?
427
- MQTT::HomeAssistant.publish_humidifier(
428
- @homie["humidistat"]["humidifier-running"],
429
- device_class: :humidifier,
430
- name: "Humidifier",
431
- id: "humidifier",
432
- target_property: @homie["humidistat"]["humidification-target"],
433
- mode_property: @homie["humidistat"]["humidifier-mode"]
434
- )
435
- end
436
- if @abc.humidistat.dehumidifier? || @abc.compressor.is_a?(Aurora::Compressor::VSDrive)
437
- MQTT::HomeAssistant.publish_humidifier(
438
- @homie["humidistat"]["dehumidifier-running"],
439
- device_class: :dehumidifier,
440
- name: "Dehumidifier",
441
- id: "dehumidifier",
442
- target_property: @homie["humidistat"]["dehumidification-target"],
443
- mode_property: @homie["humidistat"]["dehumidifier-mode"]
444
- )
445
- end
446
-
447
- @abc.zones.each_with_index do |zone, i|
448
- homie_zone = @homie["zone#{i + 1}"]
449
- MQTT::HomeAssistant.publish_climate(
450
- action_property: homie_zone["current-mode"],
451
- current_temperature_property: homie_zone["ambient-temperature"],
452
- fan_mode_property: homie_zone["target-fan-mode"],
453
- mode_property: homie_zone["target-mode"],
454
- temperature_high_property: homie_zone["cooling-target-temperature"],
455
- temperature_low_property: homie_zone["heating-target-temperature"],
456
- templates: {
457
- action_template: <<~JINJA
458
- {% if value.startswith('h') %}
459
- heating
460
- {% elif value.startswith('c') %}
461
- cooling
462
- {% elif value == 'standby' %}
463
- idle
464
- {% endif %}
465
- JINJA
466
- }
467
- )
468
- MQTT::HomeAssistant.publish_binary_sensor(homie_zone["current-fan-mode"],
469
- device_class: :running)
470
- MQTT::HomeAssistant.publish_select(homie_zone["fan-intermittent-on"],
471
- entity_category: :config)
472
- MQTT::HomeAssistant.publish_select(homie_zone["fan-intermittent-off"],
473
- entity_category: :config)
474
-
475
- next unless zone.is_a?(Aurora::IZ2Zone)
476
-
477
- MQTT::HomeAssistant.publish_sensor(homie_zone["priority"],
478
- entity_category: :diagnostic)
479
- MQTT::HomeAssistant.publish_sensor(homie_zone["size"],
480
- entity_category: :diagnostic)
481
- MQTT::HomeAssistant.publish_sensor(homie_zone["normalized-size"],
482
- entity_category: :diagnostic)
483
- end
484
- end
602
+ @homie.publish
485
603
  end
486
604
  end
487
605
 
@@ -43,6 +43,7 @@ module Aurora
43
43
  end
44
44
 
45
45
  attr_reader :modbus_slave,
46
+ :model,
46
47
  :serial_number,
47
48
  :zones,
48
49
  :compressor,
@@ -66,9 +67,10 @@ module Aurora
66
67
  @modbus_slave = self.class.open_modbus_slave(uri)
67
68
  @modbus_slave.read_retry_timeout = 15
68
69
  @modbus_slave.read_retries = 2
69
- raw_registers = @modbus_slave.holding_registers[33, 88..91, 105...110, 404, 412..413, 1103, 1114]
70
+ raw_registers = @modbus_slave.holding_registers[33, 88...110, 404, 412..413, 1103, 1114]
70
71
  registers = Aurora.transform_registers(raw_registers.dup)
71
72
  @program = registers[88]
73
+ @model = registers[92]
72
74
  @serial_number = registers[105]
73
75
  @energy_monitor = raw_registers[412]
74
76
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aurora
4
- VERSION = "0.7.1"
4
+ VERSION = "0.7.5"
5
5
  end
data/lib/aurora.rb CHANGED
@@ -7,6 +7,7 @@ require "aurora/mock_abc"
7
7
  require "aurora/modbus/server"
8
8
  require "aurora/modbus/slave"
9
9
  require "aurora/registers"
10
+ require "aurora/version"
10
11
 
11
12
  # extend ModBus for WaterFurnace's custom functions
12
13
  ModBus::RTUServer.include(Aurora::ModBus::Server)
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.7.1
4
+ version: 0.7.5
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-12-09 00:00:00.000000000 Z
11
+ date: 2021-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ccutrer-serialport
@@ -16,34 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mqtt-homeassistant
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.1'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.0.2
36
+ version: 0.1.3
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '0'
43
+ version: '0.1'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.0.2
46
+ version: 0.1.3
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: net-telnet-rfc2217
49
49
  requirement: !ruby/object:Gem::Requirement