mirror of
https://github.com/home-assistant/core.git
synced 2025-11-12 12:30:31 +00:00
Add target temperature range to homekit_controller (#42817)
* Add support for temperature range in thermostat. * Add tests for setting temperature range. * Update Lennox E30/Ecobee 3 tests to reflect new supported feature * Add support for thermostate mode specific min/max temp values.
This commit is contained in:
@@ -19,6 +19,8 @@ from homeassistant.components.climate import (
|
||||
ClimateEntity,
|
||||
)
|
||||
from homeassistant.components.climate.const import (
|
||||
ATTR_TARGET_TEMP_HIGH,
|
||||
ATTR_TARGET_TEMP_LOW,
|
||||
CURRENT_HVAC_COOL,
|
||||
CURRENT_HVAC_HEAT,
|
||||
CURRENT_HVAC_IDLE,
|
||||
@@ -30,6 +32,7 @@ from homeassistant.components.climate.const import (
|
||||
SUPPORT_SWING_MODE,
|
||||
SUPPORT_TARGET_HUMIDITY,
|
||||
SUPPORT_TARGET_TEMPERATURE,
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE,
|
||||
SWING_OFF,
|
||||
SWING_VERTICAL,
|
||||
)
|
||||
@@ -329,7 +332,9 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
||||
return [
|
||||
CharacteristicsTypes.HEATING_COOLING_CURRENT,
|
||||
CharacteristicsTypes.HEATING_COOLING_TARGET,
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD,
|
||||
CharacteristicsTypes.TEMPERATURE_CURRENT,
|
||||
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD,
|
||||
CharacteristicsTypes.TEMPERATURE_TARGET,
|
||||
CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT,
|
||||
CharacteristicsTypes.RELATIVE_HUMIDITY_TARGET,
|
||||
@@ -338,10 +343,23 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
||||
async def async_set_temperature(self, **kwargs):
|
||||
"""Set new target temperature."""
|
||||
temp = kwargs.get(ATTR_TEMPERATURE)
|
||||
|
||||
await self.async_put_characteristics(
|
||||
{CharacteristicsTypes.TEMPERATURE_TARGET: temp}
|
||||
)
|
||||
heat_temp = kwargs.get(ATTR_TARGET_TEMP_LOW)
|
||||
cool_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH)
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}:
|
||||
if temp is None:
|
||||
temp = (cool_temp + heat_temp) / 2
|
||||
await self.async_put_characteristics(
|
||||
{
|
||||
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD: heat_temp,
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD: cool_temp,
|
||||
CharacteristicsTypes.TEMPERATURE_TARGET: temp,
|
||||
}
|
||||
)
|
||||
else:
|
||||
await self.async_put_characteristics(
|
||||
{CharacteristicsTypes.TEMPERATURE_TARGET: temp}
|
||||
)
|
||||
|
||||
async def async_set_humidity(self, humidity):
|
||||
"""Set new target humidity."""
|
||||
@@ -367,22 +385,57 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
||||
@property
|
||||
def target_temperature(self):
|
||||
"""Return the temperature we try to reach."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) not in {HVAC_MODE_HEAT, HVAC_MODE_COOL}:
|
||||
return None
|
||||
return self.service.value(CharacteristicsTypes.TEMPERATURE_TARGET)
|
||||
|
||||
@property
|
||||
def target_temperature_high(self):
|
||||
"""Return the highbound target temperature we try to reach."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) not in {HVAC_MODE_HEAT_COOL}:
|
||||
return None
|
||||
return self.service.value(CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD)
|
||||
|
||||
@property
|
||||
def target_temperature_low(self):
|
||||
"""Return the lowbound target temperature we try to reach."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) not in {HVAC_MODE_HEAT_COOL}:
|
||||
return None
|
||||
return self.service.value(CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD)
|
||||
|
||||
@property
|
||||
def min_temp(self):
|
||||
"""Return the minimum target temp."""
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_TARGET):
|
||||
char = self.service[CharacteristicsTypes.TEMPERATURE_TARGET]
|
||||
return char.minValue
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}:
|
||||
min_temp = self.service[
|
||||
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD
|
||||
].minValue
|
||||
if min_temp is not None:
|
||||
return min_temp
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT, HVAC_MODE_COOL}:
|
||||
min_temp = self.service[CharacteristicsTypes.TEMPERATURE_TARGET].minValue
|
||||
if min_temp is not None:
|
||||
return min_temp
|
||||
return super().min_temp
|
||||
|
||||
@property
|
||||
def max_temp(self):
|
||||
"""Return the maximum target temp."""
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_TARGET):
|
||||
char = self.service[CharacteristicsTypes.TEMPERATURE_TARGET]
|
||||
return char.maxValue
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}:
|
||||
max_temp = self.service[
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
|
||||
].maxValue
|
||||
if max_temp is not None:
|
||||
return max_temp
|
||||
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT, HVAC_MODE_COOL}:
|
||||
max_temp = self.service[CharacteristicsTypes.TEMPERATURE_TARGET].maxValue
|
||||
if max_temp is not None:
|
||||
return max_temp
|
||||
return super().max_temp
|
||||
|
||||
@property
|
||||
@@ -443,6 +496,11 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_TARGET):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE
|
||||
|
||||
if self.service.has(
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
|
||||
) and self.service.has(CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
|
||||
if self.service.has(CharacteristicsTypes.RELATIVE_HUMIDITY_TARGET):
|
||||
features |= SUPPORT_TARGET_HUMIDITY
|
||||
|
||||
|
||||
Reference in New Issue
Block a user