跳到主要内容

条件

条件可以在脚本或自动化中使用,以防止进一步执行。当条件评估为真时,脚本或自动化将被执行。如果返回任何其他值,脚本或自动化将停止执行。条件会查看系统在那一刻的状态。例如,条件可以测试开关当前是打开还是关闭。

与触发器不同,触发器始终是or,条件默认是and - 所有条件都必须为真。

所有条件都支持可选的alias

  • 逻辑条件
    • AND条件
    • OR条件
    • 混合AND和OR条件
    • NOT条件
  • 数值状态条件
  • 状态条件
    • 太阳条件
    • 太阳高度条件
    • 日落/日出条件
  • 模板条件
    • 模板条件简写符号
  • 时间条件
  • 触发条件
  • 区域条件
  • 示例
  • 禁用条件

逻辑条件

AND条件

在一个条件语句中测试多个条件。如果所有嵌入的条件都为真,则通过。

conditions:
- alias: "Paulus在家且温度低于20"
condition: and
conditions:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

如果你不想组合AND和OR条件,可以按顺序列出它们。

以下配置与上面列出的配置效果相同:

conditions:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

目前,你需要像这样格式化条件才能使用自动化编辑器编辑它们。

AND条件也有简写形式。以下配置与上面列出的配置效果相同:

conditions:
alias: "Paulus在家且温度低于20"
- and:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

OR条件

在一个条件语句中测试多个条件。如果任何嵌入的条件为真,则通过。

conditions:
- alias: "Paulus在家或温度低于20"
condition: or
conditions:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

OR条件也有简写形式。以下配置与上面列出的配置效果相同:

conditions:
- alias: "Paulus在家或温度低于20"
or:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

混合AND和OR条件

在一个条件语句中测试多个AND和OR条件。如果任何嵌入的条件为真,则通过。这允许你混合多个AND和OR条件。

conditions:
- condition: and
conditions:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- condition: or
conditions:
- condition: state
entity_id: sensor.weather_precip
state: "rain"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

或者以简写形式:

conditions:
- and:
- condition: state
entity_id: "device_tracker.paulus"
state: "home"
- or:
- condition: state
entity_id: sensor.weather_precip
state: "rain"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

NOT条件

在一个条件语句中测试多个条件。如果所有嵌入的条件都为真,则通过。

conditions:
- alias: "Paulus不在家且警报未解除"
condition: not
conditions:
- condition: state
entity_id: device_tracker.paulus
state: "home"
- condition: state
entity_id: alarm_control_panel.home_alarm
state: "disarmed"

NOT条件也有简写形式。以下配置与上面列出的配置效果相同:

conditions:
alias: "Paulus不在家且警报未解除"
not:
- condition: state
entity_id: device_tracker.paulus
state: "home"
- condition: state
entity_id: alarm_control_panel.home_alarm
state: disarmed

数值状态条件

这种类型的条件尝试将指定实体的状态或实体的属性解析为数字,如果值符合阈值(严格低于/高于,所以等于被排除),则触发。

如果同时指定了belowabove,则两个测试都必须通过。

conditions:
- alias: "温度在17到25度之间"
condition: numeric_state
entity_id: sensor.temperature
above: 17
below: 25

你可以选择使用value_template来处理状态的值,然后再对其进行测试。

conditions:
- condition: numeric_state
entity_id: sensor.temperature
above: 17
below: 25
# If your sensor value needs to be adjusted
value_template: "{{ float(state.state) + 2 }}"

It is also possible to test the condition against multiple entities at once. The condition will pass if all entities match the thresholds.

conditions:
- condition: numeric_state
entity_id:
- sensor.kitchen_temperature
- sensor.living_room_temperature
below: 18

Alternatively, the condition can test against a state attribute. The condition will pass if the attribute value of the entity matches the thresholds.

conditions:
- condition: numeric_state
entity_id: climate.living_room_thermostat
attribute: temperature
above: 17
below: 25

Number helpers (input_number entities), number, sensor, and zone entities that contain a numeric value, can be used in the above and below options to make the condition more dynamic.

conditions:
- condition: numeric_state
entity_id: climate.living_room_thermostat
attribute: temperature
above: input_number.temperature_threshold_low
below: input_number.temperature_threshold_high

State condition

Tests if an entity has a specified state.

conditions:
- alias: "Paulus not home for an hour and a bit"
condition: state
entity_id: device_tracker.paulus
state: "not_home"
# optional: Evaluates to true only if state was this for last X time.
for:
hours: 1
minutes: 10
seconds: 5

It is also possible to test the condition against multiple entities at once. The condition will pass if all entities match the state.

conditions:
- condition: state
entity_id:
- binary_sensor.motion_sensor_left
- binary_sensor.motion_sensor_right
match: any
state: "on"

Testing if an entity is matching a set of possible conditions; The condition will pass if the entity matches one of the states given.

conditions:
- condition: state
entity_id: alarm_control_panel.home
state:
- "armed_away"
- "armed_home"

Or, combine multiple entities with multiple states. In the following example, both media players need to be either paused or playing for the condition to pass.

conditions:
- condition: state
entity_id:
- media_player.living_room
- media_player.kitchen
state:
- "playing"
- "paused"

Alternatively, the condition can test against a state attribute. The condition will pass if the attribute matches the given state.

conditions:
- condition: state
entity_id: climate.living_room_thermostat
attribute: fan_mode
state: "auto"

Finally, the state option accepts helper entities (also known as input_* entities). The condition will pass if the state of the entity matches the state of the given helper entity.

conditions:
- condition: state
entity_id: alarm_control_panel.home
state: input_select.guest_mode

You can also use templates in the for option.

conditions:
- condition: state
entity_id: device_tracker.paulus
state: "home"
for:
minutes: "{{ states('input_number.lock_min')|int }}"
seconds: "{{ states('input_number.lock_sec')|int }}"

The for template(s) will be evaluated when the condition is tested.

Sun condition

Sun state condition

The sun state can be used to test if the sun has set or risen.

conditions:
- alias: "Sun up"
condition: state # 'day' condition: from sunrise until sunset
entity_id: sun.sun
state: "above_horizon"
conditions:
- alias: "Sun down"
condition: state # from sunset until sunrise
entity_id: sun.sun
state: "below_horizon"

Sun elevation condition

The sun elevation can be used to test if the sun has set or risen, it is dusk, it is night, etc. when a trigger occurs. For an in-depth explanation of sun elevation, see sun elevation trigger.

conditions:
- condition: and # 'twilight' condition: dusk and dawn, in typical locations
conditions:
- condition: template
value_template: "{{ state_attr('sun.sun', 'elevation') < 0 }}"
- condition: template
value_template: "{{ state_attr('sun.sun', 'elevation') > -6 }}"
conditions:
condition: template # 'night' condition: from dusk to dawn, in typical locations
value_template: "{{ state_attr('sun.sun', 'elevation') < -6 }}"

Sunset/sunrise condition

The sun condition can also test if the sun has already set or risen when a trigger occurs. The before and after keys can only be set to sunset or sunrise. They have a corresponding optional offset value (before_offset, after_offset) that can be added, similar to the sun trigger.

Note that if only before key is used, the condition will be true from midnight until sunrise/sunset. If only after key is used, the condition will be true from sunset/sunrise until midnight. If both before: sunrise and after: sunset keys are used, the condition will be true from midnight until sunrise and from sunset until midnight. If both after: sunrise and before: sunset keys are used, the condition will be true from sunrise until sunset.

提示

The sunset/sunrise conditions do not work in locations inside the polar circles, and also not in locations with a highly skewed local time zone. In those cases it is advised to use conditions evaluating the solar elevation instead of the before/after sunset/sunrise conditions.

This is an example of 1 hour offset before sunset:

conditions:
- condition: sun
after: sunset
after_offset: "-01:00:00"

This is 'when dark' - equivalent to a state condition on sun.sun of below_horizon:

conditions:
- condition: sun
after: sunset
before: sunrise

This is 'when light' - equivalent to a state condition on sun.sun of above_horizon:

conditions:
- condition: sun
after: sunrise
before: sunset

A visual timeline is provided below, showing an example of when these conditions are true. In this chart, sunrise is at 6:00, and sunset is at 18:00 (6:00 PM). The green areas of the chart indicate when the specified conditions are true.

Graphic showing an example of sun conditions

Template condition

The template condition tests if the given template renders a value equal to true. This is achieved by having the template result in a true boolean expression or by having the template render True.

conditions:
- alias: "Iphone battery above 50%"
condition: template
value_template: "{{ (state_attr('device_tracker.iphone', 'battery_level')|int) > 50 }}"

Within an automation, template conditions also have access to the trigger variable as described here.

Template condition shorthand notation

The template condition has a shorthand notation that can be used to make your scripts and automations shorter.

For example:

conditions: "{{ (state_attr('device_tracker.iphone', 'battery_level')|int) > 50 }}"

Or in a list of conditions, allowing to use existing conditions as described in this chapter and one or more shorthand template conditions

conditions:
- "{{ (state_attr('device_tracker.iphone', 'battery_level')|int) > 50 }}"
- condition: state
entity_id: alarm_control_panel.home
state: armed_away
- "{{ is_state('device_tracker.iphone', 'away') }}"

This shorthand notation can be used everywhere in Home Assistant where conditions are accepted. For example, in and, or and not conditions:

conditions:
- condition: or
conditions:
- "{{ is_state('device_tracker.iphone', 'away') }}"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20

It's also supported in the repeat action's while or until option, or in a choose action's conditions option:

- while: "{{ is_state('sensor.mode', 'Home') and repeat.index < 10 }}"
sequence:
- ...
- choose:
- conditions: "{{ is_state('sensor.mode', 'Home') and repeat.index < 10 }}"
sequence:
- ...

It's also supported in script or automation condition actions:

- condition: "{{ is_state('device_tracker.iphone', 'away') }}"

Time condition

The time condition can test if it is after a specified time, before a specified time or if it is a certain day of the week.

conditions:
- alias: "Time 15~02"
condition: time
# At least one of the following is required.
after: "15:00:00"
before: "02:00:00"
weekday:
- mon
- wed
- fri

Valid values for weekday are mon, tue, wed, thu, fri, sat, sun. Note that if only before key is used, the condition will be true from midnight until the specified time. If only after key is used, the condition will be true from the specified time until midnight. Time condition windows can span across the midnight threshold if both after and before keys are used. In the example above, the condition window is from 3pm to 2am.

提示

A better weekday condition could be by using the Workday Binary Sensor.

For the after and before options a time helper (input_datetime entity), a time entity, or another sensor entity containing a timestamp with the "timestamp" device class, can be used instead.

conditions:
- alias: "Example referencing a time helper"
condition: time
after: input_datetime.house_silent_hours_start
before: input_datetime.house_silent_hours_end

- alias: "Example referencing a time entity"
before: time.dnd_start

- alias: "Example referencing another sensor"
after: sensor.groceries_delivery_time
备注

Note that the time condition only takes the time into account. If a referenced sensor or helper entity contains a timestamp with a date, the date part is fully ignored.

Trigger condition

The trigger condition can test if an automation was triggered by a certain trigger, identified by the trigger's id.

conditions:
- condition: trigger
id: event_trigger

For a trigger identified by its index, both a string and integer is allowed:

conditions:
- condition: trigger
id: "0"
conditions:
- condition: trigger
id: 0

It is possible to give a list of triggers:

conditions:
- condition: trigger
id:
- event_1_trigger
- event_2_trigger

Zone condition

Zone conditions test if an entity is in a certain zone. For zone automation to work, you need to have set up a device tracker platform that supports reporting GPS coordinates.

conditions:
- alias: "Paulus at home"
condition: zone
entity_id: device_tracker.paulus
zone: zone.home

It is also possible to test the condition against multiple entities at once. The condition will pass if all entities are in the specified zone.

conditions:
- condition: zone
entity_id:
- device_tracker.frenck
- device_tracker.daphne
zone: zone.home

Testing if an entity is matching a set of possible zones; The condition will pass if the entity is in one of the zones.

conditions:
- condition: zone
entity_id: device_tracker.paulus
state:
- zone.home
- zone.work

Or, combine multiple entities with multiple zones. In the following example, both entities need to be either in the home or the work zone for the condition to pass.

conditions:
condition: zone
entity_id:
- device_tracker.frenck
- device_tracker.daphne
state:
- zone.home
- zone.work

Examples

conditions:
- condition: numeric_state
entity_id: sun.sun
value_template: "{{ state.attributes.elevation }}"
below: 1
- condition: state
entity_id: light.living_room
state: "off"
- condition: time
before: "23:00:00"
after: "14:00:00"
- condition: state
entity_id: script.light_turned_off_5min
state: "off"

Disabling a condition

Every individual condition can be disabled, without removing it. To do so, add enabled: false to the condition configuration.

This can be useful if you want to temporarily disable a condition, for example, for testing. A disabled condition will behave as if it were removed.

For example:

# This condition will always pass, as it is disabled.
conditions:
- enabled: false
condition: state
entity_id: sun.sun
state: "above_horizon"

Conditions can also be disabled based on limited templates or blueprint inputs.

blueprint:
input:
input_boolean:
name: Boolean
selector:
boolean:
input_number:
name: Number
selector:
number:
min: 0
max: 100

trigger_variables:
_enable_number: !input input_number

conditions:
- condition: state
entity_id: sun.sun
state: "above_horizon"
enabled: !input input_boolean
- condition: state
entity_id: sun.sun
state: "below_horizon"
enabled: "{{ _enable_number < 50 }}"