node-red-contrib-symi-modbus 2.6.8 → 2.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -366
- package/examples/basic-flow.json +33 -21
- package/nodes/custom-protocol.html +276 -0
- package/nodes/custom-protocol.js +240 -0
- package/nodes/homekit-bridge.html +44 -22
- package/nodes/homekit-bridge.js +18 -0
- package/nodes/mesh-protocol.js +286 -0
- package/nodes/modbus-dashboard.html +444 -0
- package/nodes/modbus-dashboard.js +116 -0
- package/nodes/modbus-debug.js +10 -2
- package/nodes/modbus-master.js +175 -74
- package/nodes/modbus-slave-switch.html +196 -12
- package/nodes/modbus-slave-switch.js +479 -157
- package/nodes/serial-port-config.js +84 -21
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -16,8 +16,15 @@ Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成,
|
|
|
16
16
|
- Modbus TCP(标准Modbus TCP)
|
|
17
17
|
- Modbus RTU over TCP(TCP转RS485网关)
|
|
18
18
|
- Telnet ASCII(推荐用于TCP转RS485网关)
|
|
19
|
-
- **Symi
|
|
19
|
+
- **Symi开关集成**:
|
|
20
|
+
- RS-485开关:自动识别并处理Symi私有协议按键事件
|
|
21
|
+
- 蓝牙Mesh开关:支持Symi蓝牙Mesh网关和1-6路Mesh开关
|
|
22
|
+
- 双向同步:开关面板与继电器状态实时同步
|
|
23
|
+
- 设备持久化:Mesh设备列表自动保存,重启无需重新扫描
|
|
20
24
|
- **HomeKit网桥**:一键桥接到Apple HomeKit,支持Siri语音控制,自动同步主站配置,名称可自定义
|
|
25
|
+
- **智能写入队列**:所有写入操作串行执行,支持HomeKit群控160个继电器同时动作,流畅无卡顿
|
|
26
|
+
- **可视化控制看板**:实时显示和控制所有继电器状态,美观易用,适合现场调试和日常监控
|
|
27
|
+
- **自定义协议转换**:支持非标准485协议设备,窗帘循环控制,配置界面可测试发送
|
|
21
28
|
- **多设备轮询**:支持最多10台Modbus从站设备,每台32路继电器
|
|
22
29
|
- **智能轮询机制**:从站上报时自动暂停轮询,优先处理数据,避免冲突
|
|
23
30
|
- **稳定可靠**:完整的内存管理、错误处理、断线重连,适合7x24小时长期运行
|
|
@@ -53,7 +60,7 @@ node-red-restart
|
|
|
53
60
|
**配置方法**:
|
|
54
61
|
1. 主站节点:不启用MQTT或不配置MQTT服务器
|
|
55
62
|
2. 从站开关节点:不配置MQTT服务器
|
|
56
|
-
3.
|
|
63
|
+
3. **无需连线**:主站和从站通过内部事件自动通信
|
|
57
64
|
|
|
58
65
|
**优势**:
|
|
59
66
|
- ✅ 断网也能稳定运行
|
|
@@ -132,21 +139,73 @@ node-red-restart
|
|
|
132
139
|
|
|
133
140
|
### 5. 配置从站开关节点(可选)
|
|
134
141
|
|
|
135
|
-
|
|
142
|
+
使用物理开关面板控制继电器,支持三种模式:
|
|
143
|
+
|
|
144
|
+
#### 模式1:RS-485开关模式(传统有线开关)
|
|
136
145
|
|
|
137
146
|
1. 拖拽 **从站开关** 节点到流程画布
|
|
138
147
|
2. 选择刚创建的RS-485连接配置
|
|
139
148
|
3. 配置开关面板信息:
|
|
140
149
|
- 面板品牌: `亖米` (默认)
|
|
150
|
+
- 按钮类型: `开关按钮(RS-485)`
|
|
141
151
|
- 开关ID: 物理面板地址 (0-255)
|
|
142
152
|
- 按钮编号: 按键编号 (1-8)
|
|
143
|
-
- 按钮类型: 开关按钮或场景按钮(也可自动识别)
|
|
144
153
|
4. 配置映射到的继电器:
|
|
145
154
|
- 目标从站地址: `10`
|
|
146
|
-
- 目标线圈编号: `
|
|
147
|
-
5.
|
|
155
|
+
- 目标线圈编号: `1`(用户输入1-32)
|
|
156
|
+
5. **无需连线**:主站和从站通过内部事件自动通信
|
|
148
157
|
6. 部署流程
|
|
149
158
|
|
|
159
|
+
#### 模式2:RS-485场景模式(场景触发)
|
|
160
|
+
|
|
161
|
+
1. 配置步骤同上,但按钮类型选择 `场景按钮(RS-485)`
|
|
162
|
+
2. 每次按键触发状态翻转(ON→OFF或OFF→ON)
|
|
163
|
+
3. 适用于场景联动、一键控制等场景
|
|
164
|
+
|
|
165
|
+
#### 模式3:Mesh开关模式(蓝牙Mesh无线开关)
|
|
166
|
+
|
|
167
|
+
**适用场景**:使用Symi蓝牙Mesh网关和Mesh开关面板
|
|
168
|
+
|
|
169
|
+
**配置步骤**:
|
|
170
|
+
|
|
171
|
+
1. **准备工作**
|
|
172
|
+
- 确保Mesh网关已通过TCP或串口连接到Node-RED
|
|
173
|
+
- 确保Mesh开关已配网到网关
|
|
174
|
+
|
|
175
|
+
2. **添加节点**
|
|
176
|
+
- 拖拽 **从站开关** 节点到流程画布
|
|
177
|
+
- 选择Mesh网关的连接配置(TCP或串口)
|
|
178
|
+
|
|
179
|
+
3. **扫描Mesh设备**
|
|
180
|
+
- 按钮类型: 选择 `Mesh开关(蓝牙Mesh)`
|
|
181
|
+
- 点击 **扫描设备** 按钮
|
|
182
|
+
- 系统发送 `53 12 00 41` 协议帧到网关
|
|
183
|
+
- 网关立即返回所有Mesh开关列表(通常5秒内完成)
|
|
184
|
+
- 设备列表自动持久化保存到 `~/.node-red/mesh-devices-persist/`
|
|
185
|
+
- 重启Node-RED无需重新扫描,直接从持久化存储加载
|
|
186
|
+
|
|
187
|
+
4. **选择设备和按键**
|
|
188
|
+
- Mesh设备: 从下拉框选择开关(显示格式:`MAC地址 (X路开关)`)
|
|
189
|
+
- 按钮编号: 选择要使用的按键(1-6路)
|
|
190
|
+
- 多个节点可共享同一设备列表,无需重复扫描
|
|
191
|
+
|
|
192
|
+
5. **配置目标继电器**
|
|
193
|
+
- 目标从站地址: `10`
|
|
194
|
+
- 目标线圈编号: `1`(用户输入1-32)
|
|
195
|
+
|
|
196
|
+
6. **部署流程**
|
|
197
|
+
- 点击"完成"并部署
|
|
198
|
+
- Mesh开关按键会自动控制对应继电器
|
|
199
|
+
- 继电器状态变化会自动反馈到Mesh开关LED
|
|
200
|
+
|
|
201
|
+
**Mesh模式特点**:
|
|
202
|
+
- ✅ 无线控制,无需布线
|
|
203
|
+
- ✅ 支持1-6路开关
|
|
204
|
+
- ✅ 双向同步(按键→继电器,继电器→LED)
|
|
205
|
+
- ✅ 设备列表持久化保存
|
|
206
|
+
- ✅ 短地址自动更新(如果网关重新配网)
|
|
207
|
+
- ✅ 与RS-485开关使用方式完全一致
|
|
208
|
+
|
|
150
209
|
### 6. 配置HomeKit网桥节点(可选)
|
|
151
210
|
|
|
152
211
|
将Modbus继电器桥接到Apple HomeKit,实现Siri语音控制:
|
|
@@ -183,6 +242,35 @@ node-red-restart
|
|
|
183
242
|
- 支持Siri语音控制:"嘿Siri,打开客厅灯"
|
|
184
243
|
- 支持HomeKit自动化和场景
|
|
185
244
|
- 配置会自动保存,重启后无需重新配对
|
|
245
|
+
- **群控性能**:支持同时控制多个继电器(如创建编组),智能队列机制确保流畅无卡顿
|
|
246
|
+
|
|
247
|
+
**群控说明**(客户友好模式):
|
|
248
|
+
|
|
249
|
+
本节点专为智能家居群控场景优化,支持以下高性能操作:
|
|
250
|
+
|
|
251
|
+
1. **HomeKit编组群控**:
|
|
252
|
+
- 在HomeKit中创建房间或编组,可同时控制多个继电器
|
|
253
|
+
- 例如:创建"客厅"编组,包含10个灯光开关,一键全开/全关
|
|
254
|
+
- 智能队列机制确保所有继电器按序快速执行,无超时警告
|
|
255
|
+
- 10个继电器同时动作仅需约200ms(20ms间隔×10)
|
|
256
|
+
|
|
257
|
+
2. **场景联动**:
|
|
258
|
+
- 支持HomeKit场景(如"回家模式"、"离家模式")
|
|
259
|
+
- 场景可包含多个继电器动作,自动串行执行
|
|
260
|
+
- 前16个线圈(继电器)可同时动作,后16个线圈(场景)按需触发
|
|
261
|
+
|
|
262
|
+
3. **性能保证**:
|
|
263
|
+
- 最大支持10台继电器(每台32路),共320个线圈
|
|
264
|
+
- 前160个线圈(10台×16路)可用于继电器控制,支持群控
|
|
265
|
+
- 后160个线圈(10台×16路)可用于场景触发,一般不会全部同时动作
|
|
266
|
+
- 智能写入队列确保所有操作串行执行,避免总线冲突
|
|
267
|
+
- 长期稳定运行,反复控制不会造成内存增加、卡顿或死机
|
|
268
|
+
|
|
269
|
+
4. **技术细节**:
|
|
270
|
+
- 写入队列间隔:20ms(确保总线稳定)
|
|
271
|
+
- 轮询恢复时间:20ms(快速响应)
|
|
272
|
+
- 锁等待超时:100ms(快速检测异常)
|
|
273
|
+
- 队列自动处理,无需手动干预
|
|
186
274
|
|
|
187
275
|
## 核心特性说明
|
|
188
276
|
|
|
@@ -650,6 +738,79 @@ HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
|
650
738
|
- 配置信息持久化存储在~/.node-red/homekit-persist目录
|
|
651
739
|
- 重启Node-RED后自动恢复配对状态,无需重新配对
|
|
652
740
|
|
|
741
|
+
### 控制看板节点(客户友好模式)
|
|
742
|
+
|
|
743
|
+
控制看板节点提供可视化界面,实时显示和控制所有从站的继电器状态,适合现场调试和日常监控。
|
|
744
|
+
|
|
745
|
+
**配置参数**:
|
|
746
|
+
- **节点名称**:控制看板的显示名称(默认:Modbus控制看板)
|
|
747
|
+
- **主站节点**:选择要监控的Modbus主站节点(必填)
|
|
748
|
+
|
|
749
|
+
**功能特性**:
|
|
750
|
+
- **实时状态显示**:在配置界面中显示所有从站和线圈的实时状态
|
|
751
|
+
- **一键控制**:点击按钮即可控制继电器开关,无需部署流程
|
|
752
|
+
- **美观布局**:网格布局,按从站分组显示,一目了然
|
|
753
|
+
- **名称同步**:自动同步HomeKit网桥配置的继电器名称
|
|
754
|
+
- **快速响应**:状态实时更新(500ms轮询),响应迅速
|
|
755
|
+
- **零开销**:不参与实际Modbus通信,不影响主站性能
|
|
756
|
+
|
|
757
|
+
**使用步骤**:
|
|
758
|
+
1. 在Node-RED中添加控制看板节点
|
|
759
|
+
2. 选择已配置的Modbus主站节点
|
|
760
|
+
3. 双击节点打开配置界面,即可看到所有继电器状态
|
|
761
|
+
4. 点击按钮即可控制继电器开关(绿色=ON,红色=OFF)
|
|
762
|
+
5. 部署流程后,节点会显示"监控中"状态
|
|
763
|
+
|
|
764
|
+
**使用场景**:
|
|
765
|
+
- **现场调试**:快速测试继电器是否正常工作
|
|
766
|
+
- **日常监控**:实时查看所有继电器状态
|
|
767
|
+
- **批量控制**:快速控制多个继电器
|
|
768
|
+
- **客户演示**:美观的界面,适合向客户展示系统功能
|
|
769
|
+
|
|
770
|
+
**技术细节**:
|
|
771
|
+
- 使用HTTP API与主站通信,通过内部事件发送控制命令
|
|
772
|
+
- 状态缓存机制,减少网络请求
|
|
773
|
+
- 仅在配置界面打开时才轮询状态,关闭后自动停止
|
|
774
|
+
- 与HomeKit网桥共享继电器名称配置,保持一致性
|
|
775
|
+
|
|
776
|
+
**注意事项**:
|
|
777
|
+
- 确保主站节点已正确配置并运行
|
|
778
|
+
- 控制看板只在配置界面打开时才轮询状态
|
|
779
|
+
- 继电器名称需在HomeKit网桥节点中配置
|
|
780
|
+
- 本节点不参与实际Modbus通信,不会增加主站负担
|
|
781
|
+
|
|
782
|
+
### 自定义协议节点
|
|
783
|
+
|
|
784
|
+
用于控制非标准Modbus协议的485设备(如窗帘、特殊开关等)。
|
|
785
|
+
|
|
786
|
+
**配置步骤**:
|
|
787
|
+
1. 添加自定义协议节点到流程画布
|
|
788
|
+
2. 选择设备类型(开关/窗帘/其他)
|
|
789
|
+
3. 选择串口配置节点
|
|
790
|
+
4. 输入16进制指令(空格分隔,自动格式化为大写)
|
|
791
|
+
- 打开指令:例如 `01 05 00 00 FF 00 8C 3A`
|
|
792
|
+
- 关闭指令:例如 `01 05 00 00 00 00 CD CA`
|
|
793
|
+
- 暂停指令:仅窗帘模式需要,例如 `01 05 00 01 FF 00 DD FA`
|
|
794
|
+
5. 点击"测试"按钮验证指令是否正确发送
|
|
795
|
+
6. 连线:从站开关 → 自定义协议节点
|
|
796
|
+
7. 部署流程
|
|
797
|
+
|
|
798
|
+
**设备类型说明**:
|
|
799
|
+
- **开关模式**:收到`true`发送打开指令,收到`false`发送关闭指令
|
|
800
|
+
- **窗帘模式**:每次触发循环发送下一个指令(打开 → 暂停 → 关闭 → 暂停 → 打开...)
|
|
801
|
+
- **其他模式**:与开关模式相同
|
|
802
|
+
|
|
803
|
+
**使用场景**:
|
|
804
|
+
- 窗帘控制:支持打开/暂停/关闭循环控制
|
|
805
|
+
- 特殊开关:非标准Modbus协议的485设备
|
|
806
|
+
- 自定义设备:任何需要发送固定16进制指令的设备
|
|
807
|
+
|
|
808
|
+
**注意事项**:
|
|
809
|
+
- 每个指令最多48字节
|
|
810
|
+
- 窗帘模式需配置三个指令(打开、关闭、暂停)
|
|
811
|
+
- 测试功能需先选择串口配置
|
|
812
|
+
- 无需连线到debug节点,直接通过串口配置节点发送数据
|
|
813
|
+
|
|
653
814
|
## 输出消息格式
|
|
654
815
|
|
|
655
816
|
### 主站节点
|
|
@@ -708,381 +869,66 @@ HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
|
708
869
|
]
|
|
709
870
|
```
|
|
710
871
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
**版本**: v2.6.8
|
|
872
|
+
完整示例请参考项目中的 `examples/basic-flow.json` 文件。
|
|
714
873
|
|
|
715
|
-
|
|
716
|
-
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
717
|
-
- 多设备轮询(最多10台从站,每台32路继电器,轮询间隔100-10000ms可调)
|
|
718
|
-
- 🔥 **双模式支持**(本地模式和MQTT模式可选切换,断网也能稳定运行)
|
|
719
|
-
- 🔥 **免连线通信**(主站和从站通过内部事件通信,无需连线)
|
|
720
|
-
- 🔥 **HomeKit网桥**(一键桥接到Apple HomeKit,支持Siri语音控制)
|
|
721
|
-
- MQTT集成(可选启用,Home Assistant自动发现)
|
|
722
|
-
- 物理开关面板双向同步(支持开关模式和场景模式)
|
|
723
|
-
- 长期稳定运行(内存管理、智能重连、异步处理)
|
|
874
|
+
## 技术栈
|
|
724
875
|
|
|
725
|
-
**技术要求**:
|
|
726
876
|
- Node.js: >=14.0.0
|
|
727
877
|
- Node-RED: >=2.0.0
|
|
878
|
+
- modbus-serial: ^8.0.23
|
|
879
|
+
- serialport: ^12.0.0
|
|
880
|
+
- mqtt: ^5.14.1(可选)
|
|
881
|
+
- hap-nodejs: ^1.2.0
|
|
882
|
+
- node-persist: ^4.0.4
|
|
728
883
|
|
|
729
|
-
|
|
730
|
-
- **🔥 新增HomeKit网桥节点**:
|
|
731
|
-
- 一键桥接Modbus继电器到Apple HomeKit
|
|
732
|
-
- 自动同步主站配置的所有从站和继电器
|
|
733
|
-
- 支持在Node-RED中配置继电器友好名称
|
|
734
|
-
- 双向同步:HomeKit控制继电器,继电器状态实时同步到HomeKit
|
|
735
|
-
- 支持Siri语音控制和HomeKit自动化场景
|
|
736
|
-
- 持久化存储配对信息,重启后自动恢复
|
|
737
|
-
- 线圈0-15显示为开关,线圈16-31显示为插座(避免误触发)
|
|
738
|
-
|
|
739
|
-
**v2.6.7更新**:
|
|
740
|
-
- **🔥 修复LED反馈功能**:
|
|
741
|
-
- 主站轮询检测到状态变化时自动广播事件
|
|
742
|
-
- 从站开关节点监听状态变化并发送LED反馈到物理面板
|
|
743
|
-
- 支持开关模式(SET协议)和场景模式(REPORT协议)
|
|
744
|
-
- LED反馈队列间隔20ms,避免总线拥堵
|
|
745
|
-
- **🔥 TCP连接稳定性优化**:
|
|
746
|
-
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
747
|
-
- Keep-Alive间隔从30秒优化到10秒
|
|
748
|
-
- 适应客户长期不在家、总线无数据的场景
|
|
749
|
-
- **日志优化**:
|
|
750
|
-
- 移除频繁的轮询日志("轮询持续运行中"、"正在轮询从站X")
|
|
751
|
-
- 轮询永久稳定运行,无需频繁确认
|
|
752
|
-
- 减少日志输出,降低硬盘占用
|
|
753
|
-
|
|
754
|
-
**v2.6.6更新**:
|
|
755
|
-
- **🔥 彻底解决MQTT日志刷屏问题**:
|
|
756
|
-
- 局域网IP检测优化:配置192.168.x.x等IP后不再尝试fallback地址
|
|
757
|
-
- 高频MQTT日志改为debug级别:broker候选、认证、重连等
|
|
758
|
-
- 默认不输出到日志文件和调试窗口
|
|
759
|
-
- 配置局域网IP后立即连接,不产生多余日志
|
|
760
|
-
- **日志输出优化**:
|
|
761
|
-
- 连接成功/失败:仍使用log(重要信息)
|
|
762
|
-
- 重连尝试、fallback地址、认证信息:改为debug(调试信息)
|
|
763
|
-
- 仅启用debug模式时才在调试窗口显示
|
|
764
|
-
- 彻底解决日志刷屏和硬盘占用问题
|
|
765
|
-
|
|
766
|
-
**v2.6.5更新**:
|
|
767
|
-
- **🔥 修复MQTT报错问题**:从站开关节点新增"启用MQTT"勾选框
|
|
768
|
-
- 默认不启用MQTT,不会尝试连接
|
|
769
|
-
- 本地模式和MQTT模式自由切换
|
|
770
|
-
|
|
771
|
-
**v2.6.4更新**:
|
|
772
|
-
- **🔥 日志优化**:大幅减少日志输出,保证长期稳定运行
|
|
773
|
-
- 高频操作日志改为debug级别
|
|
774
|
-
- 默认不输出到日志文件
|
|
775
|
-
- 完善的内存清理机制
|
|
776
|
-
|
|
777
|
-
**v2.6.3更新**:
|
|
778
|
-
- **🔥 MQTT可选配置**:完全兼容无MQTT环境
|
|
779
|
-
- 本地模式:纯串口通信
|
|
780
|
-
- MQTT模式:可选接入HA
|
|
781
|
-
- 智能切换和状态显示
|
|
782
|
-
|
|
783
|
-
**性能优化**:
|
|
784
|
-
- 轮询间隔优化:修复间隔计算逻辑,确保每个从站使用正确的轮询间隔
|
|
785
|
-
- MQTT发布使用QoS=0,避免阻塞轮询
|
|
786
|
-
- 异步发布状态更新,不影响Modbus读取性能
|
|
787
|
-
- 减少调试日志输出,降低CPU占用
|
|
788
|
-
- 互斥锁机制确保读写操作不冲突
|
|
789
|
-
- 共享连接配置节点,避免串口资源冲突
|
|
790
|
-
|
|
791
|
-
**许可证**: MIT License
|
|
792
|
-
|
|
793
|
-
**作者**: symi-daguo
|
|
794
|
-
- NPM: https://www.npmjs.com/~symi-daguo
|
|
795
|
-
- GitHub: https://github.com/symi-daguo
|
|
796
|
-
|
|
797
|
-
**支持**:
|
|
798
|
-
- Issues: https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
799
|
-
- NPM: https://www.npmjs.com/package/node-red-contrib-symi-modbus
|
|
884
|
+
## 版本信息
|
|
800
885
|
|
|
801
|
-
|
|
886
|
+
**当前版本**: v2.6.9
|
|
802
887
|
|
|
803
|
-
|
|
804
|
-
- 包含节点:`modbus-master`(主站)、`modbus-slave-switch`(从站开关)、`modbus-debug`(调试)
|
|
805
|
-
- 如果未显示该分类或节点:
|
|
806
|
-
- 刷新浏览器缓存(Shift+刷新)
|
|
807
|
-
- 重启 Node-RED(如:`node-red-restart` 或系统服务方式)
|
|
808
|
-
- 在“节点管理(Manage Palette)”确认安装版本为 `v2.6.6`
|
|
888
|
+
### v2.6.9 (2025-11-10)
|
|
809
889
|
|
|
810
|
-
|
|
890
|
+
**重要修复**:
|
|
891
|
+
- 修复LED反馈队列处理逻辑:移除本地队列,直接使用全局队列(serial-port-config统一管理)
|
|
892
|
+
- 确保所有LED反馈按顺序串行发送,间隔20ms(TCP)或10ms(串口)
|
|
893
|
+
- 修复多从站继电器同时变化时的LED反馈遗漏问题
|
|
894
|
+
- 确保双控/多控场景下所有开关面板都能收到完整的状态反馈
|
|
811
895
|
|
|
812
|
-
|
|
813
|
-
-
|
|
814
|
-
-
|
|
815
|
-
-
|
|
816
|
-
-
|
|
896
|
+
**队列处理机制**(全局统一队列):
|
|
897
|
+
- **全局队列**:所有从站开关节点共享同一个全局队列(由serial-port-config管理)
|
|
898
|
+
- **串行发送**:所有LED反馈按加入队列的顺序依次发送,间隔20ms(TCP)或10ms(串口)
|
|
899
|
+
- **完整性保证**:所有LED反馈都能正确发送,不会遗漏
|
|
900
|
+
- **去重机制**:每个节点50ms内不重复发送相同状态,避免总线拥堵
|
|
901
|
+
- **性能优化**:400个按键(50个8键开关)反馈耗时约8秒(20ms×400)
|
|
817
902
|
|
|
818
|
-
|
|
903
|
+
**典型场景说明**:
|
|
904
|
+
1. **场景1:单个继电器控制**
|
|
905
|
+
- 按下开关 → 继电器动作 → LED反馈加入全局队列 → 20ms后发送
|
|
819
906
|
|
|
820
|
-
|
|
821
|
-
-
|
|
822
|
-
-
|
|
907
|
+
2. **场景2:批量控制(如17通道全开,16个继电器)**
|
|
908
|
+
- 触发17通道 → 1-16路继电器全开 → 所有绑定的LED反馈加入全局队列
|
|
909
|
+
- 假设每个继电器绑定2个开关面板 = 32个LED反馈
|
|
910
|
+
- 按加入队列的顺序依次发送,耗时约640ms(20ms×32)
|
|
823
911
|
|
|
824
|
-
|
|
825
|
-
-
|
|
826
|
-
-
|
|
827
|
-
-
|
|
912
|
+
3. **场景3:快速切换(如17通道全开后立即18通道全关)**
|
|
913
|
+
- 17通道触发 → 1-16路全开 → 32个LED反馈加入队列
|
|
914
|
+
- 18通道触发 → 1-16路全关 → 32个LED反馈加入队列
|
|
915
|
+
- 全局队列按顺序处理,确保所有面板最终显示正确状态
|
|
828
916
|
|
|
829
|
-
|
|
917
|
+
4. **场景4:双控开关(1个继电器绑定2个不同ID的开关面板)**
|
|
918
|
+
- 继电器状态变化 → 2个LED反馈加入全局队列
|
|
919
|
+
- 按顺序发送,间隔20ms,确保所有面板LED状态同步
|
|
830
920
|
|
|
831
|
-
|
|
832
|
-
-
|
|
833
|
-
-
|
|
834
|
-
-
|
|
835
|
-
- **在线状态**:自动发布设备可用性状态
|
|
836
|
-
|
|
837
|
-
### 配置持久化
|
|
921
|
+
5. **场景5:大规模部署(50个8键开关 = 400个按键)**
|
|
922
|
+
- 批量控制触发 → 所有LED反馈加入全局队列
|
|
923
|
+
- 按部署时的节点顺序依次发送,耗时约8秒(20ms×400)
|
|
924
|
+
- 确保总线稳定,不会冲突或丢失
|
|
838
925
|
|
|
839
|
-
|
|
840
|
-
- 从站地址、线圈范围、轮询间隔
|
|
841
|
-
- MQTT服务器配置
|
|
842
|
-
- 开关面板映射关系
|
|
926
|
+
## 许可证
|
|
843
927
|
|
|
844
|
-
|
|
928
|
+
MIT License
|
|
845
929
|
|
|
846
|
-
|
|
930
|
+
## 支持与反馈
|
|
847
931
|
|
|
848
|
-
|
|
849
|
-
-
|
|
850
|
-
-
|
|
851
|
-
- **智能日志限流**:错误日志10分钟输出一次,避免日志刷屏
|
|
852
|
-
- **智能重连机制**:
|
|
853
|
-
- Modbus连接断开自动重连(指数退避:5秒→10秒→20秒...最大60秒)
|
|
854
|
-
- MQTT连接断开自动重连(支持多地址fallback)
|
|
855
|
-
- 串口拔插自动检测并重连
|
|
856
|
-
- TCP网络故障自动恢复
|
|
857
|
-
- 连接前彻底清理旧实例,避免资源泄漏
|
|
858
|
-
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
859
|
-
- **TCP永久连接**:
|
|
860
|
-
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
861
|
-
- Keep-Alive心跳10秒间隔,确保连接活跃
|
|
862
|
-
- 适应客户长期不在家、总线无数据的场景
|
|
863
|
-
- 网络故障自动重连,恢复后立即恢复通信
|
|
864
|
-
|
|
865
|
-
## 技术规格
|
|
866
|
-
|
|
867
|
-
### Modbus协议
|
|
868
|
-
|
|
869
|
-
- **协议类型**:Modbus TCP / Modbus RTU
|
|
870
|
-
- **底层库**:modbus-serial ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
871
|
-
- **功能码支持**:0x01(读线圈)、0x05(写单个线圈)、0x0F(写多个线圈)
|
|
872
|
-
- **从站地址范围**:1-247(建议从10开始)
|
|
873
|
-
- **线圈数量**:每台设备32个(0-31)
|
|
874
|
-
- **最大设备数**:10台同时轮询
|
|
875
|
-
- **轮询间隔**:默认200ms(建议300-500ms,支持100-10000ms)
|
|
876
|
-
- **串口配置**:9600 8-N-1(波特率9600,8数据位,无校验,1停止位)
|
|
877
|
-
- **超时设置**:5000ms(TCP和串口通用)
|
|
878
|
-
|
|
879
|
-
### 兼容性
|
|
880
|
-
|
|
881
|
-
- **Node.js**: >= 14.0.0
|
|
882
|
-
- **Node-RED**: >= 2.0.0
|
|
883
|
-
- **MQTT Broker**: Mosquitto / EMQX / Any MQTT 3.1.1/5.0
|
|
884
|
-
- **Home Assistant**: 2024.x+(MQTT Discovery标准)
|
|
885
|
-
- **操作系统**: Windows / Linux / macOS / HassOS
|
|
886
|
-
|
|
887
|
-
## Home Assistant集成
|
|
888
|
-
|
|
889
|
-
### 自动发现
|
|
890
|
-
|
|
891
|
-
启用MQTT后,设备自动出现在Home Assistant中:
|
|
892
|
-
- 实体ID: `switch.relay_{从站地址}_{线圈编号}`
|
|
893
|
-
- 设备名称: `Modbus继电器-{从站地址}`
|
|
894
|
-
- 自动分组: 同一从站的所有继电器分组到一个设备
|
|
895
|
-
|
|
896
|
-
### MQTT主题结构
|
|
897
|
-
|
|
898
|
-
```
|
|
899
|
-
状态主题: modbus/relay/{从站}/{线圈}/state
|
|
900
|
-
命令主题: modbus/relay/{从站}/{线圈}/set
|
|
901
|
-
可用性主题: modbus/relay/{从站}/availability
|
|
902
|
-
发现主题: homeassistant/switch/modbus_relay_{从站}_{线圈}/config
|
|
903
|
-
```
|
|
904
|
-
|
|
905
|
-
## 故障排除
|
|
906
|
-
|
|
907
|
-
### 串口连接失败
|
|
908
|
-
|
|
909
|
-
**Linux**:
|
|
910
|
-
```bash
|
|
911
|
-
# 查看串口设备
|
|
912
|
-
ls -l /dev/ttyUSB* /dev/ttyS*
|
|
913
|
-
|
|
914
|
-
# 添加用户到dialout组(需要重新登录)
|
|
915
|
-
sudo usermod -a -G dialout $USER
|
|
916
|
-
```
|
|
917
|
-
|
|
918
|
-
**macOS**:
|
|
919
|
-
```bash
|
|
920
|
-
# 查看串口设备(注意macOS使用cu.*而不是tty.*)
|
|
921
|
-
ls -l /dev/cu.*
|
|
922
|
-
```
|
|
923
|
-
|
|
924
|
-
**Docker/HassOS**:
|
|
925
|
-
```yaml
|
|
926
|
-
# 在docker-compose.yml或HassOS插件配置中添加设备映射
|
|
927
|
-
devices:
|
|
928
|
-
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
929
|
-
```
|
|
930
|
-
|
|
931
|
-
### MQTT连接失败
|
|
932
|
-
|
|
933
|
-
1. 确认MQTT broker正在运行:
|
|
934
|
-
```bash
|
|
935
|
-
# Linux
|
|
936
|
-
sudo systemctl status mosquitto
|
|
937
|
-
|
|
938
|
-
# macOS
|
|
939
|
-
brew services list | grep mosquitto
|
|
940
|
-
```
|
|
941
|
-
|
|
942
|
-
2. 测试MQTT连接:
|
|
943
|
-
```bash
|
|
944
|
-
mosquitto_sub -h localhost -t test
|
|
945
|
-
```
|
|
946
|
-
|
|
947
|
-
3. 检查Node-RED日志中的MQTT连接信息
|
|
948
|
-
|
|
949
|
-
### 主站轮询不工作
|
|
950
|
-
|
|
951
|
-
1. **检查从站配置**:确认已添加所有从站设备(如10、11、12、13)
|
|
952
|
-
2. **检查轮询间隔**:默认200ms,建议300-500ms(多台从站时避免总线拥堵)
|
|
953
|
-
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
954
|
-
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
955
|
-
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
956
|
-
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
957
|
-
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
958
|
-
8. **测试连接**:
|
|
959
|
-
- TCP连接问题:先用 `modbus-serial` 单独测试TCP连接
|
|
960
|
-
- 串口问题:先用 `serialport` 单独测试串口通信
|
|
961
|
-
|
|
962
|
-
### 从站开关无响应
|
|
963
|
-
|
|
964
|
-
1. 检查RS-485连接是否正常
|
|
965
|
-
2. 确认开关面板地址和按钮编号正确
|
|
966
|
-
3. 检查MQTT连接状态
|
|
967
|
-
4. 查看Node-RED日志中的协议解析信息
|
|
968
|
-
|
|
969
|
-
## 输入消息格式
|
|
970
|
-
|
|
971
|
-
### 主站节点
|
|
972
|
-
|
|
973
|
-
```javascript
|
|
974
|
-
// 启动轮询
|
|
975
|
-
msg.payload = {cmd: "start"};
|
|
976
|
-
|
|
977
|
-
// 停止轮询
|
|
978
|
-
msg.payload = {cmd: "stop"};
|
|
979
|
-
|
|
980
|
-
// 写单个线圈
|
|
981
|
-
msg.payload = {
|
|
982
|
-
cmd: "writeCoil",
|
|
983
|
-
slave: 10, // 从站地址
|
|
984
|
-
coil: 0, // 线圈编号
|
|
985
|
-
value: true // true=开, false=关
|
|
986
|
-
};
|
|
987
|
-
|
|
988
|
-
// 批量写多个线圈
|
|
989
|
-
msg.payload = {
|
|
990
|
-
cmd: "writeCoils",
|
|
991
|
-
slave: 10, // 从站地址
|
|
992
|
-
startCoil: 0, // 起始线圈
|
|
993
|
-
values: [true, false, true, false] // 线圈值数组
|
|
994
|
-
};
|
|
995
|
-
```
|
|
996
|
-
|
|
997
|
-
### 从站开关节点
|
|
998
|
-
|
|
999
|
-
```javascript
|
|
1000
|
-
// 发送开关命令
|
|
1001
|
-
msg.payload = true; // 或 false
|
|
1002
|
-
msg.payload = "ON"; // 或 "OFF"
|
|
1003
|
-
msg.payload = 1; // 或 0
|
|
1004
|
-
```
|
|
1005
|
-
|
|
1006
|
-
## 输出消息格式
|
|
1007
|
-
|
|
1008
|
-
### 主站节点
|
|
1009
|
-
|
|
1010
|
-
```javascript
|
|
1011
|
-
{
|
|
1012
|
-
payload: {
|
|
1013
|
-
slave: 10, // 从站地址
|
|
1014
|
-
coils: [true, false, ...], // 线圈状态数组
|
|
1015
|
-
timestamp: 1234567890 // 时间戳
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
```
|
|
1019
|
-
|
|
1020
|
-
### 从站开关节点
|
|
1021
|
-
|
|
1022
|
-
```javascript
|
|
1023
|
-
{
|
|
1024
|
-
payload: true, // 开关状态
|
|
1025
|
-
topic: "switch_0_btn1", // 主题
|
|
1026
|
-
switchId: 0, // 开关面板ID
|
|
1027
|
-
button: 1, // 按钮编号
|
|
1028
|
-
targetSlave: 10, // 目标从站地址
|
|
1029
|
-
targetCoil: 0 // 目标线圈编号
|
|
1030
|
-
}
|
|
1031
|
-
```
|
|
1032
|
-
|
|
1033
|
-
## 性能指标
|
|
1034
|
-
|
|
1035
|
-
- **内存占用**:< 50MB(单个主站节点,轮询10个设备)
|
|
1036
|
-
- **CPU占用**:< 5%(正常轮询状态)
|
|
1037
|
-
- **连接延迟**:Modbus响应 < 100ms,MQTT发布 < 50ms
|
|
1038
|
-
- **稳定运行**:经过工控机7x24小时长期运行验证
|
|
1039
|
-
- **容错能力**:Modbus从站离线不影响其他从站,MQTT断线自动重连
|
|
1040
|
-
|
|
1041
|
-
## 示例Flow
|
|
1042
|
-
|
|
1043
|
-
```json
|
|
1044
|
-
[
|
|
1045
|
-
{
|
|
1046
|
-
"id": "modbus-master-1",
|
|
1047
|
-
"type": "modbus-master",
|
|
1048
|
-
"name": "主站",
|
|
1049
|
-
"connectionType": "serial",
|
|
1050
|
-
"serialPort": "/dev/ttyUSB0",
|
|
1051
|
-
"serialBaudRate": 9600,
|
|
1052
|
-
"slaves": [
|
|
1053
|
-
{"address": 10, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
1054
|
-
{"address": 11, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
1055
|
-
{"address": 12, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
1056
|
-
{"address": 13, "coilStart": 0, "coilEnd": 31, "pollInterval": 200}
|
|
1057
|
-
],
|
|
1058
|
-
"enableMqtt": true,
|
|
1059
|
-
"mqttServer": "mqtt-config-1"
|
|
1060
|
-
}
|
|
1061
|
-
]
|
|
1062
|
-
```
|
|
1063
|
-
|
|
1064
|
-
## 项目信息
|
|
1065
|
-
|
|
1066
|
-
**版本**: v2.6.8
|
|
1067
|
-
|
|
1068
|
-
**核心功能**:
|
|
1069
|
-
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
1070
|
-
- 多设备轮询(最多10台从站,每台32路继电器,轮询间隔100-10000ms可调)
|
|
1071
|
-
- Symi私有协议自动识别(支持两种485开关控制方式)
|
|
1072
|
-
- 智能轮询暂停机制(从站上报时自动暂停,处理完成后恢复)
|
|
1073
|
-
- 🔥 **双模式支持**(本地模式和MQTT模式可选切换,断网也能稳定运行)
|
|
1074
|
-
- 🔥 **免连线通信**(主站和从站通过内部事件通信,无需连线,支持本地模式和MQTT模式)
|
|
1075
|
-
- 🔥 **HomeKit网桥**(一键桥接到Apple HomeKit,支持Siri语音控制,名称可自定义)
|
|
1076
|
-
- MQTT集成(可选启用,Home Assistant自动发现,实体唯一性保证,QoS=0高性能发布)
|
|
1077
|
-
- 物理开关面板双向同步(亖米协议支持,LED反馈同步,支持开关模式和场景模式)
|
|
1078
|
-
- 共享连接架构(多个从站开关节点共享同一个串口/TCP连接,支持500+节点)
|
|
1079
|
-
- 长期稳定运行(内存管理、智能重连、错误日志限流、异步MQTT发布、TCP永久连接)
|
|
1080
|
-
|
|
1081
|
-
**技术栈**:
|
|
1082
|
-
- modbus-serial: ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
1083
|
-
- serialport: ^12.0.0(原生串口通信)
|
|
1084
|
-
- mqtt: ^5.14.1(最新稳定版,可选依赖)
|
|
1085
|
-
- hap-nodejs: ^1.2.0(HomeKit桥接)
|
|
1086
|
-
- node-persist: ^4.0.4(持久化存储)
|
|
1087
|
-
- Node.js: >=14.0.0
|
|
1088
|
-
- Node-RED: >=2.0.0
|
|
932
|
+
- GitHub: https://github.com/symi-daguo/node-red-contrib-symi-modbus
|
|
933
|
+
- Issues: https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
934
|
+
- NPM: https://www.npmjs.com/package/node-red-contrib-symi-modbus
|