本帖最后由 SilverWolf 于 2022-10-15 14:09 编辑
Template (模板) Template集成允许你创建由其他数据中取值或判断的实体。这些实体的属性值来自于指定模板获取或计算所完成的。 本页包含,传感器、二元传感器(例如:开/关)、按钮、数字项和选择项。对于其他类型,请参阅特定页面: 传感器、二元传感器、按钮、数字项和选择项的template实体需要在 YAML 配置文件template: 下直接定义,无法通过 UI 进行配置。您可以将多个配置写成一个列表。分别定义每个部分,如:传感器/二元传感器/数字项/选择项实体,并且可以包含更新触发器(update trigger)的选项。 基于状态的模板(template)传感器、二元传感器、按钮、数字项和选择项 默认情况下,只要模板中的任何引用数据更新,模板(template)实体就会立即更新。 例如,您可以有一个模板来获取两个传感器的平均值。HomeAssistant将在任一源传感器更新后立即更新您的模板(template)传感器。
template:
- sensor:
- name: "Averagetemperature"
unit_of_measurement: "°C"
state: >
{% set bedroom = states('sensor.bedroom_temperature') | float %}
{% set kitchen = states('sensor.kitchen_temperature') | float %}
{{ ((bedroom + kitchen) /2) | round(1, default=0) }}
基于触发器的模板二元传感器、按钮、数字、选择和传感器 如果要更好地控制实体何时更新,可以定义触发器。触发器遵循与自动化中的触发器相同的格式和工作原理。此功能是基于 Webhook 数据(见下面webhook)创建实体或基于计划更新实体。 每当触发器触发时,所有相关实体都将重新更新,并且它将有权访问模板中的触发信息。 当模板中引用的状态发生更改时,基于触发器的实体不会自动更新。为需要触发更新的实体定义状态触发器,可以重新添加此功能。 另外每当重新启动HomeAssistant时,基于触发器的传感器和二元传感器的状态(包括属性)将被重置。其他基于触发器模板的实体状态则不受影响。
# 示例 configuration 中输入
template:
- trigger:
- platform: time_pattern
# 将会在每晚更新
hours: 0
minutes: 0
sensor:
# 跟踪自设定日期以来已经过去了多少天
- name: "Not smoking"
state: '{{ ( (as_timestamp(now()) - as_timestamp(strptime("06.07.2018","%d.%m.%Y")) ) / 86400 ) | round(default=0) }}'
unit_of_measurement: "Days"
配置变量 (sensor,binary_sensor, number...... 等这些类,用哪个写哪个,小白别一股脑全扔上去。)
trigger 列表(可选) 定义自动化触发器以更新实体。可选。如果省略,将基于引用的实体进行更新。请参阅触发器文档。 unique_id 字符串(可选) 此 Config Block的唯一 ID。这将作为此Block中所有实体的所有唯一 ID 的前缀。 sensor 必填 (传感器类可以获取值) 传感器列表 定义一个模板以获取传感器的状态值。 unit_of_measurement字符串(可选,默认值:无) 定义传感器的测量单位(如果有)。这还将根据用户配置文件“数字格式”设置显示该值,并将历史记录可视化中的图形显示作为连续值影响。 state_class字符串(可选,默认值:无) 传感器的state_class还将根据用户配置文件中所编辑的格式显示该值,并影响历史记录可视化中的图形表示作为连续值。
binary_sensor列表必填 (二元传感器类可以获取特定的两个值。多用于判断。) 二元传感器列表 如果模板的计算结果为True,yes,on,enable,则为on。任何其他值都会将呈现为off。前端(Open/Closed,Detected/ Clear等)中的实际显示取决于传感器的device_class值 delay_on 时间(可选) 在此传感器切换到on 之前必须满足 模板状态的时间量(例如0:00:05)。这也可以是一个模板。 delay_off 时间(可选) 在此传感器切换到off 之前必须不满足模板状态的时间量。这也可以是一个模板。 auto_off 时间(可选) 需要触发器。在打开后多长时间关闭。
sensor和binary_sensor实体 列表(可选) (通用于传感器和二元传感器的选项) 上面可用于传感器和二元传感器的字段。 为传感器实体添加一张图片 attributes列表(可选) 定义传感器属性的模板。 属性和相应的模板。 设置设备的class(类),更改 UI 上显示的设备状态和图标(见下文)。无需设置unit_of_measurement
number 列表 必填 (数字类型,例如模板判断家里有几个人返回值 5) 数字项 获取当前数字值的模板。 定义当数字值改变时要运行的action。变量值将包含输入的数字值 模板值递增/递减的步数。例:每次+1或-1 数字模板的最小值 数字模板的最大值 optimistic 布尔 (可选,默认值: false) 数字项在正常模式下工作时设定标记。
select 列表 必填 (选择类型,从下拉列表选择对应的选项,并执行相应的动作。不执行也可以) 列出一个选项菜单来选择值 选项的状态值模板 定义列表中的选项,以及选项所对应的操作。该变量将包含选项optionsoption 列表中可供选择的选项 optimistic 布尔(可选,默认值: false) 选择项在正常模式下工作时设定标记。
button列表 必填 (按钮类型) 列出所需按钮 定义为按下按钮要进行的操作。
[all sensor, binary sensor, button, number, select entities]列表(可选) (所有类型通用词条) 通用于传感器、二元传感器、按钮、数字项和选择项的字段。 定义一个模板以获取实体的名称。 unique_id字符串(可选) 唯一标识此实体的 ID。将与配置Block的唯一 ID(如果可用)结合使用。允许从 Web 界面更改名称,图标和实体ID 为模板实体指定图标 定义一个模板以获取来自实体的可用状态。如果模板无法呈现或返回True,"1","true","yes","on","enable" 或非零数字,则实体将为available(可用)。如果模板返回任何其他值,则实体将为unavailable(不可用)。如果未配置,则实体将始终为available(可用)。请注意,字符串比较不区分大小写; 像此类字符"TrUe","yEs"也是可以接受的。 上述配置变量描述了一个配置部分。模板集成允许定义多个配置部分。即使重复也没有关系。
# 示例configuration.yaml 入口有两个部分
template:
# 定义基于触发器的模板实体
- sensor:
...
- binary_sensor:
...
# 定义基于触发器的模板实体
- trigger:
...
sensor:
...
binary_sensor:
...
模板和操作变量 基于状态和基于触发器的模板实体在其模板和操作中提供了特殊的模板变量。这些特殊的模板变量可以在template和actions中使用。其中变量可以是实体的对象状态,这有助于在模板和操作中self-referencing(自引用)实体的状态和属性。基于触发器的实体还提供trigger data触发器数据。 速率限制更新 如果模板中存在实体且未定义触发器,则当其中一个实体更改状态时,将 re-render整个Template。为避免占用“HomeAssistant”中的过多资源,如果短时间内检测到太多状态变化,系统将自动应用速率限制。 说明 PS:由于找不到恰当地解释,为防止误导,此处使用原文 re-render(直译为:重新呈现。也可以理解为重新加载。) 当在模板中单独使用状态来迭代系统上的所有状态时,如果访问了状态的任何部分,则每当发生任何状态更改事件时,模板就会 re-render。当只计算状态时,只有在添加或从系统中删除状态时才 re-render模板。在重度工作的系统中,例如:数十万状态更改事件的情况下,模板的 re-render可能会超出预期。
template:
- binary_sensor:
- name: "Has Unavailable States"
state: "{{ states | selectattr('state', 'in',['unavailable', 'unknown', 'none']) | list | count }}"
在下面的示例中, re-render限制为每秒一次,因为我们迭代单个domain中的所有(传感器)实体:
template:
- binary_sensor:
- name: "Has Unavailable States"
state: "{{ states.sensor | selectattr('state','in', ['unavailable', 'unknown', 'none']) | list | count }}"
如果模板访问系统上的每个状态,则应设置每分钟一次更新的速率限制。如果模板访问特定域下的所有状态,则应设置每秒更新一次的速率限制。如果模板只访问特定的状态,则应指定实体的更新事件,或使用homeassistant.update_entity接收更新事件。不限制速率。
注意事项: 启动 如果正在使用的平台状态在启动期间可能不可用,则Template Sensor可能会获得未知状态。为了避免这种情况,可以在模板中使用is_state()函数。例如,你可以将{{states.switch.source.state == 'on'}}替换为返回true/false且从不给出未知结果的等价函数:
示例: 在本节中,您将找到一些如何使用模板传感器的示例。 基于触发器的传感器和二元传感器存储 WEBHOOK 信息 模板实体可以使用任何自动化触发器触发,包括webhook触发器。使用基于触发器的模板实体来将这些信息存储在模板实体中。
template:
- trigger:
- platform: webhook
webhook_id: my-super-secret-webhook-id
sensor:
- name: "Webhook Temperature"
state: "{{ trigger.json.temperature }}"
unit_of_measurement: °C
- name: "Webhook Humidity"
state: "{{ trigger.json.humidity }}"
unit_of_measurement: %
binary_sensor:
- name: "Motion"
state: "{{ trigger.json.motion }}"
device_class: motion
您可以使用以下 CURL 命令测试此触发器实体:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"temperature": 5,"humidity": 34, "motion": true}' \
http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id
将事件转换为基于触发器的二元传感器 可以使用基于触发器的模板实体将任何事件或其他自动化触发器转换为二元传感器。 当自动化触发器触发时,以下配置将打开二元传感器 5 秒钟。
template:
- trigger:
platform: event
event_type: my_event
binary_sensor:
- name: Event recently fired
auto_off: 5
state: "true"
基于状态的传感器,太阳光度角 此示例显示前端的太阳角度。
template:
- sensor:
- name: Sun Angle
unit_of_measurement: "°"
state: "{{ '%+.1f'|format(state_attr('sun.sun','elevation')) }}"
基于一个传感器的状态修改另一个传感器的输出 (个人最喜欢的用途就是将一些英文集成输出的状态转成中文) 如果您不喜欢传感器输出的措辞,那么模板传感器也可以提供帮助。让我们将 Sun 集成的输出重命名为一个简单的示例:
template:
- sensor:
- name: "Sun State"
state: >
{% if is_state('sun.sun','above_horizon') %}
up
{% else %}
down
{% endif %}
基于状态的传感器,带有多行模板和 IF 测试 这个例子展示了一个带有 if 的多行模板。它监听着一个感应开关,除了在前端显示开/关外,如果功耗低于1000瓦,则显示“待机”。
template:
- sensor:
- name: "Kettle"
state: >
{% if is_state('switch.kettle','off') %}
off
{% elif state_attr('switch.kettle','W')|float < 1000 %}
standby
{% elif is_state('switch.kettle','on') %}
on
{% else %}
failed
{% endif %}
基于状态的传感器更改另一个传感器的测量单位 通过template传感器,如果测量单位不符合您的需求,则可以轻松将单位转换为其他值。
template:
- sensor:
- name: "Transmission Down Speed"
unit_of_measurement: "kB/s"
state: "{{states('sensor.transmission_down_speed')|float * 1024 }}"
- name: "Transmission Up Speed"
unit_of_measurement: "kB/s"
state: "{{ states('sensor.transmission_up_speed')|float* 1024 }}"
基于状态的二元传感器 - 洗衣机运行 本例通过监听洗衣机所连接的电能表,创建了一个洗衣机“负载运行”传感器。在洗衣机的运行过程中,电能表会剧烈波动,甚至在洗衣完成之前就经常降到零。通过使用delay_off,我们可以让这个传感器只在洗衣机没有活动5分钟时才关闭。
# 确定洗衣机什么时候开始运转
template:
- binary_sensor:
- name: "Washing Machine"
delay_off:
minutes: 5
state: >
{{states('sensor.washing_machine_power')|float > 0 }}
基于状态的二元传感器 - 有人在家吗 这个例子是基于设备跟踪和运动传感器的组合来确定是否有人在家。假设你的孩子/保姆/祖父母还在你家里,而HomeAssistant中没有可跟踪他们的设备,这将非常有用。这提供了例如Wi-Fi,device_tracker,Z-Wave等多个传感器进行组合从而进行存在的判断。
template:
- binary_sensor:
- name: People home
state: >
{{ is_state('device_tracker.sean','home')
oris_state('device_tracker.susan', 'home')
oris_state('binary_sensor.office_124', 'on')
oris_state('binary_sensor.hallway_134', 'on')
oris_state('binary_sensor.living_room_139', 'on')
oris_state('binary_sensor.porch_ms6_1_129', 'on')
oris_state('binary_sensor.family_room_144', 'on') }}
基于状态的二元传感器 - 具有纬度和经度属性的设备跟踪器传感器 这个例子展示了如何组合非GPS(例如NMAP)和GPS设备跟踪器,同时包含纬度和经度属性
template:
- binary_sensor:
- name: My Device
state: >
{{is_state('device_tracker.my_device_nmap', 'home') oris_state('device_tracker.my_device_gps', 'home') }}
device_class: "presence"
attributes:
latitude: >
{% ifis_state('device_tracker.my_device_nmap', 'home') %}
{{ state_attr('zone.home','latitude') }}
{% else %}
{{state_attr('device_tracker.my_device_gps', 'latitude') }}
{% endif %}
longitude: >
{% ifis_state('device_tracker.my_device_nmap', 'home') %}
{{ state_attr('zone.home','longitude') }}
{% else %}
{{state_attr('device_tracker.my_device_gps', 'longitude') }}
{% endif %}
基于状态的二元传感器 - 当状态更改时更改图标 此示例演示如何使用模板在图标的状态更改时更改图标。此图标引用其自己的状态。
template:
- binary_sensor:
- name: Sun Up
state: >
{{ is_state("sun.sun","above_horizon") }}
icon: >
{% ifis_state("binary_sensor.sun_up", "on") %}
mdi:weather-sunset-up
{% else %}
mdi:weather-sunset-down
{% endif %}
更高级的用例可能是像上面那样根据传感器自身的状态设置图标,但当由事件触发时。这个例子演示了一个随时打开的二元传感器,比如当门铃按钮被按下时。
当接收到适当的事件时,二元传感器打开并设置匹配的图标。5秒后,二元传感器自动关闭。为了确保图标得到更新,当状态更改为关闭时,必须有一个触发器。
template:
- trigger:
- platform: event
event_type: YOUR_EVENT
- platform: state
entity_id: binary_sensor.doorbell_rang
to: "off"
binary_sensor:
name: doorbell_rang
icon: "{{ (trigger.platform == 'event') |iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
state: "{{ trigger.platform == 'event' }}"
auto_off:
seconds: 5
基于状态的选择控制相机的昼/夜模式
template:
select:
- name: "Porch Camera Day-Night Mode"
unique_id: porch_camera_day_night_mode
state: "{{ state_attr('camera.porch_camera_sd','day_night_mode') }}"
options: "{{ ['off', 'on', 'auto'] }}"
select_option:
- service: tapo_control.set_day_night_mode
data:
day_night_mode: "{{ option }}"
target:
entity_id: camera.porch_camera_sd
自我引用 这个例子演示了如何在模板中使用This变量进行自引用。
template:
- sensor:
- name: test
state: "{{ this.attributes.test |default('Value when missing') }}"
# not: "{{ state_attr('sensor.test','test') }}"
attributes:
test: "{{ now() }}"
事件event_template_reloaded 事件event_template_reloaded在模板实体已被重新加载且实体可能已发生更改时被触发。 此事件没有其他数据。
隐藏内容 |