模板


这是家庭助理的高级功能。必威是什么您需要对:

模板是一个强大的功能,可让您控制进入系统的信息。它用于:

建筑模板

在家庭助理中的模板由必威是什么Jinja2模板引擎。这意味着我们正在使用他们的语法,并在渲染过程中使模板可用一些自定义的家庭助理变量。必威是什么Jinja2支持各种各样的操作:

我们不会介绍语法的基础知识,因为Jinja2在他们的工作中做得很好模板文档

前端有一个模板编辑器工具帮助开发和调试模板。导航开发人员工具>模板,在模板编辑器并在右侧检查结果。

模板可以很快变大。要保持清晰的概述,请考虑使用YAML多行字符串来定义您的模板:

脚本msg_who_is_home序列-服务notify.notify数据信息>{%如果IS_STATE('device_tracker.paulus','home')%}哈,保卢斯在家!{% 别的 %}Paulus在{{state('device_tracker.paulus')}}}。{% 万一 %}

重要的模板规则

在将模板添加到YAML时,有一些非常重要的规则要记住:

  1. 必须用双引号包围单线模板()或单引号(')。
  2. 建议您通过使用未定义的变量如果...不是没有或者默认筛选, 或两者。
  3. 建议在比较数字时,您将数字转换为漂浮或一个int通过使用各自的筛选
  4. 漂浮int过滤器确实允许默认的后备值,如果转换不成功,它们无法提供捕获未定义变量的能力。

记住这些简单的规则将有助于您在使用自动化模板时从许多头痛和无休止的挫败感中挽​​救您。

必威是什么家庭助理模板扩展

扩展程序允许模板访问所有家庭助理特定状态,并添加其他便利功能和过滤器。必威是什么

有限的模板

一些模板触发器trigger_variables仅支持家庭助理模板扩展的子集。必威是什么该子集称为“有限模板”。

状态

不支持有限的模板

  • 迭代状态将通过实体ID按字母顺序排列的每个状态。
  • 迭代国家将通过实体ID按字母顺序排序该域的每个状态。
  • states.sensor.temperature返回状态对象传感器(在可能的情况下避免,请参见下面的注释)。
  • 状态('device_tracker.paulus')将返回给定实体的状态字符串(不是对象),未知如果不存在,不可用如果对象存在但尚未可用。
  • is_state('device_tracker.paulus','home')将测试给定实体是否是指定状态。
  • state_attr('device_tracker.paulus','电池')如果不存在,将返回属性的值或无。
  • is_state_attr('device_tracker.paulus','电池',40)将测试给定的实体属性是否为指定状态(在这种情况下为数字值)。请注意,属性可以是没有任何您想检查是否是没有任何,您需要使用state_attr('sensor.my_sensor','attr')==无

避免使用states.sensor.temperature.state,而是使用状态(“传感器”)。强烈建议使用状态(),,,,is_state(),,,,state_attr()is_state_attr()尽可能多地,避免实体尚未准备就绪时(例如,在家庭助理启动期间)时发生错误和错误消息。必威是什么

除了正常状态对象方法和属性,,,,states.sensor.temperature.state_with_unit将打印实体的状态,如果有的话,将打印该设备。

国家例子

接下来的两个陈述如果状态存在,则会导致相同的值。如果状态不存在,第二个将导致错误。

{{state('device_tracker.paulus')}}}} {{states.device_tracker.paulus.state}}}}

打印出所有传感器状态的列表:

{attentate.sensor%} {{state.entity_id}} = {{state.state}},{%endfor%}

其他国家示例:

{%如果IS_STATE('device_tracker.paulus','Home')%} ha,Paulus是家!{%else%} Paulus在{{states('device_tracker.paulus')}}}。{%endif%} #check sensor.train_departure_time state {%如果states('senser.train_departure_time')in(“'novable”,“ novable”,“ unknown”)%} {...}} {...}}} {{.temperature')%} {{state |float + 1如果is_number(state)else“无效温度”}}} {%set state = state('sensor.temperature')%} {{(state | float * 10)|(2)如果is_number(state)}} {%set state = state = state('sensor.temperature')%} {%如果is_number(state)和状态|浮点> 20%}它很温暖!{%endif%} {{as_timestamp(states.binary_sensor.garage_door.last_changed)}}}}} {{as_local(states.binary_sensor.garage_door.garage_door.garage_door.last_changed)}}}}}}} {as_timestamp(as_timestamp(as_timestamp(as_timestamp(as_timestamp))last_changed)}}} {{as_local(states.sensor.time.last_changed)}}}}} {{states('sensor.expires')|AS_DATETIME}}

属性

不支持有限的模板

您可以打印一个属性state_attr如果定义状态。

属性示例

{%如果states.device_tracker.paulus%} {{state_attr('device_tracker.paulus','battery')}}}}}} {%else else%}{% 万一 %}

与字符串:

{%set tracker_name =“ paulus”%} {%如果states(“ device_tracker。” + tracker_name)!=“ unknown”%} {{state_attr(“ device_tracker。” + tracker_name,“ battery”,“ batte} ??{% 万一 %}

与小组一起工作

不支持有限的模板

扩张功能和过滤器可用于对实体进行分类和扩展组。它输出一个无重复的实体排序阵列。

扩展示例

{for Tracker在Expand('device_tracker.paulus','group.child_trackers')%} {{state_attr(tracker.entity_id,'battery'')}} {% - 如果不是loop.last%},{%endif--%} {%endfor%}

同一件事也可以表示为过滤器:

{{{['device_tracker.paulus','group.child_trackers'])|selectAttr(“ attributes.battery”,'定义')|join(',',属性=“ attributes.battery”)}}}}}
{%为Expand('group.energy_sensors')的能量,如果IS_NUMBER(engers.State)%} {{energy erent.State}} {% - 如果不是loop.last%},{%endif-%}}

同样的事情也可以表示为测试:

{{explian('group.energy_sensors')|selectAttr(“状态”,'is_number')|加入(', ') }}

设备

  • device_entities(device_id)返回与给定设备ID关联的实体列表。也可以用作过滤器。
  • device_attr(device_or_entity_id,attr_name)返回的价值attr_name对于给定的设备或实体ID。不支持有限的模板
  • is_device_attr(device_or_entity_id,attr_name,attr_value)返回是否值attr_name对于给定的设备或实体ID匹配attr_value。不支持有限的模板
  • device_id(entity_id)返回给定实体ID或设备名称的设备ID。也可以用作过滤器。

设备示例

{{{device_attr('deadbeefdeadbeefdeadbeefdeadbeef','制造商')}}}}}#sony
{{is_device_attr('DeadBeefDeadBeefDeadBeefDeadBeef','Manufacturer','Sony')}}}}}}#true
{{{device_id('Sensor.sony')}}}#DeadBeefDeadBeefDeadBeefDeadBeef

区域

  • Area_id(lookup_value)返回给定设备ID,实体ID或区域名称的区域ID。也可以用作过滤器。
  • abreat_name(lookup_value)返回给定设备ID,实体ID或区域ID的区域名称。也可以用作过滤器。
  • 区域_entities(abore_name_or_id)返回与给定区域ID或名称相关的实体ID列表。也可以用作过滤器。
  • abreat_devices(abreat_name_or_id)返回与给定区域ID或名称相关的设备ID列表。也可以用作过滤器。

区域示例

{{afir_id('live Room')}}}#'DeadBeefDeadBeefDeadBeefDeadBeef'
{{afier_id('my_device_id')}}}#'DeadBeefDeadBeefDeadBeefDeadBeef'
{{afore_id('sensor.sony')}}}#'DeadBeefDeadBeefDeadBeefDeadBeef'
{{artion_name('DeadBeefDeadBeefDeadBeefDeadBeef')}}}#'living Room'
{{artion_name('my_device_id')}}#'living Room'
{{afore_name('sensor.sony')}}#'起居室'
{{artion_entities('DeadBeefDeadBeefDeadBeefDeadBeef')}}}#['Sensor.sony']
{{Area_devices('Living Room')}}#['my_device_id']

集成

  • Integration_Entities(集成)返回与给定集成相关的实体列表,例如色调或者zwave_js
  • Integration_Entities(标题)如果您有多个集成设置的设置,则还可以使用设置的标题进行集成,以防您只想针对特定的设备桥梁。

集成示例

{{intermation_entities('hue')}}#['light.hue_light_upstairs','light.hue_light_downstairs']
{{intermation_entities('hue桥下')}}}#['light.hue_light_downstairs']

立即if(iif)

一个常见的情况是根据另一个值有条件地返回值。例如,当灯打开或关闭时,返回“是”或“否”。

这可以写为:

{%如果IS_STATE('light.kitchen','on')%} yes {%else%} no {%endif%}

或使用较短的语法:

{{'YES'如果IS_STATE('light.kitchen','on')else'no'}}}

此外,在上面,您可以使用iif功能/过滤器,这是立即的。

句法:iif(条件,if_true,if_false,if_none)

iif返回的价值如果真实如果情况是真实的,那么if_false如果它是虚假和价值if_none如果它是没有任何。一个空字符串,一个空的映射或一个空列表,都是虚假的,请参阅Python文档为了深入解释。

如果真实如果省略了,是可选的真的如果情况是真实的,则将返回。if_false如果省略了,是可选的错误的如果条件是虚假的,将返回。if_none是可选的,如果省略了if_false如果条件是没有任何

示例使用iif

{{iif(is_state('light.kitchen','on'),'yes','no')}}}} {{is_state('light.kitchen','on'on'')|iif('yes','no')}}} {(states('light.kitchen')=='on')|iif('yes','no')}}}

如果过滤器不像您期望的那样,即时滤波器不会像典型的条件语句那样短路。这如果真实,,,,if_falseif_none表达式将全部评估,过滤器将简单地返回结果值之一。这意味着您不能使用此过滤器来防止执行会导致错误的表达式。

例如,如果您想从中选择一个字段扳机在基于平台的自动化中,您可能要进行此模板:trigger.platform =='event'|iif(trigger.event.data.message,trigger.to_state.state)。这是行不通的,因为两个表达式都会被评估,并且由于该字段不存在,因此将失败。相反,您必须这样做trigger.event.data.message如果trigger.platform =='event'else trigger.to_state.state。这种表达式短路的形式,因此如果平台为事件表达方式trigger.to_state.state将永远不会评估,不会导致错误。

时间

现在()utcnow()不支持有限的模板

  • 现在()返回代表时区域中当前时间的日期对象。

    • 您也可以使用:现在()。第二,,,,现在()。分钟,,,,现在()。小时,,,,现在()。天,,,,现在()。月份,,,,现在()。年,,,,现在()。工作日()现在()。isoweekday()和别的约会时间属性和功能。
    • 使用现在()每分钟开始时都会使模板刷新。
  • utcnow()返回UTC时区中当前时间的日期对象。

    • 对于特定值:utcnow()。第二,,,,utcnow()。分钟,,,,utcnow()。小时,,,,utcnow()。,,,,utcnow()。月份,,,,utcnow()。,,,,utcnow()。工作日()utcnow()。isoweekday()
    • 使用utcnow()每分钟开始时都会使模板刷新。
  • 今天_at(值)将包含军事时间格式的字符串转换为DateTime对象,并在当今的时区域中的日期。

    #当前时间是10:15?{{{now()> today_at(“ 1015“)}}}
  • AS_DATETIME()将包含时间戳或有效UNIX时间戳的字符串转换为DateTime对象。

  • AS_TIMESTAMP(值,默认值)将DateTime对象或字符串转换为UNIX TIMESTAMP。如果失败,返回默认价值,或者如果省略没有任何。此功能也可以用作过滤器。

  • as_local()将日期时间对象转换为本地时间。此功能也可以用作过滤器。

  • Strptime(字符串,格式)基于一个格式并返回DateTime对象。如果失败,返回默认值,或者如果省略了未加工的输入值。

  • 相对_time将DateTime对象转换为对人类友好的“年龄”字符串。年龄可以在第二,分钟,小时,日,月或年内(但仅考虑最大的单位,例如,如果是2天三小时,则将返回“ 2天”)。请注意,它仅适用于日期在过去

  • 序列返回一个序列对象并接受与python相同的论点datetime.timedelta功能 - 天,秒,微秒,毫秒,分钟,小时,几周。

    #77分钟前当时。{{{现在()-TimeDelta(小时= 1,,,,分钟= 17)}}}
  • 筛选timestamp_local(默认)将UNIX时间戳转换为ISO格式字符串表示,作为本地时区中的日期/时间。如果失败,返回默认值,或者如果省略了未加工的输入值。如果字符串中需要自定义字符串格式,请使用Timestamp_custom反而。

  • 筛选timestamp_utc(默认)将UNIX时间戳转换为ISO格式字符串表示表示为UTC TimeZone中的日期/时间。如果失败,返回默认值,或者如果省略了未加工的输入值。如果字符串中需要自定义字符串格式,请使用Timestamp_custom反而。

  • 筛选timestamp_custom(format_string,local = true,默认)将UNIX时间戳转换为基于自定义格式的字符串表示形式,默认情况下的本地时区使用。如果失败,返回默认值,或者如果省略了未加工的输入值。支持标准Python时间格式选项

UNIX时间戳是自1970年1月1日00:00:00 UTC以来经过的秒数。因此,如果用作函数的参数,它可以用数字值代替(int或者漂浮)。

如果您的模板正在返回应在前端显示的时间戳(例如,作为传感器实体device_class:时间戳),您必须确保它是ISO 8601格式(这意味着它在日期和时间部分之间具有“ t”分离器)。否则,MACOS和iOS设备上的前端渲染将显示错误。以下值模板将导致这样的错误:

{{states.sun.sun.last_changed}}}=>2021-01-24 07:06:59+00:00(缺少“ T”分离器)

要修复它,请通过isooformat()

{{states.sun.sun.last_changed.isoformat()}}}=>2021-01-24T07:06:59+00:00(包含“ T”分离器)

{{{120 |时间戳_local}}}

往返JSON

to_json过滤器将对象序列化为JSON字符串。在某些情况下,可能有必要将JSON字符串格式化以与Webhook一起使用,作为命令行实用程序的参数或其他数量的其他应用程序。在模板中,这可能很复杂,尤其是在处理特殊角色时。使用to_json过滤器,这是自动处理的。

与python等效类似,过滤器接受suse_ascii参数,默认为真的。如果suse_ascii真的,保证输出可以使所有传入的非ASCII字符逃脱。如果suse_ascii是错误的,这些字符将被输出。

来自_json过滤器类似地运行,但在另一个方向上,将JSON字符串重新序列化回到对象中。

从JSON示例/来自

在此示例中,特殊字符“°”将自动逃脱以产生有效的JSON。串起的对象和实际JSON之间的区别是显而易见的。

模板

{%设置temp = {'温度':25,'unit':'°C'}%} stringified对象:{{temp}}对象| to_json:{{temp | to_json(suse_ascii = false)}}}}}

输出

弦乐对象:{'温度':25,'unit':'°C'}对象| to_json:{“温度”:25,“单元”:“ \ u00b0c”}

反过来,来自_json可以用来将JSON字符串重新序列化为对象,以使可以轻松提取可用数据成为可能。

模板

{%设置temp ='{“温度”:25,“单元”:“ \ u00b0c”}'| from_json%}温度为{{temp.temperature}}} {{temp.unit}}}

输出

温度为25°C

被定义为

有时,仅在定义值或对象的情况下(如果不是)可以返回所提供的默认值时,模板才应返回。这对于验证JSON有效载荷很有用。这被定义为如果未定义值或对象,则过滤器允许丢弃错误。

示例使用被定义为解析JSON有效载荷:

{{value_json.val |被定义为 }}

这会丢下错误UNDEDINDERROR:“ value_json”是未定义的如果JSON有效载荷没有瓦尔属性。

距离

不支持有限的模板

  • 距离()将在家庭,实体,坐标之间以公里为单位的距离进行测量。
  • 最接近()会找到最接近的实体。

距离示例

如果仅通过一个位置,则家庭助理将测量离家的距离。必威是什么

使用LAT LNG坐标:{{距离(123.45,123.45)}}}使用状态:{{distand(states.device_tracker.paulus)}}}}}}}}这些也可以组合到任何组合中:{distair {distair(123.45,123.45,'device_tracker'device_tracker。paulus')}}} {{decepent('device_tracker.anne_therese','device_tracker.paulus')}}}}}}}}}

最接近的例子

最接近的功能和过滤器将找到最接近家庭助理位置的实体:必威是什么

查询所有实体:{{cresceast(states)}}查询特定域的所有实体:{{cresst(states.device_tracker)}}} group.Children中的所有实体:{查询组中的所有实体。

找到最接近坐标或其他实体的实体。所有以前的论点仍然适用于第二个参数。

最接近坐标:{{{{23.456,23.456,'group.Children')}}}}}}最接近实体的}:{{cressest('Zone.School','group.Children'')}}}最接近实体:{{croscest(states.zone.school,'group.Children')}}}}

由于最接近的状态,我们也可以将其与距离结合在一起。

{{{cresst(states).name}}是{{distance(clasteast(states)}}}}}}公里。

最接近函数的最后一个论点具有隐式扩张,并且可以采用任何可觉得的状态或实体ID序列,并将扩展群体:

Closest out of given entities: {{ closest(['group.children', states.device_tracker]) }} Closest to a coordinate: {{ closest(23.456, 23.456, ['group.children', states.device_tracker]) }}最接近某些实体:{{{

它还可以作为一个可迭代的实体或组的过滤器来工作:

最接近给定实体:{{[['group.Children',states.device_tracker] |最近的}}最接近坐标:{{['group.Children',states.device_tracker] |最接近(23.456,23.456)}}最接近某些实体:{{['group.Children',states.device_tracker] |最近(states.zone.school)}}}

数字功能和过滤器

其中一些功能也可以在筛选。这意味着他们可以像这样的正常函数SQRT(2),或作为这样的过滤器的一部分2 | SQRT

如果输入不是有效的数字,则数字函数和过滤器将不会失败,而是将输入值返回,除非指定默认值。这漂浮过滤器是一个例外,它返回0.0如果输入无效,并且尚未指定默认值。在许多情况下,这是不必要的行为,使用is_number检查值是否有效。

  • {{float(“ not_a_number”)}}}}- 渲染为“ not_a_number”
  • {{“ not_a_number” |漂浮 }}- 渲染为0.0
  • {{sin(“ not_a_number”)}}}- 渲染为“ not_a_number”
  • {{“ not_a_number” |sin}}}- 渲染为“ not_a_number”
  • {{float(“ not_a_number”,default =“无效号码!”)}}}}}- 渲染为“无效号码!”
  • {{“ not_a_number” |float(default =“无效号码!”)}}}}- 渲染为“无效号码!”
  • {{sin(“ not_a_number”,default =“无效号码!”)}}}}}- 渲染为“无效号码!”
  • {{“ not_a_number” |sin(默认=“无效号码!”)}}}}}- 渲染为“无效号码!”
  • float(值,默认值)功能将尝试将输入转换为漂浮。如果失败,返回默认价值,或者如果省略价值

  • float(默认)过滤器将尝试将输入转换为漂浮。如果失败,返回默认价值,或者如果省略0.0

  • is_number将返回真的如果输入可以由Python解析漂浮功能和解析的输入不是inf或者,在所有其他情况下返回错误的。请注意python布尔将返回真的但是弦“真的”“错误的”都将返回错误的。可以用作过滤器。

  • 日志(值,基础,默认)将采用输入的对数。省略基础时,默认为e- 自然对数。如果价值或者根据无法转换为漂浮,返回默认价值,或者如果省略价值。也可以用作过滤器。

  • 罪(价值,默认)将返回输入的正弦。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • cos(值,默认值)将返回输入的余弦。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • 棕褐色(值,默认)将返回输入的切线。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • ASIN(值,默认)将返回输入的弧形正弦。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • ACO(值,默认)将返回输入的弧形余弦。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • Atan(值,默认)将返回输入的弧形切线。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • atan2(y,x,默认)将返回y / x的四个象限弧形切线。如果y或者X无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • SQRT(值,默认)将返回输入的平方根。如果价值无法转换为漂浮,返回默认价值,或者如果省略价值。可以用作过滤器。

  • max([x,y,...])将在序列中获得最大的项目。使用与内置相同的参数最大限度筛选。

  • min([x,y,...])将以序列获得最小的项目。使用与内置相同的参数最小筛选。

  • 平均([x,y,...])将返回序列的平均值。可以用作过滤器。

  • e数学常数,约2.71828。

  • pi数学常数,约为3.14159。

  • tau数学常数,约为6.28318。

  • 筛选圆(精度,方法,默认)将输入转换为数字,然后将其舍入到精确小数点。回合具有四个模式,默认模式(未指定模式)将往返。如果输入值无法转换为漂浮,返回默认值,或者如果省略了输入值。

    • 圆形(精度,“地板”,默认)总是会四舍五入精确小数点
    • 圆(精度,“ ceil”,默认)总是会汇总精确小数点
    • 回合(1,“半”,默认)始终将圆形为最接近的.5值。精确对于此模式应该是1
  • 筛选value_one | bitwise_and(value_two)用两个值执行(&)操作。

  • 筛选value_one | bitwise_or(value_two)用两个值执行一个位或(|)操作。

  • 筛选ORD将返回一个长度字符串,一个整数代表参数为unicode对象时字符的unicode代码点,或当参数是8位字符串时的字节值。

功能和过滤器处理原始数据

这些函数用于处理A中的原始值字节格式为本机Python类型或反之亦然的值。这打开包装功能也可以用作过滤器。他们利用Python 3结构图书馆。看:https://docs.python.org/3/library/struct.html

  • 筛选值|pack(format_string)将将本地类型转换为字节类型对象。这将调用功能struct.pack(format_string,value)。返回没有任何如果发生错误或何时发生format_string是无效的。
  • 功能pack(value,format_string)将将本地类型转换为字节类型对象。这将调用功能struct.pack(format_string,value)。返回没有任何如果发生错误或何时发生format_string是无效的。
  • 筛选值|打开包装(format_string,offset = 0)会尝试转换字节对象成本机Python对象。这抵消参数从输入开始时定义字节中的偏移位置字节基于缓冲区。这将调用功能struct.unpack_from(format_string,value,offset = offset)。返回没有任何如果发生错误或何时发生format_string是无效的。
  • 功能打开包装(value,format_string,offset = 0)会尝试转换字节对象成本机Python对象。这抵消参数从输入开始时定义字节中的偏移位置字节基于缓冲区。这将调用功能struct.unpack_from(format_string,value,offset = offset)。返回没有任何如果发生错误或何时发生format_string是无效的。

一些例子:

  • {{0xDeadBeef |pack(“> i”)}}}- 渲染为b“ \ xde \ xad \ xbe \ xef”
  • {{pack(0xDeadBeef,“> i”)}}}- 渲染为b“ \ xde \ xad \ xbe \ xef”
  • {{0xDeadBeef |pack(“> i”)|拆开(“”> i”)}}}- 渲染为0xDeadBeef
  • {{0xDeadBeef |pack(“> i”)|拆卸(“”> h”,offset = 2)}}}}- 渲染为0xbeef

字符串过滤器

  • 筛选urlencode将将对象转换为一个百分比的ASCII文本字符串(例如,用于使用HTTP请求应用/X-WWW-Form-urlenCoded)。
  • 筛选slugify(saparator =“ _”)会将给定的字符串转换为“ slug”。

常用表达

  • 测试字符串是匹配的(查找,ignorecase = false)将使用Regex在字符串开头的查找表达式匹配。
  • 测试字符串是搜索(查找,ignorecase = false)将使用REGEX在字符串中的任何位置匹配查找表达式。
  • 筛选字符串| regex_replace(find ='',替换='',ignorecase = false)将使用Regex替换替换字符串。
  • 筛选值|REGEX_FINDALL(find ='',ignorecase = false)会在查找表达式中找到所有正则匹配价值并返回比赛数组。
  • 筛选值|REGEX_FINDALL_INDEX(find ='',index = 0,ignorecase = false)会做与REGEX_FINDALL并在索引中返回比赛。

处理传入数据

模板的另一部分是处理传入数据。它使您可以修改传入数据并仅提取您关心的数据。这仅适用于平台和集成,这些平台和集成在其文档中提到了对此的支持。

它取决于每个集成或平台,但是通常能够使用该模板来定义模板value_template配置密钥。当新值到达时,您的模板将在访问通常的家庭助理扩展名之上的以下值时呈现:必威是什么

多变的 描述
价值 传入价值。
value_json 传入的价值被解析为JSON。

这意味着,如果传入值看起来像以下样本:

{“上”“真的”,,,,“临时”21}

模板将会:

'{{value_json.on}}'

也支持嵌套的JSON:

{“传感器”{“类型”“空气”,,,,“ID”“ 12345”},,“值”{“临时”26.09,,,,“哼”56.73}}

只需使用“方括号符号”即可获取值。

{{{value_json ['values'] ['temp']}}””

以下概述包含一些选项以获取所需的值:

#传入值:{“ primes”:[2,3,5,7,11,13]}#提取第一个元数{{value_json.primes [0]}}#格式atupper {{“%+.1f” |value_json}}#Math {{value_json |float * 1024如果IS_NUMBER(value_json)}}} {{float(valie_json) *(2 ** 10)如果IS_NUMBER(value_json)}}}} {value_json |log如果IS_NUMBER(value_json)}}} {{log(1000,10)}}} {{sin(pi / 2)}}} {{cos(cos(tau)}} {{tan(pi)}}}}#timestamps {{value_json.tst |timestamp_local}}} {{value_json.tst |timestamp_utc}}} {{value_json.tst |timestamp_custom('%y',true)}}}

要评估回应,请转到开发人员工具 - >模板,在“模板编辑器”中创建输出,然后检查结果。

{set value_json ={姓名”外部”,,,,设备”天气 -,,,,数据”{临时”24C”,,,,哼”35%”}}}{{{value_json.data.hum[:-1]}}}

使用模板与MQTT集成

MQTT集成严重依赖模板。模板用于将传入有效载荷(值模板)转换为状态更新或传入的服务调用(命令模板),以配置MQTT设备的有效负载。

使用MQTT的值模板

对于传入数据,值模板将传入的JSON或原始数据转换为有效的有效载荷。传入有效载荷可能会带有可能的JSON值,因此在渲染时value_json可以使用基于JSON的有效载荷中的属性访问属性。

示例值模板:

给定有效载荷:

{“状态”“上”,,,,“温度”21.902}

模板{{value_json.temperature |第1轮) }}渲染到21.9

其他MQTT实体属性ENTITY_ID姓名可以用作模板中的变量。

将命令模板与MQTT一起使用

对于服务调用,定义了命令模板以将传出的MQTT有效负载格式化为设备。执行服务电话时价值可用于将正确的有效载荷生成到设备。

示例命令模板:

给定值21.9模板{“温度”:{{value}}}}渲染到:

{“温度”21.9}

其他MQTT实体属性ENTITY_ID姓名可以用作模板中的变量。

还有更多要记住的事情

以一个数字开头的Entity_id

如果您的模板使用ENTITY_ID从一个数字开始(示例:states.device_tracker.2008_gmc)您必须使用括号语法来避免通过渲染造成的错误ENTITY_ID不当。在给出的示例中,设备跟踪器的正确语法是:states.device_tracker ['2008_GMC']

运营商的优先级

操作员的默认优先级是过滤器(|)除括号外,所有内容都优先。这意味着:

{{{状态(“传感器”温度')|浮点 / 10 |(2)}}}

会圆形10到小数点2个小数,然后分裂状态(“传感器”)经过10(四舍五入到小数点小数10.00)。这种行为也许不是预期的,但优先规则暗示了这一点。