1
1
"""Support for Z-Wave climate devices."""
2
2
# Because we do not compile openzwave on CI
3
3
import logging
4
- from typing import Optional
4
+ from typing import Optional , Tuple
5
5
6
6
from homeassistant .components .climate import ClimateDevice
7
7
from homeassistant .components .climate .const import (
34
34
from homeassistant .core import callback
35
35
from homeassistant .helpers .dispatcher import async_dispatcher_connect
36
36
37
- from . import ZWaveDeviceEntity
37
+ from . import ZWaveDeviceEntity , const
38
38
39
39
_LOGGER = logging .getLogger (__name__ )
40
40
@@ -147,10 +147,14 @@ def async_add_climate(climate):
147
147
def get_device (hass , values , ** kwargs ):
148
148
"""Create Z-Wave entity device."""
149
149
temp_unit = hass .config .units .temperature_unit
150
- return ZWaveClimate (values , temp_unit )
150
+ if values .primary .command_class == const .COMMAND_CLASS_THERMOSTAT_SETPOINT :
151
+ return ZWaveClimateSingleSetpoint (values , temp_unit )
152
+ if values .primary .command_class == const .COMMAND_CLASS_THERMOSTAT_MODE :
153
+ return ZWaveClimateMultipleSetpoint (values , temp_unit )
154
+ return None
151
155
152
156
153
- class ZWaveClimate (ZWaveDeviceEntity , ClimateDevice ):
157
+ class ZWaveClimateBase (ZWaveDeviceEntity , ClimateDevice ):
154
158
"""Representation of a Z-Wave Climate device."""
155
159
156
160
def __init__ (self , values , temp_unit ):
@@ -188,18 +192,21 @@ def __init__(self, values, temp_unit):
188
192
self ._zxt_120 = 1
189
193
self .update_properties ()
190
194
191
- def _current_mode_setpoints (self ):
192
- current_mode = str (self .values .primary .data ).lower ()
193
- setpoints_names = MODE_SETPOINT_MAPPINGS .get (current_mode , ())
194
- return tuple (getattr (self .values , name , None ) for name in setpoints_names )
195
+ def _mode (self ) -> None :
196
+ """Return thermostat mode Z-Wave value."""
197
+ raise NotImplementedError ()
198
+
199
+ def _current_mode_setpoints (self ) -> Tuple :
200
+ """Return a tuple of current setpoint Z-Wave value(s)."""
201
+ raise NotImplementedError ()
195
202
196
203
@property
197
204
def supported_features (self ):
198
205
"""Return the list of supported features."""
199
206
support = SUPPORT_TARGET_TEMPERATURE
200
- if HVAC_MODE_HEAT_COOL in self ._hvac_list :
207
+ if self . _hvac_list and HVAC_MODE_HEAT_COOL in self ._hvac_list :
201
208
support |= SUPPORT_TARGET_TEMPERATURE_RANGE
202
- if PRESET_AWAY in self ._preset_list :
209
+ if self . _preset_list and PRESET_AWAY in self ._preset_list :
203
210
support |= SUPPORT_TARGET_TEMPERATURE_RANGE
204
211
205
212
if self .values .fan_mode :
@@ -237,13 +244,13 @@ def update_properties(self):
237
244
238
245
def _update_operation_mode (self ):
239
246
"""Update hvac and preset modes."""
240
- if self .values . primary :
247
+ if self ._mode () :
241
248
self ._hvac_list = []
242
249
self ._hvac_mapping = {}
243
250
self ._preset_list = []
244
251
self ._preset_mapping = {}
245
252
246
- mode_list = self .values . primary .data_items
253
+ mode_list = self ._mode () .data_items
247
254
if mode_list :
248
255
for mode in mode_list :
249
256
ha_mode = HVAC_STATE_MAPPINGS .get (str (mode ).lower ())
@@ -271,7 +278,7 @@ def _update_operation_mode(self):
271
278
# Presets are supported
272
279
self ._preset_list .append (PRESET_NONE )
273
280
274
- current_mode = self .values . primary .data
281
+ current_mode = self ._mode () .data
275
282
_LOGGER .debug ("current_mode=%s" , current_mode )
276
283
_hvac_temp = next (
277
284
(
@@ -424,7 +431,7 @@ def hvac_mode(self):
424
431
425
432
Need to be one of HVAC_MODE_*.
426
433
"""
427
- if self .values . primary :
434
+ if self ._mode () :
428
435
return self ._hvac_mode
429
436
return self ._default_hvac_mode
430
437
@@ -434,7 +441,7 @@ def hvac_modes(self):
434
441
435
442
Need to be a subset of HVAC_MODES.
436
443
"""
437
- if self .values . primary :
444
+ if self ._mode () :
438
445
return self ._hvac_list
439
446
return []
440
447
@@ -451,7 +458,7 @@ def is_aux_heat(self):
451
458
"""Return true if aux heater."""
452
459
if not self ._aux_heat :
453
460
return None
454
- if self .values . primary .data == AUX_HEAT_ZWAVE_MODE :
461
+ if self ._mode () .data == AUX_HEAT_ZWAVE_MODE :
455
462
return True
456
463
return False
457
464
@@ -461,7 +468,7 @@ def preset_mode(self):
461
468
462
469
Need to be one of PRESET_*.
463
470
"""
464
- if self .values . primary :
471
+ if self ._mode () :
465
472
return self ._preset_mode
466
473
return PRESET_NONE
467
474
@@ -471,7 +478,7 @@ def preset_modes(self):
471
478
472
479
Need to be a subset of PRESET_MODES.
473
480
"""
474
- if self .values . primary :
481
+ if self ._mode () :
475
482
return self ._preset_list
476
483
return []
477
484
@@ -520,19 +527,19 @@ def set_fan_mode(self, fan_mode):
520
527
def set_hvac_mode (self , hvac_mode ):
521
528
"""Set new target hvac mode."""
522
529
_LOGGER .debug ("Set hvac_mode to %s" , hvac_mode )
523
- if not self .values . primary :
530
+ if not self ._mode () :
524
531
return
525
532
operation_mode = self ._hvac_mapping .get (hvac_mode )
526
533
_LOGGER .debug ("Set operation_mode to %s" , operation_mode )
527
- self .values . primary .data = operation_mode
534
+ self ._mode () .data = operation_mode
528
535
529
536
def turn_aux_heat_on (self ):
530
537
"""Turn auxillary heater on."""
531
538
if not self ._aux_heat :
532
539
return
533
540
operation_mode = AUX_HEAT_ZWAVE_MODE
534
541
_LOGGER .debug ("Aux heat on. Set operation mode to %s" , operation_mode )
535
- self .values . primary .data = operation_mode
542
+ self ._mode () .data = operation_mode
536
543
537
544
def turn_aux_heat_off (self ):
538
545
"""Turn auxillary heater off."""
@@ -543,23 +550,23 @@ def turn_aux_heat_off(self):
543
550
else :
544
551
operation_mode = self ._hvac_mapping .get (HVAC_MODE_OFF )
545
552
_LOGGER .debug ("Aux heat off. Set operation mode to %s" , operation_mode )
546
- self .values . primary .data = operation_mode
553
+ self ._mode () .data = operation_mode
547
554
548
555
def set_preset_mode (self , preset_mode ):
549
556
"""Set new target preset mode."""
550
557
_LOGGER .debug ("Set preset_mode to %s" , preset_mode )
551
- if not self .values . primary :
558
+ if not self ._mode () :
552
559
return
553
560
if preset_mode == PRESET_NONE :
554
561
# Activate the current hvac mode
555
562
self ._update_operation_mode ()
556
563
operation_mode = self ._hvac_mapping .get (self .hvac_mode )
557
564
_LOGGER .debug ("Set operation_mode to %s" , operation_mode )
558
- self .values . primary .data = operation_mode
565
+ self ._mode () .data = operation_mode
559
566
else :
560
567
operation_mode = self ._preset_mapping .get (preset_mode , preset_mode )
561
568
_LOGGER .debug ("Set operation_mode to %s" , operation_mode )
562
- self .values . primary .data = operation_mode
569
+ self ._mode () .data = operation_mode
563
570
564
571
def set_swing_mode (self , swing_mode ):
565
572
"""Set new target swing mode."""
@@ -575,3 +582,37 @@ def device_state_attributes(self):
575
582
if self ._fan_action :
576
583
data [ATTR_FAN_ACTION ] = self ._fan_action
577
584
return data
585
+
586
+
587
+ class ZWaveClimateSingleSetpoint (ZWaveClimateBase ):
588
+ """Representation of a single setpoint Z-Wave thermostat device."""
589
+
590
+ def __init__ (self , values , temp_unit ):
591
+ """Initialize the Z-Wave climate device."""
592
+ ZWaveClimateBase .__init__ (self , values , temp_unit )
593
+
594
+ def _mode (self ) -> None :
595
+ """Return thermostat mode Z-Wave value."""
596
+ return self .values .mode
597
+
598
+ def _current_mode_setpoints (self ) -> Tuple :
599
+ """Return a tuple of current setpoint Z-Wave value(s)."""
600
+ return (self .values .primary ,)
601
+
602
+
603
+ class ZWaveClimateMultipleSetpoint (ZWaveClimateBase ):
604
+ """Representation of a multiple setpoint Z-Wave thermostat device."""
605
+
606
+ def __init__ (self , values , temp_unit ):
607
+ """Initialize the Z-Wave climate device."""
608
+ ZWaveClimateBase .__init__ (self , values , temp_unit )
609
+
610
+ def _mode (self ) -> None :
611
+ """Return thermostat mode Z-Wave value."""
612
+ return self .values .primary
613
+
614
+ def _current_mode_setpoints (self ) -> Tuple :
615
+ """Return a tuple of current setpoint Z-Wave value(s)."""
616
+ current_mode = str (self .values .primary .data ).lower ()
617
+ setpoints_names = MODE_SETPOINT_MAPPINGS .get (current_mode , ())
618
+ return tuple (getattr (self .values , name , None ) for name in setpoints_names )
0 commit comments