11"""Provides conditions for climates."""
22
3- from homeassistant .const import ATTR_TEMPERATURE , UnitOfTemperature
3+ from typing import TYPE_CHECKING
4+
5+ import voluptuous as vol
6+
7+ from homeassistant .const import ATTR_TEMPERATURE , CONF_OPTIONS , UnitOfTemperature
48from homeassistant .core import HomeAssistant , State
9+ from homeassistant .helpers import config_validation as cv
510from homeassistant .helpers .automation import DomainSpec
611from homeassistant .helpers .condition import (
12+ ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL ,
713 Condition ,
14+ ConditionConfig ,
15+ EntityConditionBase ,
816 EntityNumericalConditionWithUnitBase ,
917 make_entity_numerical_condition ,
1018 make_entity_state_condition ,
1321
1422from .const import ATTR_HUMIDITY , ATTR_HVAC_ACTION , DOMAIN , HVACAction , HVACMode
1523
24+ CONF_HVAC_MODE = "hvac_mode"
25+
26+ _HVAC_MODE_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL .extend (
27+ {
28+ vol .Required (CONF_OPTIONS ): {
29+ vol .Required (CONF_HVAC_MODE ): vol .All (
30+ cv .ensure_list , vol .Length (min = 1 ), [vol .Coerce (HVACMode )]
31+ ),
32+ },
33+ }
34+ )
35+
36+
37+ class ClimateHVACModeCondition (EntityConditionBase ):
38+ """Condition for climate HVAC mode."""
39+
40+ _domain_specs = {DOMAIN : DomainSpec ()}
41+ _schema = _HVAC_MODE_CONDITION_SCHEMA
42+
43+ def __init__ (self , hass : HomeAssistant , config : ConditionConfig ) -> None :
44+ """Initialize the HVAC mode condition."""
45+ super ().__init__ (hass , config )
46+ if TYPE_CHECKING :
47+ assert config .options is not None
48+ self ._hvac_modes : set [str ] = set (config .options [CONF_HVAC_MODE ])
49+
50+ def is_valid_state (self , entity_state : State ) -> bool :
51+ """Check if the state matches any of the expected HVAC modes."""
52+ return entity_state .state in self ._hvac_modes
53+
1654
1755class ClimateTargetTemperatureCondition (EntityNumericalConditionWithUnitBase ):
1856 """Mixin for climate target temperature conditions with unit conversion."""
@@ -28,6 +66,7 @@ def _get_entity_unit(self, entity_state: State) -> str | None:
2866
2967
3068CONDITIONS : dict [str , type [Condition ]] = {
69+ "is_hvac_mode" : ClimateHVACModeCondition ,
3170 "is_off" : make_entity_state_condition (DOMAIN , HVACMode .OFF ),
3271 "is_on" : make_entity_state_condition (
3372 DOMAIN ,
0 commit comments