Fix HomeKit climate integration for devices with a single set point in Heat_Cool mode. (#45065)

* Check supported flags in auto mode, and add tests.

* Fix test description.
This commit is contained in:
Jacob Southard 2021-01-13 08:21:32 -06:00 committed by GitHub
parent f78b02b163
commit 3364e945aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 139 additions and 14 deletions

View file

@ -346,7 +346,9 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
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 (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
):
if temp is None:
temp = (cool_temp + heat_temp) / 2
await self.async_put_characteristics(
@ -386,37 +388,54 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
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)
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT, HVAC_MODE_COOL}) or (
(MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL})
and not (SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features)
):
return self.service.value(CharacteristicsTypes.TEMPERATURE_TARGET)
return None
@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)
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
):
return self.service.value(
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
)
return None
@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)
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
):
return self.service.value(
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD
)
return None
@property
def min_temp(self):
"""Return the minimum target temp."""
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}:
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
):
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}:
elif MODE_HOMEKIT_TO_HASS.get(value) in {
HVAC_MODE_HEAT,
HVAC_MODE_COOL,
HVAC_MODE_HEAT_COOL,
}:
min_temp = self.service[CharacteristicsTypes.TEMPERATURE_TARGET].minValue
if min_temp is not None:
return min_temp
@ -426,13 +445,19 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
def max_temp(self):
"""Return the maximum target temp."""
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
if MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}:
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
):
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}:
elif MODE_HOMEKIT_TO_HASS.get(value) in {
HVAC_MODE_HEAT,
HVAC_MODE_COOL,
HVAC_MODE_HEAT_COOL,
}:
max_temp = self.service[CharacteristicsTypes.TEMPERATURE_TARGET].maxValue
if max_temp is not None:
return max_temp