Home Assistant的Jinja2模板比较时间戳出现float与str类型错误
问题根源
你在满足判断条件后直接把原始状态字符串赋值给了data.min_date,覆盖了初始化时的float类型时间戳:
- 初始化时
data.min_date确实是转换后的浮点型时间戳 - 第一次触发
if条件时,{%- set data.min_date = value -%}里的value是states(i)返回的字符串类型状态值,直接替换了原本的浮点型数值 - 第二次循环执行比较逻辑时,
data.min_date已经是字符串类型,自然触发float和str无法比较的类型错误 - 额外隐藏问题:就算比较逻辑不报错,最后调用
timestamp_custom过滤器时传入字符串类型的data.min_date也无法完成时间格式化,会再次报错。
修正后代码
{%- set list = ['sensor.1','sensor.2','sensor.3','sensor.4'] -%} {%- set data = namespace(min_date=float(as_timestamp(now() + timedelta(days = 360))), min_name = '') -%} {%- for i in list %} {%- set value = states(i) %} {%- set current_ts = float(as_timestamp(value)) %} {%- if current_ts < data.min_date %} {%- set data.min_date = current_ts -%} {%- set data.min_name = state_attr(i, 'friendly_name') -%} {% endif %} {%- endfor %} {{ data.min_name + ' (' + data.min_date | timestamp_custom('%Y-%m-%dT%H:%M:%S%z') + ')' }}
修正说明
- 提前把当前传感器的状态转换为浮点型时间戳
current_ts,避免重复转换 - 满足条件时给
data.min_date存储转换后的浮点型时间戳,而非原始字符串,保证后续循环的比较逻辑始终是两个浮点型数值对比 - 最终格式化时直接传入存储的浮点型时间戳,符合
timestamp_custom过滤器的参数要求
可选优化:如果部分传感器可能返回非时间格式的无效状态,可以给
float转换加默认值,避免转换失败中断模板执行:{%- set current_ts = float(as_timestamp(value), float(as_timestamp(now() + timedelta(days = 360)))) %}
内容的提问来源于stack exchange,提问作者Chrisvdberge
相关产品推荐
相关产品推荐

