声明
本文仅针对坛子里面用了我发的那个万物流程、并且跟我一样不会用NR的兄弟。
帖子链接:https://bbs.hassbian.com/thread-7202-1-1.html
这几天也抽空琢磨了下,有一些收获,感觉还是有必要发个帖子分享一下,一起学习。
前情提示:其他人均可忽略,其他人均可忽略,其他人均可忽略。
适用人群
1、初学nodered或者HA、你感兴趣、自己却不了解、通过自己的学习、花费一些时间成本、最终可以学会去使用它的人群。
2、会主动学习;
3、会利用现成的机器OR工具(此处仅仅指代会用<谷歌搜索>、<Chrome右键Google翻译成简体中文>等);
4、会去查看官方文档
HA官方支持的设备接入:
https://www.home-assistant.io/components/
HA官方资料:
https://www.home-assistant.io/docs/
NR官方文档:
https://nodered.org/docs/
不适用的人群
大佬们
小白教程
先贴万物流程图:
1、token流程:
inject:作为输入端(译名时间戳),可能是最常用的节点了,NR的流程计算,遵循“输入”-“处理”-“输出”原则;
debug:作为输出端,用来看调试日志(NR的优势,HA是需要重启看log的,检查配置千遍,不如重启看一下日志)。
上图中两个inject节点:
“定时2个小时:是因为花神的节点本身说明了:token需要两个小时获取一次,所以有了这个定时的时间戳;
“手动触发”:只是为了调试看日志。
正常情况下,如果你不手动触发的话,NR右侧的信息输出窗口每隔两个小时会有一条获取token的日志。
2、dodoJie大佬提供的sensor转换Fun写法:
这个处理节点中:
var newMsg = {payload:msg.payload.dataArray.data[0]};
个人理解:经过这个处理环节,输出给下一环节的数据均来自于上面的设备“0”
花神的第二个节点“设备监控”(上面的登陆处理完成,且正常获取了token的情况下)就是为了获取从万物的服务上拉下来的数据,我因为买了3个GPS模块,所以会在这个节点的日志中,找到三个设备的数据,json数据格式和位置见图:
D大的处理结果就是,把“设备监控”中、你利用花神的节点、从万物服务器拉下来的数据通过筛选(这里筛选了msg.payload-dataArray-data-0这个设备的数据),发送给下一个处理的环节,下一个环节收到的信息(如下图,注意那个msg.payload):
结合上面的描述,仔细看图找点规律。
3、通过MQTT发送:
通过上面的处理,你就得到了一个新的json格式的文本,然后你就可以通过HA本身对接收到的json数据进行处理,得到了万物的GPS模块的Sensor信息。
g兄在原贴中贴上了利用HA的json转换时间戳的写法。
4、萝卜大佬提供的位置追踪的Fun写法:
流程:
上面同理,从设备监控只能够获取到的数据,取了我们需要的值(经纬度、电量等),通过筛选处理发给了下一个流程;
这个环节你筛选了几个数据值:比如经纬度(longitude和latitude)、电量(battery_level,因为我现在这个模块本身就没有电池,所以就的不到数据)、speed(来自设备[0]的数据中的speed)、gps_accuracy(我汉化了个名字叫定位方式,来自于[0]中的source_type);
为什么要改个名字叫“gps_accuracy”而不叫原名称的“source_type”,因为HA的devices_track.xxxxx设备中的Attributes值中就叫“gps_accuracy”,所以需要改个名字,让经过这个FUN处理的信息发送给HA的时候转换成HA自己定义的、可以识别的ID;
这个流程中的下一步:
这个作用,我目前的理解是,把上面的到的数据转换成json格式,然后通过MQTT发出去(HA可以识别的格式),我还没学到这个。
5、萝卜大佬提供的地理信息转换的Fun写法:
如上图的箭头指示:
rbe前面的FUN处理,为了取得你的设备的经纬度信息,通过rbe过滤掉不用的信息,将经纬度信息转换成花大的“逆地理解析”这个节点能读取的内容,,然后下一个FUN语言就是为了把他翻译成HA能理解的语言,可以用过MQTT发送给HA、然后通过自定义的devices_track.xxxx(json格式的写法)转换成实际的地理位置。
OK,整个流程据基本上解释完了。
6、自己学习了一下NR时间戳的转换方法:
本来想把接收到的秒(那些各种time数据)转换成正常的年月日时分秒,参考了好些资料(大佬的指点,还有小鬼鬼),然后搞定了了一个简单的FUN,贴个代码吧:
var newMsg = {payload:'msg.payload.dataArray.data.0.gps_time',};
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
var minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
var second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
msg.payload = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
return msg;
流程图:
折腾了这么久,就学了这么点东西,欢迎指导交流,路过大佬请轻拍,谢谢。
最后
欢迎来到NodeRED的世界!