node-red-contrib-symi-modbus 2.10.7 → 2.10.8
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/.trae/skills/node-red-dev/SKILL.md +63 -0
- package/README.md +1077 -1061
- package/nodes/custom-protocol.html +6 -4
- package/nodes/homekit-bridge.html +5 -4
- package/nodes/lightweight-protocol.js +41 -26
- package/nodes/mesh-protocol.js +218 -17
- package/nodes/mesh-transparent-node.html +291 -0
- package/nodes/mesh-transparent-node.js +551 -0
- package/nodes/modbus-dashboard.html +9 -4
- package/nodes/modbus-debug.html +9 -4
- package/nodes/modbus-master.html +6 -4
- package/nodes/modbus-master.js +8 -1
- package/nodes/modbus-server-config.html +9 -4
- package/nodes/modbus-slave-switch.html +7 -6
- package/nodes/modbus-slave-switch.js +149 -27
- package/nodes/mqtt-server-config.html +6 -4
- package/nodes/relay-output.html +7 -5
- package/nodes/relay-output.js +3 -1
- package/nodes/serial-port-config.html +13 -13
- package/nodes/serial-port-config.js +362 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,1061 +1,1077 @@
|
|
|
1
|
-
# node-red-contrib-symi-modbus
|
|
2
|
-
|
|
3
|
-
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成,专为智能家居场景设计。
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/node-red-contrib-symi-modbus)
|
|
6
|
-
[](https://nodered.org)
|
|
7
|
-
[](https://opensource.org/licenses/MIT)
|
|
8
|
-
|
|
9
|
-
## 核心特性
|
|
10
|
-
|
|
11
|
-
- **双模式运行**:
|
|
12
|
-
- **本地模式**:纯串口/TCP通信,断网也能稳定运行,无需MQTT
|
|
13
|
-
- **MQTT模式**:可选接入Home Assistant等第三方平台
|
|
14
|
-
- **工业级稳定性**:
|
|
15
|
-
- **多主站隔离**:采用实例级隔离机制,支持无限个主站和从站节点共存,配置互不干扰
|
|
16
|
-
- **智能分包/粘包处理**:内置1KB环形缓冲区和协议分析器,完美处理RS-485总线的分包、粘包问题
|
|
17
|
-
- **内存安全**:严格的内存管理策略,长时间运行内存不泄露,自动清理过期缓存
|
|
18
|
-
- **死锁防护**:多级看门狗机制,自动检测并恢复控制死循环,确保生产环境不卡顿
|
|
19
|
-
- **Symi/Clowire生态集成**:
|
|
20
|
-
- **多协议支持**:完美支持Symi和Clowire(克伦威尔)双品牌协议,全面兼容 `0x03 SET`、`0x04 REPORT`、`0x05 STATUS` 等多种帧类型
|
|
21
|
-
- **全按键覆盖**:协议解析逻辑通用化,完美支持 1-8 号所有物理按键,不再局限于特定编号
|
|
22
|
-
- **蓝牙Mesh深度集成**:支持Symi蓝牙Mesh网关V1.3.1协议,实现无线开关秒级响应
|
|
23
|
-
- **设备持久化**:Mesh设备列表自动保存到磁盘,断电/重启/断网后配置不丢失
|
|
24
|
-
- **反馈同步优化**:
|
|
25
|
-
- **轮询暂停机制**:上报数据时自动暂停主站轮询,防止状态回跳
|
|
26
|
-
- **REPORT协议强制化**:指示灯反馈强制使用REPORT (0x04)协议,不触发继电器动作,避免闪烁
|
|
27
|
-
- **指示灯状态强同步**:无论当前状态如何,物理按键操作都会强制下发指示灯同步指令,确保面板 LED 与系统状态严格一致,彻底解决状态错位导致的按键失灵
|
|
28
|
-
- **物理按键强制同步**:物理按键触发时强制同步 LED 反馈(忽略重复检查),纠正面板可能存在的状态不一致
|
|
29
|
-
- **协议解析安全化**:严格过滤 REPORT (0x04) 反馈回显数据,从源头上切断“反馈触发控制”的无限死循环,确保继电器不乱跳
|
|
30
|
-
- **精准反馈锁**:内置 **100ms** 毫秒级反馈锁,完美过滤 RS485 总线物理回显,同时确保高频连点操作不丢失状态
|
|
31
|
-
- **高级控制功能**:
|
|
32
|
-
- **门禁联动过滤**:继电器节点支持门禁ID过滤,实现精确的门禁联动控制
|
|
33
|
-
- **HomeKit网桥**:一键接入Apple HomeKit,支持Siri语音控制,状态实时同步
|
|
34
|
-
- **智能写入队列**:所有写入操作串行执行,支持优先级管理,确保指示灯反馈在群控场景下秒级响应
|
|
35
|
-
- **多主站精准隔离**:支持多主站并行运行,通过 `masterId` 实现指令精准定向,严格过滤跨主站事件,彻底解决多主站环境下的控制冲突与误触发
|
|
36
|
-
- **智能反馈路由**:从站开关节点自动识别所属主站,仅响应目标主站的状态变化,防止多系统并存时的信号串扰
|
|
37
|
-
- **真·状态翻转逻辑**:继电器输出节点内置状态感知能力,基于物理设备真实反馈执行翻转操作,解决传统盲发指令导致的开关失灵
|
|
38
|
-
- **可视化运维**:
|
|
39
|
-
- **控制看板**:实时显示所有继电器状态,支持手动控制
|
|
40
|
-
- **调试模式**:详细的通信日志,支持十六进制报文监控
|
|
41
|
-
|
|
42
|
-
### 1. 安装
|
|
43
|
-
|
|
44
|
-
**通过npm安装(推荐)**
|
|
45
|
-
```bash
|
|
46
|
-
cd ~/.node-red
|
|
47
|
-
npm install node-red-contrib-symi-modbus
|
|
48
|
-
node-red-restart
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**通过Node-RED界面安装**
|
|
52
|
-
1. 点击右上角菜单 → 设置 → 节点管理
|
|
53
|
-
2. 搜索 `node-red-contrib-symi-modbus`
|
|
54
|
-
3. 点击安装
|
|
55
|
-
|
|
56
|
-
### 2. 选择运行模式
|
|
57
|
-
|
|
58
|
-
本节点支持两种运行模式,根据需求选择:
|
|
59
|
-
|
|
60
|
-
#### 模式1:本地模式(推荐用于纯串口控制)
|
|
61
|
-
|
|
62
|
-
**适用场景**:
|
|
63
|
-
- 无需对接第三方平台
|
|
64
|
-
- 断网环境下稳定运行
|
|
65
|
-
- 纯本地化控制,不受网络影响
|
|
66
|
-
|
|
67
|
-
**配置方法**:
|
|
68
|
-
1. 主站节点:不启用MQTT或不配置MQTT服务器
|
|
69
|
-
2. 从站开关节点:不配置MQTT服务器
|
|
70
|
-
3. **无需连线**:主站和从站通过内部事件自动通信
|
|
71
|
-
|
|
72
|
-
**优势**:
|
|
73
|
-
- 断网也能稳定运行
|
|
74
|
-
- 不依赖外部服务
|
|
75
|
-
- 响应速度更快
|
|
76
|
-
- 配置更简单
|
|
77
|
-
- 无需手动连线(免连线通信)
|
|
78
|
-
|
|
79
|
-
#### 模式2:MQTT模式(推荐用于Home Assistant集成)
|
|
80
|
-
|
|
81
|
-
**适用场景**:
|
|
82
|
-
- 需要对接Home Assistant等平台
|
|
83
|
-
- 需要远程控制
|
|
84
|
-
- 需要状态持久化
|
|
85
|
-
|
|
86
|
-
**配置方法**:
|
|
87
|
-
1. 拖拽任意节点到流程画布
|
|
88
|
-
2. 双击节点,找到"MQTT服务器"字段
|
|
89
|
-
3. 点击编辑按钮,填写MQTT服务器信息:
|
|
90
|
-
- MQTT Broker: `mqtt://localhost:1883` (或你的MQTT服务器地址)
|
|
91
|
-
- 用户名/密码: 按需填写
|
|
92
|
-
- 基础主题: `modbus/relay` (默认)
|
|
93
|
-
|
|
94
|
-
**优势**:
|
|
95
|
-
- Home Assistant自动发现
|
|
96
|
-
- 支持远程控制
|
|
97
|
-
- 状态持久化存储
|
|
98
|
-
|
|
99
|
-
### 3. 配置主站节点
|
|
100
|
-
|
|
101
|
-
1. 拖拽 **Modbus主站** 节点到流程画布
|
|
102
|
-
2. 配置连接参数:
|
|
103
|
-
- **串口模式**(直连RS485设备):
|
|
104
|
-
- 连接类型: `串口`
|
|
105
|
-
- 串口路径: `/dev/ttyUSB0` (Linux/Mac) 或 `COM1` (Windows)
|
|
106
|
-
- 波特率: `9600`(默认)
|
|
107
|
-
- 数据位: `8`
|
|
108
|
-
- 停止位: `1`
|
|
109
|
-
- 校验位: `无`
|
|
110
|
-
- **TCP模式**(通过TCP转RS485网关):
|
|
111
|
-
- 连接类型: `TCP/IP`
|
|
112
|
-
- TCP模式: `Telnet ASCII`(推荐,适用于大多数TCP转RS485网关)
|
|
113
|
-
- TCP主机: `192.168.2.110`
|
|
114
|
-
- TCP端口: `1031`
|
|
115
|
-
- 其他模式:
|
|
116
|
-
- `RTU over TCP`:适用于支持Modbus RTU over TCP的网关
|
|
117
|
-
- `Modbus TCP`:适用于标准Modbus TCP设备
|
|
118
|
-
3. 配置从站设备:
|
|
119
|
-
- 从站地址: `10` (默认,可添加多个,如10、11、12、13)
|
|
120
|
-
- 线圈范围: `0-31`
|
|
121
|
-
- 轮询间隔: `200ms` (默认,支持100-10000ms)
|
|
122
|
-
4. MQTT配置(可选):
|
|
123
|
-
- 本地模式:不启用MQTT或留空
|
|
124
|
-
- MQTT模式:启用MQTT并选择MQTT服务器配置
|
|
125
|
-
5. 部署流程
|
|
126
|
-
|
|
127
|
-
### 4. 配置RS-485连接配置节点(用于从站开关)
|
|
128
|
-
|
|
129
|
-
如果需要物理开关面板控制,首先创建RS-485连接配置:
|
|
130
|
-
|
|
131
|
-
1. 点击右上角菜单 → 配置节点
|
|
132
|
-
2. 添加新的 **serial-port-config** 配置节点
|
|
133
|
-
3. 选择连接类型:
|
|
134
|
-
- **串口模式**(本地RS-485总线):
|
|
135
|
-
- 连接类型: `串口`
|
|
136
|
-
- 串口路径: `/dev/ttyUSB0` (可点击"搜索"按钮自动发现)
|
|
137
|
-
- 波特率: `9600`
|
|
138
|
-
- 数据位: `8`
|
|
139
|
-
- 停止位: `1`
|
|
140
|
-
- 校验位: `无 (N)`
|
|
141
|
-
- **TCP模式**(通过TCP转RS485网关):
|
|
142
|
-
- 连接类型: `TCP网关`
|
|
143
|
-
- TCP主机: `192.168.2.110`
|
|
144
|
-
- TCP端口: `1031`
|
|
145
|
-
4. 保存配置
|
|
146
|
-
|
|
147
|
-
### 5. 配置从站开关节点(可选)
|
|
148
|
-
|
|
149
|
-
使用物理开关面板控制继电器,支持三种模式:
|
|
150
|
-
|
|
151
|
-
#### 模式1:RS-485开关模式(传统有线开关)
|
|
152
|
-
|
|
153
|
-
1. 拖拽 **从站开关** 节点到流程画布
|
|
154
|
-
2. 选择刚创建的RS-485连接配置
|
|
155
|
-
3. 配置开关面板信息:
|
|
156
|
-
- 面板品牌: `亖米` (默认)
|
|
157
|
-
- 按钮类型: `开关按钮(RS-485)`
|
|
158
|
-
- 开关ID: 物理面板地址 (0-255)
|
|
159
|
-
- 按钮编号: 按键编号 (1-8)
|
|
160
|
-
4. 配置映射到的继电器:
|
|
161
|
-
- 目标从站地址: `10`
|
|
162
|
-
- 目标线圈编号: `1`(用户输入1-32)
|
|
163
|
-
5. **无需连线**:主站和从站通过内部事件自动通信
|
|
164
|
-
6. 部署流程
|
|
165
|
-
|
|
166
|
-
#### 模式2:RS-485场景模式(场景触发)
|
|
167
|
-
|
|
168
|
-
1. 配置步骤同上,但按钮类型选择 `场景按钮(RS-485)`
|
|
169
|
-
2. 每次按键触发状态翻转(ON→OFF或OFF→ON)
|
|
170
|
-
3. 适用于场景联动、一键控制等场景
|
|
171
|
-
|
|
172
|
-
#### 模式3:Mesh开关模式(蓝牙Mesh无线开关)
|
|
173
|
-
|
|
174
|
-
**适用场景**:使用Symi蓝牙Mesh网关和Mesh开关面板
|
|
175
|
-
|
|
176
|
-
**配置步骤**:
|
|
177
|
-
|
|
178
|
-
1. **准备工作**
|
|
179
|
-
- 确保Mesh网关已通过TCP或串口连接到Node-RED
|
|
180
|
-
- 确保Mesh开关已配网到网关
|
|
181
|
-
|
|
182
|
-
2. **添加节点**
|
|
183
|
-
- 拖拽 **从站开关** 节点到流程画布
|
|
184
|
-
- 选择Mesh网关的连接配置(TCP或串口)
|
|
185
|
-
|
|
186
|
-
3. **扫描Mesh设备**
|
|
187
|
-
- 按钮类型: 选择 `Mesh开关(蓝牙Mesh)`
|
|
188
|
-
- 点击 **扫描设备** 按钮
|
|
189
|
-
- 系统发送 `53 12 00 41` 协议帧到网关
|
|
190
|
-
- 网关立即返回所有Mesh开关列表(通常5秒内完成)
|
|
191
|
-
- 设备列表自动持久化保存到 `~/.node-red/mesh-devices-persist/`
|
|
192
|
-
- 重启Node-RED无需重新扫描,直接从持久化存储加载
|
|
193
|
-
|
|
194
|
-
4. **选择设备和按键**
|
|
195
|
-
- Mesh设备: 从下拉框选择开关(显示格式:`MAC地址 (X路开关)`)
|
|
196
|
-
- 按钮编号: 选择要使用的按键(1-6路)
|
|
197
|
-
- **无线模式**(可选): 勾选此选项后,该按键不响应LED反馈
|
|
198
|
-
- 适用场景:按键用于触发场景(如全开/全关),继电器状态变化不应点亮该按键LED
|
|
199
|
-
- 例如:按键3控制线圈16(全开触发),勾选无线模式后,线圈0-15状态变化不会点亮按键3的LED
|
|
200
|
-
- 多个节点可共享同一设备列表,无需重复扫描
|
|
201
|
-
|
|
202
|
-
5. **配置目标继电器**
|
|
203
|
-
- 目标从站地址: `10`
|
|
204
|
-
- 目标线圈编号: `1`(用户输入1-32)
|
|
205
|
-
|
|
206
|
-
6. **部署流程**
|
|
207
|
-
- 点击"完成"并部署
|
|
208
|
-
- Mesh开关按键会自动控制对应继电器
|
|
209
|
-
- 继电器状态变化会自动反馈到Mesh开关LED(无线模式按键除外)
|
|
210
|
-
|
|
211
|
-
**Mesh模式特点**:
|
|
212
|
-
- 无线控制,无需布线
|
|
213
|
-
- 支持1-6路开关
|
|
214
|
-
- 双向同步(按键→继电器,继电器→LED)
|
|
215
|
-
- 支持无线模式(场景触发按键不响应LED反馈)
|
|
216
|
-
- 设备列表持久化保存
|
|
217
|
-
- 短地址自动更新(如果网关重新配网)
|
|
218
|
-
- 与RS-485开关使用方式完全一致
|
|
219
|
-
|
|
220
|
-
### 6. 配置HomeKit网桥节点(可选)
|
|
221
|
-
|
|
222
|
-
将Modbus继电器桥接到Apple HomeKit,实现Siri语音控制:
|
|
223
|
-
|
|
224
|
-
**配置步骤**:
|
|
225
|
-
|
|
226
|
-
1. **添加网桥节点**
|
|
227
|
-
- 拖拽 **HomeKit网桥** 节点到流程画布
|
|
228
|
-
- 双击节点打开配置界面
|
|
229
|
-
|
|
230
|
-
2. **基础配置**
|
|
231
|
-
- 网桥名称: `Modbus继电器网桥`(在HomeKit中显示)
|
|
232
|
-
- 选择主站节点: 从下拉框选择已配置的主站
|
|
233
|
-
- 配对码: `031-45-154`(添加到HomeKit时使用)
|
|
234
|
-
- 端口: `51828`(保持默认)
|
|
235
|
-
|
|
236
|
-
3. **配置继电器名称**(推荐)
|
|
237
|
-
- 选择主站后,下方会自动显示所有继电器
|
|
238
|
-
- 为每个继电器输入友好的中文名称
|
|
239
|
-
- 例如:`客厅灯`、`卧室灯`、`空调插座`等
|
|
240
|
-
- 配置后在HomeKit中直接显示,无需再修改
|
|
241
|
-
|
|
242
|
-
4. **部署并添加到HomeKit**
|
|
243
|
-
- 点击"完成"并部署流程
|
|
244
|
-
- 打开iPhone/iPad的"家庭"App
|
|
245
|
-
- 点击右上角"+" → "添加配件"
|
|
246
|
-
- 选择"更多选项"
|
|
247
|
-
- 找到"Modbus继电器网桥"
|
|
248
|
-
- 输入配对码:`031-45-154`
|
|
249
|
-
- 完成配对
|
|
250
|
-
|
|
251
|
-
**使用说明**:
|
|
252
|
-
- 线圈0-15显示为开关,线圈16-31显示为插座
|
|
253
|
-
- 支持Siri语音控制:"嘿Siri,打开客厅灯"
|
|
254
|
-
- 支持HomeKit自动化和场景
|
|
255
|
-
- 配置会自动保存,重启后无需重新配对
|
|
256
|
-
- **群控性能**:支持同时控制多个继电器(如创建编组),智能队列机制确保流畅无卡顿
|
|
257
|
-
|
|
258
|
-
**群控说明**(客户友好模式):
|
|
259
|
-
|
|
260
|
-
本节点专为智能家居群控场景优化,支持以下高性能操作:
|
|
261
|
-
|
|
262
|
-
1. **HomeKit编组群控**:
|
|
263
|
-
- 在HomeKit中创建房间或编组,可同时控制多个继电器
|
|
264
|
-
- 例如:创建"客厅"编组,包含10个灯光开关,一键全开/全关
|
|
265
|
-
- 智能优先队列机制确保触发源面板最快响应,其他继电器按序执行
|
|
266
|
-
- 10个继电器同时动作仅需约 500ms(50ms间隔×10),触发源面板优先反馈
|
|
267
|
-
|
|
268
|
-
2. **场景联动**:
|
|
269
|
-
- 支持HomeKit场景(如"回家模式"、"离家模式")
|
|
270
|
-
- 场景可包含多个继电器动作,自动串行执行
|
|
271
|
-
- 前16个线圈(继电器)可同时动作,后16个线圈(场景)按需触发
|
|
272
|
-
|
|
273
|
-
3. **性能保证**:
|
|
274
|
-
- 最大支持10台继电器(每台32路),共320个线圈
|
|
275
|
-
- 前160个线圈(10台×16路)可用于继电器控制,支持群控
|
|
276
|
-
- 后160个线圈(10台×16路)可用于场景触发,一般不会全部同时动作
|
|
277
|
-
- 智能写入队列确保所有操作串行执行,避免总线冲突
|
|
278
|
-
- 长期稳定运行,反复控制不会造成内存增加、卡顿或死机
|
|
279
|
-
|
|
280
|
-
4. **技术细节**:
|
|
281
|
-
- 写入队列间隔:50ms(确保总线稳定,优化指示灯反馈)
|
|
282
|
-
- 写入锁机制:写入操作优先级高于轮询,自动抢占总线资源
|
|
283
|
-
- 轮询恢复时间:50ms(写入完成后快速恢复轮询)
|
|
284
|
-
- 锁等待超时:500ms(适配高延迟网络,确保指令不丢失)
|
|
285
|
-
- 智能优先队列:触发源面板优先处理(500ms优先窗口)
|
|
286
|
-
- 触发源追踪:全链路追踪控制指令来源(triggerSource),日志清晰记录是物理按键、HomeKit还是自动化触发
|
|
287
|
-
- 队列自动处理,无需手动干预
|
|
288
|
-
|
|
289
|
-
## 核心特性说明
|
|
290
|
-
|
|
291
|
-
### Symi开关自动识别
|
|
292
|
-
|
|
293
|
-
主站节点自动支持两种控制方式,无需额外配置:
|
|
294
|
-
|
|
295
|
-
#### 方式1:Modbus RTU轮询(标准)
|
|
296
|
-
- 主站定期轮询从站线圈状态
|
|
297
|
-
- 通过MQTT或Node-RED流程控制继电器
|
|
298
|
-
- 适用于所有Modbus RTU设备
|
|
299
|
-
|
|
300
|
-
#### 方式2:Symi私有协议(自动)
|
|
301
|
-
- 自动识别Symi开关按键事件(协议格式:`7E [地址] 03 0F ...`)
|
|
302
|
-
- 自动应答并控制对应继电器(协议格式:`7E [地址] 04 0F ...`)
|
|
303
|
-
- 映射规则:
|
|
304
|
-
- 设备地址1 → 从站10
|
|
305
|
-
- 设备地址2 → 从站11
|
|
306
|
-
- 设备地址3 → 从站12
|
|
307
|
-
- 设备地址4 → 从站13
|
|
308
|
-
- 通道号1-8 → 线圈0-7
|
|
309
|
-
|
|
310
|
-
**按钮类型说明**:
|
|
311
|
-
|
|
312
|
-
**1. 开关按钮(推荐)**
|
|
313
|
-
- **控制方式**:按键有独立的开/关状态
|
|
314
|
-
- **LED反馈**:面板LED指示灯精确同步开关状态
|
|
315
|
-
- **适用场景**:
|
|
316
|
-
- 灯光开关(客厅灯、卧室灯等)
|
|
317
|
-
- 插座开关(电器控制)
|
|
318
|
-
- 窗帘开关(电动窗帘)
|
|
319
|
-
- 任何需要明确开/关状态的场景
|
|
320
|
-
- **技术特点**:
|
|
321
|
-
- 使用REPORT协议(0x04)发送LED反馈
|
|
322
|
-
- 使用原始设备地址确保LED精确反馈
|
|
323
|
-
- 支持物理按键和Home Assistant远程控制
|
|
324
|
-
- 面板LED完美同步,响应速度快
|
|
325
|
-
|
|
326
|
-
**2. 场景按钮**
|
|
327
|
-
- **控制方式**:每次按下toggle切换状态(开→关→开)
|
|
328
|
-
- **LED反馈**:根据当前状态显示LED(开=亮,关=灭)
|
|
329
|
-
- **协议特征**:操作信息为0x11、0x12、0x13等(高4位=1表示场景模式)
|
|
330
|
-
- **适用场景**:
|
|
331
|
-
- 场景触发(回家模式、离家模式等)
|
|
332
|
-
- 一键全开/全关
|
|
333
|
-
- 需要状态指示的场景按钮
|
|
334
|
-
- **技术特点**:
|
|
335
|
-
- 使用REPORT协议(0x04)发送LED反馈
|
|
336
|
-
- 使用原始设备地址确保LED精确反馈
|
|
337
|
-
- 支持物理按键和Home Assistant远程控制
|
|
338
|
-
- 200ms防抖,避免重复触发
|
|
339
|
-
- 自动识别场景模式(根据操作信息高4位判断)
|
|
340
|
-
|
|
341
|
-
**两种模式对比**:
|
|
342
|
-
|
|
343
|
-
| 特性 | 开关按钮 | 场景按钮 |
|
|
344
|
-
|------|---------|---------|
|
|
345
|
-
| 控制方式 | 开/关独立 | Toggle切换 |
|
|
346
|
-
| 操作信息 | 0x00/0x01 | 0x11/0x12/0x13等 |
|
|
347
|
-
| LED反馈协议 | REPORT (0x04) | REPORT (0x04) |
|
|
348
|
-
| 按键事件 | 独立开/关码 | 统一触发码 |
|
|
349
|
-
| LED同步 | ✓ 完美同步 | ✓ 完美同步 |
|
|
350
|
-
| HA远程控制 | ✓ 支持 | ✓ 支持 |
|
|
351
|
-
| 推荐场景 | 灯光/插座 | 场景触发 |
|
|
352
|
-
| 自动识别 | ✓ 支持 | ✓ 支持 |
|
|
353
|
-
|
|
354
|
-
**配置说明**:
|
|
355
|
-
|
|
356
|
-
1. **RS-485连接**:选择串口配置节点(波特率9600,8N1)
|
|
357
|
-
2. **MQTT服务器**(可选):
|
|
358
|
-
- 本地模式:不启用MQTT,主站和从站通过内部事件自动通信(免连线)
|
|
359
|
-
- MQTT模式:启用MQTT并选择MQTT配置节点
|
|
360
|
-
3. **面板配置**:
|
|
361
|
-
- 面板品牌:选择亖米(Symi)
|
|
362
|
-
- 按钮类型:开关按钮或场景按钮(也可自动识别)
|
|
363
|
-
- 开关ID:物理面板的RS-485地址(0-255)
|
|
364
|
-
- 按钮编号:面板上的按键序号(1-8)
|
|
365
|
-
4. **继电器映射**:
|
|
366
|
-
- 从站地址:Modbus继电器地址(10-247)
|
|
367
|
-
- 继电器路数:继电器通道(1-32路)
|
|
368
|
-
|
|
369
|
-
**使用示例**:
|
|
370
|
-
|
|
371
|
-
**示例1:客厅灯光开关(本地模式)**
|
|
372
|
-
- 面板:开关ID=2,按键1(开关按钮)
|
|
373
|
-
- 继电器:从站10,1路
|
|
374
|
-
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
375
|
-
- 效果:按下面板按键,客厅灯开/关,面板LED同步状态,断网也能正常工作
|
|
376
|
-
|
|
377
|
-
**示例2:全开场景(MQTT模式)**
|
|
378
|
-
- 面板:开关ID=2,按键8(场景按钮)
|
|
379
|
-
- 继电器:从站10,32路
|
|
380
|
-
- 配置:启用MQTT,连接到Home Assistant
|
|
381
|
-
- 效果:按下面板按键,触发全开场景,HA中可远程控制,面板LED同步状态
|
|
382
|
-
|
|
383
|
-
**示例3:三键场景开关(本地模式)**
|
|
384
|
-
- 面板:开关ID=1,按键1/2/3(场景按钮,自动识别)
|
|
385
|
-
- 继电器:从站10,1/2/3路
|
|
386
|
-
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
387
|
-
- 效果:按下按键1/2/3,分别控制对应继电器,LED指示灯同步状态
|
|
388
|
-
|
|
389
|
-
### 智能轮询机制
|
|
390
|
-
|
|
391
|
-
主站轮询时,从站开关可以同时使用。当从站开关上报数据到服务器后:
|
|
392
|
-
1. **自动暂停轮询**:主站检测到写入操作,立即暂停轮询
|
|
393
|
-
2. **优先处理数据**:处理从站上报的数据(写入Modbus继电器)
|
|
394
|
-
3. **继续轮询**:数据处理完成后(100ms延迟),自动恢复轮询
|
|
395
|
-
4. **日志记录**:记录轮询暂停时长和跳过的轮询次数
|
|
396
|
-
|
|
397
|
-
这种机制确保:
|
|
398
|
-
- 主站轮询不会与从站写入冲突
|
|
399
|
-
- 从站上报的数据得到优先处理
|
|
400
|
-
- 系统响应迅速,状态同步及时
|
|
401
|
-
|
|
402
|
-
### 总线数据过滤与稳定性
|
|
403
|
-
|
|
404
|
-
本节点具备完善的总线数据过滤机制,确保长期稳定运行:
|
|
405
|
-
|
|
406
|
-
**数据过滤机制**:
|
|
407
|
-
- **CRC校验**:所有Symi协议帧都经过CRC8校验,无效数据自动丢弃
|
|
408
|
-
- **静默忽略**:总线上的非相关数据(其他设备、其他协议)静默忽略,不影响正常通信
|
|
409
|
-
- **精确匹配**:只处理本节点配置的从站地址和线圈范围内的数据
|
|
410
|
-
- **TCP粘包处理**:TCP模式下自动处理粘包和分包问题,确保数据完整性
|
|
411
|
-
|
|
412
|
-
**稳定性保障**:
|
|
413
|
-
- **写入队列**:多个节点同时写入时自动排队,避免并发冲突
|
|
414
|
-
- **断线重连**:TCP和串口断线后自动重连,指数退避策略(最大60秒)
|
|
415
|
-
- **内存管理**:定时清理缓存,防止内存泄漏
|
|
416
|
-
- **错误日志限流**:避免日志刷屏影响性能
|
|
417
|
-
- **MQTT独立性**:MQTT开启或关闭都不影响主站和从站的本地通信
|
|
418
|
-
|
|
419
|
-
**网络适应性**:
|
|
420
|
-
- **离线通信**:串口模式完全脱离网络依赖,断网也能正常工作
|
|
421
|
-
- **TCP稳定性**:TCP模式支持局域网通信,网络恢复后自动重连
|
|
422
|
-
- **MQTT可选**:MQTT仅用于对接第三方平台,不影响本地控制
|
|
423
|
-
|
|
424
|
-
## 调试节点(modbus-debug)
|
|
425
|
-
|
|
426
|
-
用于抓取并显示原始RS485字节流数据(HEX),帮助定位串口或TCP网关下的Modbus通信问题。
|
|
427
|
-
|
|
428
|
-
- 数据来源:
|
|
429
|
-
- 共享连接:`serial-port-config`(推荐,复用主站/从站的同一连接)
|
|
430
|
-
- 独立连接:`modbus-server-config`(直接连接TCP或串口)
|
|
431
|
-
- 输出内容:
|
|
432
|
-
- `msg.payload`:格式化的HEX字符串(可选大写)
|
|
433
|
-
- `msg.buffer`:原始Buffer数据
|
|
434
|
-
- `msg.meta`:来源信息与连接参数(串口或TCP详情)
|
|
435
|
-
- `msg.timestamp`:时间戳(可选)
|
|
436
|
-
- 显示控制:
|
|
437
|
-
- `maxBytes`:限制显示字节数,超过会截断并在`meta.truncated`标记
|
|
438
|
-
|
|
439
|
-
使用步骤:
|
|
440
|
-
1. 将 `modbus-debug` 节点拖入画布。
|
|
441
|
-
2. 选择“数据来源”:
|
|
442
|
-
- 选“共享串口配置(serial-port-config)”以复用主站/从站连接;或
|
|
443
|
-
- 选“Modbus服务器(modbus-server-config)”进行独立直连。
|
|
444
|
-
3. 可选:勾选“大写HEX”、勾选“时间戳”、设置“最大字节数”。
|
|
445
|
-
4. 部署后,节点自动输出捕获到的原始数据。
|
|
446
|
-
|
|
447
|
-
典型用法:
|
|
448
|
-
- 联调TCP转RS485网关时,观察上行/下行原始数据帧是否完整。
|
|
449
|
-
- 排查波特率/数据位/校验位配置是否正确(串口模式)。
|
|
450
|
-
- 与 `modbus-master` 或 `modbus-slave-switch` 同时使用,定位现场设备通信异常。
|
|
451
|
-
|
|
452
|
-
### MQTT自动发现
|
|
453
|
-
|
|
454
|
-
启用MQTT后,自动生成Home Assistant兼容的Discovery配置:
|
|
455
|
-
- **唯一性保证**:每个实体使用稳定的`unique_id`,避免重复生成
|
|
456
|
-
- **设备分组**:同一从站的所有继电器自动分组到一个设备下
|
|
457
|
-
- **状态持久化**:使用`retain=true`确保状态持久化
|
|
458
|
-
- **在线状态**:自动发布设备可用性状态
|
|
459
|
-
|
|
460
|
-
### 配置持久化
|
|
461
|
-
|
|
462
|
-
所有节点配置自动保存到Node-RED的flows文件中:
|
|
463
|
-
- 从站地址、线圈范围、轮询间隔
|
|
464
|
-
- MQTT服务器配置
|
|
465
|
-
- 开关面板映射关系
|
|
466
|
-
|
|
467
|
-
部署后配置永久生效,重启Node-RED后自动恢复。
|
|
468
|
-
|
|
469
|
-
### 长期稳定运行
|
|
470
|
-
|
|
471
|
-
针对工控机24/7长期运行优化:
|
|
472
|
-
- **内存管理**:自动清理缓存,释放无用对象
|
|
473
|
-
- **事件监听器清理**:关闭时移除所有监听器,防止内存泄漏
|
|
474
|
-
- **智能日志限流**:错误日志10分钟输出一次,避免日志刷屏
|
|
475
|
-
- **智能重连机制**:
|
|
476
|
-
- Modbus连接断开自动重连(指数退避:5秒→10秒→20秒...最大60秒)
|
|
477
|
-
- MQTT连接断开自动重连(支持多地址fallback)
|
|
478
|
-
- 串口拔插自动检测并重连
|
|
479
|
-
- TCP网络故障自动恢复
|
|
480
|
-
- 连接前彻底清理旧实例,避免资源泄漏
|
|
481
|
-
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
482
|
-
- **TCP永久连接**:
|
|
483
|
-
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
484
|
-
- Keep-Alive心跳10秒间隔,确保连接活跃
|
|
485
|
-
- 适应客户长期不在家、总线无数据的场景
|
|
486
|
-
- 网络故障自动重连,恢复后立即恢复通信
|
|
487
|
-
|
|
488
|
-
## 技术规格
|
|
489
|
-
|
|
490
|
-
### Modbus协议
|
|
491
|
-
|
|
492
|
-
- **协议类型**:Modbus TCP / Modbus RTU
|
|
493
|
-
- **底层库**:modbus-serial ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
494
|
-
- **功能码支持**:0x01(读线圈)、0x05(写单个线圈)、0x0F(写多个线圈)
|
|
495
|
-
- **从站地址范围**:1-247(建议从10开始)
|
|
496
|
-
- **线圈数量**:每台设备32个(0-31)
|
|
497
|
-
- **最大设备数**:10台同时轮询
|
|
498
|
-
- **轮询间隔**:默认200ms(建议300-500ms,支持100-10000ms)
|
|
499
|
-
- **串口配置**:9600 8-N-1(波特率9600,8数据位,无校验,1停止位)
|
|
500
|
-
- **超时设置**:5000ms(TCP和串口通用)
|
|
501
|
-
|
|
502
|
-
### 兼容性
|
|
503
|
-
|
|
504
|
-
- **Node.js**: >= 14.0.0
|
|
505
|
-
- **Node-RED**: >= 2.0.0
|
|
506
|
-
- **MQTT Broker**: Mosquitto / EMQX / Any MQTT 3.1.1/5.0
|
|
507
|
-
- **Home Assistant**: 2024.x+(MQTT Discovery标准)
|
|
508
|
-
- **操作系统**: Windows / Linux / macOS / HassOS
|
|
509
|
-
|
|
510
|
-
## Home Assistant集成
|
|
511
|
-
|
|
512
|
-
### 自动发现
|
|
513
|
-
|
|
514
|
-
启用MQTT后,设备自动出现在Home Assistant中:
|
|
515
|
-
- 实体ID: `switch.relay_{从站地址}_{线圈编号}`
|
|
516
|
-
- 设备名称: `Modbus继电器-{从站地址}`
|
|
517
|
-
- 自动分组: 同一从站的所有继电器分组到一个设备
|
|
518
|
-
|
|
519
|
-
### MQTT主题结构
|
|
520
|
-
|
|
521
|
-
```
|
|
522
|
-
状态主题: modbus/relay/{从站}/{线圈}/state
|
|
523
|
-
命令主题: modbus/relay/{从站}/{线圈}/set
|
|
524
|
-
可用性主题: modbus/relay/{从站}/availability
|
|
525
|
-
发现主题: homeassistant/switch/modbus_relay_{从站}_{线圈}/config
|
|
526
|
-
```
|
|
527
|
-
|
|
528
|
-
## 故障排除
|
|
529
|
-
|
|
530
|
-
### 串口连接失败
|
|
531
|
-
|
|
532
|
-
**Linux**:
|
|
533
|
-
```bash
|
|
534
|
-
# 查看串口设备
|
|
535
|
-
ls -l /dev/ttyUSB* /dev/ttyS*
|
|
536
|
-
|
|
537
|
-
# 添加用户到dialout组(需要重新登录)
|
|
538
|
-
sudo usermod -a -G dialout $USER
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
**macOS**:
|
|
542
|
-
```bash
|
|
543
|
-
# 查看串口设备(注意macOS使用cu.*而不是tty.*)
|
|
544
|
-
ls -l /dev/cu.*
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
**Docker/HassOS**:
|
|
548
|
-
```yaml
|
|
549
|
-
# 在docker-compose.yml或HassOS插件配置中添加设备映射
|
|
550
|
-
devices:
|
|
551
|
-
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
### MQTT连接失败
|
|
555
|
-
|
|
556
|
-
1. 确认MQTT broker正在运行:
|
|
557
|
-
```bash
|
|
558
|
-
# Linux
|
|
559
|
-
sudo systemctl status mosquitto
|
|
560
|
-
|
|
561
|
-
# macOS
|
|
562
|
-
brew services list | grep mosquitto
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
2. 测试MQTT连接:
|
|
566
|
-
```bash
|
|
567
|
-
mosquitto_sub -h localhost -t test
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
3. 检查Node-RED日志中的MQTT连接信息
|
|
571
|
-
|
|
572
|
-
### 主站轮询不工作
|
|
573
|
-
|
|
574
|
-
1. **检查从站配置**:确认已添加所有从站设备(如10、11、12、13)
|
|
575
|
-
2. **检查轮询间隔**:默认200ms,建议300-500ms(多台从站时避免总线拥堵)
|
|
576
|
-
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
577
|
-
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
578
|
-
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
579
|
-
|
|
580
|
-
### 轮询超时或频繁报错
|
|
581
|
-
|
|
582
|
-
1. **轮询永不停止原则**:
|
|
583
|
-
- 即使从站不响应,轮询也会持续运行
|
|
584
|
-
- 不会因超时而跳过任何从站
|
|
585
|
-
- 只记录错误日志,不影响总线轮询机制
|
|
586
|
-
2. **正常超时**:偶尔超时是正常的,系统会自动重试
|
|
587
|
-
- 超时设置:2-3秒(串口/TCP)
|
|
588
|
-
- 只记录日志,不停止轮询
|
|
589
|
-
- 轮询会持续运行,不受超时影响
|
|
590
|
-
3. **频繁超时**:
|
|
591
|
-
- 检查Modbus连接是否稳定
|
|
592
|
-
- 调整轮询间隔(默认200ms,可增加到500ms)
|
|
593
|
-
- 检查从站设备是否在线
|
|
594
|
-
- 查看总线是否有其他设备干扰
|
|
595
|
-
4. **总线干扰**:
|
|
596
|
-
- 总线上的其他数据(如Symi网关通信、其他Modbus设备)可能导致偶尔超时或CRC错误
|
|
597
|
-
- 系统已优化容错机制,会自动忽略异常数据并继续轮询
|
|
598
|
-
- 非超时错误(如CRC错误)不累积计数,只记录日志
|
|
599
|
-
5. **长期稳定性保障**:
|
|
600
|
-
- 轮询循环采用try-catch包裹,确保异常不会中断轮询
|
|
601
|
-
- 每1000轮输出一次调试日志,证明轮询持续运行
|
|
602
|
-
- 定时清理机制(每小时)防止内存泄漏
|
|
603
|
-
- 所有定时器在节点关闭时正确清除
|
|
604
|
-
|
|
605
|
-
### 总线上出现未知数据
|
|
606
|
-
|
|
607
|
-
1. **识别数据来源**:
|
|
608
|
-
- 使用`modbus-debug`节点监听总线数据(必须使用共享的serial-port-config,避免串口冲突)
|
|
609
|
-
- 查看Node-RED日志中的"写入线圈"日志,确认是否是本节点发送的
|
|
610
|
-
- 检查是否有其他Modbus设备或Symi网关在总线上通信
|
|
611
|
-
2. **常见数据格式**:
|
|
612
|
-
- `01 05 00 01 FF 00 ...`:写单个线圈(功能码0x05)
|
|
613
|
-
- `01 0F 00 00 00 20 ...`:写多个线圈(功能码0x0F)
|
|
614
|
-
- `7E 01 03 ...`:Symi轻量级协议数据
|
|
615
|
-
3. **影响**:
|
|
616
|
-
- 总线上的其他数据不会影响轮询稳定性
|
|
617
|
-
- 可能导致偶尔的CRC错误或超时,但系统会自动忽略并继续轮询
|
|
618
|
-
|
|
619
|
-
### 串口冲突错误
|
|
620
|
-
|
|
621
|
-
**错误信息**:
|
|
622
|
-
```
|
|
623
|
-
串口监听错误: Port is not open
|
|
624
|
-
串口监听错误: Error Resource temporarily unavailable Cannot lock port
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
**原因**:
|
|
628
|
-
- 多个节点试图独立打开同一个串口
|
|
629
|
-
- 串口只能被一个进程同时打开
|
|
630
|
-
|
|
631
|
-
**解决方案**:
|
|
632
|
-
1. **modbus-debug节点**:必须使用"serial"源类型,选择共享的`serial-port-config`配置节点
|
|
633
|
-
2. **不要使用独立连接**:不要让多个节点独立打开同一个串口
|
|
634
|
-
3. **共享连接配置**:所有节点(主站、从站开关、modbus-debug)都应该使用同一个`serial-port-config`配置节点
|
|
635
|
-
|
|
636
|
-
### 批量更换连接配置
|
|
637
|
-
|
|
638
|
-
**问题**:如何批量更换所有节点的RS-485连接配置?
|
|
639
|
-
|
|
640
|
-
**Node-RED原生方法**(推荐):
|
|
641
|
-
1. 创建新的`serial-port-config`配置节点
|
|
642
|
-
2. 点击右上角菜单 → 配置节点
|
|
643
|
-
3. 找到旧的`serial-port-config`配置节点
|
|
644
|
-
4. 点击删除按钮
|
|
645
|
-
5. Node-RED会提示"此配置节点被X个节点使用,是否替换为其他配置?"
|
|
646
|
-
6. 选择新创建的配置节点
|
|
647
|
-
7. 点击确认,所有使用旧配置的节点会自动更换为新配置
|
|
648
|
-
|
|
649
|
-
**注意**:
|
|
650
|
-
- 这是Node-RED的原生功能,安全可靠
|
|
651
|
-
- 删除配置节点前必须先创建新配置
|
|
652
|
-
- 替换后需要部署才能生效
|
|
653
|
-
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
654
|
-
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
655
|
-
8. **测试连接**:
|
|
656
|
-
- TCP连接问题:先用 `modbus-serial` 单独测试TCP连接
|
|
657
|
-
- 串口问题:先用 `serialport` 单独测试串口通信
|
|
658
|
-
|
|
659
|
-
### 从站开关无响应
|
|
660
|
-
|
|
661
|
-
1. **检查免连线通信**(v2.6.7+推荐):
|
|
662
|
-
- **无需连线**:主站和从站通过内部事件自动通信,无需手动连线
|
|
663
|
-
- 查看Node-RED日志,确认是否有"内部事件模式:发送命令到从站X 线圈Y"的日志
|
|
664
|
-
- 查看主站节点日志,确认是否有"收到内部事件:从站X 线圈Y"的日志
|
|
665
|
-
- 查看主站节点日志,确认是否有"内部事件写入成功,已广播状态变化"的日志
|
|
666
|
-
- 查看从站开关节点日志,确认是否有"收到状态变化事件"和"LED反馈已发送"的日志
|
|
667
|
-
2. **检查RS-485连接**:
|
|
668
|
-
- 确认RS-485连接配置正确(串口路径、波特率等)
|
|
669
|
-
- 查看节点状态显示是否为"MQTT未启用 - 使用内部事件模式"
|
|
670
|
-
- 物理面板连接:确认物理面板连接到正确的RS-485总线(TCP或串口)
|
|
671
|
-
3. **检查开关面板配置**:
|
|
672
|
-
- 确认开关面板地址和按钮编号正确
|
|
673
|
-
- 场景模式开关:操作信息为0x11、0x12、0x13等(高4位=1)
|
|
674
|
-
- 开关模式开关:操作信息为0x00(关)或0x01(开)
|
|
675
|
-
4. **检查继电器映射**:
|
|
676
|
-
- 确认目标从站地址和线圈编号正确
|
|
677
|
-
- 线圈编号范围:0-31(对应用户输入的1-32路)
|
|
678
|
-
5. **查看调试日志**:
|
|
679
|
-
- 使用modbus-debug节点抓取原始总线数据
|
|
680
|
-
- 查看Node-RED日志中的协议解析信息
|
|
681
|
-
- 确认按键事件是否被正确识别
|
|
682
|
-
- 确认LED反馈协议帧是否正确发送(查看日志中的HEX字符串)
|
|
683
|
-
|
|
684
|
-
## 输入消息格式
|
|
685
|
-
|
|
686
|
-
### 主站节点
|
|
687
|
-
|
|
688
|
-
```javascript
|
|
689
|
-
// 启动轮询
|
|
690
|
-
msg.payload = {cmd: "start"};
|
|
691
|
-
|
|
692
|
-
// 停止轮询
|
|
693
|
-
msg.payload = {cmd: "stop"};
|
|
694
|
-
|
|
695
|
-
// 写单个线圈
|
|
696
|
-
msg.payload = {
|
|
697
|
-
cmd: "writeCoil",
|
|
698
|
-
slave: 10, // 从站地址
|
|
699
|
-
coil: 0, // 线圈编号
|
|
700
|
-
value: true // true=开, false=关
|
|
701
|
-
};
|
|
702
|
-
|
|
703
|
-
// 批量写多个线圈
|
|
704
|
-
msg.payload = {
|
|
705
|
-
cmd: "writeCoils",
|
|
706
|
-
slave: 10, // 从站地址
|
|
707
|
-
startCoil: 0, // 起始线圈
|
|
708
|
-
values: [true, false, true, false] // 线圈值数组
|
|
709
|
-
};
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
### 从站开关节点
|
|
713
|
-
|
|
714
|
-
```javascript
|
|
715
|
-
// 发送开关命令
|
|
716
|
-
msg.payload = true; // 或 false
|
|
717
|
-
msg.payload = "ON"; // 或 "OFF"
|
|
718
|
-
msg.payload = 1; // 或 0
|
|
719
|
-
```
|
|
720
|
-
|
|
721
|
-
### HomeKit网桥节点
|
|
722
|
-
|
|
723
|
-
HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
724
|
-
|
|
725
|
-
**配置参数**:
|
|
726
|
-
- **主站节点**:选择要桥接的Modbus主站节点(必填)
|
|
727
|
-
- **网桥名称**:在HomeKit中显示的网桥名称(默认:Modbus继电器网桥)
|
|
728
|
-
- **MAC地址**:HomeKit网桥的唯一标识符(自动生成,无需修改)
|
|
729
|
-
- **配对码**:HomeKit配对时使用的PIN码(格式:XXX-XX-XXX,默认:031-45-154)
|
|
730
|
-
- **端口**:HomeKit网桥监听端口(默认:51828)
|
|
731
|
-
- **继电器名称配置**:为每个继电器配置友好的中文名称(可选)
|
|
732
|
-
|
|
733
|
-
**自动同步规则**:
|
|
734
|
-
- 自动读取主站节点配置的所有从站和线圈
|
|
735
|
-
- 线圈0-15(1-16路):创建为开关(Switch)配件
|
|
736
|
-
- 线圈16-31(17-32路):创建为插座(Outlet)配件
|
|
737
|
-
- 监听主站的状态变化事件,实时同步到HomeKit
|
|
738
|
-
- 接收HomeKit控制命令,发送到主站执行
|
|
739
|
-
|
|
740
|
-
**使用示例**:
|
|
741
|
-
1. 在Node-RED中配置好主站节点和从站
|
|
742
|
-
2. 添加HomeKit网桥节点,选择主站节点
|
|
743
|
-
3. 为每个继电器配置友好的名称(例如:客厅灯、卧室灯)
|
|
744
|
-
4. 部署流程
|
|
745
|
-
5. 在iPhone的"家庭"App中添加配件,输入配对码
|
|
746
|
-
6. 完成配对后,即可在HomeKit中控制继电器,支持Siri语音控制
|
|
747
|
-
|
|
748
|
-
**注意事项**:
|
|
749
|
-
- 确保主站节点已正确配置并运行
|
|
750
|
-
- 配对码格式必须为XXX-XX-XXX(8位数字)
|
|
751
|
-
- 端口不能与其他服务冲突(默认51828)
|
|
752
|
-
- 配置信息持久化存储在~/.node-red/homekit-persist目录
|
|
753
|
-
- 重启Node-RED后自动恢复配对状态,无需重新配对
|
|
754
|
-
|
|
755
|
-
###
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
-
|
|
761
|
-
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
-
|
|
765
|
-
-
|
|
766
|
-
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
-
|
|
781
|
-
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
-
|
|
814
|
-
-
|
|
815
|
-
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
-
|
|
820
|
-
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
-
|
|
826
|
-
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
-
|
|
848
|
-
-
|
|
849
|
-
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
-
|
|
854
|
-
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
-
|
|
858
|
-
-
|
|
859
|
-
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
-
|
|
883
|
-
-
|
|
884
|
-
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
-
|
|
888
|
-
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
```
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
```
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
-
|
|
922
|
-
-
|
|
923
|
-
-
|
|
924
|
-
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
-
|
|
956
|
-
-
|
|
957
|
-
-
|
|
958
|
-
-
|
|
959
|
-
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
-
|
|
989
|
-
-
|
|
990
|
-
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
-
|
|
994
|
-
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
-
|
|
1002
|
-
-
|
|
1003
|
-
-
|
|
1004
|
-
- **Mesh
|
|
1005
|
-
-
|
|
1006
|
-
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
-
|
|
1010
|
-
-
|
|
1011
|
-
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
-
|
|
1015
|
-
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
-
|
|
1019
|
-
|
|
1020
|
-
-
|
|
1021
|
-
-
|
|
1022
|
-
-
|
|
1023
|
-
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
-
|
|
1029
|
-
-
|
|
1030
|
-
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
-
|
|
1036
|
-
-
|
|
1037
|
-
-
|
|
1038
|
-
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
-
|
|
1047
|
-
|
|
1048
|
-
-
|
|
1049
|
-
-
|
|
1050
|
-
-
|
|
1051
|
-
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
-
|
|
1060
|
-
-
|
|
1061
|
-
-
|
|
1
|
+
# node-red-contrib-symi-modbus
|
|
2
|
+
|
|
3
|
+
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成,专为智能家居场景设计。
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/node-red-contrib-symi-modbus)
|
|
6
|
+
[](https://nodered.org)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
## 核心特性
|
|
10
|
+
|
|
11
|
+
- **双模式运行**:
|
|
12
|
+
- **本地模式**:纯串口/TCP通信,断网也能稳定运行,无需MQTT
|
|
13
|
+
- **MQTT模式**:可选接入Home Assistant等第三方平台
|
|
14
|
+
- **工业级稳定性**:
|
|
15
|
+
- **多主站隔离**:采用实例级隔离机制,支持无限个主站和从站节点共存,配置互不干扰
|
|
16
|
+
- **智能分包/粘包处理**:内置1KB环形缓冲区和协议分析器,完美处理RS-485总线的分包、粘包问题
|
|
17
|
+
- **内存安全**:严格的内存管理策略,长时间运行内存不泄露,自动清理过期缓存
|
|
18
|
+
- **死锁防护**:多级看门狗机制,自动检测并恢复控制死循环,确保生产环境不卡顿
|
|
19
|
+
- **Symi/Clowire生态集成**:
|
|
20
|
+
- **多协议支持**:完美支持Symi和Clowire(克伦威尔)双品牌协议,全面兼容 `0x03 SET`、`0x04 REPORT`、`0x05 STATUS` 等多种帧类型
|
|
21
|
+
- **全按键覆盖**:协议解析逻辑通用化,完美支持 1-8 号所有物理按键,不再局限于特定编号
|
|
22
|
+
- **蓝牙Mesh深度集成**:支持Symi蓝牙Mesh网关V1.3.1协议,实现无线开关秒级响应
|
|
23
|
+
- **设备持久化**:Mesh设备列表自动保存到磁盘,断电/重启/断网后配置不丢失
|
|
24
|
+
- **反馈同步优化**:
|
|
25
|
+
- **轮询暂停机制**:上报数据时自动暂停主站轮询,防止状态回跳
|
|
26
|
+
- **REPORT协议强制化**:指示灯反馈强制使用REPORT (0x04)协议,不触发继电器动作,避免闪烁
|
|
27
|
+
- **指示灯状态强同步**:无论当前状态如何,物理按键操作都会强制下发指示灯同步指令,确保面板 LED 与系统状态严格一致,彻底解决状态错位导致的按键失灵
|
|
28
|
+
- **物理按键强制同步**:物理按键触发时强制同步 LED 反馈(忽略重复检查),纠正面板可能存在的状态不一致
|
|
29
|
+
- **协议解析安全化**:严格过滤 REPORT (0x04) 反馈回显数据,从源头上切断“反馈触发控制”的无限死循环,确保继电器不乱跳
|
|
30
|
+
- **精准反馈锁**:内置 **100ms** 毫秒级反馈锁,完美过滤 RS485 总线物理回显,同时确保高频连点操作不丢失状态
|
|
31
|
+
- **高级控制功能**:
|
|
32
|
+
- **门禁联动过滤**:继电器节点支持门禁ID过滤,实现精确的门禁联动控制
|
|
33
|
+
- **HomeKit网桥**:一键接入Apple HomeKit,支持Siri语音控制,状态实时同步
|
|
34
|
+
- **智能写入队列**:所有写入操作串行执行,支持优先级管理,确保指示灯反馈在群控场景下秒级响应
|
|
35
|
+
- **多主站精准隔离**:支持多主站并行运行,通过 `masterId` 实现指令精准定向,严格过滤跨主站事件,彻底解决多主站环境下的控制冲突与误触发
|
|
36
|
+
- **智能反馈路由**:从站开关节点自动识别所属主站,仅响应目标主站的状态变化,防止多系统并存时的信号串扰
|
|
37
|
+
- **真·状态翻转逻辑**:继电器输出节点内置状态感知能力,基于物理设备真实反馈执行翻转操作,解决传统盲发指令导致的开关失灵
|
|
38
|
+
- **可视化运维**:
|
|
39
|
+
- **控制看板**:实时显示所有继电器状态,支持手动控制
|
|
40
|
+
- **调试模式**:详细的通信日志,支持十六进制报文监控
|
|
41
|
+
|
|
42
|
+
### 1. 安装
|
|
43
|
+
|
|
44
|
+
**通过npm安装(推荐)**
|
|
45
|
+
```bash
|
|
46
|
+
cd ~/.node-red
|
|
47
|
+
npm install node-red-contrib-symi-modbus
|
|
48
|
+
node-red-restart
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**通过Node-RED界面安装**
|
|
52
|
+
1. 点击右上角菜单 → 设置 → 节点管理
|
|
53
|
+
2. 搜索 `node-red-contrib-symi-modbus`
|
|
54
|
+
3. 点击安装
|
|
55
|
+
|
|
56
|
+
### 2. 选择运行模式
|
|
57
|
+
|
|
58
|
+
本节点支持两种运行模式,根据需求选择:
|
|
59
|
+
|
|
60
|
+
#### 模式1:本地模式(推荐用于纯串口控制)
|
|
61
|
+
|
|
62
|
+
**适用场景**:
|
|
63
|
+
- 无需对接第三方平台
|
|
64
|
+
- 断网环境下稳定运行
|
|
65
|
+
- 纯本地化控制,不受网络影响
|
|
66
|
+
|
|
67
|
+
**配置方法**:
|
|
68
|
+
1. 主站节点:不启用MQTT或不配置MQTT服务器
|
|
69
|
+
2. 从站开关节点:不配置MQTT服务器
|
|
70
|
+
3. **无需连线**:主站和从站通过内部事件自动通信
|
|
71
|
+
|
|
72
|
+
**优势**:
|
|
73
|
+
- 断网也能稳定运行
|
|
74
|
+
- 不依赖外部服务
|
|
75
|
+
- 响应速度更快
|
|
76
|
+
- 配置更简单
|
|
77
|
+
- 无需手动连线(免连线通信)
|
|
78
|
+
|
|
79
|
+
#### 模式2:MQTT模式(推荐用于Home Assistant集成)
|
|
80
|
+
|
|
81
|
+
**适用场景**:
|
|
82
|
+
- 需要对接Home Assistant等平台
|
|
83
|
+
- 需要远程控制
|
|
84
|
+
- 需要状态持久化
|
|
85
|
+
|
|
86
|
+
**配置方法**:
|
|
87
|
+
1. 拖拽任意节点到流程画布
|
|
88
|
+
2. 双击节点,找到"MQTT服务器"字段
|
|
89
|
+
3. 点击编辑按钮,填写MQTT服务器信息:
|
|
90
|
+
- MQTT Broker: `mqtt://localhost:1883` (或你的MQTT服务器地址)
|
|
91
|
+
- 用户名/密码: 按需填写
|
|
92
|
+
- 基础主题: `modbus/relay` (默认)
|
|
93
|
+
|
|
94
|
+
**优势**:
|
|
95
|
+
- Home Assistant自动发现
|
|
96
|
+
- 支持远程控制
|
|
97
|
+
- 状态持久化存储
|
|
98
|
+
|
|
99
|
+
### 3. 配置主站节点
|
|
100
|
+
|
|
101
|
+
1. 拖拽 **Modbus主站** 节点到流程画布
|
|
102
|
+
2. 配置连接参数:
|
|
103
|
+
- **串口模式**(直连RS485设备):
|
|
104
|
+
- 连接类型: `串口`
|
|
105
|
+
- 串口路径: `/dev/ttyUSB0` (Linux/Mac) 或 `COM1` (Windows)
|
|
106
|
+
- 波特率: `9600`(默认)
|
|
107
|
+
- 数据位: `8`
|
|
108
|
+
- 停止位: `1`
|
|
109
|
+
- 校验位: `无`
|
|
110
|
+
- **TCP模式**(通过TCP转RS485网关):
|
|
111
|
+
- 连接类型: `TCP/IP`
|
|
112
|
+
- TCP模式: `Telnet ASCII`(推荐,适用于大多数TCP转RS485网关)
|
|
113
|
+
- TCP主机: `192.168.2.110`
|
|
114
|
+
- TCP端口: `1031`
|
|
115
|
+
- 其他模式:
|
|
116
|
+
- `RTU over TCP`:适用于支持Modbus RTU over TCP的网关
|
|
117
|
+
- `Modbus TCP`:适用于标准Modbus TCP设备
|
|
118
|
+
3. 配置从站设备:
|
|
119
|
+
- 从站地址: `10` (默认,可添加多个,如10、11、12、13)
|
|
120
|
+
- 线圈范围: `0-31`
|
|
121
|
+
- 轮询间隔: `200ms` (默认,支持100-10000ms)
|
|
122
|
+
4. MQTT配置(可选):
|
|
123
|
+
- 本地模式:不启用MQTT或留空
|
|
124
|
+
- MQTT模式:启用MQTT并选择MQTT服务器配置
|
|
125
|
+
5. 部署流程
|
|
126
|
+
|
|
127
|
+
### 4. 配置RS-485连接配置节点(用于从站开关)
|
|
128
|
+
|
|
129
|
+
如果需要物理开关面板控制,首先创建RS-485连接配置:
|
|
130
|
+
|
|
131
|
+
1. 点击右上角菜单 → 配置节点
|
|
132
|
+
2. 添加新的 **serial-port-config** 配置节点
|
|
133
|
+
3. 选择连接类型:
|
|
134
|
+
- **串口模式**(本地RS-485总线):
|
|
135
|
+
- 连接类型: `串口`
|
|
136
|
+
- 串口路径: `/dev/ttyUSB0` (可点击"搜索"按钮自动发现)
|
|
137
|
+
- 波特率: `9600`
|
|
138
|
+
- 数据位: `8`
|
|
139
|
+
- 停止位: `1`
|
|
140
|
+
- 校验位: `无 (N)`
|
|
141
|
+
- **TCP模式**(通过TCP转RS485网关):
|
|
142
|
+
- 连接类型: `TCP网关`
|
|
143
|
+
- TCP主机: `192.168.2.110`
|
|
144
|
+
- TCP端口: `1031`
|
|
145
|
+
4. 保存配置
|
|
146
|
+
|
|
147
|
+
### 5. 配置从站开关节点(可选)
|
|
148
|
+
|
|
149
|
+
使用物理开关面板控制继电器,支持三种模式:
|
|
150
|
+
|
|
151
|
+
#### 模式1:RS-485开关模式(传统有线开关)
|
|
152
|
+
|
|
153
|
+
1. 拖拽 **从站开关** 节点到流程画布
|
|
154
|
+
2. 选择刚创建的RS-485连接配置
|
|
155
|
+
3. 配置开关面板信息:
|
|
156
|
+
- 面板品牌: `亖米` (默认)
|
|
157
|
+
- 按钮类型: `开关按钮(RS-485)`
|
|
158
|
+
- 开关ID: 物理面板地址 (0-255)
|
|
159
|
+
- 按钮编号: 按键编号 (1-8)
|
|
160
|
+
4. 配置映射到的继电器:
|
|
161
|
+
- 目标从站地址: `10`
|
|
162
|
+
- 目标线圈编号: `1`(用户输入1-32)
|
|
163
|
+
5. **无需连线**:主站和从站通过内部事件自动通信
|
|
164
|
+
6. 部署流程
|
|
165
|
+
|
|
166
|
+
#### 模式2:RS-485场景模式(场景触发)
|
|
167
|
+
|
|
168
|
+
1. 配置步骤同上,但按钮类型选择 `场景按钮(RS-485)`
|
|
169
|
+
2. 每次按键触发状态翻转(ON→OFF或OFF→ON)
|
|
170
|
+
3. 适用于场景联动、一键控制等场景
|
|
171
|
+
|
|
172
|
+
#### 模式3:Mesh开关模式(蓝牙Mesh无线开关)
|
|
173
|
+
|
|
174
|
+
**适用场景**:使用Symi蓝牙Mesh网关和Mesh开关面板
|
|
175
|
+
|
|
176
|
+
**配置步骤**:
|
|
177
|
+
|
|
178
|
+
1. **准备工作**
|
|
179
|
+
- 确保Mesh网关已通过TCP或串口连接到Node-RED
|
|
180
|
+
- 确保Mesh开关已配网到网关
|
|
181
|
+
|
|
182
|
+
2. **添加节点**
|
|
183
|
+
- 拖拽 **从站开关** 节点到流程画布
|
|
184
|
+
- 选择Mesh网关的连接配置(TCP或串口)
|
|
185
|
+
|
|
186
|
+
3. **扫描Mesh设备**
|
|
187
|
+
- 按钮类型: 选择 `Mesh开关(蓝牙Mesh)`
|
|
188
|
+
- 点击 **扫描设备** 按钮
|
|
189
|
+
- 系统发送 `53 12 00 41` 协议帧到网关
|
|
190
|
+
- 网关立即返回所有Mesh开关列表(通常5秒内完成)
|
|
191
|
+
- 设备列表自动持久化保存到 `~/.node-red/mesh-devices-persist/`
|
|
192
|
+
- 重启Node-RED无需重新扫描,直接从持久化存储加载
|
|
193
|
+
|
|
194
|
+
4. **选择设备和按键**
|
|
195
|
+
- Mesh设备: 从下拉框选择开关(显示格式:`MAC地址 (X路开关)`)
|
|
196
|
+
- 按钮编号: 选择要使用的按键(1-6路)
|
|
197
|
+
- **无线模式**(可选): 勾选此选项后,该按键不响应LED反馈
|
|
198
|
+
- 适用场景:按键用于触发场景(如全开/全关),继电器状态变化不应点亮该按键LED
|
|
199
|
+
- 例如:按键3控制线圈16(全开触发),勾选无线模式后,线圈0-15状态变化不会点亮按键3的LED
|
|
200
|
+
- 多个节点可共享同一设备列表,无需重复扫描
|
|
201
|
+
|
|
202
|
+
5. **配置目标继电器**
|
|
203
|
+
- 目标从站地址: `10`
|
|
204
|
+
- 目标线圈编号: `1`(用户输入1-32)
|
|
205
|
+
|
|
206
|
+
6. **部署流程**
|
|
207
|
+
- 点击"完成"并部署
|
|
208
|
+
- Mesh开关按键会自动控制对应继电器
|
|
209
|
+
- 继电器状态变化会自动反馈到Mesh开关LED(无线模式按键除外)
|
|
210
|
+
|
|
211
|
+
**Mesh模式特点**:
|
|
212
|
+
- 无线控制,无需布线
|
|
213
|
+
- 支持1-6路开关
|
|
214
|
+
- 双向同步(按键→继电器,继电器→LED)
|
|
215
|
+
- 支持无线模式(场景触发按键不响应LED反馈)
|
|
216
|
+
- 设备列表持久化保存
|
|
217
|
+
- 短地址自动更新(如果网关重新配网)
|
|
218
|
+
- 与RS-485开关使用方式完全一致
|
|
219
|
+
|
|
220
|
+
### 6. 配置HomeKit网桥节点(可选)
|
|
221
|
+
|
|
222
|
+
将Modbus继电器桥接到Apple HomeKit,实现Siri语音控制:
|
|
223
|
+
|
|
224
|
+
**配置步骤**:
|
|
225
|
+
|
|
226
|
+
1. **添加网桥节点**
|
|
227
|
+
- 拖拽 **HomeKit网桥** 节点到流程画布
|
|
228
|
+
- 双击节点打开配置界面
|
|
229
|
+
|
|
230
|
+
2. **基础配置**
|
|
231
|
+
- 网桥名称: `Modbus继电器网桥`(在HomeKit中显示)
|
|
232
|
+
- 选择主站节点: 从下拉框选择已配置的主站
|
|
233
|
+
- 配对码: `031-45-154`(添加到HomeKit时使用)
|
|
234
|
+
- 端口: `51828`(保持默认)
|
|
235
|
+
|
|
236
|
+
3. **配置继电器名称**(推荐)
|
|
237
|
+
- 选择主站后,下方会自动显示所有继电器
|
|
238
|
+
- 为每个继电器输入友好的中文名称
|
|
239
|
+
- 例如:`客厅灯`、`卧室灯`、`空调插座`等
|
|
240
|
+
- 配置后在HomeKit中直接显示,无需再修改
|
|
241
|
+
|
|
242
|
+
4. **部署并添加到HomeKit**
|
|
243
|
+
- 点击"完成"并部署流程
|
|
244
|
+
- 打开iPhone/iPad的"家庭"App
|
|
245
|
+
- 点击右上角"+" → "添加配件"
|
|
246
|
+
- 选择"更多选项"
|
|
247
|
+
- 找到"Modbus继电器网桥"
|
|
248
|
+
- 输入配对码:`031-45-154`
|
|
249
|
+
- 完成配对
|
|
250
|
+
|
|
251
|
+
**使用说明**:
|
|
252
|
+
- 线圈0-15显示为开关,线圈16-31显示为插座
|
|
253
|
+
- 支持Siri语音控制:"嘿Siri,打开客厅灯"
|
|
254
|
+
- 支持HomeKit自动化和场景
|
|
255
|
+
- 配置会自动保存,重启后无需重新配对
|
|
256
|
+
- **群控性能**:支持同时控制多个继电器(如创建编组),智能队列机制确保流畅无卡顿
|
|
257
|
+
|
|
258
|
+
**群控说明**(客户友好模式):
|
|
259
|
+
|
|
260
|
+
本节点专为智能家居群控场景优化,支持以下高性能操作:
|
|
261
|
+
|
|
262
|
+
1. **HomeKit编组群控**:
|
|
263
|
+
- 在HomeKit中创建房间或编组,可同时控制多个继电器
|
|
264
|
+
- 例如:创建"客厅"编组,包含10个灯光开关,一键全开/全关
|
|
265
|
+
- 智能优先队列机制确保触发源面板最快响应,其他继电器按序执行
|
|
266
|
+
- 10个继电器同时动作仅需约 500ms(50ms间隔×10),触发源面板优先反馈
|
|
267
|
+
|
|
268
|
+
2. **场景联动**:
|
|
269
|
+
- 支持HomeKit场景(如"回家模式"、"离家模式")
|
|
270
|
+
- 场景可包含多个继电器动作,自动串行执行
|
|
271
|
+
- 前16个线圈(继电器)可同时动作,后16个线圈(场景)按需触发
|
|
272
|
+
|
|
273
|
+
3. **性能保证**:
|
|
274
|
+
- 最大支持10台继电器(每台32路),共320个线圈
|
|
275
|
+
- 前160个线圈(10台×16路)可用于继电器控制,支持群控
|
|
276
|
+
- 后160个线圈(10台×16路)可用于场景触发,一般不会全部同时动作
|
|
277
|
+
- 智能写入队列确保所有操作串行执行,避免总线冲突
|
|
278
|
+
- 长期稳定运行,反复控制不会造成内存增加、卡顿或死机
|
|
279
|
+
|
|
280
|
+
4. **技术细节**:
|
|
281
|
+
- 写入队列间隔:50ms(确保总线稳定,优化指示灯反馈)
|
|
282
|
+
- 写入锁机制:写入操作优先级高于轮询,自动抢占总线资源
|
|
283
|
+
- 轮询恢复时间:50ms(写入完成后快速恢复轮询)
|
|
284
|
+
- 锁等待超时:500ms(适配高延迟网络,确保指令不丢失)
|
|
285
|
+
- 智能优先队列:触发源面板优先处理(500ms优先窗口)
|
|
286
|
+
- 触发源追踪:全链路追踪控制指令来源(triggerSource),日志清晰记录是物理按键、HomeKit还是自动化触发
|
|
287
|
+
- 队列自动处理,无需手动干预
|
|
288
|
+
|
|
289
|
+
## 核心特性说明
|
|
290
|
+
|
|
291
|
+
### Symi开关自动识别
|
|
292
|
+
|
|
293
|
+
主站节点自动支持两种控制方式,无需额外配置:
|
|
294
|
+
|
|
295
|
+
#### 方式1:Modbus RTU轮询(标准)
|
|
296
|
+
- 主站定期轮询从站线圈状态
|
|
297
|
+
- 通过MQTT或Node-RED流程控制继电器
|
|
298
|
+
- 适用于所有Modbus RTU设备
|
|
299
|
+
|
|
300
|
+
#### 方式2:Symi私有协议(自动)
|
|
301
|
+
- 自动识别Symi开关按键事件(协议格式:`7E [地址] 03 0F ...`)
|
|
302
|
+
- 自动应答并控制对应继电器(协议格式:`7E [地址] 04 0F ...`)
|
|
303
|
+
- 映射规则:
|
|
304
|
+
- 设备地址1 → 从站10
|
|
305
|
+
- 设备地址2 → 从站11
|
|
306
|
+
- 设备地址3 → 从站12
|
|
307
|
+
- 设备地址4 → 从站13
|
|
308
|
+
- 通道号1-8 → 线圈0-7
|
|
309
|
+
|
|
310
|
+
**按钮类型说明**:
|
|
311
|
+
|
|
312
|
+
**1. 开关按钮(推荐)**
|
|
313
|
+
- **控制方式**:按键有独立的开/关状态
|
|
314
|
+
- **LED反馈**:面板LED指示灯精确同步开关状态
|
|
315
|
+
- **适用场景**:
|
|
316
|
+
- 灯光开关(客厅灯、卧室灯等)
|
|
317
|
+
- 插座开关(电器控制)
|
|
318
|
+
- 窗帘开关(电动窗帘)
|
|
319
|
+
- 任何需要明确开/关状态的场景
|
|
320
|
+
- **技术特点**:
|
|
321
|
+
- 使用REPORT协议(0x04)发送LED反馈
|
|
322
|
+
- 使用原始设备地址确保LED精确反馈
|
|
323
|
+
- 支持物理按键和Home Assistant远程控制
|
|
324
|
+
- 面板LED完美同步,响应速度快
|
|
325
|
+
|
|
326
|
+
**2. 场景按钮**
|
|
327
|
+
- **控制方式**:每次按下toggle切换状态(开→关→开)
|
|
328
|
+
- **LED反馈**:根据当前状态显示LED(开=亮,关=灭)
|
|
329
|
+
- **协议特征**:操作信息为0x11、0x12、0x13等(高4位=1表示场景模式)
|
|
330
|
+
- **适用场景**:
|
|
331
|
+
- 场景触发(回家模式、离家模式等)
|
|
332
|
+
- 一键全开/全关
|
|
333
|
+
- 需要状态指示的场景按钮
|
|
334
|
+
- **技术特点**:
|
|
335
|
+
- 使用REPORT协议(0x04)发送LED反馈
|
|
336
|
+
- 使用原始设备地址确保LED精确反馈
|
|
337
|
+
- 支持物理按键和Home Assistant远程控制
|
|
338
|
+
- 200ms防抖,避免重复触发
|
|
339
|
+
- 自动识别场景模式(根据操作信息高4位判断)
|
|
340
|
+
|
|
341
|
+
**两种模式对比**:
|
|
342
|
+
|
|
343
|
+
| 特性 | 开关按钮 | 场景按钮 |
|
|
344
|
+
|------|---------|---------|
|
|
345
|
+
| 控制方式 | 开/关独立 | Toggle切换 |
|
|
346
|
+
| 操作信息 | 0x00/0x01 | 0x11/0x12/0x13等 |
|
|
347
|
+
| LED反馈协议 | REPORT (0x04) | REPORT (0x04) |
|
|
348
|
+
| 按键事件 | 独立开/关码 | 统一触发码 |
|
|
349
|
+
| LED同步 | ✓ 完美同步 | ✓ 完美同步 |
|
|
350
|
+
| HA远程控制 | ✓ 支持 | ✓ 支持 |
|
|
351
|
+
| 推荐场景 | 灯光/插座 | 场景触发 |
|
|
352
|
+
| 自动识别 | ✓ 支持 | ✓ 支持 |
|
|
353
|
+
|
|
354
|
+
**配置说明**:
|
|
355
|
+
|
|
356
|
+
1. **RS-485连接**:选择串口配置节点(波特率9600,8N1)
|
|
357
|
+
2. **MQTT服务器**(可选):
|
|
358
|
+
- 本地模式:不启用MQTT,主站和从站通过内部事件自动通信(免连线)
|
|
359
|
+
- MQTT模式:启用MQTT并选择MQTT配置节点
|
|
360
|
+
3. **面板配置**:
|
|
361
|
+
- 面板品牌:选择亖米(Symi)
|
|
362
|
+
- 按钮类型:开关按钮或场景按钮(也可自动识别)
|
|
363
|
+
- 开关ID:物理面板的RS-485地址(0-255)
|
|
364
|
+
- 按钮编号:面板上的按键序号(1-8)
|
|
365
|
+
4. **继电器映射**:
|
|
366
|
+
- 从站地址:Modbus继电器地址(10-247)
|
|
367
|
+
- 继电器路数:继电器通道(1-32路)
|
|
368
|
+
|
|
369
|
+
**使用示例**:
|
|
370
|
+
|
|
371
|
+
**示例1:客厅灯光开关(本地模式)**
|
|
372
|
+
- 面板:开关ID=2,按键1(开关按钮)
|
|
373
|
+
- 继电器:从站10,1路
|
|
374
|
+
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
375
|
+
- 效果:按下面板按键,客厅灯开/关,面板LED同步状态,断网也能正常工作
|
|
376
|
+
|
|
377
|
+
**示例2:全开场景(MQTT模式)**
|
|
378
|
+
- 面板:开关ID=2,按键8(场景按钮)
|
|
379
|
+
- 继电器:从站10,32路
|
|
380
|
+
- 配置:启用MQTT,连接到Home Assistant
|
|
381
|
+
- 效果:按下面板按键,触发全开场景,HA中可远程控制,面板LED同步状态
|
|
382
|
+
|
|
383
|
+
**示例3:三键场景开关(本地模式)**
|
|
384
|
+
- 面板:开关ID=1,按键1/2/3(场景按钮,自动识别)
|
|
385
|
+
- 继电器:从站10,1/2/3路
|
|
386
|
+
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
387
|
+
- 效果:按下按键1/2/3,分别控制对应继电器,LED指示灯同步状态
|
|
388
|
+
|
|
389
|
+
### 智能轮询机制
|
|
390
|
+
|
|
391
|
+
主站轮询时,从站开关可以同时使用。当从站开关上报数据到服务器后:
|
|
392
|
+
1. **自动暂停轮询**:主站检测到写入操作,立即暂停轮询
|
|
393
|
+
2. **优先处理数据**:处理从站上报的数据(写入Modbus继电器)
|
|
394
|
+
3. **继续轮询**:数据处理完成后(100ms延迟),自动恢复轮询
|
|
395
|
+
4. **日志记录**:记录轮询暂停时长和跳过的轮询次数
|
|
396
|
+
|
|
397
|
+
这种机制确保:
|
|
398
|
+
- 主站轮询不会与从站写入冲突
|
|
399
|
+
- 从站上报的数据得到优先处理
|
|
400
|
+
- 系统响应迅速,状态同步及时
|
|
401
|
+
|
|
402
|
+
### 总线数据过滤与稳定性
|
|
403
|
+
|
|
404
|
+
本节点具备完善的总线数据过滤机制,确保长期稳定运行:
|
|
405
|
+
|
|
406
|
+
**数据过滤机制**:
|
|
407
|
+
- **CRC校验**:所有Symi协议帧都经过CRC8校验,无效数据自动丢弃
|
|
408
|
+
- **静默忽略**:总线上的非相关数据(其他设备、其他协议)静默忽略,不影响正常通信
|
|
409
|
+
- **精确匹配**:只处理本节点配置的从站地址和线圈范围内的数据
|
|
410
|
+
- **TCP粘包处理**:TCP模式下自动处理粘包和分包问题,确保数据完整性
|
|
411
|
+
|
|
412
|
+
**稳定性保障**:
|
|
413
|
+
- **写入队列**:多个节点同时写入时自动排队,避免并发冲突
|
|
414
|
+
- **断线重连**:TCP和串口断线后自动重连,指数退避策略(最大60秒)
|
|
415
|
+
- **内存管理**:定时清理缓存,防止内存泄漏
|
|
416
|
+
- **错误日志限流**:避免日志刷屏影响性能
|
|
417
|
+
- **MQTT独立性**:MQTT开启或关闭都不影响主站和从站的本地通信
|
|
418
|
+
|
|
419
|
+
**网络适应性**:
|
|
420
|
+
- **离线通信**:串口模式完全脱离网络依赖,断网也能正常工作
|
|
421
|
+
- **TCP稳定性**:TCP模式支持局域网通信,网络恢复后自动重连
|
|
422
|
+
- **MQTT可选**:MQTT仅用于对接第三方平台,不影响本地控制
|
|
423
|
+
|
|
424
|
+
## 调试节点(modbus-debug)
|
|
425
|
+
|
|
426
|
+
用于抓取并显示原始RS485字节流数据(HEX),帮助定位串口或TCP网关下的Modbus通信问题。
|
|
427
|
+
|
|
428
|
+
- 数据来源:
|
|
429
|
+
- 共享连接:`serial-port-config`(推荐,复用主站/从站的同一连接)
|
|
430
|
+
- 独立连接:`modbus-server-config`(直接连接TCP或串口)
|
|
431
|
+
- 输出内容:
|
|
432
|
+
- `msg.payload`:格式化的HEX字符串(可选大写)
|
|
433
|
+
- `msg.buffer`:原始Buffer数据
|
|
434
|
+
- `msg.meta`:来源信息与连接参数(串口或TCP详情)
|
|
435
|
+
- `msg.timestamp`:时间戳(可选)
|
|
436
|
+
- 显示控制:
|
|
437
|
+
- `maxBytes`:限制显示字节数,超过会截断并在`meta.truncated`标记
|
|
438
|
+
|
|
439
|
+
使用步骤:
|
|
440
|
+
1. 将 `modbus-debug` 节点拖入画布。
|
|
441
|
+
2. 选择“数据来源”:
|
|
442
|
+
- 选“共享串口配置(serial-port-config)”以复用主站/从站连接;或
|
|
443
|
+
- 选“Modbus服务器(modbus-server-config)”进行独立直连。
|
|
444
|
+
3. 可选:勾选“大写HEX”、勾选“时间戳”、设置“最大字节数”。
|
|
445
|
+
4. 部署后,节点自动输出捕获到的原始数据。
|
|
446
|
+
|
|
447
|
+
典型用法:
|
|
448
|
+
- 联调TCP转RS485网关时,观察上行/下行原始数据帧是否完整。
|
|
449
|
+
- 排查波特率/数据位/校验位配置是否正确(串口模式)。
|
|
450
|
+
- 与 `modbus-master` 或 `modbus-slave-switch` 同时使用,定位现场设备通信异常。
|
|
451
|
+
|
|
452
|
+
### MQTT自动发现
|
|
453
|
+
|
|
454
|
+
启用MQTT后,自动生成Home Assistant兼容的Discovery配置:
|
|
455
|
+
- **唯一性保证**:每个实体使用稳定的`unique_id`,避免重复生成
|
|
456
|
+
- **设备分组**:同一从站的所有继电器自动分组到一个设备下
|
|
457
|
+
- **状态持久化**:使用`retain=true`确保状态持久化
|
|
458
|
+
- **在线状态**:自动发布设备可用性状态
|
|
459
|
+
|
|
460
|
+
### 配置持久化
|
|
461
|
+
|
|
462
|
+
所有节点配置自动保存到Node-RED的flows文件中:
|
|
463
|
+
- 从站地址、线圈范围、轮询间隔
|
|
464
|
+
- MQTT服务器配置
|
|
465
|
+
- 开关面板映射关系
|
|
466
|
+
|
|
467
|
+
部署后配置永久生效,重启Node-RED后自动恢复。
|
|
468
|
+
|
|
469
|
+
### 长期稳定运行
|
|
470
|
+
|
|
471
|
+
针对工控机24/7长期运行优化:
|
|
472
|
+
- **内存管理**:自动清理缓存,释放无用对象
|
|
473
|
+
- **事件监听器清理**:关闭时移除所有监听器,防止内存泄漏
|
|
474
|
+
- **智能日志限流**:错误日志10分钟输出一次,避免日志刷屏
|
|
475
|
+
- **智能重连机制**:
|
|
476
|
+
- Modbus连接断开自动重连(指数退避:5秒→10秒→20秒...最大60秒)
|
|
477
|
+
- MQTT连接断开自动重连(支持多地址fallback)
|
|
478
|
+
- 串口拔插自动检测并重连
|
|
479
|
+
- TCP网络故障自动恢复
|
|
480
|
+
- 连接前彻底清理旧实例,避免资源泄漏
|
|
481
|
+
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
482
|
+
- **TCP永久连接**:
|
|
483
|
+
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
484
|
+
- Keep-Alive心跳10秒间隔,确保连接活跃
|
|
485
|
+
- 适应客户长期不在家、总线无数据的场景
|
|
486
|
+
- 网络故障自动重连,恢复后立即恢复通信
|
|
487
|
+
|
|
488
|
+
## 技术规格
|
|
489
|
+
|
|
490
|
+
### Modbus协议
|
|
491
|
+
|
|
492
|
+
- **协议类型**:Modbus TCP / Modbus RTU
|
|
493
|
+
- **底层库**:modbus-serial ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
494
|
+
- **功能码支持**:0x01(读线圈)、0x05(写单个线圈)、0x0F(写多个线圈)
|
|
495
|
+
- **从站地址范围**:1-247(建议从10开始)
|
|
496
|
+
- **线圈数量**:每台设备32个(0-31)
|
|
497
|
+
- **最大设备数**:10台同时轮询
|
|
498
|
+
- **轮询间隔**:默认200ms(建议300-500ms,支持100-10000ms)
|
|
499
|
+
- **串口配置**:9600 8-N-1(波特率9600,8数据位,无校验,1停止位)
|
|
500
|
+
- **超时设置**:5000ms(TCP和串口通用)
|
|
501
|
+
|
|
502
|
+
### 兼容性
|
|
503
|
+
|
|
504
|
+
- **Node.js**: >= 14.0.0
|
|
505
|
+
- **Node-RED**: >= 2.0.0
|
|
506
|
+
- **MQTT Broker**: Mosquitto / EMQX / Any MQTT 3.1.1/5.0
|
|
507
|
+
- **Home Assistant**: 2024.x+(MQTT Discovery标准)
|
|
508
|
+
- **操作系统**: Windows / Linux / macOS / HassOS
|
|
509
|
+
|
|
510
|
+
## Home Assistant集成
|
|
511
|
+
|
|
512
|
+
### 自动发现
|
|
513
|
+
|
|
514
|
+
启用MQTT后,设备自动出现在Home Assistant中:
|
|
515
|
+
- 实体ID: `switch.relay_{从站地址}_{线圈编号}`
|
|
516
|
+
- 设备名称: `Modbus继电器-{从站地址}`
|
|
517
|
+
- 自动分组: 同一从站的所有继电器分组到一个设备
|
|
518
|
+
|
|
519
|
+
### MQTT主题结构
|
|
520
|
+
|
|
521
|
+
```
|
|
522
|
+
状态主题: modbus/relay/{从站}/{线圈}/state
|
|
523
|
+
命令主题: modbus/relay/{从站}/{线圈}/set
|
|
524
|
+
可用性主题: modbus/relay/{从站}/availability
|
|
525
|
+
发现主题: homeassistant/switch/modbus_relay_{从站}_{线圈}/config
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
## 故障排除
|
|
529
|
+
|
|
530
|
+
### 串口连接失败
|
|
531
|
+
|
|
532
|
+
**Linux**:
|
|
533
|
+
```bash
|
|
534
|
+
# 查看串口设备
|
|
535
|
+
ls -l /dev/ttyUSB* /dev/ttyS*
|
|
536
|
+
|
|
537
|
+
# 添加用户到dialout组(需要重新登录)
|
|
538
|
+
sudo usermod -a -G dialout $USER
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
**macOS**:
|
|
542
|
+
```bash
|
|
543
|
+
# 查看串口设备(注意macOS使用cu.*而不是tty.*)
|
|
544
|
+
ls -l /dev/cu.*
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
**Docker/HassOS**:
|
|
548
|
+
```yaml
|
|
549
|
+
# 在docker-compose.yml或HassOS插件配置中添加设备映射
|
|
550
|
+
devices:
|
|
551
|
+
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### MQTT连接失败
|
|
555
|
+
|
|
556
|
+
1. 确认MQTT broker正在运行:
|
|
557
|
+
```bash
|
|
558
|
+
# Linux
|
|
559
|
+
sudo systemctl status mosquitto
|
|
560
|
+
|
|
561
|
+
# macOS
|
|
562
|
+
brew services list | grep mosquitto
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
2. 测试MQTT连接:
|
|
566
|
+
```bash
|
|
567
|
+
mosquitto_sub -h localhost -t test
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
3. 检查Node-RED日志中的MQTT连接信息
|
|
571
|
+
|
|
572
|
+
### 主站轮询不工作
|
|
573
|
+
|
|
574
|
+
1. **检查从站配置**:确认已添加所有从站设备(如10、11、12、13)
|
|
575
|
+
2. **检查轮询间隔**:默认200ms,建议300-500ms(多台从站时避免总线拥堵)
|
|
576
|
+
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
577
|
+
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
578
|
+
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
579
|
+
|
|
580
|
+
### 轮询超时或频繁报错
|
|
581
|
+
|
|
582
|
+
1. **轮询永不停止原则**:
|
|
583
|
+
- 即使从站不响应,轮询也会持续运行
|
|
584
|
+
- 不会因超时而跳过任何从站
|
|
585
|
+
- 只记录错误日志,不影响总线轮询机制
|
|
586
|
+
2. **正常超时**:偶尔超时是正常的,系统会自动重试
|
|
587
|
+
- 超时设置:2-3秒(串口/TCP)
|
|
588
|
+
- 只记录日志,不停止轮询
|
|
589
|
+
- 轮询会持续运行,不受超时影响
|
|
590
|
+
3. **频繁超时**:
|
|
591
|
+
- 检查Modbus连接是否稳定
|
|
592
|
+
- 调整轮询间隔(默认200ms,可增加到500ms)
|
|
593
|
+
- 检查从站设备是否在线
|
|
594
|
+
- 查看总线是否有其他设备干扰
|
|
595
|
+
4. **总线干扰**:
|
|
596
|
+
- 总线上的其他数据(如Symi网关通信、其他Modbus设备)可能导致偶尔超时或CRC错误
|
|
597
|
+
- 系统已优化容错机制,会自动忽略异常数据并继续轮询
|
|
598
|
+
- 非超时错误(如CRC错误)不累积计数,只记录日志
|
|
599
|
+
5. **长期稳定性保障**:
|
|
600
|
+
- 轮询循环采用try-catch包裹,确保异常不会中断轮询
|
|
601
|
+
- 每1000轮输出一次调试日志,证明轮询持续运行
|
|
602
|
+
- 定时清理机制(每小时)防止内存泄漏
|
|
603
|
+
- 所有定时器在节点关闭时正确清除
|
|
604
|
+
|
|
605
|
+
### 总线上出现未知数据
|
|
606
|
+
|
|
607
|
+
1. **识别数据来源**:
|
|
608
|
+
- 使用`modbus-debug`节点监听总线数据(必须使用共享的serial-port-config,避免串口冲突)
|
|
609
|
+
- 查看Node-RED日志中的"写入线圈"日志,确认是否是本节点发送的
|
|
610
|
+
- 检查是否有其他Modbus设备或Symi网关在总线上通信
|
|
611
|
+
2. **常见数据格式**:
|
|
612
|
+
- `01 05 00 01 FF 00 ...`:写单个线圈(功能码0x05)
|
|
613
|
+
- `01 0F 00 00 00 20 ...`:写多个线圈(功能码0x0F)
|
|
614
|
+
- `7E 01 03 ...`:Symi轻量级协议数据
|
|
615
|
+
3. **影响**:
|
|
616
|
+
- 总线上的其他数据不会影响轮询稳定性
|
|
617
|
+
- 可能导致偶尔的CRC错误或超时,但系统会自动忽略并继续轮询
|
|
618
|
+
|
|
619
|
+
### 串口冲突错误
|
|
620
|
+
|
|
621
|
+
**错误信息**:
|
|
622
|
+
```
|
|
623
|
+
串口监听错误: Port is not open
|
|
624
|
+
串口监听错误: Error Resource temporarily unavailable Cannot lock port
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
**原因**:
|
|
628
|
+
- 多个节点试图独立打开同一个串口
|
|
629
|
+
- 串口只能被一个进程同时打开
|
|
630
|
+
|
|
631
|
+
**解决方案**:
|
|
632
|
+
1. **modbus-debug节点**:必须使用"serial"源类型,选择共享的`serial-port-config`配置节点
|
|
633
|
+
2. **不要使用独立连接**:不要让多个节点独立打开同一个串口
|
|
634
|
+
3. **共享连接配置**:所有节点(主站、从站开关、modbus-debug)都应该使用同一个`serial-port-config`配置节点
|
|
635
|
+
|
|
636
|
+
### 批量更换连接配置
|
|
637
|
+
|
|
638
|
+
**问题**:如何批量更换所有节点的RS-485连接配置?
|
|
639
|
+
|
|
640
|
+
**Node-RED原生方法**(推荐):
|
|
641
|
+
1. 创建新的`serial-port-config`配置节点
|
|
642
|
+
2. 点击右上角菜单 → 配置节点
|
|
643
|
+
3. 找到旧的`serial-port-config`配置节点
|
|
644
|
+
4. 点击删除按钮
|
|
645
|
+
5. Node-RED会提示"此配置节点被X个节点使用,是否替换为其他配置?"
|
|
646
|
+
6. 选择新创建的配置节点
|
|
647
|
+
7. 点击确认,所有使用旧配置的节点会自动更换为新配置
|
|
648
|
+
|
|
649
|
+
**注意**:
|
|
650
|
+
- 这是Node-RED的原生功能,安全可靠
|
|
651
|
+
- 删除配置节点前必须先创建新配置
|
|
652
|
+
- 替换后需要部署才能生效
|
|
653
|
+
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
654
|
+
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
655
|
+
8. **测试连接**:
|
|
656
|
+
- TCP连接问题:先用 `modbus-serial` 单独测试TCP连接
|
|
657
|
+
- 串口问题:先用 `serialport` 单独测试串口通信
|
|
658
|
+
|
|
659
|
+
### 从站开关无响应
|
|
660
|
+
|
|
661
|
+
1. **检查免连线通信**(v2.6.7+推荐):
|
|
662
|
+
- **无需连线**:主站和从站通过内部事件自动通信,无需手动连线
|
|
663
|
+
- 查看Node-RED日志,确认是否有"内部事件模式:发送命令到从站X 线圈Y"的日志
|
|
664
|
+
- 查看主站节点日志,确认是否有"收到内部事件:从站X 线圈Y"的日志
|
|
665
|
+
- 查看主站节点日志,确认是否有"内部事件写入成功,已广播状态变化"的日志
|
|
666
|
+
- 查看从站开关节点日志,确认是否有"收到状态变化事件"和"LED反馈已发送"的日志
|
|
667
|
+
2. **检查RS-485连接**:
|
|
668
|
+
- 确认RS-485连接配置正确(串口路径、波特率等)
|
|
669
|
+
- 查看节点状态显示是否为"MQTT未启用 - 使用内部事件模式"
|
|
670
|
+
- 物理面板连接:确认物理面板连接到正确的RS-485总线(TCP或串口)
|
|
671
|
+
3. **检查开关面板配置**:
|
|
672
|
+
- 确认开关面板地址和按钮编号正确
|
|
673
|
+
- 场景模式开关:操作信息为0x11、0x12、0x13等(高4位=1)
|
|
674
|
+
- 开关模式开关:操作信息为0x00(关)或0x01(开)
|
|
675
|
+
4. **检查继电器映射**:
|
|
676
|
+
- 确认目标从站地址和线圈编号正确
|
|
677
|
+
- 线圈编号范围:0-31(对应用户输入的1-32路)
|
|
678
|
+
5. **查看调试日志**:
|
|
679
|
+
- 使用modbus-debug节点抓取原始总线数据
|
|
680
|
+
- 查看Node-RED日志中的协议解析信息
|
|
681
|
+
- 确认按键事件是否被正确识别
|
|
682
|
+
- 确认LED反馈协议帧是否正确发送(查看日志中的HEX字符串)
|
|
683
|
+
|
|
684
|
+
## 输入消息格式
|
|
685
|
+
|
|
686
|
+
### 主站节点
|
|
687
|
+
|
|
688
|
+
```javascript
|
|
689
|
+
// 启动轮询
|
|
690
|
+
msg.payload = {cmd: "start"};
|
|
691
|
+
|
|
692
|
+
// 停止轮询
|
|
693
|
+
msg.payload = {cmd: "stop"};
|
|
694
|
+
|
|
695
|
+
// 写单个线圈
|
|
696
|
+
msg.payload = {
|
|
697
|
+
cmd: "writeCoil",
|
|
698
|
+
slave: 10, // 从站地址
|
|
699
|
+
coil: 0, // 线圈编号
|
|
700
|
+
value: true // true=开, false=关
|
|
701
|
+
};
|
|
702
|
+
|
|
703
|
+
// 批量写多个线圈
|
|
704
|
+
msg.payload = {
|
|
705
|
+
cmd: "writeCoils",
|
|
706
|
+
slave: 10, // 从站地址
|
|
707
|
+
startCoil: 0, // 起始线圈
|
|
708
|
+
values: [true, false, true, false] // 线圈值数组
|
|
709
|
+
};
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
### 从站开关节点
|
|
713
|
+
|
|
714
|
+
```javascript
|
|
715
|
+
// 发送开关命令
|
|
716
|
+
msg.payload = true; // 或 false
|
|
717
|
+
msg.payload = "ON"; // 或 "OFF"
|
|
718
|
+
msg.payload = 1; // 或 0
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
### HomeKit网桥节点
|
|
722
|
+
|
|
723
|
+
HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
724
|
+
|
|
725
|
+
**配置参数**:
|
|
726
|
+
- **主站节点**:选择要桥接的Modbus主站节点(必填)
|
|
727
|
+
- **网桥名称**:在HomeKit中显示的网桥名称(默认:Modbus继电器网桥)
|
|
728
|
+
- **MAC地址**:HomeKit网桥的唯一标识符(自动生成,无需修改)
|
|
729
|
+
- **配对码**:HomeKit配对时使用的PIN码(格式:XXX-XX-XXX,默认:031-45-154)
|
|
730
|
+
- **端口**:HomeKit网桥监听端口(默认:51828)
|
|
731
|
+
- **继电器名称配置**:为每个继电器配置友好的中文名称(可选)
|
|
732
|
+
|
|
733
|
+
**自动同步规则**:
|
|
734
|
+
- 自动读取主站节点配置的所有从站和线圈
|
|
735
|
+
- 线圈0-15(1-16路):创建为开关(Switch)配件
|
|
736
|
+
- 线圈16-31(17-32路):创建为插座(Outlet)配件
|
|
737
|
+
- 监听主站的状态变化事件,实时同步到HomeKit
|
|
738
|
+
- 接收HomeKit控制命令,发送到主站执行
|
|
739
|
+
|
|
740
|
+
**使用示例**:
|
|
741
|
+
1. 在Node-RED中配置好主站节点和从站
|
|
742
|
+
2. 添加HomeKit网桥节点,选择主站节点
|
|
743
|
+
3. 为每个继电器配置友好的名称(例如:客厅灯、卧室灯)
|
|
744
|
+
4. 部署流程
|
|
745
|
+
5. 在iPhone的"家庭"App中添加配件,输入配对码
|
|
746
|
+
6. 完成配对后,即可在HomeKit中控制继电器,支持Siri语音控制
|
|
747
|
+
|
|
748
|
+
**注意事项**:
|
|
749
|
+
- 确保主站节点已正确配置并运行
|
|
750
|
+
- 配对码格式必须为XXX-XX-XXX(8位数字)
|
|
751
|
+
- 端口不能与其他服务冲突(默认51828)
|
|
752
|
+
- 配置信息持久化存储在~/.node-red/homekit-persist目录
|
|
753
|
+
- 重启Node-RED后自动恢复配对状态,无需重新配对
|
|
754
|
+
|
|
755
|
+
### 7. 配置Mesh透传控制节点
|
|
756
|
+
|
|
757
|
+
**Mesh透传控制**节点允许在没有Mesh网关的情况下,直接通过现有的RS-485或TCP连接与Mesh实体进行通信。
|
|
758
|
+
|
|
759
|
+
**功能特点**:
|
|
760
|
+
- **自动发现**:只要总线上有匹配的Mesh实体协议(如窗帘、调光、开关、空调、新风、地暖),节点会自动捕捉并生成实体。
|
|
761
|
+
- **持久化存储**:实体信息根据MAC地址去重并永久保存到磁盘(`.node-red/symi-mesh-entities`),确保设备离线或Node-RED重启后实体列表依然有效。
|
|
762
|
+
- **灵活绑定**:支持绑定到物理从站继电器输出或物理从站开关面板按键。
|
|
763
|
+
- **多类型支持**:
|
|
764
|
+
- **窗帘**:实现“打开 -> 停止 -> 关闭 -> 停止”循环控制。
|
|
765
|
+
- **开关/调光/空调/新风/地暖**:实现标准的开/关/翻转控制。
|
|
766
|
+
- **状态同步**:实时监听总线上的Mesh状态更新,并在节点上直观显示当前状态(如 ON/OFF 或窗帘动作)。
|
|
767
|
+
|
|
768
|
+
**配置步骤**:
|
|
769
|
+
|
|
770
|
+
1. **添加节点**
|
|
771
|
+
- 拖拽 **Mesh透传控制** 节点到流程画布。
|
|
772
|
+
- 选择现有的 **serial-port-config** 连接配置(串口 9600 或 TCP 网关)。
|
|
773
|
+
|
|
774
|
+
2. **选择Mesh实体**
|
|
775
|
+
- 在“Mesh实体”下拉框中选择已发现的设备。
|
|
776
|
+
- 如果是新设备,请先在物理端操作一次设备,总线采集到数据后会自动出现在列表中。
|
|
777
|
+
- 列表显示格式:`[类型] MAC地址 (短地址)`。
|
|
778
|
+
|
|
779
|
+
3. **配置触发源(可选)**
|
|
780
|
+
- **绑定从站继电器**:输入目标从站地址和线圈编号。当对应的从站继电器状态变化时,会触发此Mesh实体的控制。
|
|
781
|
+
- **绑定面板按键**:输入面板开关ID和按键编号。当按下物理面板按键时,会触发此Mesh实体的控制。
|
|
782
|
+
|
|
783
|
+
4. **控制逻辑**
|
|
784
|
+
- 节点会自动根据实体类型选择最佳控制逻辑(窗帘循环或普通开关)。
|
|
785
|
+
- 手动点击节点左侧按钮也可直接触发控制。
|
|
786
|
+
|
|
787
|
+
---
|
|
788
|
+
|
|
789
|
+
### 8. 控制看板节点(客户友好模式)
|
|
790
|
+
|
|
791
|
+
控制看板节点提供可视化界面,实时显示和控制所有从站的继电器状态,适合现场调试和日常监控。
|
|
792
|
+
|
|
793
|
+
**配置参数**:
|
|
794
|
+
- **节点名称**:控制看板的显示名称(默认:Modbus控制看板)
|
|
795
|
+
- **主站节点**:选择要监控的Modbus主站节点(必填)
|
|
796
|
+
|
|
797
|
+
**功能特性**:
|
|
798
|
+
- **实时状态显示**:在配置界面中显示所有从站和线圈的实时状态
|
|
799
|
+
- **一键控制**:点击按钮即可控制继电器开关,无需部署流程
|
|
800
|
+
- **美观布局**:网格布局,按从站分组显示,一目了然
|
|
801
|
+
- **名称同步**:自动同步HomeKit网桥配置的继电器名称
|
|
802
|
+
- **快速响应**:状态实时更新(500ms轮询),响应迅速
|
|
803
|
+
- **零开销**:不参与实际Modbus通信,不影响主站性能
|
|
804
|
+
|
|
805
|
+
**使用步骤**:
|
|
806
|
+
1. 在Node-RED中添加控制看板节点
|
|
807
|
+
2. 选择已配置的Modbus主站节点
|
|
808
|
+
3. 双击节点打开配置界面,即可看到所有继电器状态
|
|
809
|
+
4. 点击按钮即可控制继电器开关(绿色=ON,红色=OFF)
|
|
810
|
+
5. 部署流程后,节点会显示"监控中"状态
|
|
811
|
+
|
|
812
|
+
**使用场景**:
|
|
813
|
+
- **现场调试**:快速测试继电器是否正常工作
|
|
814
|
+
- **日常监控**:实时查看所有继电器状态
|
|
815
|
+
- **批量控制**:快速控制多个继电器
|
|
816
|
+
- **客户演示**:美观的界面,适合向客户展示系统功能
|
|
817
|
+
|
|
818
|
+
**技术细节**:
|
|
819
|
+
- 使用HTTP API与主站通信,通过内部事件发送控制命令
|
|
820
|
+
- 状态缓存机制,减少网络请求
|
|
821
|
+
- 仅在配置界面打开时才轮询状态,关闭后自动停止
|
|
822
|
+
- 与HomeKit网桥共享继电器名称配置,保持一致性
|
|
823
|
+
|
|
824
|
+
**注意事项**:
|
|
825
|
+
- 确保主站节点已正确配置并运行
|
|
826
|
+
- 控制看板只在配置界面打开时才轮询状态
|
|
827
|
+
- 继电器名称需在HomeKit网桥节点中配置
|
|
828
|
+
- 本节点不参与实际Modbus通信,不会增加主站负担
|
|
829
|
+
|
|
830
|
+
### 自定义协议节点
|
|
831
|
+
|
|
832
|
+
用于控制非标准Modbus协议的485设备(如窗帘、特殊开关等)。
|
|
833
|
+
|
|
834
|
+
**配置步骤**:
|
|
835
|
+
1. 添加自定义协议节点到流程画布
|
|
836
|
+
2. 选择设备类型(开关/窗帘/其他)
|
|
837
|
+
3. 选择串口配置节点
|
|
838
|
+
4. 输入16进制指令(空格分隔,自动格式化为大写)
|
|
839
|
+
- 打开指令:例如 `01 05 00 00 FF 00 8C 3A`
|
|
840
|
+
- 关闭指令:例如 `01 05 00 00 00 00 CD CA`
|
|
841
|
+
- 暂停指令:仅窗帘模式需要,例如 `01 05 00 01 FF 00 DD FA`
|
|
842
|
+
5. 点击"测试"按钮验证指令是否正确发送
|
|
843
|
+
6. 连线:从站开关 → 自定义协议节点
|
|
844
|
+
7. 部署流程
|
|
845
|
+
|
|
846
|
+
**设备类型说明**:
|
|
847
|
+
- **开关模式**:收到`true`发送打开指令,收到`false`发送关闭指令
|
|
848
|
+
- **窗帘模式**:每次触发循环发送下一个指令(打开 → 暂停 → 关闭 → 暂停 → 打开...)
|
|
849
|
+
- **其他模式**:与开关模式相同
|
|
850
|
+
|
|
851
|
+
**使用场景**:
|
|
852
|
+
- 窗帘控制:支持打开/暂停/关闭循环控制
|
|
853
|
+
- 特殊开关:非标准Modbus协议的485设备
|
|
854
|
+
- 自定义设备:任何需要发送固定16进制指令的设备
|
|
855
|
+
|
|
856
|
+
**注意事项**:
|
|
857
|
+
- 每个指令最多48字节
|
|
858
|
+
- 窗帘模式需配置三个指令(打开、关闭、暂停)
|
|
859
|
+
- 测试功能需先选择串口配置
|
|
860
|
+
- 无需连线到debug节点,直接通过串口配置节点发送数据
|
|
861
|
+
|
|
862
|
+
### 继电器输出节点(relay-output)
|
|
863
|
+
|
|
864
|
+
用于控制Modbus继电器,支持**绑定从站开关触发源**或接收外部输入,**无需连线到主站**。
|
|
865
|
+
|
|
866
|
+
**核心特性**:
|
|
867
|
+
- 从站开关、继电器输出、主站之间**完全无需连线**
|
|
868
|
+
- 共享RS-485连接配置,支持多个节点共用
|
|
869
|
+
- 支持绑定从站开关作为触发源(内部事件通信)
|
|
870
|
+
- 支持外部设备触发(如海康门禁)
|
|
871
|
+
- 支持延时执行(0-60000毫秒),实现级联开灯效果
|
|
872
|
+
- 配置持久化保存,断电断网恢复后正常工作
|
|
873
|
+
|
|
874
|
+
**配置参数**:
|
|
875
|
+
|
|
876
|
+
*RS-485连接配置*:
|
|
877
|
+
- **连接配置**:选择已配置的RS-485连接(支持TCP网关或串口),多个节点共享
|
|
878
|
+
|
|
879
|
+
*按键触发配置*:
|
|
880
|
+
- **面板品牌**:开关面板品牌,目前支持亖米(Symi)
|
|
881
|
+
- **按钮类型**:开关按钮/场景按钮/输入端触发(外部设备)
|
|
882
|
+
- **开关ID**:物理面板地址(0-255)
|
|
883
|
+
- **按钮编号**:按键编号(1-8,15=背光灯)
|
|
884
|
+
- **门禁ID**:可选,0=不过滤,>0=只响应指定门禁编号
|
|
885
|
+
|
|
886
|
+
*目标继电器配置*:
|
|
887
|
+
- **从站地址**:要控制的Modbus从站地址(1-247)
|
|
888
|
+
- **继电器路数**:要控制的继电器通道(1-32)
|
|
889
|
+
|
|
890
|
+
*动作配置*:
|
|
891
|
+
- **动作**:打开/关闭/跟随输入/翻转状态
|
|
892
|
+
- **延时**:执行延时(0-60000毫秒),用于实现级联开灯效果
|
|
893
|
+
- **忽略释放信号**:只响应按下信号
|
|
894
|
+
|
|
895
|
+
**使用示例**:
|
|
896
|
+
|
|
897
|
+
**示例1:按键触发继电器(无需任何连线)**
|
|
898
|
+
```
|
|
899
|
+
配置:开关ID=1,按钮编号=3,从站地址=10,继电器路数=1,动作=打开
|
|
900
|
+
效果:当开关1的按钮3被按下时,自动控制从站10的1路继电器打开
|
|
901
|
+
```
|
|
902
|
+
|
|
903
|
+
**示例2:一个按键控制多路继电器(级联开灯)**
|
|
904
|
+
```
|
|
905
|
+
继电器输出1: 开关ID=1, 按钮=3, 继电器=1路, 延时=0ms, 动作=打开
|
|
906
|
+
继电器输出2: 开关ID=1, 按钮=3, 继电器=2路, 延时=500ms, 动作=打开
|
|
907
|
+
继电器输出3: 开关ID=1, 按钮=3, 继电器=3路, 延时=1000ms, 动作=打开
|
|
908
|
+
```
|
|
909
|
+
|
|
910
|
+
**示例3:海康门禁触发(使用输入端)**
|
|
911
|
+
```
|
|
912
|
+
海康门禁事件 → 继电器输出(按钮类型=输入端触发, 从站地址=10, 继电器=1路, 门禁ID=4)
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
**工作原理**:
|
|
916
|
+
- 节点监听 `modbus:buttonPressed` 事件(按键触发)
|
|
917
|
+
- 通过 `modbus:writeCoil` 事件发送控制命令到主站
|
|
918
|
+
- 实现按键 → 继电器输出 → 主站之间的无连线通信
|
|
919
|
+
|
|
920
|
+
**稳定性保障**:
|
|
921
|
+
- 长期运行不卡顿、不死机、内存不溢出
|
|
922
|
+
- 无调试数据输出,具备生产条件长期运行
|
|
923
|
+
- 断电断网恢复后正常工作
|
|
924
|
+
- 内置防抖和状态检测机制,不会出现设备反复开关进入死循环
|
|
925
|
+
|
|
926
|
+
## 输出消息格式
|
|
927
|
+
|
|
928
|
+
### 主站节点
|
|
929
|
+
|
|
930
|
+
```javascript
|
|
931
|
+
{
|
|
932
|
+
payload: {
|
|
933
|
+
slave: 10, // 从站地址
|
|
934
|
+
coils: [true, false, ...], // 线圈状态数组
|
|
935
|
+
timestamp: 1234567890 // 时间戳
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
```
|
|
939
|
+
|
|
940
|
+
### 从站开关节点
|
|
941
|
+
|
|
942
|
+
```javascript
|
|
943
|
+
{
|
|
944
|
+
payload: true, // 开关状态
|
|
945
|
+
topic: "switch_0_btn1", // 主题
|
|
946
|
+
switchId: 0, // 开关面板ID
|
|
947
|
+
button: 1, // 按钮编号
|
|
948
|
+
targetSlave: 10, // 目标从站地址
|
|
949
|
+
targetCoil: 0 // 目标线圈编号
|
|
950
|
+
}
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
## 性能指标
|
|
954
|
+
|
|
955
|
+
- **内存占用**:< 50MB(单个主站节点,轮询10个设备)
|
|
956
|
+
- **CPU占用**:< 5%(正常轮询状态)
|
|
957
|
+
- **连接延迟**:Modbus响应 < 100ms,MQTT发布 < 50ms
|
|
958
|
+
- **稳定运行**:经过工控机7x24小时长期运行验证
|
|
959
|
+
- **容错能力**:Modbus从站离线不影响其他从站,MQTT断线自动重连
|
|
960
|
+
|
|
961
|
+
## 示例Flow
|
|
962
|
+
|
|
963
|
+
```json
|
|
964
|
+
[
|
|
965
|
+
{
|
|
966
|
+
"id": "modbus-master-1",
|
|
967
|
+
"type": "modbus-master",
|
|
968
|
+
"name": "主站",
|
|
969
|
+
"connectionType": "serial",
|
|
970
|
+
"serialPort": "/dev/ttyUSB0",
|
|
971
|
+
"serialBaudRate": 9600,
|
|
972
|
+
"slaves": [
|
|
973
|
+
{"address": 10, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
974
|
+
{"address": 11, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
975
|
+
{"address": 12, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
976
|
+
{"address": 13, "coilStart": 0, "coilEnd": 31, "pollInterval": 200}
|
|
977
|
+
],
|
|
978
|
+
"enableMqtt": true,
|
|
979
|
+
"mqttServer": "mqtt-config-1"
|
|
980
|
+
}
|
|
981
|
+
]
|
|
982
|
+
```
|
|
983
|
+
|
|
984
|
+
完整示例请参考项目中的 `examples/basic-flow.json` 文件。
|
|
985
|
+
|
|
986
|
+
## 技术栈
|
|
987
|
+
|
|
988
|
+
- Node.js: >=14.0.0
|
|
989
|
+
- Node-RED: >=2.0.0
|
|
990
|
+
- modbus-serial: ^8.0.23
|
|
991
|
+
- serialport: ^12.0.0
|
|
992
|
+
- mqtt: ^5.14.1(可选)
|
|
993
|
+
- hap-nodejs: ^1.2.0
|
|
994
|
+
- node-persist: ^4.0.4
|
|
995
|
+
|
|
996
|
+
## 版本更新说明
|
|
997
|
+
|
|
998
|
+
### v2.10.8 (2026-01-24)
|
|
999
|
+
- **指示灯反馈核心修复**: 彻底修复指示灯反馈地址错误及失效问题。
|
|
1000
|
+
- **寻址逻辑修正**: 修正反馈帧的地址映射逻辑。`localAddr` 修正为面板 ID(发送方),`deviceAddr` 修正为子设备地址(1),`channel` 修正为按键 ID,确保反馈报文准确送达目标按键。
|
|
1001
|
+
- **协议帧结构重构**: 严格对齐 V0.13 协议框架图,修正 `REPORT` 帧结构为 15 字节,修正 CRC8 计算范围(前13字节),移除了冗余的操作信息字节。
|
|
1002
|
+
- **初始化优化**: 节点启动时优先使用配置的 `switchId` 作为默认反馈目标,无需等待首次按键触发即可正常同步状态。
|
|
1003
|
+
- **协议兼容性**: 强制指示灯反馈使用 `DEVICE_TYPE_LIGHT (0x01)` 类型,兼容 Symi/Clowire 全系面板固件。
|
|
1004
|
+
- **Mesh实体注册增强**:
|
|
1005
|
+
- **无MAC实体持久化**: 支持无 MAC 地址的实体通过短地址持久化,解决 Mesh 网关模式下部分设备(如仅上报状态的窗帘)无法生成实体的问题。
|
|
1006
|
+
- **动态类型识别**: 收到状态帧时立即根据 `msgType` 推断设备类型,无需等待设备列表响应即可控制。
|
|
1007
|
+
- **窗帘控制深度优化**:
|
|
1008
|
+
- **端点状态纠偏**: 当位置到达 0% 或 100%(容差±2%)时,强制重置状态为“停止”,彻底消除到达端点后点击反向无反应(误判为暂停)的问题。
|
|
1009
|
+
- **智能暂停恢复**: 修复运动过程中的暂停功能,通过位置变化和时间推断运动状态,确保中途点击能正确触发“暂停”。
|
|
1010
|
+
- **逻辑对齐**: 统一 `toggle` 和 `cycle` 逻辑,基于实时位置和上次动作智能决策下一步动作。
|
|
1011
|
+
- **物理面板直连**: Mesh透传节点新增内置协议解析,直接支持Symi/Clowire面板控制 (支持03场景指令),复用 `Lightweight Protocol` 标准解析逻辑,确保协议完全兼容。
|
|
1012
|
+
- **安装与文档规范**:
|
|
1013
|
+
- **路径修正**: 明确本地安装路径应为 Node-RED 用户目录(如 `~/.node-red`)。
|
|
1014
|
+
- **文档优化**: 合并了 README.md 中重复的更新日志条目。
|
|
1015
|
+
- **日志体验提升**: 优化 `serial-port-config` 日志输出,Mesh 实体更新日志增加中文动作描述(打开/关闭/停止)和位置百分比。
|
|
1016
|
+
|
|
1017
|
+
### v2.10.7 (2026-01-22)
|
|
1018
|
+
- **协议解析增强**: 修复 `serial-port-config` 无法解析字符串格式数据的问题,支持直接处理 Hex 字符串帧(如 `53 80 ...`)。
|
|
1019
|
+
- **Mesh实体管理**:
|
|
1020
|
+
- **双重匹配机制**: 优先使用 MAC 地址匹配实体(Mesh网关模式),无 MAC 时自动降级为短地址匹配(透传模式),确保所有设备均可被发现和控制。
|
|
1021
|
+
- **无MAC实体支持**: 完美支持透传节点上报的无MAC状态帧(如窗帘 `53 80`),自动基于短地址注册并持久化实体,不再强制依赖 MAC。
|
|
1022
|
+
- **智能类型推断**: 收到状态帧时立即根据 `msgType` 推断设备类型(如窗帘、调光),无需等待设备列表响应即可使用。
|
|
1023
|
+
- **自动补全**: 在后续收到设备列表(带MAC)时,自动为无MAC实体补全 MAC 地址,实现平滑升级。
|
|
1024
|
+
- **队列优先级**: 明确指令优先级:从站开关 (3) > 继电器 (2) > Mesh透传 (1) > 普通 (0)。
|
|
1025
|
+
- **文档更新**: 更新 `README.md` 和 `透传节点协议.md`,补充最新的协议细节和注意事项。
|
|
1026
|
+
|
|
1027
|
+
### v2.10.6 (2026-01-17)
|
|
1028
|
+
- **多节点LED状态聚合**: 支持多个 `从站开关` 节点配置为同一物理按键(相同 Switch ID 和 Button ID)但控制不同继电器。系统会自动聚合所有关联继电器的状态(OR逻辑),实现“任意开则灯亮,全关则灯灭”的智能反馈,完美支持“一键多控”场景。
|
|
1029
|
+
- **全关指令优化**: 支持 Symi/Clowire 协议的“全关”指令,降低总线负载。
|
|
1030
|
+
- **Symi协议深度优化**: 新增支持 Symi 协议的“全关”指令(0x05 MULTI)。
|
|
1031
|
+
- **日志优化**: 对网络错误日志进行限流,避免刷屏。
|
|
1032
|
+
- **稳定性增强**: 优化了全局状态管理的内存回收机制。
|
|
1033
|
+
|
|
1034
|
+
### v2.10.5 (2026-01-15)
|
|
1035
|
+
- **多主站精准隔离架构**:引入 `masterId` 指令定向机制。
|
|
1036
|
+
- **真·状态翻转 (Toggle) 逻辑**:继电器输出节点新增状态感知能力。
|
|
1037
|
+
- **指示灯反馈机制重构**:优化了 `modbus-slave-switch` 的反馈锁与初始化逻辑。
|
|
1038
|
+
- **生产级日志分级**:对全局日志进行了分级处理。
|
|
1039
|
+
- **资源管理与稳定性**:规范化了所有节点的 `close` 生命周期管理。
|
|
1040
|
+
|
|
1041
|
+
### v2.10.4 (2026-01-14)
|
|
1042
|
+
- **Modbus超时优化**:将默认Modbus通信超时时间(Timeout)统一调整为 **3000ms**。
|
|
1043
|
+
- **锁等待恢复合理值**:将写入锁等待超时恢复为 **3000ms**。
|
|
1044
|
+
- **断连彻底静默**:移除写入队列在断连时的错误日志提醒。
|
|
1045
|
+
- **缓存策略优化**:连接断开时立即清空所有待处理的写入任务。
|
|
1046
|
+
- **连接恢复优化**:移除重连后的自动任务恢复逻辑。
|
|
1047
|
+
|
|
1048
|
+
### v2.10.3 (2026-01-14)
|
|
1049
|
+
- **协议兼容性**: 完善 Symi 协议解析逻辑,全面支持 `0x03 SET`、`0x04 REPORT` 和 `0x05 STATUS` 帧类型。
|
|
1050
|
+
- **稳定性修复**: 紧急修复物理回显导致的“继电器无限跳动”死循环问题。
|
|
1051
|
+
- **并发优化**: 优化主站写入锁等待机制,将最大等待时间延长至 **500ms**。
|
|
1052
|
+
- **指示灯同步**: 引入物理按键“强制同步”机制。
|
|
1053
|
+
- **多主站联动**: 优化 `relay-output` 和 `modbus-slave-switch` 的事件路由。
|
|
1054
|
+
- **架构解耦**: 明确指示灯同步职责。
|
|
1055
|
+
|
|
1056
|
+
### v2.10.2 (2026-01-14)
|
|
1057
|
+
- **轮询优化**: 引入轮询暂停机制。
|
|
1058
|
+
- **反馈增强**: 强制使用 REPORT (0x04) 协议进行指示灯同步。
|
|
1059
|
+
- **并发管理**: 优化写入队列机制。
|
|
1060
|
+
- **Mesh深度支持**: 完善 Mesh 模式下的 LED 反馈。
|
|
1061
|
+
- **稳定性提升**: 优化主站轮询逻辑。
|
|
1062
|
+
- **隔离机制**: 引入多串口/多网关作用域隔离。
|
|
1063
|
+
|
|
1064
|
+
### v2.10.1 (2026-01-13)
|
|
1065
|
+
- **名称校准**: HA 实体名称校准。
|
|
1066
|
+
- **防抖优化**: 引入全局按键事件去重防抖。
|
|
1067
|
+
- **组网支持**: 改进 LED 反馈机制。
|
|
1068
|
+
|
|
1069
|
+
## 许可证
|
|
1070
|
+
|
|
1071
|
+
MIT License
|
|
1072
|
+
|
|
1073
|
+
## 支持与反馈
|
|
1074
|
+
|
|
1075
|
+
- GitHub: https://github.com/symi-daguo/node-red-contrib-symi-modbus
|
|
1076
|
+
- Issues: https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
1077
|
+
- NPM: https://www.npmjs.com/package/node-red-contrib-symi-modbus
|