智能家居 篇十:第八章 说有用的话,做有用的事 ——Notify的进阶
导读:话说对了才有用,没用的叫啰嗦;事做对了才有用,不然叫磨洋工。
什么叫有用实在是见仁见智,话说出来有人爱听,事做出来有人开心,就够了。
就说我吧,出门下楼,下雨了,没带伞;大太阳,没戴帽子墨镜,只好心里一万个不情愿。所以第一个要做的就是出门提醒,尤其是下雨这件事情实在是。。。。
编程嘛,总是要有逻辑:
开门→检测天气预报→条件分流→播放提醒
老规矩,先增加天气预报的功能到Homeassistant中,系统自带了现成的英文天气预报,HA管理页->侧边栏->配置->集成->“+”,Meteorologisk institutt (Met.no) 跳出来的对话框中填好名字,和经纬度就可以了,默认的经纬度就是你当前的位置。如果需要选定地点的经纬度,1、你可以上网去找,2、侧边栏->配置->地点->“+” 在跳出的地图上选择你要的地方,就会有对应的经纬度显示出来。
图上是个有意思的地方,当然不是你的经纬度,如果是家里的话,半径小一点,100左右就可以了。
Met.no设定好之后,就可以到HA管理页添加天气预报卡片:
看起来还是蛮好看的。
既然说了是进阶,那么就要用上函数和变量,DIY的时候总得要有所追求,不然就没得提高了不是。上Node-RED
今天用五个部件,三个新部件
current_state
在流程中检测某个实体(entity_id)的当前状态。
switch
是一个分流器,通过设定不同的关键字来选择或者过滤输出,每一个输出点都对应一个条件。
函数
函数是个很有用的部件,在属性页里可以写很多东西,有点类似于语言编程了。进阶嘛,总得有点小难度。
event:state不多讲,和之前一样的设定方式,entity_id设定为Door(门),state设定为on,就是开门就输出一条消息。
call service不多讲,这里设定为tts 到 google home。注意的是Data留空,用函数来控制。
current_state 如其名,就是检测当前状态,并传递到下一个部件。State留空,就是不管是什么状态都在同一个输出节点。
switch也不难,按照天气状态来添加分流条件。多个条件通过属性页左下的添加按钮来增加。
函数来了,属性页打开基本啥都没有,想起一句歌词“空,空,空,空如也”。就像赚钱,越是啥都不干的越赚钱。这东西也一样,空,但很牛X。
msg.payload 负责告诉下一个接收部件消息的来源;变量内容则是要传到下一个部件的具体内容,这里我们要传递到下一个流程的Data(在call service中留空了),所以变量名称就是"data": ,call service是TTS,所以data的格式按照tts的需求去写,"message"、"Language"。变量中语句多于一行,记得加“,”分割,最后一行不需要(初学之坑)。
按照上图部署之后,当门打开时,如果天气预报下雨,HA就会通过Google home说话提醒带伞。
既然switch设定了5个输出口,那另外四个怎么用呢,可以通过设定每个不同的tts home来对应,不过这样的话还要函数干甚呢,所以函数不是这样用的。
函数的进阶使用
Switch的属性也有一项msg.payload,也就是说switch的输出消息也是通过msg.payload来传递,那么在函数中就可以引用啦。
初学的时候,可以把需要带伞的,和只是需要报一下天气的分开,这个时候switch就有用啦,如果再进阶,函数中可以直接使用if else来判断,那么switch都不需要了。。。。
#附上代码:
var mesg = "" var laug = "en-us" if (msg.payload == "rainy") { mesg = "take a umbrella." } else if (msg.payload == "tornad") { mesg = "体重不够,不要出门", laug = "zh-cn" } else if (msg.payload == "hail") { mesg = "请自带铁锅。", laug = "zh-cn" } msg.payload = { "data": { "message": "outside is " + msg.payload + mesg, "language": laug } } return msg;
函数的使用同样见仁见智,会成为HA编程中最有趣的部分,比起添加多个部件来达到同样的效果,函数更能够把流程精简下来。
记得买输出设备
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
骑着神马的帅锅
校验提示文案
骑着神马的帅锅
校验提示文案