脚本
脚本集成允许用户指定一系列由 Home Assistant 执行的操作。当你启动脚本时,这些操作会被执行。脚本集成将为每个脚本创建一个实体,并允许通过操作进行控制。
可以通过 YAML 配置(如下所述)或通过 用户界面 创建脚本。
配置
操作的顺序使用 Home Assistant 脚本语法 指定。
# 示例 configuration.yaml 条目
script:
message_temperature:
sequence:
# 这是 Home Assistant 脚本语法
- action: notify.notify
data:
message: "当前温度是 {{ states('sensor.temperature') }}"
脚本名称(例如,上述示例中的 message_temperature
)不得包含大写字母或连字符(减号)字符,即 -
。为更好的可读性,建议使用下划线(_
)字符来分隔单词。
Configuration Variables
脚本模式
模式 | 描述 |
---|---|
single |
不启动新运行。发出警告。 |
restart |
在停止前一个运行后启动新运行。 |
queued |
在所有先前运行完成后启动新运行。运行保证按照排队顺序执行。 |
parallel |
启动一个与先前运行并行的新独立运行。 |
传递变量给脚本
作为操作的一部分,变量可以传递给脚本,以便它们在该脚本的模板中可用。
要配置脚本以接受使用 UI 的变量,可以将变量作为字段添加到脚本编辑器。
- 在脚本编辑器中,在三点菜单中选择 添加字段。
- 在基本信息和 序列 部分之间添加一个名为 字段 的新部分。
- 输入名称并选择每个所需字段的类型和选项。
- 在此设置的字段将在其他 UI 编辑器中显示,例如在一个调用脚本的自动化中,作为输入根据字段类型。
- 要使用字段数据,请在它们被添加时使用 字段键名称 作为模板,如下例所示。
在脚本中使用变量需要使用模板:
# 示例配置.yaml 条目
script:
notify_pushover:
description: "发送 pushover 通知"
fields:
title:
description: "通知的标题"
example: "状态变化"
message:
description: "消息内容"
example: "灯是开着的!"
sequence:
- condition: state
entity_id: switch.pushover_notifications
state: "on"
- action: notify.pushover
data:
title: "{{ title }}"
message: "{{ message }}"
除了自动化编辑器 UI,可以在操作数据中将变量传递给脚本。这可以通过直接调用脚本或者通用的 script.turn_on
操作使用。区别在于 等待脚本完成 中有所描述。所有操作数据都将在模板中作为变量提供,即使没有在脚本中指定为字段。此示例展示了如何直接调用脚本:
# 示例配置.yaml 条目
automation:
triggers:
- trigger: state
entity_id: light.bedroom
from: "off"
to: "on"
actions:
- action: script.notify_pushover
data:
title: "状态变化"
message: "灯是开着的!"
此示例展示了使用 script.turn_on
操作:
# 示例配置.yaml 条目
automation:
triggers:
- trigger: state
entity_id: light.bedroom
from: "off"
to: "on"
actions:
- action: script.turn_on
target:
entity_id: script.notify_pushover
data:
variables:
title: "状态变化"
message: "灯是开着的!"
可以被模板使用的脚本变量包括以下内容:
-
从配置中作为字段提供的变量
-
在从操作启动时传递的数据变量,
-
this
变量,其值是当前脚本状态的字典。
等待脚本完成
在“直接”调用脚本(例如 script.NAME
)时,调用脚本将等待被调用脚本完成。
如果发生任何导致被调用脚本中断的错误,调用脚本也将中断。
通过 script.turn_on
操作调用脚本(或多个脚本)时,调用脚本 不会 等待。它按列出顺序启动脚本,并在最后一个脚本启动后立即继续。
在被调用脚本中发生的导致它们中断的任何错误 不会 影响调用脚本。
以下是调用脚本不等待的示例。它在被调用脚本“后台”运行时执行其他操作。然后通过 wait_template
等待被调用脚本完成。
这种技术也可以用于调用脚本等待被调用脚