本帖最后由 Mirukuteii 于 2018-4-2 03:32 编辑
作为新人第一帖,按照套路,首先讲两句废话介绍一下自己并鼓鼓勇气。
本人萌新一枚,电子信息工程专业毕业,但是不从事电子相关行业,
单片机、树莓派、linux、Python等等这些个玩意,仅仅停留在一般接触和理解上,没学过。
虽然接触本论坛快一年了,也老早就在自家群晖docker上部署好HA,
但是因为各种原因,一直没有时间拾起来好好研究,荒废了大好的时光。。。
好在最近找到点空闲时间,让我能够有机会上论坛上学习充电,和大家交流感情。
OK,废话说完,进入正题。
·来源:
受@paochu_2007朋友的文章:关于sun的时间节点对应表启发
·目的:
如何将sun组件的attributes属性单独合理地提取并显示在界面上,
·涉及:
template sensor 、template extensions 、python list
本帖技术含量较低,各位大神可以无视,
旨在小结学习收获,并帮助像我一样水平不高的萌新少走弯路。
自从看了paochu_2007朋友关于sunrise的文章之后,
我就把系统自带的sun组件拿出来看了一下,于是发现
哇,原来从dev-state下面看到的sun.sun,
不光只有state值below_horizon和above_horizon,
还有一堆的attributes属性,诸如
azimuth(太阳方位角):
elevation(太阳高度角):
next_rising(下一次日出时间)等。
这几个参数,感觉似乎,有点意思的样子,比如在家里做个向日葵灯神马的?
那么萌新我就想,首先咱能不能把这些属性单独合理地放在界面上显示呢,就像最后这样:
这种事看起来似乎很轻松嘛,于是,我就直接在groups.yaml尝试直接添加类似于:
......
entities:
- sun.sun
- sun.sun.attributes.elevation
- sun.sun.attributes.azimuth
......
这样的代码。
但是!无法通过配置检查
原因是sun.sun.attributes.elevation并不是一个合法的entity id.
NND,萌新如我有点蒙了,怎么这entities下面的列表内容,
原来必须得是一个entity才行,普通state还就不行,这个咋整。。。。。
兜兜转转,搜搜索索,终于在官网文档里得到了解答:
https://www.home-assistant.io/components/sensor.template/
方法:利用【template sensor】把state转变为entity
哦,原来这样就行,把并非entity id的sun.sun.attributes.elevation,
指定为一个template类型的sensor就可以解决,
而且,这篇文章举的例子不就是我想要的代码么??
得来全不费功夫,灭哈哈哈。果断复制粘贴:
sensor:
- platform: template
sensors:
solar_angle:
friendly_name: "Sun angle"
unit_of_measurement: 'degrees'
value_template: "{{ states.sun.sun.attributes.elevation }}"
sunrise:
value_template: "{{ states.sun.sun.attributes.next_rising }}"
嗯,这样,在groups.yaml中就可以直接写上:
......
entities:
- sun.sun
- sensor.solar_angle
- sensor.sunrise
......
此时,state类型的sun.sun.attributes.elevation,
就能以entity类型的sensor.solar_angle被正常调用了
好了,这样结束了么?这样结束的话,咱也这第一帖也太混了。。。。
所以,新问题来了,sensor.sunrise得到的时间是一个这样的时间:
2018-03-31T21:47:54+00:00
本人虽然萌新,也知道这个是某种格式的UTC时间,根本就不是一个给人看的本地时间啊
然后无非摸摸索索、兜兜转转,想把这个时间本地化,
终于,在https://www.home-assistant.io/docs/configuration/templating/#home-assistant-template-extensions
得到了方法:
- as_timestamp() will convert datetime object or string to UNIX timestamp
- Filter timestamp_local will convert an UNIX timestamp to local time/data.
再补了点python知识,修改了代码
sunrise:
icon_template: mdi:weather-sunset-up
friendly_name: "日出时间"
value_template: {{ ((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) }}
方法:利用【template extensions】的函数:as_timestamp()和滤镜timestamp_local,
将UTC时间转换为可读的格式化本地时间。
哦也,终于变成格式化的本地时间了
这里,用到了函数as_timestamp()用来把时间转换为UNIX时间戳格式,
再用到了滤镜timestamp_local,把转换后的UNIX时间戳转变为本地格式化的时间,
格式是 年-月-日 时:分:秒
不出所料,新问题又来了,虽然时间已经变成可读的本地时间,
但是似乎这个时间格式也太长了,我们只要知道下次日出的时间,不需要知道日期啊,
这个日期对于下次日出时间来讲基本没有意义,不就是今天或者明天么,
而且日出是一个好几分钟的过程,精确到秒也没有意义吧,没意义的数据太繁杂看着真的不舒服。
于是,继续兜兜转转、摸摸索索,终于找到了一个聪明简便的好方法:
把{{ ((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) }}改成:
{{ ((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) [11:16] }}
方法:利用【python list】的切片方法[X:X],
将冗余的时间格式转换为简洁的时间格式
这里,用到了[X:X],就是python列表切片方法,
[11:16] 意思就是只显示第12个到第16个元素(不是第11个开始,也不是第17个结束),
比如对于 2018-04-01 02:40:10
2018-04-01是前面10个元素,加上空格作为第11个元素,
那么02:40就是第12个到16个元素,日期和秒的部分就被抛弃了,哦也
详情可以参考https://www.cnblogs.com/wmm007/p/7596997.html
为了避免发生state值“未知”的情况,加入if判断,最后补上完整的代码:
在HA根目录sensor文件夹中新建一个yaml文件(比如template.yaml),并写入:
- platform: template
sensors:
solar_elevation_angle:
icon_template: mdi:arrow-up-bold
friendly_name: "太阳高度角"
unit_of_measurement: '度'
value_template: "{% if states.sun.sun %} {{ states.sun.sun.attributes.elevation }} {% endif %}"
solar_azimuth_angle:
icon_template: mdi:arrow-right-bold
friendly_name: "太阳方位角"
unit_of_measurement: '度'
value_template: "{% if states.sun.sun %} {{ states.sun.sun.attributes.azimuth }} {% endif %}"
sunrise:
icon_template: mdi:weather-sunset-up
friendly_name: "日出时间"
value_template: "{% if states.sun.sun %} {{ ((as_timestamp(states.sun.sun.attributes.next_rising)) | timestamp_local) [11:16] }} {% endif %}"
sunset:
icon_template: mdi:weather-sunset-down
friendly_name: "日落时间"
value_template: "{% if states.sun.sun %} {{ ((as_timestamp(states.sun.sun.attributes.next_setting)) | timestamp_local) [11:16] }} {% endif %}"
随后在groups.yaml 中或者某处调用类似如下代码:
sun: #group的名字自己改
name: '太阳参数' #group的显示名称自己改
view: no #是否显示在顶栏自己改
entities:
- sun.sun
- sensor.solar_elevation_angle
- sensor.solar_azimuth_angle
- sensor.sunrise
- sensor.sunset
哦对了,补充一点,icon随便选的mdi,你可以自己设置更合适的。
2018年4月2日更新:无意中发现https://bbs.hassbian.com/forum.php?mod=viewthread&tid=22
给出了另一种不错的办法:
value_template: '{{ as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom("%H:%M") }}'
同样可以达成目的,代码更加直观可读性好。
打完收工!
|