『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 10943|回复: 19

[经验分享] 【Sun】萌新摸索之在界面单独合理地显示sun组件的attributes

[复制链接]

26

主题

553

帖子

2726

积分

金牌会员

Rank: 6Rank: 6

积分
2726
金钱
2148
HASS币
100

教程狂人

发表于 2018-4-1 03:27:10 | 显示全部楼层 |阅读模式
本帖最后由 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组件拿出来看了一下,于是发现
微信图片_20180401014942.png
哇,原来从dev-state下面看到的sun.sun,
不光只有state值below_horizon和above_horizon,
还有一堆的attributes属性,诸如


azimuth(太阳方位角):
timg.jpg


elevation(太阳高度角):
timg (1).jpg


next_rising(下一次日出时间)等。


这几个参数,感觉似乎,有点意思的样子,比如在家里做个向日葵灯神马的?
87-1G010142251.jpg


那么萌新我就想,首先咱能不能把这些属性单独合理地放在界面上显示呢,就像最后这样:
微信图片_20180401014554.png



这种事看起来似乎很轻松嘛,于是,我就直接在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") }}'
同样可以达成目的,代码更加直观可读性好。


打完收工!











评分

参与人数 4金钱 +39 收起 理由
paochu_2007 + 7 这就厉害了,感谢分享
+ 12 这个牛了!!
27hh + 10 膜拜大神!
windgo + 10 膜拜大神!

查看全部评分

回复

使用道具 举报

34

主题

335

帖子

1844

积分

金牌会员

Rank: 6Rank: 6

积分
1844
金钱
1509
HASS币
0
发表于 2018-4-1 12:37:38 | 显示全部楼层
厉害了word哥
回复

使用道具 举报

74

主题

1961

帖子

7982

积分

元老级技术达人

积分
7982
金钱
5971
HASS币
430

活跃会员教程狂人

发表于 2018-4-1 17:07:06 | 显示全部楼层
很久以前搞这个,知道转换方法,不知道怎么转换日出日落的时间时区,还是刀法不熟啊,谢谢分享。
所有过往,皆为序章。
回复

使用道具 举报

26

主题

553

帖子

2726

积分

金牌会员

Rank: 6Rank: 6

积分
2726
金钱
2148
HASS币
100

教程狂人

 楼主| 发表于 2018-4-1 21:52:14 | 显示全部楼层
咸味土豆 发表于 2018-4-1 17:07
很久以前搞这个,知道转换方法,不知道怎么转换日出日落的时间时区,还是刀法不熟啊,谢谢分享。 ...

谦虚了大神,很高兴能够得到你们的支持。
我想,SUN作为系统自带的组件,
很多像我这样的萌新在一开始都会接触到吧。
虽说是很简单的想把组件的属性调用并显示在界面上,
但是在实际达成的过程中发现的阻碍,真的让萌新如我很困惑...

虽然自己学习和探索也是一个学习的过程,
但是如果大家都能分享这种看似不起眼的小经验,
我觉得对于我们萌新来讲,真的很有意义,少走了很多弯路。
回复

使用道具 举报

2

主题

303

帖子

1675

积分

金牌会员

Rank: 6Rank: 6

积分
1675
金钱
1372
HASS币
0
发表于 2018-4-3 08:49:25 | 显示全部楼层
这个就厉害了
回复

使用道具 举报

22

主题

519

帖子

1608

积分

金牌会员

Rank: 6Rank: 6

积分
1608
金钱
1089
HASS币
10
发表于 2018-4-4 16:43:37 | 显示全部楼层
哇 向日葵灯能做吗?好强啊
回复

使用道具 举报

2

主题

113

帖子

942

积分

高级会员

Rank: 4

积分
942
金钱
829
HASS币
0
发表于 2018-4-4 19:33:44 | 显示全部楼层
哇。膜拜大神
回复

使用道具 举报

9

主题

165

帖子

718

积分

高级会员

Rank: 4

积分
718
金钱
553
HASS币
0
发表于 2018-4-5 17:23:08 来自手机 | 显示全部楼层
厉害厉害!
回复

使用道具 举报

2

主题

227

帖子

1874

积分

金牌会员

Rank: 6Rank: 6

积分
1874
金钱
1647
HASS币
0
发表于 2018-5-21 17:33:29 | 显示全部楼层

厉害厉害!
回复

使用道具 举报

0

主题

8

帖子

99

积分

注册会员

Rank: 2

积分
99
金钱
91
HASS币
0
发表于 2018-6-18 15:42:25 | 显示全部楼层
非常棒,按照楼主的方式确实解决了大问题,把attributes 作为实体加入了group
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-19 14:16 , Processed in 0.074665 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表