脚本语法


脚本是家庭助理将执行的一系列操作。19463331伟德国际脚本可作为独立的实体可用脚本组件但也可以嵌入自动化Alexa / Amazon Echo配置。

当脚本在自动化中执行时触发变量可用。看Available-Trigger-Data

脚本语法基本结构是包含操作的键/值映射列表。如果脚本仅包含1个操作,则可以省略包装列表。

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

#示例脚本集成包含脚本语法脚本:example_script:sequence:#这是使用脚本语法 - 别名编写的:“打开天花板灯”服务:light.turn_on目标:entity_id:light.cleiling  - 别名:“通知天花板打开“服务:Notify.Notify数据:消息:”在天花板灯上打开!“

致电服务

最重要的一个是调用服务的操作。这可以通过多种方式实现。对于所有不同的可能性,看看服务呼叫页面

别名:“Bedroom lights on”服务:light。turn_on目标:entity_id:组。卧室数据:亮度:100

激活一个场景

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

- 场景:场景.. _living_room

变量

变量操作允许你设置/覆盖变量,这些变量将被模板在操作之后访问。另请参阅脚本变量如何定义在整个脚本中可访问的变量。

—alias:“Set variables”变量:entities:—light。厨房——光。living_room亮度:100 -别名:“控制灯”服务:光。turn_on目标:entity_id:“{{实体}}”数据:亮度:“{{亮度}}”

测试一个条件

在执行脚本时,您可以添加一个条件以停止进一步执行。当条件没有返回时真正的,脚本将停止执行。有许多不同的条件记录在条件页面

alias: "Check If paulus is home" - condition: state entity_id: device_tracker. #如果paulus是home,继续执行下面的脚本。保卢斯:“家”

延迟

延迟对于临时暂停脚本并在以后的时刻启动它是有用的。我们支持延迟的不同语法,如下所示。

# Seconds #等待5秒-别名:"Wait 5s"延迟:5秒
#hh:mm#等待1小时 - 延迟:“01:00”
#hh:mm:ss#等1.5分钟 - 延迟:“00:01:30”
#支持毫秒,秒,分钟,小时,天数可以组合使用,至少一个必需#等待1分钟 - 延迟:分钟:1

所有的表单都接受模板。

#等待许多分钟input_number.minute_delay被设置为 -  delay:“{{sound_number.minute_delay')|乘以(60)| int}}”

等待

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

等模板

该操作对模板进行计算,如果为真,脚本将继续执行。如果不是,那么它将等待直到它是真实的。

每当IT引用更改状态的实体ID时,重新评估模板。如果您使用非确定性功能现在()在模板中,它不会被连续重新评估,但仅在更改引用的实体ID时。如果您需要定期重新评估模板,请参考传感器时间和日期组件将每分钟或每天更新。

#等待媒体播放器停止 - 别名:“等待媒体播放器停止”wait_template:“{{is_state('media_player.floor','stop')}}”

等待触发器

此操作可以使用自动化中可用的相同的触发器触发部分。看自动化触发器。只要任何触发器都触发,脚本将继续。所有先前定义的trigger_variables.变量脚本变量传递给扳机。

#等待自定义事件或光线打开并保持10秒 - 别名:“等待My_Event或亮起”wait_for_trigger: -  platform:event event_type:my_event  - 平台:状态entity_id:light.light in:“开“对于:10

等待超时

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

#等待传感器在继续执行之前将传感器更改为最多1分钟。-  wait_template:“{{is_state('binary_sensor.entrance','上')}}”超时:“00:01:00”

您还可以使用可选的超时后获取脚本以中止continue_on_timeout:false.

#等待IFTT事件或指定超时后中止。-  wait_for_trigger: - 平台:事件event_type:ifttt_webhook_received event_data:action:connected_to_network timeout:分钟:“{timeout_minutes}}”continue_on_timeout:false

没有continue_on_timeout:false.自默认值以来,脚本将始终继续continue_on_timeout真正的

等变量

每次等待完成后,要么是因为满足条件,事件发生了,或者超时到期,变量等待将创建/更新以指示结果。

多变的 描述
等待 后只存在wait_template.真正的如果遇到条件,错误的否则
wait.trigger. 后只存在wait_for_trigger.。包含关于哪个触发器被触发的信息。(见Available-Trigger-Data。) 将会没有一个如果在超时过期之前没有触发
等待 剩下超时,或没有一个如果未指定超时

这可以用于根据是否满足条件采取不同的操作,或者在实现单个超时时连续使用多个等待。

#根据满足条件,采取不同的操作。-  wait_template:“{{is_state('binary_sensor.door','上')}”超时:10  - 选择: - 条件:“条件:”{{不等待得到的}}“序列: - 服务:strevist.door_did_not_open默认值:-  service:script.turn_on目标:entity_id: -  script.door_did_open  -  script.play_fanfare#等待10秒。-  wait_template:“{{is_state('binary_sensor.door_1','上')}}”timeout:10 continue_on_timeout:false  - 服务:switch.turn_on目标:entity_id:switch.some_light  -  wait_for_trigger: - 平台:状态entity_id:binary_sensor.door_2至:“开启”:2超时:“{{wait.remailing}}”continue_on_timeout:false  - 服务:switch.turn_off目标:entity_id:switch.some_light.some_light.some_light.some_light

火灾

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

- 别名:“fire logbook_entry事件”事件:logbook_entry event_data:name:paulus消息:正在唤醒entity_id:device_tracker.paulus域:灯

您还可以使用event_data来触发带有自定义数据的事件。这可以用来将数据传递给等待事件触发器的另一个脚本。

event_data.接受模板。

- 事件:my_event event_data:name:myevent customdata:“{{mycustomvariable}}”

引发和使用自定义事件

下面的自动化示例演示如何引发自定义事件调用event_light_state_changedentity_id作为事件数据。动作部分可以在脚本或自动化内部。

- 别名:“Fire事件”触发器: - 平台:状态entity_ID:switch.kitchen到:“开启”操作: - 事件:event_light_state_changed event_data:状态:状态:状态:状态:“ON”

下面的自动化示例展示了如何捕获自定义事件event_light_state_changed与一个事件触发自动化,并检索相应的entity_id这是作为事件触发数据传递,请参阅Available-Trigger-Data为更多的细节。

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

重复一组动作

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

重复计算

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

脚本:flash_light:mode:重启顺序: - 服务:light.turn_On目标:Entity_ID:“灯。{{灯}}” - 别名:“循环灯”计数'times“重复:count:”{{count | int *2  -  1}}“序列: - 延迟:2  - 服务:Light.Toggle Target:Entity_ID:”光。{{灯}}“Flash_Hallway_light:Sequence: - 别名:”Flash Hallway Light 3次“服务:script.flash_light数据:灯光:走廊数量:3

While循环

此表单接受一系列条件(请参阅条件页面用于评估的可用选项之前每次运行序列时。序列将运行只要条件评估为true。

脚本:do_something:sequence: -  service:stript.get_ready_for_something  -  alias:只要条件为true重复序列“重复:wist: - 条件:状态entity_id:input_boolean.do_something状态:”开启“#它太多了 - 条件 - 条件:模板value_template:“{{repeat.index <= 20}}”序列: - 服务:script.something

也接受A.模板条件的速记表示。例如:

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

重复直到

此表格接受评估的条件列表每次运行序列时。因此,序列总是至少运行一次。序列将运行直到条件评估为true。

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

直到也接受A.模板条件的速记表示。例如:

-直到:"{{is_state('device_tracker. ')}}"序列:-…

重复循环变量

一个名为的变量重复在重复动作内定义(即,它在里面可用序列直到。)它包含以下字段:

描述
第一个 在重复序列的第一次迭代期间为真
指数 循环的迭代号:1,2,3,...
最后的 在重复序列的最后一次迭代期间为True,这仅对已计数的循环有效

选择一组行动

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

每个序列都与条件列表配对。(见条件页面有关可用选项以及如何处理多个条件。)运行条件的第一个序列将运行。一个可选的默认只在列表中没有一个序列运行时才会运行序列。

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

选择操作可以像“if”声明一样使用。首先条件/序列对就像“if /那”,并且可以自身使用。或者可以添加其他对,每个对就像一个“Elif /那么”。最后,一个默认可以添加,这就像“别的”。

#示例只是一个“if”自动化: - 触发器: - 平台:状态entity_id:binary_sensormotion to:“开启”操作: - 选择: - 别名:“如果没有人回家,则发出警报!”条件: - 条件:状态entity_id:group.family状态:not_home序列: -  service:script.siren数据:持续时间:60  - 服务:light.turn_On目标:Entity_ID:全部
#示例有“如果”和“else”自动化: - 触发器: - 平台:状态entity_id:binary_sensormotion模式:排队操作: - 别名:“如果检测到动作,则打开前灯,否则关闭”选择:#detected - alias: "Motion detected" conditions: "{{ trigger.to_state.state == 'on' }}" sequence: - service: script.turn_on target: entity_id: - script.slowly_turn_on_front_lights - script.announce_someone_at_door # ELSE (i.e., motion stopped) default: - service: light.turn_off target: entity_id: light.front_lights
自动化:—trigger:—platform: state entity_id: input_boolean。模拟为:"on"模式:重启动作:—选择:# IF morning—条件:—条件:模板value_template: "{{now()。小时< 9}}"序列:—服务:脚本。sim_morning # ELIF day - condition: - condition: template value_template: "{{now()。小时< 18}}"序列:-服务:光。turn_off目标:entity_id:灯。living_room服务:脚本。sim_day # ELSE night默认值:- service: light。turn_off目标:entity_id:灯。kitchen - delay: minutes: "{{range(1,11)|random}}" - service: light。turn_off目标:entity_id: all

条件也接受A.模板条件的速记表示。例如:

自动化: - 触发器: - 平台:状态entity_id:input_select.home_mode操作: - 选择: - 条件:> {{trigger.to_state.state =='home'和is_state('binary_sensor.all_clear','上')}}序列: -  service:script.arrive_home数据:确定:真实 - 条件:> {{trigger.to_state.state =='home'和is_state('binary_sensor.all_clear','off')}}序列: - 服务:脚本。turn_on target: entity_id: script.flash_lights - service: script.arrive_home data: ok: false - conditions: "{{ trigger.to_state.state == 'Away' }}" sequence: - service: script.left_home

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

以下示例显示了单个自动化如何控制与彼此无关但具有共同触发器的实体。

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

#示例有“if”和“如果”自动化: - 别名:“当太阳昏暗时,转动灯亮起,如果占用一些房间占用”触发器: - 平台:numeric_state entity_id:sun.sun属性:高度以下:4行动:4#这必须始终适用 - 服务:Light.Turn_On数据:亮度:255 Color_Temp:366目标:Entity_ID: -  Light.porch  -  Light.Garden#如果实体正在开启 - 选择: - 条件: - 条件:状态:状态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