diff --git a/homeassistant/components/climate/icons.json b/homeassistant/components/climate/icons.json index c26f1bb894b..1922c95348c 100644 --- a/homeassistant/components/climate/icons.json +++ b/homeassistant/components/climate/icons.json @@ -98,6 +98,12 @@ } }, "triggers": { + "started_cooling": { + "trigger": "mdi:snowflake" + }, + "started_drying": { + "trigger": "mdi:water-percent" + }, "started_heating": { "trigger": "mdi:fire" }, diff --git a/homeassistant/components/climate/strings.json b/homeassistant/components/climate/strings.json index fb7efeadb7d..c3801b84f67 100644 --- a/homeassistant/components/climate/strings.json +++ b/homeassistant/components/climate/strings.json @@ -298,6 +298,28 @@ }, "title": "Climate", "triggers": { + "started_cooling": { + "description": "Triggers when a climate started cooling.", + "description_configured": "[%key:component::climate::triggers::started_cooling::description%]", + "fields": { + "behavior": { + "description": "[%key:component::climate::common::trigger_behavior_description%]", + "name": "[%key:component::climate::common::trigger_behavior_name%]" + } + }, + "name": "When a climate started cooling" + }, + "started_drying": { + "description": "Triggers when a climate started drying.", + "description_configured": "[%key:component::climate::triggers::started_drying::description%]", + "fields": { + "behavior": { + "description": "[%key:component::climate::common::trigger_behavior_description%]", + "name": "[%key:component::climate::common::trigger_behavior_name%]" + } + }, + "name": "When a climate started drying" + }, "started_heating": { "description": "Triggers when a climate starts to heat.", "description_configured": "[%key:component::climate::triggers::started_heating::description%]", diff --git a/homeassistant/components/climate/trigger.py b/homeassistant/components/climate/trigger.py index c45922088ad..a8699a4ab47 100644 --- a/homeassistant/components/climate/trigger.py +++ b/homeassistant/components/climate/trigger.py @@ -11,6 +11,12 @@ from homeassistant.helpers.trigger import ( from .const import ATTR_HVAC_ACTION, DOMAIN, HVACAction, HVACMode TRIGGERS: dict[str, type[Trigger]] = { + "started_cooling": make_entity_state_attribute_trigger( + DOMAIN, ATTR_HVAC_ACTION, HVACAction.COOLING + ), + "started_drying": make_entity_state_attribute_trigger( + DOMAIN, ATTR_HVAC_ACTION, HVACAction.DRYING + ), "turned_off": make_entity_state_trigger(DOMAIN, HVACMode.OFF), "turned_on": make_conditional_entity_state_trigger( DOMAIN, diff --git a/homeassistant/components/climate/triggers.yaml b/homeassistant/components/climate/triggers.yaml index bed00d43d87..5d4f9c18976 100644 --- a/homeassistant/components/climate/triggers.yaml +++ b/homeassistant/components/climate/triggers.yaml @@ -14,6 +14,8 @@ - last - any +started_cooling: *trigger_common +started_drying: *trigger_common started_heating: *trigger_common turned_off: *trigger_common turned_on: *trigger_common diff --git a/tests/components/climate/test_trigger.py b/tests/components/climate/test_trigger.py index 5a066ec731c..561d262c21f 100644 --- a/tests/components/climate/test_trigger.py +++ b/tests/components/climate/test_trigger.py @@ -142,11 +142,21 @@ async def test_climate_state_trigger_behavior_any( @pytest.mark.parametrize( ("trigger", "states"), [ + *parametrize_trigger_states( + trigger="climate.started_cooling", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.COOLING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), + *parametrize_trigger_states( + trigger="climate.started_drying", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.DRYING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), *parametrize_trigger_states( trigger="climate.started_heating", - target_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.HEATING})], - other_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.IDLE})], - ) + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.HEATING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), ], ) async def test_climate_state_attribute_trigger_behavior_any( @@ -261,11 +271,21 @@ async def test_climate_state_trigger_behavior_first( @pytest.mark.parametrize( ("trigger", "states"), [ + *parametrize_trigger_states( + trigger="climate.started_cooling", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.COOLING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), + *parametrize_trigger_states( + trigger="climate.started_drying", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.DRYING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), *parametrize_trigger_states( trigger="climate.started_heating", - target_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.HEATING})], - other_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.IDLE})], - ) + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.HEATING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), ], ) async def test_climate_state_attribute_trigger_behavior_first( @@ -378,11 +398,21 @@ async def test_climate_state_trigger_behavior_last( @pytest.mark.parametrize( ("trigger", "states"), [ + *parametrize_trigger_states( + trigger="climate.started_cooling", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.COOLING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), + *parametrize_trigger_states( + trigger="climate.started_drying", + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.DRYING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), *parametrize_trigger_states( trigger="climate.started_heating", - target_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.HEATING})], - other_states=[(HVACMode.OFF, {ATTR_HVAC_ACTION: HVACAction.IDLE})], - ) + target_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.HEATING})], + other_states=[(HVACMode.AUTO, {ATTR_HVAC_ACTION: HVACAction.IDLE})], + ), ], ) async def test_climate_state_attribute_trigger_behavior_last(