脚本语法


脚本是Home Assistant将执行的一系列操作。必威是什么脚本可以作为一个实体通过独立的方式提供脚本组件但也可以嵌入自动化Alexa /亚马逊回声配置。

当脚本在自动化中执行时扳机可用变量。看到可用 - 触发数据

脚本语法的基本结构是包含动作的键/值映射列表。如果脚本只包含一个操作,换行列表可以省略。

所有操作都支持可选操作别名

这是使用脚本语法-别名:“打开天花板灯”服务:light编写的。Turn_on目标:entity_id:光。别名:“Notify that ceiling light is opened”服务:Notify。通知数据:消息:“打开了天花板灯!”

调用服务

最重要的是致电服务的行动。这可以以各种方式完成。对于所有不同的可能性,看看服务调用页面

- 别名:“卧室灯”服务:Light.Turn_On Target:Entity_ID:Group.bedroom数据:亮度:100

激活一个场景

脚本也可以使用快捷语法来激活场景,而不是调用scene.turn_on.服务。

——场景:scene.morning_living_room

变量

变量措施允许您设置/覆盖变量,该变量将通过模板在其后的操作中访问。也可以看看脚本变量了解如何在整个脚本中定义可访问的变量。

- 别名:“设置变量”变量:实体: -  Light.Kitchen  -  Light.Living_room亮度:100  - 别名:“控制灯”服务:Light.Turn_On目标:Entity_ID:“{{}}}”数据:亮度:“{{亮度}}“

变量的范围

变量具有本地范围。这意味着如果在嵌套的序列块中更改变量,则在外部序列块中不会看到该更改。

下面的例子总是说“There are 0 people home”。在选择序列变量行动只会改变现状该序列的变量。

将people变量设置为默认值- variables: people: 0 #如果Paulus是home,尝试增加people - choose: - conditions: - condition: state entity_id: device_tracker。paulus state: "home" sequence: #在这个范围和这个点的序列,people == 0 - variables: people: "{{people + 1}}" #在这个范围,people现在将是1…#……但在这个范围内,它仍然是0 #宣布人数在家服务:通知。通知数据:消息:“家里有{{人}}人”

测试一个条件

在执行脚本时,可以在主序列中添加一个条件以停止进一步的执行。当条件不返回时真正的,脚本将停止执行。有很多不同的情况被记录在条件页面

状况动作只会停止执行当前的序列块。当它在一个重复行动,只有当前的迭代重复循环将会停止。当它在一个选择行动,只有那个行动选择将会停止。

#如果paulus是home,请继续执行以下行下方的脚本 - 别名:“检查paulus是home的检查]条件:state entity_id:device_tracker.paulus状态:”home“

延迟

延迟对于暂时挂起脚本并在稍后时刻启动脚本非常有用。我们支持不同的延迟语法,如下所示。

#秒文件#等待5秒 - 别名:“等待5s”延迟:5
# HH:MM #等待1小时-延迟:“01:00”
#等待1.5分钟-延迟:“00:01:30”
#支持毫秒,秒,分钟,小时,天#可以组合使用,至少需要一个#等待1分钟-延迟:分钟:1

所有表单都接受模板。

等待多少分钟input_number。minte_delay被设置为- delay: "{{states('input_number.minute_delay') |乘(60)| int}}"

等待

这些操作允许脚本等待系统中的实体处于由模板指定的特定状态,或者某些事件发生以由一个或多个触发器所表达的。

等待模板

此操作评估模板,如果为true,则脚本将继续。如果没有,那么它会等到它是真的。

当模板引用的实体ID改变状态时,该模板将重新求值。如果你使用非确定性函数现在()在模板中,它不会被不断地重新求值,但只有当被引用的实体ID被改变时才会被重新求值。如果需要定期重新评估模板,请引用来自时间和日期将细本或每日更新的组件。

#等待媒体播放器被停止-别名:"等待媒体播放器被停止" wait_template: "{{is_state('media_player. is ');楼”、“停止”)}}”

等待触发

此操作可以使用自动化中可用的相同触发器扳机部分。看到自动触发.脚本将在任何触发器触发时继续执行。所有之前定义触发变量变量脚本变量传递给触发器。

#等待一个自定义事件或灯打开并保持10秒-别名:“等待MY_EVENT或灯亮”wait_for_trigger: -平台:事件event_type: MY_EVENT -平台:状态entity_id:灯。LIGHT to:“on”表示:10

等待超时

通过两种类型的等待,可以设置超时之后,如果不满足条件/事件,脚本将继续执行脚本。超时具有相同的语法延迟,就像延迟,也接受模板。

#等待传感器变为“on”1分钟,然后继续执行。- wait_template: "{{is_state('binary_sensor. ');入口','打开')}}"超时:"00:01:00"

您还可以通过使用可选的超时后获取脚本来中止continue_on_timeout:假

#等待IFTTT事件或在指定超时后中止。—wait_for_trigger:—platform: event event_type: ifttt_webhook_received event_data: action: connected_to_network timeout: minutes: "{{timeout_minutes}}" continue_on_timeout: false

没有continue_on_timeout:假该脚本将始终继续,因为默认的continue_on_timeout.真正的

等待变量

每次等待完成后,由于条件满足,事件发生,或者超时过期,变量等待将被创建/更新以指示结果。

变量 描述
wait.completed 之后只存在wait_template.真正的如果条件满足,错误的否则
wait.trigger 之后只存在wait_for_trigger.包含有关触发的触发器的信息。(见可用 - 触发数据.)将没有任何如果在超时过期之前发生触发器
等待 剩余超时,或者没有任何如果没有指定超时

这可以用于基于是否满足条件,或者在整体实现单个超时的同时按顺序使用多个等待的不同动作。

根据条件是否满足,采取不同的行动。- wait_template: "{{is_state('binary_sensor. ');}}" timeout: 10 - choose: - conditions: "{{not wait.completed}}" sequence: - service: script。Door_did_not_open默认值:—service: script。Turn_on目标:entity_id:—脚本。door_did_open——脚本。play_fanfare #等待10秒。- wait_template: "{{is_state('binary_sensor. ');门_1','on')}}" timeout: 10 continue_on_timeout: false - service:开关。Turn_on目标:entity_id:开关。Some_light - wait_for_trigger: - platform: state entity_id: binary_sensor。Door_2 to:“on”for: 2 timeout:“{{wait. wait.”Remaining}}" continue_on_timeout: false - service:开关。目标:entity_id:开关。some_light

火灾事件

此操作允许您触发一个事件。事件可以用于许多事情。它可以触发自动化或指示另一个集成正在发生一些事情。例如,在下面的例子中,它用于在日志中创建一个条目。

—alias:“Fire LOGBOOK_ENTRY event”事件:LOGBOOK_ENTRY event_data: name: Paulus message: is waking entity_id: device_tracker。保卢斯域:光

您还可以使用Event_Data以自定义数据启动事件。这可以用于将数据传递给等待事件触发的另一个脚本。

event_data接受模板。

-事件:MY_EVENT event_data:名称:myEvent customData: "{{myCustomVariable}}"

提升和消耗自定义事件

以下自动化示例显示了如何提出调用的自定义事件event_light_state_changedentity_id.作为事件数据。动作部分可以在脚本或自动化中。

—alias:“Fire Event”触发:—platform:状态entity_id:开关。Kitchen to: "on" action: - event: event_light_state_changed event_data: state: "on"

以下自动化示例显示了如何捕获自定义事件event_light_state_changed事件自动化触发器和检索相应entity_id.这是作为事件触发数据传递的,参见可用 - 触发数据更多细节。

- 别名:“capture事件”触发: - 平台:事件event_type:event_light_state_changed操作: - 服务:notify.notify数据:消息:“厨房灯被转动{{trigger.event.data.state}”

重复一组行动

此操作允许您重复一系列其他操作。嵌套是完全支持的。有三种方法可以控制序列运行的次数。

计算重复

此表单接受一个计数值。该值可以由模板指定,在这种情况下,当达到重复步骤时将呈现模板。

Script: flash_light: mode: restart sequence:—service: light。Turn_on目标:entity_id:“光。{{light}}"—alias: "Cycle light 'count' times" repeat: count: "{{count|int * 2 - 1}}" sequence:—delay: 2—service: light。切换目标:entity_id:“光。{{light}}" flash_hallway_light: sequence:—alias: "Flash走廊灯3次"服务:script。Flash_light数据:灯光:走廊数:3

循环时

此表格接受条件列表(见条件页面对于可用的选项)进行评估每次运行序列时。将运行该序列只要条件的值为真。

Script: do_something: sequence:—service: Script。get_ready_for_something—alias:“只要条件为真,重复序列”Repeat: while:—condition: state entity_id: input_boolean. get_ready_for_something—alias:“只要条件为真,重复序列”do_something状态:"on" #不要做太多次- condition: templateIndex <= 20}}"序列:- service: script.something

尽管还接受一个模板条件的速记符号.例如:

- repeat: while: "{{is_state('传感器。mode', 'Home'),然后重复。指数< 10 }}" sequence: - ...

重复直到

此表单接受要计算的条件列表每次运行序列时。因此序列总是至少运行一次。将运行该序列直到条件的值为真。

自动化: - 触发器: - 平台:状态entity_id:binary_sensor.xyz到:“开”条件: - 条件:状态entity_id:binary_sensor.something状态:“关闭”模式:单个动作: - 别名:“别名:”重复序列直到条件重复序列是真的“重复:序列:#wun命令出于某种原因并不总是工作 -  service:sh​​ell_command.turn_something_on#给它时间来完成 - 延迟:毫秒:200直到:#- 条件:状态entity_id:binary_sensor.something状态:“开启”

直到还接受一个模板条件的速记符号.例如:

- repeat: until: "{{is_state('device_tracker. ') . "Iphone ', 'home')}}"序列:-…

重复循环变量

一个变量命名重复是在重复操作中定义的(例如,它是在顺序尽管直到.)它包含以下字段:

场地 描述
第一的 在重复序列的第一次迭代时为
指数 循环的迭代次数:1,2,3,…
去年 在重复序列的最后一次迭代期间,这仅适用于计数循环

选择一组动作

此操作允许您从序列列表中选择其他操作的序列。嵌套是完全支持的。

每个序列都与一个条件列表配对。(见条件页面获取可用选项以及如何处理多个条件。)运行条件全部为真的第一个序列。一个可选默认的可以包含序列,只有在列表中没有序列中都没有运行。

一个可选别名可以添加到每个序列中,不包括默认的顺序。

选择动作可以像“if”语句一样使用。第一个条件/顺序Pair类似于“if/then”,可以单独使用。或者可以添加额外的对,每个对就像一个“elif/then”。最后,一个默认的可以添加,就像" else "一样

#使用一个“if”自动化的例子:- trigger: - platform: state entity_id: binary_sensor。动作:“on”动作:—choose:—alias:“IF nobody home, sound the alarm!”条件:—condition: state entity_id: group。Family state: not_home sequence:—service: script。警笛数据:时长:60—service:灯。Turn_on目标:entity_id:所有
#使用"if"和"else"自动化的示例:运动模式:排队动作:- alias:“打开前灯,如果运动检测,否则关闭”选择:# if运动检测- alias:“运动检测”条件:“{{trigger.to_state.”。State == 'on'}}"序列:—service:脚本。Turn_on目标:entity_id:—脚本。slowly_turn_on_front_lights——脚本。announce_someone_at_door # ELSE(即,动作停止)默认:- service: light。目标:entity_id: light.front_lights
#使用"if", "elif"和"else"自动化的示例:模拟:"on"模式:重启动作:- choose: # IF morning - conditions: - condition: template value_template: "{{now(). "Hour < 9}}" sequence:—service: script。sim_morning # ELIF天-条件:-条件:模板value_template: "{{现在()。小时< 18}}”序列:—服务:光。Turn_off target: entity_id: light。服务:脚本。sim_day # ELSE default: - service: light。Turn_off target: entity_id: light。厨房-延迟:分钟:“{{范围(1,11)|随机}}”-服务:轻。Turn_off target: entity_id: all

条件还接受一个模板条件的速记符号.例如:

自动化:—触发器:—平台:状态entity_id: input_select。Home_mode动作:—choose:—conditions: > {{trigger.to_state. to_state。state == 'Home'和is_state('binary_sensor. ')。All_clear ', 'on')}}序列:—service:脚本。Arrive_home data: ok: true - conditions: > {{trigger.to_state。state == 'Home'和is_state('binary_sensor. ')。All_clear ', 'off')}}序列:—service:脚本。Turn_on目标:entity_id:脚本。Flash_lights—服务:脚本。Arrive_home数据:ok: false -条件:“{{trigger.to_state。- service: script.left_home . state == 'Away'}}"

更多的选择可以一起使用。这是IF-IF的情况。

下面的示例展示了单个自动化如何控制彼此不相关但具有相同触发器的实体。

当太阳落在地平线下时门廊花园灯必须打开。如果有人在起居室看电视,那么有人在那间房间里有很大的机会,因此客厅灯也必须打开。相同的概念适用于工作室房间。

#示例"if"和"if"自动化:- alias: "Turn lights on when the sun gets dim and if some room is occupied"触发器:- platform: numeric_state entity_id: sun。太阳属性:海拔以下:4动作:#这必须总是适用-服务:光。Turn_on数据:亮度:255 color_temp: 366目标:entity_id: -光。门廊——光。花园# IF a entity is ON - choose: - conditions: - condition: state entity_id: binary_sensor.livingroom_tv state: "on" sequence: - service: light.turn_on data: brightness: 255 color_temp: 366 target: entity_id: light.livingroom # IF another entity not related to the previous, is ON - choose: - conditions: - condition: state entity_id: binary_sensor.studio_pc state: "on" sequence: - service: light.turn_on data: brightness: 255 color_temp: 366 target: entity_id: light.studio
Baidu