mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 11:47:06 +00:00
Make zwave climate entities contain it's respective setpoints (#4357)
* Make zwave entities contain it's respective setpoints * Add fan state
This commit is contained in:
parent
d6cb102f63
commit
c6f5a5443f
@ -8,8 +8,7 @@ https://home-assistant.io/components/climate.zwave/
|
|||||||
# pylint: disable=import-error
|
# pylint: disable=import-error
|
||||||
import logging
|
import logging
|
||||||
from homeassistant.components.climate import DOMAIN
|
from homeassistant.components.climate import DOMAIN
|
||||||
from homeassistant.components.climate import (
|
from homeassistant.components.climate import ClimateDevice
|
||||||
ClimateDevice, ATTR_OPERATION_MODE)
|
|
||||||
from homeassistant.components.zwave import ZWaveDeviceEntity
|
from homeassistant.components.zwave import ZWaveDeviceEntity
|
||||||
from homeassistant.components import zwave
|
from homeassistant.components import zwave
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
@ -24,36 +23,11 @@ REMOTEC = 0x5254
|
|||||||
REMOTEC_ZXT_120 = 0x8377
|
REMOTEC_ZXT_120 = 0x8377
|
||||||
REMOTEC_ZXT_120_THERMOSTAT = (REMOTEC, REMOTEC_ZXT_120)
|
REMOTEC_ZXT_120_THERMOSTAT = (REMOTEC, REMOTEC_ZXT_120)
|
||||||
|
|
||||||
HORSTMANN = 0x0059
|
|
||||||
HORSTMANN_HRT4_ZW = 0x3
|
|
||||||
HORSTMANN_HRT4_ZW_THERMOSTAT = (HORSTMANN, HORSTMANN_HRT4_ZW)
|
|
||||||
|
|
||||||
WORKAROUND_ZXT_120 = 'zxt_120'
|
WORKAROUND_ZXT_120 = 'zxt_120'
|
||||||
WORKAROUND_HRT4_ZW = 'hrt4_zw'
|
|
||||||
|
|
||||||
DEVICE_MAPPINGS = {
|
DEVICE_MAPPINGS = {
|
||||||
REMOTEC_ZXT_120_THERMOSTAT: WORKAROUND_ZXT_120,
|
REMOTEC_ZXT_120_THERMOSTAT: WORKAROUND_ZXT_120
|
||||||
HORSTMANN_HRT4_ZW_THERMOSTAT: WORKAROUND_HRT4_ZW
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_TEMP_TO_INDEX = {
|
|
||||||
'Heat': 1,
|
|
||||||
'Comfort': 1,
|
|
||||||
'Cool': 2,
|
|
||||||
'Auto': 3,
|
|
||||||
'Aux Heat': 4,
|
|
||||||
'Resume': 5,
|
|
||||||
'Fan Only': 6,
|
|
||||||
'Furnace': 7,
|
|
||||||
'Dry Air': 8,
|
|
||||||
'Moist Air': 9,
|
|
||||||
'Auto Changeover': 10,
|
|
||||||
'Heat Econ': 11,
|
|
||||||
'Energy Saving': 11,
|
|
||||||
'Cool Econ': 12,
|
|
||||||
'Away': 13,
|
|
||||||
'Unknown': 14,
|
|
||||||
'Direct Valve Control': 31
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -80,6 +54,7 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
from openzwave.network import ZWaveNetwork
|
from openzwave.network import ZWaveNetwork
|
||||||
from pydispatch import dispatcher
|
from pydispatch import dispatcher
|
||||||
ZWaveDeviceEntity.__init__(self, value, DOMAIN)
|
ZWaveDeviceEntity.__init__(self, value, DOMAIN)
|
||||||
|
self._index = value.index
|
||||||
self._node = value.node
|
self._node = value.node
|
||||||
self._target_temperature = None
|
self._target_temperature = None
|
||||||
self._current_temperature = None
|
self._current_temperature = None
|
||||||
@ -88,13 +63,12 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
self._operating_state = None
|
self._operating_state = None
|
||||||
self._current_fan_mode = None
|
self._current_fan_mode = None
|
||||||
self._fan_list = None
|
self._fan_list = None
|
||||||
|
self._fan_state = None
|
||||||
self._current_swing_mode = None
|
self._current_swing_mode = None
|
||||||
self._swing_list = None
|
self._swing_list = None
|
||||||
self._unit = temp_unit
|
self._unit = temp_unit
|
||||||
self._index_operation = None
|
|
||||||
_LOGGER.debug("temp_unit is %s", self._unit)
|
_LOGGER.debug("temp_unit is %s", self._unit)
|
||||||
self._zxt_120 = None
|
self._zxt_120 = None
|
||||||
self._hrt4_zw = None
|
|
||||||
self.update_properties()
|
self.update_properties()
|
||||||
# register listener
|
# register listener
|
||||||
dispatcher.connect(
|
dispatcher.connect(
|
||||||
@ -109,10 +83,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
_LOGGER.debug("Remotec ZXT-120 Zwave Thermostat"
|
_LOGGER.debug("Remotec ZXT-120 Zwave Thermostat"
|
||||||
" workaround")
|
" workaround")
|
||||||
self._zxt_120 = 1
|
self._zxt_120 = 1
|
||||||
if DEVICE_MAPPINGS[specific_sensor_key] == WORKAROUND_HRT4_ZW:
|
|
||||||
_LOGGER.debug("Horstmann HRT4-ZW Zwave Thermostat"
|
|
||||||
" workaround")
|
|
||||||
self._hrt4_zw = 1
|
|
||||||
|
|
||||||
def value_changed(self, value):
|
def value_changed(self, value):
|
||||||
"""Called when a value has changed on the network."""
|
"""Called when a value has changed on the network."""
|
||||||
@ -128,8 +98,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
for value in self._node.get_values(
|
for value in self._node.get_values(
|
||||||
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values():
|
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_MODE).values():
|
||||||
self._current_operation = value.data
|
self._current_operation = value.data
|
||||||
self._index_operation = SET_TEMP_TO_INDEX.get(
|
|
||||||
self._current_operation)
|
|
||||||
self._operation_list = list(value.data_items)
|
self._operation_list = list(value.data_items)
|
||||||
_LOGGER.debug("self._operation_list=%s", self._operation_list)
|
_LOGGER.debug("self._operation_list=%s", self._operation_list)
|
||||||
_LOGGER.debug("self._current_operation=%s",
|
_LOGGER.debug("self._current_operation=%s",
|
||||||
@ -139,7 +107,7 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL)
|
class_id=zwave.const.COMMAND_CLASS_SENSOR_MULTILEVEL)
|
||||||
.values()):
|
.values()):
|
||||||
if value.label == 'Temperature':
|
if value.label == 'Temperature':
|
||||||
self._current_temperature = int(value.data)
|
self._current_temperature = round((float(value.data)), 1)
|
||||||
self._unit = value.units
|
self._unit = value.units
|
||||||
# Fan Mode
|
# Fan Mode
|
||||||
for value in (self._node.get_values(
|
for value in (self._node.get_values(
|
||||||
@ -164,32 +132,33 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
_LOGGER.debug("self._current_swing_mode=%s",
|
_LOGGER.debug("self._current_swing_mode=%s",
|
||||||
self._current_swing_mode)
|
self._current_swing_mode)
|
||||||
# Set point
|
# Set point
|
||||||
|
temps = []
|
||||||
for value in (self._node.get_values(
|
for value in (self._node.get_values(
|
||||||
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT)
|
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT)
|
||||||
.values()):
|
.values()):
|
||||||
if value.data == 0:
|
temps.append((round(float(value.data)), 1))
|
||||||
_LOGGER.debug("Setpoint is 0, setting default to "
|
if value.index == self._index:
|
||||||
"current_temperature=%s",
|
if value.data == 0:
|
||||||
self._current_temperature)
|
_LOGGER.debug("Setpoint is 0, setting default to "
|
||||||
self._target_temperature = int(self._current_temperature)
|
"current_temperature=%s",
|
||||||
break
|
self._current_temperature)
|
||||||
if self.current_operation is not None and \
|
self._target_temperature = (
|
||||||
self.current_operation != 'Off':
|
round((float(self._current_temperature)), 1))
|
||||||
if self._index_operation != value.index:
|
|
||||||
continue
|
|
||||||
if self._zxt_120:
|
|
||||||
break
|
break
|
||||||
self._target_temperature = int(value.data)
|
else:
|
||||||
break
|
self._target_temperature = round((float(value.data)), 1)
|
||||||
_LOGGER.debug("Device can't set setpoint based on operation mode."
|
|
||||||
" Defaulting to index=1")
|
|
||||||
self._target_temperature = int(value.data)
|
|
||||||
# Operating state
|
# Operating state
|
||||||
for value in (self._node.get_values(
|
for value in (self._node.get_values(
|
||||||
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE)
|
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE)
|
||||||
.values()):
|
.values()):
|
||||||
self._operating_state = value.data
|
self._operating_state = value.data
|
||||||
|
|
||||||
|
# Fan operating state
|
||||||
|
for value in (self._node.get_values(
|
||||||
|
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_FAN_STATE)
|
||||||
|
.values()):
|
||||||
|
self._fan_state = value.data
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
"""No polling on ZWave."""
|
"""No polling on ZWave."""
|
||||||
@ -251,53 +220,19 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
temperature = kwargs.get(ATTR_TEMPERATURE)
|
temperature = kwargs.get(ATTR_TEMPERATURE)
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
operation_mode = kwargs.get(ATTR_OPERATION_MODE)
|
|
||||||
_LOGGER.debug("set_temperature operation_mode=%s", operation_mode)
|
|
||||||
|
|
||||||
for value in (self._node.get_values(
|
for value in (self._node.get_values(
|
||||||
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT)
|
class_id=zwave.const.COMMAND_CLASS_THERMOSTAT_SETPOINT)
|
||||||
.values()):
|
.values()):
|
||||||
if operation_mode is not None:
|
if value.index == self._index:
|
||||||
setpoint_mode = SET_TEMP_TO_INDEX.get(operation_mode)
|
|
||||||
if value.index != setpoint_mode:
|
|
||||||
continue
|
|
||||||
_LOGGER.debug("setpoint_mode=%s", setpoint_mode)
|
|
||||||
value.data = temperature
|
|
||||||
break
|
|
||||||
|
|
||||||
if self.current_operation is not None:
|
|
||||||
if self._hrt4_zw and self.current_operation == 'Off':
|
|
||||||
# HRT4-ZW can change setpoint when off.
|
|
||||||
value.data = int(temperature)
|
|
||||||
if self._index_operation != value.index:
|
|
||||||
continue
|
|
||||||
_LOGGER.debug("self._index_operation=%s and"
|
|
||||||
" self._current_operation=%s",
|
|
||||||
self._index_operation,
|
|
||||||
self._current_operation)
|
|
||||||
if self._zxt_120:
|
if self._zxt_120:
|
||||||
_LOGGER.debug("zxt_120: Setting new setpoint for %s, "
|
|
||||||
" operation=%s, temp=%s",
|
|
||||||
self._index_operation,
|
|
||||||
self._current_operation, temperature)
|
|
||||||
# ZXT-120 does not support get setpoint
|
|
||||||
self._target_temperature = temperature
|
|
||||||
# ZXT-120 responds only to whole int
|
# ZXT-120 responds only to whole int
|
||||||
value.data = round(temperature, 0)
|
value.data = round(temperature, 0)
|
||||||
|
self._target_temperature = temperature
|
||||||
self.update_ha_state()
|
self.update_ha_state()
|
||||||
break
|
|
||||||
else:
|
else:
|
||||||
_LOGGER.debug("Setting new setpoint for %s, "
|
|
||||||
"operation=%s, temp=%s",
|
|
||||||
self._index_operation,
|
|
||||||
self._current_operation, temperature)
|
|
||||||
value.data = temperature
|
value.data = temperature
|
||||||
break
|
self.update_ha_state()
|
||||||
else:
|
|
||||||
_LOGGER.debug("Setting new setpoint for no known "
|
|
||||||
"operation mode. Index=1 and "
|
|
||||||
"temperature=%s", temperature)
|
|
||||||
value.data = temperature
|
|
||||||
break
|
break
|
||||||
|
|
||||||
def set_fan_mode(self, fan):
|
def set_fan_mode(self, fan):
|
||||||
@ -334,9 +269,9 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
|
|||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
"""Return the device specific state attributes."""
|
"""Return the device specific state attributes."""
|
||||||
|
data = {}
|
||||||
if self._operating_state:
|
if self._operating_state:
|
||||||
return {
|
data["operating_state"] = self._operating_state,
|
||||||
"operating_state": self._operating_state,
|
if self._fan_state:
|
||||||
}
|
data["fan_state"] = self._fan_state
|
||||||
else:
|
return data
|
||||||
return {}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user