条件

条件可以在script脚本是允许用户指定 Home Assistant 打开时要执行的动作序列的组件。 [Learn more]automationHome Assistant 中的自动化允许您自动响应在家中和周围发生的事情。 [Learn more]中使用,以防止进一步的执行。当条件评估为真时,脚本或自动化将会执行。如果返回任何其他值,则脚本或自动化停止执行。条件将在那一刻查看系统。例如,条件可以测试开关是否当前处于开启或关闭状态。

与始终为ortrigger触发器是定义的一组平台值或条件,用于触发自动化运行。 [Learn more]不同,条件默认使用and - 所有条件都必须为真。

所有条件支持一个可选的alias

逻辑条件

AND 条件

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

conditions:
  - alias: "保罗在家且温度低于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: "保罗在家且温度低于20度"
  - and:
    - condition: state
      entity_id: "device_tracker.paulus"
      state: "home"
    - condition: numeric_state
      entity_id: "sensor.temperature"
      below: 20

OR 条件

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

conditions:
  - alias: "保罗在家或温度低于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: "保罗在家或温度低于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: "保罗不在家且警报未解除"
    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: "保罗不在家且警报未解除"
  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
    # 如果您的传感器值需要调整
    value_template: "{{ float(state.state) + 2 }}"

也可以同时测试多个实体的条件。如果所有实体都匹配阈值,则条件将通过。

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

或者,条件可以对状态属性进行测试。如果实体的属性值匹配阈值,则条件将通过。

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

数值助手(input_number 实体), numbersensorzone 实体 包含数值,可用于abovebelow选项,使条件更加动态。

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

状态条件

测试一个实体是否具有指定的状态。

conditions:
  - alias: "保罗离家一小时多一点"
    condition: state
    entity_id: device_tracker.paulus
    state: "not_home"
    # 可选:仅在状态在此X时间内为真时评估。
    for:
      hours: 1
      minutes: 10
      seconds: 5

也可以同时测试多个实体的条件。如果所有实体都匹配状态,则条件将通过。

conditions:
  - condition: state
    entity_id:
      - light.kitchen
      - light.living_room
    state: "on"

不仅要匹配所有实体,也可以只要一个实体匹配。在以下示例中,如果任何实体匹配状态,则条件将通过。

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

测试一个实体是否匹配一组可能的条件;如果实体匹配给定的状态之一,条件将通过。

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

或者,将多个实体与多个状态结合。在以下示例中, 两个媒体播放器都需要暂停或播放以使条件通过。

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

或者,条件可以对状态属性进行测试。如果属性值与给定状态匹配,条件将通过。

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

最后,state选项接受助手实体(也称为input_* 实体)。如果实体的状态与给定助手实体的状态匹配,则条件将通过。

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

您还可以在for选项中使用模板。

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 }}"

for模板将在测试条件时进行评估。

太阳条件

太阳状态条件

太阳状态可用于测试太阳是否已经落下或升起。

conditions:
  - alias: "太阳升起"
    condition: state  # '日间'条件:从日出到日落
    entity_id: sun.sun
    state: "above_horizon"
conditions:
  - alias: "太阳落下"
    condition: state  # 从日落到日出
    entity_id: sun.sun
    state: "below_horizon"

太阳高度条件

太阳高度可用于测试太阳是否已经落下或升起,是否黄昏,是否晚上等,当触发器发生时。 有关太阳高度的详细解释,请参见太阳高度触发器

conditions:
  - condition: and  # '黄昏'条件:黄昏和黎明,在典型位置
    conditions:
      - condition: template
        value_template: "{{ state_attr('sun.sun', 'elevation') < 0 }}"
      - condition: template
        value_template: "{{ state_attr('sun.sun', 'elevation') > -6 }}"
conditions:
  condition: template  # '夜晚'条件:从黄昏到黎明,在典型位置
  value_template: "{{ state_attr('sun.sun', 'elevation') < -6 }}"

日落/日出条件

太阳条件还可以在触发器发生时测试太阳是否已经落下或升起。beforeafter键只能设置为sunsetsunrise。它们具有相应的可选偏移值(before_offsetafter_offset),可以添加,类似于太阳触发器

注意如果只使用before键,条件将从午夜到日出/日落为真。如果只使用after键,条件将在日落/日出后直到午夜为真。如果同时使用before: sunriseafter: sunset键,条件将在午夜到日出日落到午夜之间为真。如果同时使用after: sunrisebefore: sunset键,条件将在日出到日落之间为真。

Tip

日落/日出条件在极圈内的地点不可用,在具有高度偏斜本地时区的地点也不可用。在这些情况下,建议使用评估太阳高度的条件,而不是日落/日出条件。

这是日落前1小时的偏移示例:

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

这是“黑暗时” - 相当于sun.sun状态为below_horizon的状态条件:

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

这是“光亮时” - 相当于sun.sun状态为above_horizon的状态条件:

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

下面提供了一个可视时间线,显示这些条件何时为真。在此图表中,日出时间为6:00,日落时间为18:00(下午6:00)。图表的绿色区域表示指定条件为真的时间。

展示太阳条件示例的图形

模板条件

模板条件测试给定模板是否渲染的值等于真。这是通过使模板结果为真的布尔表达式或渲染True来实现的。

conditions:
  - alias: "iPhone 电池高于50%"
    condition: template
    value_template: "{{ (state_attr('device_tracker.iphone', 'battery_level')|int) > 50 }}"

在自动化中,模板条件也可以访问trigger变量,如这里所述

模板条件简写表示法

模板条件有一种简写表示法,可以用来使您的脚本和自动化更简短。

例如:

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

或者在条件列表中,允许使用本章描述的现有条件以及一个或多个简写模板条件

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') }}"

这种简写表示法可以在 Home Assistant 中所有接受条件的地方使用。例如,在andornot条件中:

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

它也支持在repeat动作的whileuntil选项中,或在choose动作的conditions选项中:

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

它也支持在脚本或自动化的condition动作中:

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

时间条件

时间条件可以测试是否在指定时间之后、指定时间之前或是否为某个星期几。

conditions:
  - alias: "时间 15~02"
    condition: time
    # 至少需要以下一个。
    after: "15:00:00"
    before: "02:00:00"
    weekday:
      - mon
      - wed
      - fri

weekday的有效值为montuewedthufrisatsun。 注意如果只使用before键,条件将在指定时间之前从午夜为真。 如果只使用after键,条件将在指定时间直到午夜为真。 时间条件窗口可以跨越午夜阈值,如果同时使用afterbefore键。在上面的示例中,条件窗口是从下午3点到凌晨2点。

Tip

更好的星期几条件可以使用工作日二元传感器

对于afterbefore选项,可以使用时间助手(input_datetime 实体)、time 实体, 或其他带有“时间戳”设备类的传感器实体。

conditions:
  - alias: "引用时间助手的示例"
    condition: time
    after: input_datetime.house_silent_hours_start
    before: input_datetime.house_silent_hours_end

  - alias: "引用时间实体的示例"
    before: time.dnd_start

  - alias: "引用其他传感器的示例"
    after: sensor.groceries_delivery_time

Note

注意,时间条件仅考虑时间。如果 引用的传感器或助手实体包含带有日期的时间戳,日期部分将被完全忽略。

触发条件

触发条件可以测试自动化是否由某个触发器触发,触发器的id来识别。

conditions:
  - condition: trigger
    id: event_trigger

对于通过其索引识别的触发器,允许字符串和整数:

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

可以给出触发器列表:

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

区域条件

区域条件测试实体是否在特定区域。要使区域自动化正常工作,您需要设置支持报告GPS坐标的设备跟踪器平台。

conditions:
  - alias: "保罗在家"
    condition: zone
    entity_id: device_tracker.paulus
    zone: zone.home

也可以同时测试多个实体的条件。如果所有实体都在指定区域内,则条件将通过。

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

测试一个实体是否匹配一组可能的区域;如果实体在其中一个区域内,则条件将通过。

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

或者,将多个实体与多个区域结合。在以下示例中, 两个实体都需要处于家或工作区域中,以使条件通过。

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

示例

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"

禁用条件

每个单独的条件都可以被禁用,而不需要将其删除。 为此,向条件配置添加enabled: false

这对于您想要临时禁用条件时非常有用,例如, 用于测试。禁用的条件将表现得像是被移除了一样。

例如:

# 这个条件将始终通过,因为它被禁用。
conditions:
  - enabled: false
    condition: state
    entity_id: sun.sun
    state: "above_horizon"

条件也可以根据有限的模板或蓝图输入而被禁用。

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 }}"