mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add HomeKit thermostat fan state mapping for preheating, defrosting (#145353)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
4ee9fdc9fb
commit
d8e0be69d1
@ -167,6 +167,8 @@ HC_HASS_TO_HOMEKIT_FAN_STATE = {
|
|||||||
HVACAction.COOLING: FAN_STATE_ACTIVE,
|
HVACAction.COOLING: FAN_STATE_ACTIVE,
|
||||||
HVACAction.DRYING: FAN_STATE_ACTIVE,
|
HVACAction.DRYING: FAN_STATE_ACTIVE,
|
||||||
HVACAction.FAN: FAN_STATE_ACTIVE,
|
HVACAction.FAN: FAN_STATE_ACTIVE,
|
||||||
|
HVACAction.PREHEATING: FAN_STATE_IDLE,
|
||||||
|
HVACAction.DEFROSTING: FAN_STATE_IDLE,
|
||||||
}
|
}
|
||||||
|
|
||||||
HEAT_COOL_DEADBAND = 5
|
HEAT_COOL_DEADBAND = 5
|
||||||
|
@ -56,6 +56,9 @@ from homeassistant.components.homekit.const import (
|
|||||||
PROP_MIN_VALUE,
|
PROP_MIN_VALUE,
|
||||||
)
|
)
|
||||||
from homeassistant.components.homekit.type_thermostats import (
|
from homeassistant.components.homekit.type_thermostats import (
|
||||||
|
FAN_STATE_ACTIVE,
|
||||||
|
FAN_STATE_IDLE,
|
||||||
|
FAN_STATE_INACTIVE,
|
||||||
HC_HEAT_COOL_AUTO,
|
HC_HEAT_COOL_AUTO,
|
||||||
HC_HEAT_COOL_COOL,
|
HC_HEAT_COOL_COOL,
|
||||||
HC_HEAT_COOL_HEAT,
|
HC_HEAT_COOL_HEAT,
|
||||||
@ -2493,6 +2496,98 @@ async def test_thermostat_with_supported_features_target_temp_but_fan_mode_set(
|
|||||||
assert not acc.fan_chars
|
assert not acc.fan_chars
|
||||||
|
|
||||||
|
|
||||||
|
async def test_thermostat_fan_state_with_preheating_and_defrosting(
|
||||||
|
hass: HomeAssistant, hk_driver
|
||||||
|
) -> None:
|
||||||
|
"""Test thermostat fan state mappings for preheating and defrosting actions."""
|
||||||
|
entity_id = "climate.test"
|
||||||
|
hass.states.async_set(
|
||||||
|
entity_id,
|
||||||
|
HVACMode.HEAT,
|
||||||
|
{
|
||||||
|
ATTR_SUPPORTED_FEATURES: ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
|
| ClimateEntityFeature.FAN_MODE,
|
||||||
|
ATTR_FAN_MODES: [FAN_AUTO, FAN_LOW, FAN_HIGH],
|
||||||
|
ATTR_HVAC_ACTION: HVACAction.IDLE,
|
||||||
|
ATTR_FAN_MODE: FAN_AUTO,
|
||||||
|
ATTR_HVAC_MODES: [HVACMode.HEAT, HVACMode.COOL, HVACMode.OFF],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
acc = Thermostat(hass, hk_driver, "Climate", entity_id, 1, None)
|
||||||
|
hk_driver.add_accessory(acc)
|
||||||
|
|
||||||
|
acc.run()
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
# Verify fan state characteristics are available
|
||||||
|
assert CHAR_CURRENT_FAN_STATE in acc.fan_chars
|
||||||
|
assert hasattr(acc, "char_current_fan_state")
|
||||||
|
|
||||||
|
# Test PREHEATING action maps to FAN_STATE_IDLE
|
||||||
|
hass.states.async_set(
|
||||||
|
entity_id,
|
||||||
|
HVACMode.HEAT,
|
||||||
|
{
|
||||||
|
ATTR_SUPPORTED_FEATURES: ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
|
| ClimateEntityFeature.FAN_MODE,
|
||||||
|
ATTR_FAN_MODES: [FAN_AUTO, FAN_LOW, FAN_HIGH],
|
||||||
|
ATTR_HVAC_ACTION: HVACAction.PREHEATING,
|
||||||
|
ATTR_FAN_MODE: FAN_AUTO,
|
||||||
|
ATTR_HVAC_MODES: [HVACMode.HEAT, HVACMode.COOL, HVACMode.OFF],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert acc.char_current_fan_state.value == FAN_STATE_IDLE
|
||||||
|
|
||||||
|
# Test DEFROSTING action maps to FAN_STATE_IDLE
|
||||||
|
hass.states.async_set(
|
||||||
|
entity_id,
|
||||||
|
HVACMode.HEAT,
|
||||||
|
{
|
||||||
|
ATTR_SUPPORTED_FEATURES: ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
|
| ClimateEntityFeature.FAN_MODE,
|
||||||
|
ATTR_FAN_MODES: [FAN_AUTO, FAN_LOW, FAN_HIGH],
|
||||||
|
ATTR_HVAC_ACTION: HVACAction.DEFROSTING,
|
||||||
|
ATTR_FAN_MODE: FAN_AUTO,
|
||||||
|
ATTR_HVAC_MODES: [HVACMode.HEAT, HVACMode.COOL, HVACMode.OFF],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert acc.char_current_fan_state.value == FAN_STATE_IDLE
|
||||||
|
|
||||||
|
# Test other actions for comparison
|
||||||
|
hass.states.async_set(
|
||||||
|
entity_id,
|
||||||
|
HVACMode.HEAT,
|
||||||
|
{
|
||||||
|
ATTR_SUPPORTED_FEATURES: ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
|
| ClimateEntityFeature.FAN_MODE,
|
||||||
|
ATTR_FAN_MODES: [FAN_AUTO, FAN_LOW, FAN_HIGH],
|
||||||
|
ATTR_HVAC_ACTION: HVACAction.HEATING,
|
||||||
|
ATTR_FAN_MODE: FAN_AUTO,
|
||||||
|
ATTR_HVAC_MODES: [HVACMode.HEAT, HVACMode.COOL, HVACMode.OFF],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert acc.char_current_fan_state.value == FAN_STATE_ACTIVE
|
||||||
|
|
||||||
|
hass.states.async_set(
|
||||||
|
entity_id,
|
||||||
|
HVACMode.OFF,
|
||||||
|
{
|
||||||
|
ATTR_SUPPORTED_FEATURES: ClimateEntityFeature.TARGET_TEMPERATURE
|
||||||
|
| ClimateEntityFeature.FAN_MODE,
|
||||||
|
ATTR_FAN_MODES: [FAN_AUTO, FAN_LOW, FAN_HIGH],
|
||||||
|
ATTR_HVAC_ACTION: HVACAction.OFF,
|
||||||
|
ATTR_FAN_MODE: FAN_AUTO,
|
||||||
|
ATTR_HVAC_MODES: [HVACMode.HEAT, HVACMode.COOL, HVACMode.OFF],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert acc.char_current_fan_state.value == FAN_STATE_INACTIVE
|
||||||
|
|
||||||
|
|
||||||
async def test_thermostat_handles_unknown_state(hass: HomeAssistant, hk_driver) -> None:
|
async def test_thermostat_handles_unknown_state(hass: HomeAssistant, hk_driver) -> None:
|
||||||
"""Test a thermostat can handle unknown state."""
|
"""Test a thermostat can handle unknown state."""
|
||||||
entity_id = "climate.test"
|
entity_id = "climate.test"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user