node-red-contrib-symi-modbus 1.0.0
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/LICENSE +22 -0
- package/README.md +509 -0
- package/examples/basic-flow.json +188 -0
- package/nodes/modbus-master.html +348 -0
- package/nodes/modbus-master.js +569 -0
- package/nodes/modbus-slave-switch.html +69 -0
- package/nodes/modbus-slave-switch.js +68 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 symi-daguo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
# node-red-contrib-symi-modbus
|
|
2
|
+
|
|
3
|
+
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ **多协议支持**:支持Modbus TCP和Modbus RTU(串口)
|
|
8
|
+
- ✅ **多设备轮询**:最多支持10台Modbus从站设备同时轮询
|
|
9
|
+
- ✅ **32路继电器**:每台设备支持32个线圈(继电器通道)
|
|
10
|
+
- ✅ **灵活配置**:可自定义轮询间隔、线圈范围、从站地址
|
|
11
|
+
- ✅ **MQTT集成**:自动生成Home Assistant兼容的MQTT发现消息
|
|
12
|
+
- ✅ **实时状态**:实时监控和控制继电器状态
|
|
13
|
+
- ✅ **主从模式**:提供主站节点和从站控制节点
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
### 通过npm安装
|
|
18
|
+
|
|
19
|
+
在Node-RED用户目录中运行:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd ~/.node-red
|
|
23
|
+
npm install node-red-contrib-symi-modbus
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 通过Node-RED界面安装
|
|
27
|
+
|
|
28
|
+
1. 点击右上角菜单 → 设置 → 节点管理
|
|
29
|
+
2. 搜索 `node-red-contrib-symi-modbus`
|
|
30
|
+
3. 点击安装
|
|
31
|
+
|
|
32
|
+
### 本地开发安装
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 克隆或下载项目后
|
|
36
|
+
cd node-red-contrib-symi-modbus
|
|
37
|
+
npm install
|
|
38
|
+
|
|
39
|
+
# 安装到Node-RED(使用你的实际项目路径)
|
|
40
|
+
cd ~/.node-red
|
|
41
|
+
npm install /path/to/node-red-contrib-symi-modbus
|
|
42
|
+
|
|
43
|
+
# 或者在Mac上
|
|
44
|
+
cd ~/.node-red
|
|
45
|
+
npm install /Volumes/your-disk/path/to/node-red-contrib-symi-modbus
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**安装后需要重启Node-RED**
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 重启Node-RED
|
|
52
|
+
# 如果用命令行运行,按 Ctrl+C 停止,然后重新运行
|
|
53
|
+
node-red
|
|
54
|
+
|
|
55
|
+
# 如果用服务管理器,重启服务
|
|
56
|
+
# macOS: brew services restart node-red
|
|
57
|
+
# Linux: sudo systemctl restart node-red
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 节点说明
|
|
61
|
+
|
|
62
|
+
### 1. Modbus主站节点 (modbus-master)
|
|
63
|
+
|
|
64
|
+
主站节点负责与Modbus继电器设备通信,执行轮询操作,并可选择发布状态到MQTT服务器。
|
|
65
|
+
|
|
66
|
+
#### 配置参数
|
|
67
|
+
|
|
68
|
+
**连接配置**
|
|
69
|
+
- **连接类型**:选择TCP/IP或串口
|
|
70
|
+
- **TCP主机**:Modbus TCP服务器地址(默认:127.0.0.1)
|
|
71
|
+
- **TCP端口**:Modbus TCP端口(默认:502)
|
|
72
|
+
- **串口**:串口名称(如:COM1、/dev/ttyUSB0)
|
|
73
|
+
- **波特率**:串口波特率(9600/19200/38400/57600/115200)
|
|
74
|
+
- **数据位**:数据位数(7或8,默认8)
|
|
75
|
+
- **停止位**:停止位数(1或2,默认1)
|
|
76
|
+
- **校验位**:校验方式(无/奇校验/偶校验,默认无)
|
|
77
|
+
|
|
78
|
+
**从站设备配置**
|
|
79
|
+
- **动态添加从站**:点击"添加从站"按钮可添加最多10个从站设备
|
|
80
|
+
- **从站地址**:每个从站的Modbus地址(1-247,默认从10=0x0A开始递增)
|
|
81
|
+
- **起始线圈**:该从站的起始线圈编号(0-31)
|
|
82
|
+
- **结束线圈**:该从站的结束线圈编号(0-31)
|
|
83
|
+
- **轮询间隔**:该从站的轮询间隔,单位毫秒(默认:200ms,推荐≥100ms)
|
|
84
|
+
- **配置持久化**:所有从站配置自动保存,重启Node-RED后不丢失
|
|
85
|
+
|
|
86
|
+
**MQTT配置**
|
|
87
|
+
- **启用MQTT**:是否启用MQTT功能
|
|
88
|
+
- **MQTT服务器**:MQTT Broker地址(如:mqtt://localhost:1883)
|
|
89
|
+
- **MQTT用户名**:可选
|
|
90
|
+
- **MQTT密码**:可选
|
|
91
|
+
- **MQTT基础主题**:消息主题前缀(默认:modbus/relay)
|
|
92
|
+
|
|
93
|
+
#### 输入消息
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
// 启动轮询
|
|
97
|
+
msg.payload = {cmd: "start"};
|
|
98
|
+
|
|
99
|
+
// 停止轮询
|
|
100
|
+
msg.payload = {cmd: "stop"};
|
|
101
|
+
|
|
102
|
+
// 写单个线圈
|
|
103
|
+
msg.payload = {
|
|
104
|
+
cmd: "writeCoil",
|
|
105
|
+
slave: 10, // 从站地址
|
|
106
|
+
coil: 0, // 线圈编号
|
|
107
|
+
value: true // true=开, false=关
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// 批量写多个线圈
|
|
111
|
+
msg.payload = {
|
|
112
|
+
cmd: "writeCoils",
|
|
113
|
+
slave: 10, // 从站地址
|
|
114
|
+
startCoil: 0, // 起始线圈
|
|
115
|
+
values: [true, false, true, false] // 线圈值数组
|
|
116
|
+
};
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### 输出消息
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
{
|
|
123
|
+
payload: {
|
|
124
|
+
slave: 10, // 从站地址
|
|
125
|
+
coils: [true, false, true, ...], // 线圈状态数组
|
|
126
|
+
timestamp: 1234567890 // 时间戳
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### MQTT主题结构
|
|
132
|
+
|
|
133
|
+
启用MQTT后,自动生成以下主题:
|
|
134
|
+
|
|
135
|
+
- **状态主题**:`modbus/relay/{从站地址}/{线圈编号}/state`
|
|
136
|
+
- 内容:`ON` 或 `OFF`
|
|
137
|
+
- 示例:`modbus/relay/10/0/state` → `ON`
|
|
138
|
+
|
|
139
|
+
- **命令主题**:`modbus/relay/{从站地址}/{线圈编号}/set`
|
|
140
|
+
- 接受:`ON` 或 `OFF`
|
|
141
|
+
- 示例:`modbus/relay/10/0/set` ← `OFF`
|
|
142
|
+
|
|
143
|
+
- **可用性主题**:`modbus/relay/{从站地址}/availability`
|
|
144
|
+
- 内容:`online` 或 `offline`
|
|
145
|
+
- 用于显示设备在线/离线状态
|
|
146
|
+
|
|
147
|
+
- **发现主题**(Home Assistant):`homeassistant/switch/modbus_relay_{从站}_{线圈}/config`
|
|
148
|
+
- 符合Home Assistant MQTT Discovery标准
|
|
149
|
+
- 包含完整的设备信息和配置
|
|
150
|
+
|
|
151
|
+
### 2. Modbus开关从站节点 (modbus-slave-switch)
|
|
152
|
+
|
|
153
|
+
从站开关节点用于控制单个继电器线圈。
|
|
154
|
+
|
|
155
|
+
#### 配置参数
|
|
156
|
+
|
|
157
|
+
- **名称**:节点显示名称
|
|
158
|
+
- **主站节点**:关联的主站节点
|
|
159
|
+
- **从站地址**:目标从站设备地址
|
|
160
|
+
- **线圈编号**:要控制的线圈编号(0-31)
|
|
161
|
+
|
|
162
|
+
#### 输入消息
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
// 布尔值
|
|
166
|
+
msg.payload = true; // 开
|
|
167
|
+
msg.payload = false; // 关
|
|
168
|
+
|
|
169
|
+
// 字符串
|
|
170
|
+
msg.payload = "ON"; // 开
|
|
171
|
+
msg.payload = "OFF"; // 关
|
|
172
|
+
|
|
173
|
+
// 数字
|
|
174
|
+
msg.payload = 1; // 开
|
|
175
|
+
msg.payload = 0; // 关
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
#### 输出消息
|
|
179
|
+
|
|
180
|
+
```javascript
|
|
181
|
+
{
|
|
182
|
+
payload: true, // 当前状态
|
|
183
|
+
topic: "modbus/10/0" // 主题
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 快速开始
|
|
188
|
+
|
|
189
|
+
### 基础使用
|
|
190
|
+
|
|
191
|
+
1. 拖拽 **Modbus主站** 节点到流程画布
|
|
192
|
+
2. 双击配置连接参数(TCP或串口)
|
|
193
|
+
3. 设置从站地址和线圈范围
|
|
194
|
+
4. 部署流程
|
|
195
|
+
|
|
196
|
+
### 导入示例流程
|
|
197
|
+
|
|
198
|
+
项目包含示例流程文件 `examples/basic-flow.json`:
|
|
199
|
+
|
|
200
|
+
1. 点击右上角菜单 → 导入
|
|
201
|
+
2. 选择 `examples/basic-flow.json` 文件
|
|
202
|
+
3. 导入后即可测试所有功能
|
|
203
|
+
|
|
204
|
+
示例流程包含:
|
|
205
|
+
- 启动/停止轮询
|
|
206
|
+
- 写单个线圈
|
|
207
|
+
- 开关节点控制
|
|
208
|
+
- 调试输出
|
|
209
|
+
|
|
210
|
+
### TCP连接示例
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
配置:
|
|
214
|
+
- 连接类型:TCP/IP
|
|
215
|
+
- TCP主机:192.168.1.100
|
|
216
|
+
- TCP端口:502
|
|
217
|
+
|
|
218
|
+
从站1:
|
|
219
|
+
- 地址:10 (0x0A)
|
|
220
|
+
- 线圈范围:0-31
|
|
221
|
+
- 轮询间隔:200ms
|
|
222
|
+
|
|
223
|
+
从站2:(点击"添加从站"按钮)
|
|
224
|
+
- 地址:11 (0x0B)(自动递增)
|
|
225
|
+
- 线圈范围:0-31
|
|
226
|
+
- 轮询间隔:200ms
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### 串口连接示例
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
配置:
|
|
233
|
+
- 连接类型:串口
|
|
234
|
+
- 串口:COM3(Windows)或 /dev/ttyUSB0(Linux)
|
|
235
|
+
- 波特率:9600
|
|
236
|
+
- 数据位:8
|
|
237
|
+
- 停止位:1
|
|
238
|
+
- 校验位:无
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### MQTT集成示例
|
|
242
|
+
|
|
243
|
+
启用MQTT后,可与Home Assistant或其他MQTT平台集成:
|
|
244
|
+
|
|
245
|
+
1. 在主站节点中启用MQTT
|
|
246
|
+
2. 配置MQTT服务器地址
|
|
247
|
+
3. 部署流程
|
|
248
|
+
4. Home Assistant会自动发现设备
|
|
249
|
+
|
|
250
|
+
## Home Assistant集成
|
|
251
|
+
|
|
252
|
+
本节点完全兼容Home Assistant的MQTT Discovery标准,支持自动发现和持久化:
|
|
253
|
+
|
|
254
|
+
### 集成步骤
|
|
255
|
+
|
|
256
|
+
1. **配置MQTT集成**
|
|
257
|
+
- 确保Home Assistant已配置MQTT集成
|
|
258
|
+
- 记下MQTT Broker地址(如:mqtt://192.168.1.100:1883)
|
|
259
|
+
|
|
260
|
+
2. **配置Node-RED节点**
|
|
261
|
+
- 在主站节点中启用MQTT
|
|
262
|
+
- 配置MQTT Broker地址、用户名、密码
|
|
263
|
+
- 添加从站设备(点击"添加从站"按钮,可添加多个设备)
|
|
264
|
+
- 默认第一个从站地址为10,后续自动递增为11、12...
|
|
265
|
+
|
|
266
|
+
3. **部署流程**
|
|
267
|
+
- 点击Node-RED的Deploy按钮
|
|
268
|
+
- 节点会自动发布MQTT Discovery消息
|
|
269
|
+
- 设备自动出现在Home Assistant中
|
|
270
|
+
|
|
271
|
+
4. **验证集成**
|
|
272
|
+
- 在HA中查看:设置 → 设备与服务 → MQTT → 设备
|
|
273
|
+
- 每个从站显示为一个设备(如:`Modbus继电器-10`)
|
|
274
|
+
- 每个继电器显示为一个开关实体
|
|
275
|
+
|
|
276
|
+
### 实体和设备规则
|
|
277
|
+
|
|
278
|
+
**唯一ID规则(确保不重复):**
|
|
279
|
+
- 设备唯一标识符:`modbus_relay_{从站地址}`
|
|
280
|
+
- 实体唯一ID:`modbus_relay_{从站地址}_{线圈编号}`
|
|
281
|
+
- 实体ID:`switch.relay_{从站地址}_{线圈编号}`
|
|
282
|
+
|
|
283
|
+
**示例:**
|
|
284
|
+
```
|
|
285
|
+
从站地址=10,线圈0-31:
|
|
286
|
+
├─ 设备:Modbus继电器-10 (标识符: modbus_relay_10)
|
|
287
|
+
│ ├─ 实体:switch.relay_10_0 (继电器 10-0)
|
|
288
|
+
│ ├─ 实体:switch.relay_10_1 (继电器 10-1)
|
|
289
|
+
│ └─ ... (共32个实体)
|
|
290
|
+
│
|
|
291
|
+
从站地址=11,线圈0-31:
|
|
292
|
+
├─ 设备:Modbus继电器-11 (标识符: modbus_relay_11)
|
|
293
|
+
├─ 实体:switch.relay_11_0 (继电器 11-0)
|
|
294
|
+
└─ ...
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### 持久化和稳定性保证
|
|
298
|
+
|
|
299
|
+
✅ **唯一ID稳定性**
|
|
300
|
+
- 使用从站地址作为设备标识符
|
|
301
|
+
- 使用从站地址+线圈编号作为实体唯一ID
|
|
302
|
+
- 断电、重启、重新部署不会创建重复实体
|
|
303
|
+
|
|
304
|
+
✅ **MQTT retain消息**
|
|
305
|
+
- 所有发现消息使用`retain=true`
|
|
306
|
+
- HA重启后自动重新发现设备
|
|
307
|
+
|
|
308
|
+
✅ **设备可用性状态**
|
|
309
|
+
- 每个从站有独立的availability主题
|
|
310
|
+
- 节点关闭时自动发送`offline`状态
|
|
311
|
+
- 节点启动时自动发送`online`状态
|
|
312
|
+
|
|
313
|
+
✅ **避免重复实体的机制**
|
|
314
|
+
1. 稳定的unique_id(基于从站地址)
|
|
315
|
+
2. MQTT retain消息保持配置
|
|
316
|
+
3. 设备标识符保持不变
|
|
317
|
+
4. HA会自动识别并更新现有实体,不会创建新的
|
|
318
|
+
|
|
319
|
+
### 多从站配置示例
|
|
320
|
+
|
|
321
|
+
**场景1:3台32路继电器**
|
|
322
|
+
```
|
|
323
|
+
从站配置(点击3次"添加从站"):
|
|
324
|
+
- 从站1:地址10,线圈0-31,间隔200ms
|
|
325
|
+
- 从站2:地址11,线圈0-31,间隔200ms
|
|
326
|
+
- 从站3:地址12,线圈0-31,间隔200ms
|
|
327
|
+
|
|
328
|
+
Home Assistant结果:
|
|
329
|
+
- 设备10:32个实体(switch.relay_10_0 到 switch.relay_10_31)
|
|
330
|
+
- 设备11:32个实体(switch.relay_11_0 到 switch.relay_11_31)
|
|
331
|
+
- 设备12:32个实体(switch.relay_12_0 到 switch.relay_12_31)
|
|
332
|
+
总计:3个设备,96个实体
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**场景2:10台32路继电器(最大容量)**
|
|
336
|
+
```
|
|
337
|
+
从站配置(点击10次"添加从站"):
|
|
338
|
+
- 从站1-10:地址10-19,每个线圈0-31,间隔200ms
|
|
339
|
+
|
|
340
|
+
Home Assistant结果:
|
|
341
|
+
10个设备(地址10-19),总计320个实体
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**场景3:不同线圈范围配置**
|
|
345
|
+
```
|
|
346
|
+
从站配置:
|
|
347
|
+
- 从站1:地址10,线圈0-7(仅8路继电器),间隔150ms
|
|
348
|
+
- 从站2:地址15,线圈0-15(16路继电器),间隔200ms
|
|
349
|
+
- 从站3:地址20,线圈0-31(全部32路),间隔250ms
|
|
350
|
+
|
|
351
|
+
Home Assistant结果:
|
|
352
|
+
- 设备10:8个实体
|
|
353
|
+
- 设备15:16个实体
|
|
354
|
+
- 设备20:32个实体
|
|
355
|
+
总计:3个设备,56个实体
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### 故障恢复测试
|
|
359
|
+
|
|
360
|
+
✅ **断网/通网**:不影响,MQTT自动重连,retain消息保持配置
|
|
361
|
+
✅ **断电/通电**:不影响,节点重启后自动发送online状态
|
|
362
|
+
✅ **HA重启**:不影响,通过retain消息自动重新发现
|
|
363
|
+
✅ **Node-RED重启**:不影响,unique_id保持不变
|
|
364
|
+
|
|
365
|
+
## 技术规格
|
|
366
|
+
|
|
367
|
+
- **Modbus协议**:Modbus TCP / Modbus RTU
|
|
368
|
+
- **功能码支持**:
|
|
369
|
+
- 0x01:读线圈状态(Read Coils)
|
|
370
|
+
- 0x05:写单个线圈(Write Single Coil)
|
|
371
|
+
- 0x0F:写多个线圈(Write Multiple Coils)
|
|
372
|
+
- **从站地址范围**:1-247
|
|
373
|
+
- **线圈数量**:每台设备32个(0-31)
|
|
374
|
+
- **最大设备数**:10台同时轮询
|
|
375
|
+
- **轮询间隔**:最小10ms,默认200ms,推荐≥100ms
|
|
376
|
+
- **连接超时**:5秒
|
|
377
|
+
- **自动重连**:连接失败后每5秒重试
|
|
378
|
+
- **错误恢复**:自动检测连接断开并重连
|
|
379
|
+
- **兼容性**:
|
|
380
|
+
- Node.js: >= 14.0.0
|
|
381
|
+
- Node-RED: >= 2.0.0
|
|
382
|
+
- 已在 Node-RED v4.0.8 / Node.js v23.1.0 上测试通过
|
|
383
|
+
|
|
384
|
+
## 故障排除
|
|
385
|
+
|
|
386
|
+
### 节点没有出现在面板中
|
|
387
|
+
|
|
388
|
+
**症状**:安装后在Node-RED左侧面板找不到节点
|
|
389
|
+
|
|
390
|
+
**解决方案**:
|
|
391
|
+
1. 确认已重启Node-RED(**必须重启!**)
|
|
392
|
+
2. 检查安装路径:`~/.node-red/node_modules/node-red-contrib-symi-modbus`
|
|
393
|
+
3. 查看Node-RED启动日志是否有错误
|
|
394
|
+
4. 清除浏览器缓存并刷新页面
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
# 重启Node-RED
|
|
398
|
+
# 按 Ctrl+C 停止,然后重新运行
|
|
399
|
+
node-red
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### 连接失败
|
|
403
|
+
|
|
404
|
+
**TCP连接失败**:
|
|
405
|
+
- 检查网络连通性:`ping <IP地址>`
|
|
406
|
+
- 确认Modbus TCP服务器地址和端口
|
|
407
|
+
- 检查防火墙设置
|
|
408
|
+
- 确认设备已启动Modbus TCP服务
|
|
409
|
+
|
|
410
|
+
**串口连接失败**:
|
|
411
|
+
- 确认串口名称正确(Windows设备管理器或Linux `ls /dev/tty*`)
|
|
412
|
+
- 检查串口权限(Linux需要:`sudo usermod -a -G dialout $USER`)
|
|
413
|
+
- 确认波特率等参数与设备匹配
|
|
414
|
+
- 确保串口没有被其他程序占用
|
|
415
|
+
|
|
416
|
+
### 轮询错误
|
|
417
|
+
|
|
418
|
+
1. 检查从站地址是否正确(默认10,即0x0A)
|
|
419
|
+
2. 确认设备在线且响应正常
|
|
420
|
+
3. 验证线圈范围是否超出设备限制
|
|
421
|
+
4. 适当增加轮询间隔(快速轮询可能导致超时)
|
|
422
|
+
5. 查看Node-RED日志获取详细错误信息
|
|
423
|
+
|
|
424
|
+
### MQTT问题
|
|
425
|
+
|
|
426
|
+
1. 确认MQTT Broker地址正确且可访问
|
|
427
|
+
2. 检查用户名密码(如果需要)
|
|
428
|
+
3. 查看Node-RED日志确认MQTT连接状态
|
|
429
|
+
4. 测试MQTT连接:`mosquitto_pub -h localhost -t test -m "hello"`
|
|
430
|
+
|
|
431
|
+
### 测试设备
|
|
432
|
+
|
|
433
|
+
如果没有真实Modbus设备,可以使用模拟器测试:
|
|
434
|
+
|
|
435
|
+
**Windows**:
|
|
436
|
+
- ModRSsim2(免费Modbus模拟器)
|
|
437
|
+
- 下载:https://sourceforge.net/projects/modrssim2/
|
|
438
|
+
|
|
439
|
+
**跨平台**:
|
|
440
|
+
```bash
|
|
441
|
+
# 安装pymodbus
|
|
442
|
+
pip install pymodbus
|
|
443
|
+
|
|
444
|
+
# 运行TCP模拟器
|
|
445
|
+
python -m pymodbus.server tcp --port 502
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## 开发计划
|
|
449
|
+
|
|
450
|
+
### 即将推出的功能
|
|
451
|
+
|
|
452
|
+
- [ ] **调光从站节点**:支持0-100%调光控制
|
|
453
|
+
- [ ] **窗帘从站节点**:开关、停止、位置控制
|
|
454
|
+
- [ ] **温控从站节点**:温度设置和模式控制
|
|
455
|
+
- [ ] **更多Modbus功能码**:读保持寄存器、输入寄存器等
|
|
456
|
+
- [ ] **数据持久化**:保存设备状态
|
|
457
|
+
- [ ] **设备分组管理**:批量操作多个设备
|
|
458
|
+
- [ ] **Web配置界面**:可视化配置工具
|
|
459
|
+
|
|
460
|
+
### 贡献
|
|
461
|
+
|
|
462
|
+
欢迎贡献代码、报告问题、提出建议!
|
|
463
|
+
|
|
464
|
+
## 更新日志
|
|
465
|
+
|
|
466
|
+
### v1.0.0 (2025-10-17)
|
|
467
|
+
- ✅ 初始版本发布
|
|
468
|
+
- ✅ Modbus主站节点(TCP/串口支持)
|
|
469
|
+
- ✅ **动态从站管理**:支持动态添加/删除从站设备(最多10台)
|
|
470
|
+
- ✅ **独立配置**:每个从站独立配置地址、线圈范围、轮询间隔
|
|
471
|
+
- ✅ **容错机制**:单个从站失败不影响其他从站继续轮询
|
|
472
|
+
- ✅ **配置持久化**:所有从站配置自动保存
|
|
473
|
+
- ✅ MQTT集成和Home Assistant MQTT Discovery(完全兼容)
|
|
474
|
+
- ✅ 开关从站节点
|
|
475
|
+
- ✅ 完整文档和示例流程
|
|
476
|
+
- ✅ 优化的错误处理和自动重连机制
|
|
477
|
+
- ✅ 连接断开自动检测和恢复
|
|
478
|
+
- ✅ 完善的资源清理和内存管理
|
|
479
|
+
- ✅ 稳定的唯一ID机制(避免重复实体)
|
|
480
|
+
- ✅ 设备可用性状态管理(online/offline)
|
|
481
|
+
- ✅ MQTT retain消息支持(断电重启不丢失配置)
|
|
482
|
+
- ✅ 智能状态显示(正常设备数/总设备数)
|
|
483
|
+
- ✅ 本地测试验证通过(Node-RED v4.0.8)
|
|
484
|
+
|
|
485
|
+
## 许可证
|
|
486
|
+
|
|
487
|
+
MIT License - 详见 [LICENSE](LICENSE) 文件
|
|
488
|
+
|
|
489
|
+
## 作者
|
|
490
|
+
|
|
491
|
+
**symi-daguo**
|
|
492
|
+
|
|
493
|
+
- NPM: https://www.npmjs.com/~symi-daguo
|
|
494
|
+
- GitHub: https://github.com/symi-daguo
|
|
495
|
+
|
|
496
|
+
## 支持
|
|
497
|
+
|
|
498
|
+
如有问题或建议:
|
|
499
|
+
- 📧 提交Issue:[GitHub Issues]
|
|
500
|
+
- 📦 NPM包:https://www.npmjs.com/package/node-red-contrib-symi-modbus
|
|
501
|
+
- 🌐 Node-RED Flow Library:[待提交]
|
|
502
|
+
|
|
503
|
+
## 致谢
|
|
504
|
+
|
|
505
|
+
感谢以下开源项目:
|
|
506
|
+
- [Node-RED](https://nodered.org/) - 流程编程平台
|
|
507
|
+
- [modbus-serial](https://github.com/yaacov/node-modbus-serial) - Modbus通信库
|
|
508
|
+
- [MQTT.js](https://github.com/mqttjs/MQTT.js) - MQTT客户端库
|
|
509
|
+
- Node-RED社区的支持和贡献
|