条件
条件可以在script脚本是允许用户指定 Home Assistant 打开时要执行的动作序列的组件。 [Learn more]或automationHome Assistant 中的自动化允许您自动响应在家中和周围发生的事情。 [Learn more]中使用,以防止进一步的执行。当条件评估为真时,脚本或自动化将会执行。如果返回任何其他值,则脚本或自动化停止执行。条件将在那一刻查看系统。例如,条件可以测试开关是否当前处于开启或关闭状态。
与始终为or
的trigger触发器是定义的一组平台值或条件,用于触发自动化运行。 [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
数值状态条件
此类型的条件试图将指定实体或实体属性的状态解析为数字,并在值匹配阈值时触发(严格低于/高于,因此等于被排除)。
如果同时指定below
和above
,则两个测试都必须通过。
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
实体), number
,sensor
和 zone
实体
包含数值,可用于above
和below
选项,使条件更加动态。
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 }}"
日落/日出条件
太阳条件还可以在触发器发生时测试太阳是否已经落下或升起。before
和after
键只能设置为sunset
或sunrise
。它们具有相应的可选偏移值(before_offset
,after_offset
),可以添加,类似于太阳触发器。
注意如果只使用before
键,条件将从午夜到日出/日落为真。如果只使用after
键,条件将在日落/日出后直到午夜为真。如果同时使用before: sunrise
和after: sunset
键,条件将在午夜到日出和日落到午夜之间为真。如果同时使用after: sunrise
和before: sunset
键,条件将在日出到日落之间为真。
日落/日出条件在极圈内的地点不可用,在具有高度偏斜本地时区的地点也不可用。在这些情况下,建议使用评估太阳高度的条件,而不是日落/日出条件。
这是日落前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 中所有接受条件的地方使用。例如,在and
,or
和not
条件中:
conditions:
- condition: or
conditions:
- "{{ is_state('device_tracker.iphone', 'away') }}"
- condition: numeric_state
entity_id: "sensor.temperature"
below: 20
它也支持在repeat
动作的while
或until
选项中,或在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
的有效值为mon
,tue
,wed
,thu
,fri
,sat
,sun
。
注意如果只使用before
键,条件将在指定时间之前从午夜为真。
如果只使用after
键,条件将在指定时间直到午夜为真。
时间条件窗口可以跨越午夜阈值,如果同时使用after
和before
键。在上面的示例中,条件窗口是从下午3点到凌晨2点。
对于after
和before
选项,可以使用时间助手(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
注意,时间条件仅考虑时间。如果 引用的传感器或助手实体包含带有日期的时间戳,日期部分将被完全忽略。
触发条件
触发条件可以测试自动化是否由某个触发器触发,触发器的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 }}"