01 前言
本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。
02 概述
前面分享过私有485协议设备的解析与HomeAssistant自动发现的NodeRed流程,那条流程只限于解析单个设备,如果需要同时解析多个设备,则需要重新定义和修改,当然我已经完成了该项功能。
03 流程特点及功能
该NodeRed流程主要特点和功能如下:
1.设置简单,轻松定义;
2.同时解析和自动发现多个485协议的设备;
3.支持485接入和串口服务器方式接入;
4.可以灵活切换反转开关状态;
5.防止窗帘设备回弹而造成开度显示不正确;
6.数据校验功能,防止数据错误而导致显示异常;
7.多种窗帘、开合帘等设备类型的全支持;
8.基于485通讯轮询机制进行数据采集;
9.异步通讯机制构建消息队列,防止读写冲突;
10.HomeAssistant中自动发现实体;
11.设置变量输出及清除功能,方便调试;
12.设置节点状态显示,实时检测函数运行状态。
04 流程运行原理
流程图如下:
首先“轮询查询”节点根据私有485协议定义数据结构及功能并写入全局变量RS485-2中,同时根据从站信息自动计算设置轮询指令,该指令发送至串口或串口服务器。串口或串口服务器接收到正确的指令后输出相应的状态信息供“数据解析”节点根据全局变量RS485-2中的定义进行解析输出状态至MQTT服务器。
“查询变量”节点实质是读取全局变量数据生成HomeAssistant动态订阅指令发送至HA的MQTT服务器从而得到订阅的HA的各种指令,然后通过“解析HA指令并发布节点”自动计算出485控制指令发送给串口或串口服务器执行写操作。同时他也生成HA自动发现的MQTT消息负载给HomeAssistant完成实体的自动发现。
由于485半双工传输特性,控制和轮询指令可能同时发送至串口节点造成通讯阻塞,而导致控制失败,因此我加入了“队列”节点,它能有效的避免这一情况的发送,而且可以通过节点实时的观察数据处理情况,例如:空闲、排队、忙碌等状态。
05 流程使用方法
首先配置“流程查询”节点:
以上是函数节点局部截图:let variableNames = { config: 'RS485-2' }; 是定义全局变量节点的名称,一般不用修改。如果确要修改需要把其他节点中的定义变量全部修改,格式需为:RS485-;
const pollingInterval = 500; 为从站轮询时间,默认为500毫秒轮询一次。
配置参数均在RS485ParamsData中配置:其中各值的定义为:
-
Add:从站地址;
-
CH:预留,可随意设置;
-
RWHead:读写帧头;
-
RHead:解析帧头;
-
CHL:频道低位;
-
CHH:频道高位;
-
RCMD:读命令;
-
CMD00:占位;
-
WCMD:写命令:
-
CRC:校验方式,这里为XOR奇偶校验;
-
REV:百分比反转,true或false;
-
POS:定义是否为百分比控制,true或false;
-
STD:协议类型,false时为私有方式解析协议;
-
Bytes:报文长度;
-
Offset:数据所在位;
-
OP:输出状态值;
-
OPCMD:百分比控制命令设置;
-
DrvClass:HA中的设备类别;
-
Drv:HA中的设备类型;
-
entities:HA中的实体名称定义;
-
Path:MQTT路径,需以“/”结尾;
-
Notes:HA中显示的中文名称。
以上各值定义可参考流程中的案例定义根据实际情况改写,但是只能修改其值,不要对定义键进行修改。
如果需要添加多个从站设备按照以下方式复制即可,注意从站地址不能重复。
完成以上设置后就可以手动触发一次“轮询查询”前的注入节点,然后触发“输出Cover-485内容”函数节点输出设置的值,如果正确后就可以进行运行测试。
运行时需使“查询变量”前的注入节点设置成立即执行,“轮询查询”前的注入节点设置成周期性执行,时间应大于等于函数节点显示的轮询时间。
流程中使用的是串口服务器节点通讯,如果你使用的是直接控制串口的方式把流程中的TCP节点替换成“serial request”节点即可。
其他MQTT节点设置可以参照前面文章,这里不再赘述。
以上流程是基于奥科485窗帘协议编写,如果大家有其他私有协议的设备需要接入,可以联系我免费写流程用以完善扩充以上流程的功能。