01 前言
本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。
02 概述
前面详细讲解过对私有485设备的解析方法与流程,按照解析方法来说,私有485设备的解析比Modbus协议设备的解析更为简单,虽然协议不是标准的,但是它定义更为简单,只需找到规律即可;Modbus协议经过多年的发展以及很成熟,功能强大且复杂,正因如此同时加大了解析的难度。
485和Modbus的概念和关系我在这里不多说,大家可以网上搜索,讲的也很透彻。在NodeRed和HomeAssistant中都可以对Modbus设备进行解析控制,HomeAssistant中需要配置configuration.yaml的方式来添加设备,如果设备较多可能会抓狂,在NodeRed中也可以采用三方节点进行解析,这些节点一直在正常维护中,功能也在不断强大,但是我没有使用过。
自从接触NodeRed就对它的强大功能吸引,于是就思考能不能自己编写流程来解析Modbus,抱着试一试的心态从构思到实施终于完成了流程。该流程和HomeAssistant能完美契合,配置简单并实现HomeAssistant自动发现,也能通过其他设备自由控制。案例中以如下12路照明控制模块为例演示接入。
流程功能:
1.同时支持485和串口服务器接入;
2.校验码自动计算;
3.简单配置即可在HA中自动发现;
4.与HomeAssistant无缝对接;
5.设备数据定义方便快捷;
6.Modbus继电器开关设备支持;
7.支持16位无符号数解析;
8.全功能码支持;
9.便捷的Modbus转MQTT。
03 流程运行原理
Modbus解析流程图如下:
细心的朋友会发现,上面的流程和私有协议的流程基本上是一样的。没错,在流程图上看就是一样的,区别在于报文解析的逻辑上有很大差异,难点在于对不同数据类型的解析上。
解析流程:根据定义构建Modbus指令➝串口接收并反馈消息➝解析串口数据➝MQTT发布状态信息;
控制流程:动态接收HA指令➝解析HA指令➝构建控制指令➝串口接收并执行指令。
以上流程中为使用任何Modbus三方节点,只使用了serial request,当然同时也是支持使用TCP连接的。
04 流程使用方法
配置“轮询查询”节点:
Device配置(从站配置)
-
Add:从站地址;
-
FC:读功能码;
-
RegStAdd:开始寄存器;
-
QTY:需要读取的寄存器数量;
analysis配置(寄存器配置)
-
RegAdd:寄存器地址;
-
FC:写功能;
-
RegQty:寄存器数量;
-
DataType:数据类型(暂不修改):
-
DrvClass:HA中的设备类别;
-
entities:HA中的实体名称定义;
-
Path:MQTT路径,需以“/”结尾;
-
Notes:HA中显示的中文名称;
-
icon:自定义HA图标。
以上各值定义可参考流程中的案例定义根据实际情况改写,但是只能修改其值,不要对定义键进行修改。
完成以上设置后就可以手动触发一次“轮询查询”前的注入节点,然后触发“输出modbusParams内容”函数节点输出设置的值,如果正确后就可以进行运行测试。
运行时需使“查询变量”前的注入节点设置成立即执行,“轮询查询”前的注入节点设置成周期性执行,默认为1S。
流程中使用的是serial reques节点通讯,如果你使用的是串口服务器方式把流程中的节点替换成“TCP request”节点即可。
然后把MQTT节点设置成HA的MQTT服务器地址,可以参照前面文章,这里不再赘述。
以上流程是基于12路继电器开关协议,数据类型为16位符号数,暂支持单个从站的多路设备接入,后期会支持更多的设备和数据类型解析,下面是HomeAssistant中通过自动发现后的全部实体。
以上案例中流程代码位于公众号底部,需要的朋友请自取。