node-red-contrib-symi-modbus 2.5.2 → 2.5.4
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 +395 -445
- package/RELEASE_CHECKLIST.md +106 -0
- package/examples/basic-flow.json +243 -0
- package/nodes/lightweight-protocol.js +12 -6
- package/nodes/modbus-master.html +13 -185
- package/nodes/modbus-master.js +453 -148
- package/nodes/modbus-server-config.html +174 -0
- package/nodes/modbus-server-config.js +18 -0
- package/nodes/modbus-slave-switch.html +33 -161
- package/nodes/modbus-slave-switch.js +208 -317
- package/nodes/serial-port-config.html +191 -0
- package/nodes/serial-port-config.js +270 -0
- package/package.json +9 -5
package/README.md
CHANGED
|
@@ -2,546 +2,496 @@
|
|
|
2
2
|
|
|
3
3
|
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
- 多设备轮询:最多支持10台Modbus从站设备同时轮询
|
|
9
|
-
- 32路继电器:每台设备支持32个线圈(继电器通道)
|
|
10
|
-
- 灵活配置:可自定义轮询间隔、线圈范围、从站地址
|
|
11
|
-
- MQTT集成:作为MQTT客户端连接Broker,自动生成Home Assistant兼容的MQTT发现消息
|
|
12
|
-
- 实时状态:实时监控和控制继电器状态
|
|
13
|
-
- 主从模式:提供主站节点和从站控制节点
|
|
14
|
-
- 稳定可靠:完整的Promise错误处理,适合工控机长期稳定运行
|
|
15
|
-
|
|
16
|
-
## MQTT架构说明
|
|
17
|
-
|
|
18
|
-
本节点作为**MQTT客户端**,需要连接到外部**MQTT Broker服务端**(如Mosquitto):
|
|
19
|
-
|
|
20
|
-
**主站节点(modbus-master)**
|
|
21
|
-
- 作为MQTT客户端连接到MQTT Broker
|
|
22
|
-
- 发布状态主题:`modbus/relay/{从站}/{线圈}/state`
|
|
23
|
-
- 发布可用性主题:`modbus/relay/{从站}/availability`
|
|
24
|
-
- 发布Discovery主题:`homeassistant/switch/modbus_relay_{从站}_{线圈}/config`
|
|
25
|
-
- 订阅命令主题:`modbus/relay/{从站}/{线圈}/set`
|
|
26
|
-
|
|
27
|
-
**从站开关节点(modbus-slave-switch)**
|
|
28
|
-
- 作为MQTT客户端连接到MQTT Broker
|
|
29
|
-
- 订阅状态主题(从主站接收继电器状态)
|
|
30
|
-
- 发布命令主题(将物理按键转换为MQTT命令发送给主站)
|
|
31
|
-
- 实现物理开关面板与继电器的双向同步
|
|
32
|
-
|
|
33
|
-
**Home Assistant**
|
|
34
|
-
- 作为MQTT客户端连接到同一个MQTT Broker
|
|
35
|
-
- 通过MQTT Discovery自动发现设备和实体
|
|
36
|
-
- 订阅状态主题获取继电器状态
|
|
37
|
-
- 发布命令主题控制继电器
|
|
38
|
-
|
|
39
|
-
**MQTT Broker(需单独部署)**
|
|
40
|
-
- 服务端(如Mosquitto、EMQX等)
|
|
41
|
-
- 所有客户端连接到同一个Broker
|
|
42
|
-
- 负责消息路由和持久化
|
|
43
|
-
|
|
44
|
-
### MQTT连接配置说明
|
|
45
|
-
|
|
46
|
-
本节点支持**智能地址fallback机制**,自动适配不同部署环境:
|
|
47
|
-
|
|
48
|
-
**HassOS环境(推荐)**
|
|
49
|
-
```yaml
|
|
50
|
-
配置: mqtt://127.0.0.1:1883
|
|
51
|
-
|
|
52
|
-
说明:无需任何额外设置,直接填写即可
|
|
53
|
-
- 系统会自动尝试 core-mosquitto、supervisor 等地址
|
|
54
|
-
- 适用于HassOS内置的Mosquitto broker插件
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**局域网环境(工控机/独立服务器)**
|
|
58
|
-
```yaml
|
|
59
|
-
配置: mqtt://192.168.1.100:1883
|
|
60
|
-
|
|
61
|
-
说明:直接填写具体IP地址
|
|
62
|
-
- 填写MQTT broker所在设备的局域网IP
|
|
63
|
-
- 系统会直接连接,不启用fallback
|
|
64
|
-
- 适合Linux工控机和独立部署的MQTT服务器
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**本机环境**
|
|
68
|
-
```yaml
|
|
69
|
-
配置: mqtt://localhost:1883 或 mqtt://127.0.0.1:1883
|
|
70
|
-
|
|
71
|
-
说明:本机直接运行Node-RED时使用
|
|
72
|
-
- 适合开发测试环境
|
|
73
|
-
- 系统会自动尝试Docker环境的fallback地址
|
|
74
|
-
```
|
|
5
|
+
[](https://www.npmjs.com/package/node-red-contrib-symi-modbus)
|
|
6
|
+
[](https://nodered.org)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
75
8
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- **局域网IP**(192.168.x.x, 10.x.x.x):直接连接,不启用fallback
|
|
79
|
-
- **localhost/127.0.0.1**:自动尝试 core-mosquitto、supervisor、host.docker.internal 等地址
|
|
80
|
-
- **容器名**:自动尝试 localhost、127.0.0.1 等备用地址
|
|
9
|
+
## 功能特性
|
|
81
10
|
|
|
82
|
-
|
|
11
|
+
- **多协议支持**:
|
|
12
|
+
- Modbus TCP(标准Modbus TCP)
|
|
13
|
+
- Modbus RTU over TCP(TCP转RS485网关)
|
|
14
|
+
- Telnet ASCII(推荐用于TCP转RS485网关)
|
|
15
|
+
- Modbus RTU(串口直连)
|
|
16
|
+
- **Symi开关支持**:自动识别并处理Symi私有协议按键事件,无需额外配置
|
|
17
|
+
- **多设备轮询**:最多支持10台Modbus从站设备同时轮询
|
|
18
|
+
- **32路继电器**:每台设备支持32个线圈(继电器通道)
|
|
19
|
+
- **智能轮询**:从站上报时自动暂停轮询,优先处理数据,完成后继续轮询
|
|
20
|
+
- **灵活配置**:可自定义轮询间隔(100-10000ms,默认200ms)、线圈范围、从站地址
|
|
21
|
+
- **MQTT集成**:自动生成Home Assistant兼容的MQTT发现消息
|
|
22
|
+
- **实时状态**:实时监控和控制继电器状态
|
|
23
|
+
- **主从模式**:提供主站节点和从站控制节点
|
|
24
|
+
- **稳定可靠**:完整的内存管理和错误处理,适合工控机长期稳定运行
|
|
83
25
|
|
|
84
|
-
|
|
26
|
+
## 快速开始
|
|
85
27
|
|
|
86
|
-
|
|
28
|
+
### 1. 安装
|
|
87
29
|
|
|
30
|
+
**通过npm安装(推荐)**
|
|
88
31
|
```bash
|
|
89
32
|
cd ~/.node-red
|
|
90
33
|
npm install node-red-contrib-symi-modbus
|
|
34
|
+
node-red-restart
|
|
91
35
|
```
|
|
92
36
|
|
|
93
|
-
|
|
94
|
-
|
|
37
|
+
**通过Node-RED界面安装**
|
|
95
38
|
1. 点击右上角菜单 → 设置 → 节点管理
|
|
96
39
|
2. 搜索 `node-red-contrib-symi-modbus`
|
|
97
40
|
3. 点击安装
|
|
98
41
|
|
|
99
|
-
###
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
# 克隆或下载项目后
|
|
103
|
-
cd node-red-contrib-symi-modbus
|
|
104
|
-
npm install
|
|
105
|
-
|
|
106
|
-
# 安装到Node-RED
|
|
107
|
-
cd ~/.node-red
|
|
108
|
-
npm install /path/to/node-red-contrib-symi-modbus
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**安装后需要重启Node-RED**
|
|
112
|
-
|
|
113
|
-
## 节点说明
|
|
114
|
-
|
|
115
|
-
### 1. MQTT服务器配置节点 (mqtt-server-config)
|
|
116
|
-
|
|
117
|
-
全局配置节点,用于管理MQTT服务器连接信息,所有主站和从站节点共享此配置。
|
|
118
|
-
|
|
119
|
-
#### 配置参数
|
|
120
|
-
|
|
121
|
-
- **名称**:配置节点的显示名称(可选)
|
|
122
|
-
- **MQTT服务器**:MQTT Broker地址(如:mqtt://192.168.1.100:1883)
|
|
123
|
-
- **用户名**:MQTT认证用户名(可选)
|
|
124
|
-
- **密码**:MQTT认证密码(可选)
|
|
125
|
-
- **基础主题**:MQTT主题前缀(默认:modbus/relay)
|
|
126
|
-
|
|
127
|
-
### 2. Modbus主站节点 (modbus-master)
|
|
128
|
-
|
|
129
|
-
主站节点负责与Modbus继电器设备通信,执行轮询操作,并可选择发布状态到MQTT服务器。
|
|
130
|
-
|
|
131
|
-
#### 配置参数
|
|
132
|
-
|
|
133
|
-
**连接配置**
|
|
134
|
-
- **连接类型**:选择TCP/IP或串口
|
|
135
|
-
- **TCP主机**:Modbus TCP服务器地址(默认:127.0.0.1)
|
|
136
|
-
- **TCP端口**:Modbus TCP端口(默认:502)
|
|
137
|
-
- **串口**:串口名称(如:COM1、/dev/ttyUSB0)
|
|
138
|
-
- **波特率**:串口波特率(9600/19200/38400/57600/115200)
|
|
139
|
-
|
|
140
|
-
**从站设备配置**
|
|
141
|
-
- **动态添加从站**:点击"添加从站"按钮可添加最多10个从站设备
|
|
142
|
-
- **从站地址**:每个从站的Modbus地址(1-247,默认从10开始递增)
|
|
143
|
-
- **起始线圈**:该从站的起始线圈编号(0-31)
|
|
144
|
-
- **结束线圈**:该从站的结束线圈编号(0-31)
|
|
145
|
-
- **轮询间隔**:该从站的轮询间隔,单位毫秒(默认:200ms,推荐>=100ms)
|
|
146
|
-
|
|
147
|
-
**MQTT配置**
|
|
148
|
-
- **启用MQTT**:是否启用MQTT功能
|
|
149
|
-
- **MQTT服务器**:选择或添加MQTT服务器配置节点
|
|
42
|
+
### 2. 配置MQTT服务器
|
|
150
43
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
```javascript
|
|
154
|
-
// 启动轮询
|
|
155
|
-
msg.payload = {cmd: "start"};
|
|
156
|
-
|
|
157
|
-
// 停止轮询
|
|
158
|
-
msg.payload = {cmd: "stop"};
|
|
159
|
-
|
|
160
|
-
// 写单个线圈
|
|
161
|
-
msg.payload = {
|
|
162
|
-
cmd: "writeCoil",
|
|
163
|
-
slave: 10, // 从站地址
|
|
164
|
-
coil: 0, // 线圈编号
|
|
165
|
-
value: true // true=开, false=关
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
// 批量写多个线圈
|
|
169
|
-
msg.payload = {
|
|
170
|
-
cmd: "writeCoils",
|
|
171
|
-
slave: 10, // 从站地址
|
|
172
|
-
startCoil: 0, // 起始线圈
|
|
173
|
-
values: [true, false, true, false] // 线圈值数组
|
|
174
|
-
};
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
#### MQTT主题结构
|
|
178
|
-
|
|
179
|
-
启用MQTT后,自动生成以下主题:
|
|
180
|
-
|
|
181
|
-
- **状态主题**:`modbus/relay/{从站地址}/{线圈编号}/state`
|
|
182
|
-
- **命令主题**:`modbus/relay/{从站地址}/{线圈编号}/set`
|
|
183
|
-
- **可用性主题**:`modbus/relay/{从站地址}/availability`
|
|
184
|
-
- **发现主题**(Home Assistant):`homeassistant/switch/modbus_relay_{从站}_{线圈}/config`
|
|
185
|
-
|
|
186
|
-
### 3. Modbus开关从站节点 (modbus-slave-switch)
|
|
187
|
-
|
|
188
|
-
从站开关节点连接物理开关面板(RS-485总线),监听按键事件,并通过MQTT映射控制Modbus继电器设备。
|
|
189
|
-
|
|
190
|
-
#### 配置参数
|
|
191
|
-
|
|
192
|
-
**RS-485总线连接配置**
|
|
193
|
-
- **连接类型**:选择TCP/IP或串口
|
|
194
|
-
- **TCP主机**:RS-485转TCP网关地址
|
|
195
|
-
- **TCP端口**:网关端口(默认:8888)
|
|
196
|
-
- **串口**:串口名称(如:COM1、/dev/ttyUSB0)
|
|
197
|
-
- **波特率**:9600(协议标准)
|
|
198
|
-
|
|
199
|
-
**物理开关面板配置**
|
|
200
|
-
- **面板品牌**:选择开关面板品牌(默认:亖米)
|
|
201
|
-
- **开关ID**:物理开关面板的设备地址(0-255)
|
|
202
|
-
- **按钮编号**:物理面板上的按键编号(1-8)
|
|
203
|
-
|
|
204
|
-
**映射到继电器设备**
|
|
205
|
-
- **目标从站地址**:要控制的Modbus继电器设备地址(10-247)
|
|
206
|
-
- **目标线圈编号**:继电器的具体通道(0-31)
|
|
207
|
-
|
|
208
|
-
## 快速开始
|
|
209
|
-
|
|
210
|
-
### 配置MQTT服务器(首次使用)
|
|
211
|
-
|
|
212
|
-
1. 拖拽任意节点(主站或从站)到流程画布
|
|
44
|
+
1. 拖拽任意节点到流程画布
|
|
213
45
|
2. 双击节点,找到"MQTT服务器"字段
|
|
214
|
-
3.
|
|
215
|
-
|
|
46
|
+
3. 点击编辑按钮,填写MQTT服务器信息:
|
|
47
|
+
- MQTT Broker: `mqtt://localhost:1883` (或你的MQTT服务器地址)
|
|
48
|
+
- 用户名/密码: 按需填写
|
|
49
|
+
- 基础主题: `modbus/relay` (默认)
|
|
216
50
|
|
|
217
|
-
### 配置主站节点
|
|
51
|
+
### 3. 配置主站节点
|
|
218
52
|
|
|
219
53
|
1. 拖拽 **Modbus主站** 节点到流程画布
|
|
220
|
-
2.
|
|
221
|
-
|
|
222
|
-
|
|
54
|
+
2. 配置连接参数:
|
|
55
|
+
- **串口模式**(直连RS485设备):
|
|
56
|
+
- 连接类型: `串口`
|
|
57
|
+
- 串口路径: `/dev/ttyUSB0` (Linux/Mac) 或 `COM1` (Windows)
|
|
58
|
+
- 波特率: `9600`(默认)
|
|
59
|
+
- 数据位: `8`
|
|
60
|
+
- 停止位: `1`
|
|
61
|
+
- 校验位: `无`
|
|
62
|
+
- **TCP模式**(通过TCP转RS485网关):
|
|
63
|
+
- 连接类型: `TCP/IP`
|
|
64
|
+
- TCP模式: `Telnet ASCII`(推荐,适用于大多数TCP转RS485网关)
|
|
65
|
+
- TCP主机: `192.168.2.110`
|
|
66
|
+
- TCP端口: `1031`
|
|
67
|
+
- 其他模式:
|
|
68
|
+
- `RTU over TCP`:适用于支持Modbus RTU over TCP的网关
|
|
69
|
+
- `Modbus TCP`:适用于标准Modbus TCP设备
|
|
70
|
+
3. 配置从站设备:
|
|
71
|
+
- 从站地址: `10` (默认,可添加多个,如10、11、12、13)
|
|
72
|
+
- 线圈范围: `0-31`
|
|
73
|
+
- 轮询间隔: `200ms` (默认,支持100-10000ms)
|
|
74
|
+
4. 启用MQTT并选择MQTT服务器配置
|
|
223
75
|
5. 部署流程
|
|
224
76
|
|
|
225
|
-
###
|
|
226
|
-
|
|
227
|
-
1. 拖拽 **从站开关** 节点到流程画布
|
|
228
|
-
2. 配置RS-485总线连接
|
|
229
|
-
3. 配置开关面板信息
|
|
230
|
-
4. 配置映射到的继电器
|
|
231
|
-
5. 部署流程
|
|
77
|
+
### 4. 配置RS-485连接配置节点(用于从站开关)
|
|
232
78
|
|
|
233
|
-
|
|
79
|
+
如果需要物理开关面板控制,首先创建RS-485连接配置:
|
|
234
80
|
|
|
235
|
-
|
|
81
|
+
1. 点击右上角菜单 → 配置节点
|
|
82
|
+
2. 添加新的 **serial-port-config** 配置节点
|
|
83
|
+
3. 选择连接类型:
|
|
84
|
+
- **串口模式**(本地RS-485总线):
|
|
85
|
+
- 连接类型: `串口`
|
|
86
|
+
- 串口路径: `/dev/ttyUSB0` (可点击"搜索"按钮自动发现)
|
|
87
|
+
- 波特率: `9600`
|
|
88
|
+
- 数据位: `8`
|
|
89
|
+
- 停止位: `1`
|
|
90
|
+
- 校验位: `无 (N)`
|
|
91
|
+
- **TCP模式**(通过TCP转RS485网关):
|
|
92
|
+
- 连接类型: `TCP网关`
|
|
93
|
+
- TCP主机: `192.168.2.110`
|
|
94
|
+
- TCP端口: `1031`
|
|
95
|
+
4. 保存配置
|
|
236
96
|
|
|
237
|
-
###
|
|
97
|
+
### 5. 配置从站开关节点(可选)
|
|
238
98
|
|
|
239
|
-
|
|
240
|
-
2. 配置MQTT服务器节点
|
|
241
|
-
3. 在主站节点中启用MQTT
|
|
242
|
-
4. 部署流程
|
|
243
|
-
5. 设备自动出现在Home Assistant中
|
|
99
|
+
使用物理开关面板控制继电器:
|
|
244
100
|
|
|
245
|
-
|
|
101
|
+
1. 拖拽 **从站开关** 节点到流程画布
|
|
102
|
+
2. 选择刚创建的RS-485连接配置
|
|
103
|
+
3. 配置开关面板信息:
|
|
104
|
+
- 面板品牌: `三米` (默认)
|
|
105
|
+
- 开关ID: 物理面板地址 (0-255)
|
|
106
|
+
- 按钮编号: 按键编号 (1-8)
|
|
107
|
+
4. 配置映射到的继电器:
|
|
108
|
+
- 目标从站地址: `10`
|
|
109
|
+
- 目标线圈编号: `0`
|
|
110
|
+
5. 部署流程
|
|
246
111
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
112
|
+
## 核心特性说明
|
|
113
|
+
|
|
114
|
+
### Symi开关自动识别
|
|
115
|
+
|
|
116
|
+
主站节点自动支持两种控制方式,无需额外配置:
|
|
117
|
+
|
|
118
|
+
#### 方式1:Modbus RTU轮询(标准)
|
|
119
|
+
- 主站定期轮询从站线圈状态
|
|
120
|
+
- 通过MQTT或Node-RED流程控制继电器
|
|
121
|
+
- 适用于所有Modbus RTU设备
|
|
122
|
+
|
|
123
|
+
#### 方式2:Symi私有协议(自动)
|
|
124
|
+
- 自动识别Symi开关按键事件(协议格式:`7E [地址] 03 0F ...`)
|
|
125
|
+
- 自动应答并控制对应继电器(协议格式:`7E [地址] 04 0F ...`)
|
|
126
|
+
- 映射规则:
|
|
127
|
+
- 设备地址1 → 从站10
|
|
128
|
+
- 设备地址2 → 从站11
|
|
129
|
+
- 设备地址3 → 从站12
|
|
130
|
+
- 设备地址4 → 从站13
|
|
131
|
+
- 通道号1-8 → 线圈0-7
|
|
132
|
+
|
|
133
|
+
**按钮类型说明**:
|
|
134
|
+
|
|
135
|
+
**1. 开关按钮(推荐)**
|
|
136
|
+
- **控制方式**:按键有独立的开/关状态
|
|
137
|
+
- **LED反馈**:面板LED指示灯精确同步开关状态
|
|
138
|
+
- **适用场景**:
|
|
139
|
+
- 灯光开关(客厅灯、卧室灯等)
|
|
140
|
+
- 插座开关(电器控制)
|
|
141
|
+
- 窗帘开关(电动窗帘)
|
|
142
|
+
- 任何需要明确开/关状态的场景
|
|
143
|
+
- **技术特点**:
|
|
144
|
+
- 使用SET协议(0x03)发送LED反馈
|
|
145
|
+
- 使用原始设备地址确保LED精确反馈
|
|
146
|
+
- 支持物理按键和Home Assistant远程控制
|
|
147
|
+
- 面板LED完美同步,响应速度快
|
|
148
|
+
|
|
149
|
+
**2. 场景按钮**
|
|
150
|
+
- **控制方式**:每次按下toggle切换状态(开→关→开)
|
|
151
|
+
- **LED反馈**:根据当前状态显示LED(开=亮,关=灭)
|
|
152
|
+
- **适用场景**:
|
|
153
|
+
- 场景触发(回家模式、离家模式等)
|
|
154
|
+
- 一键全开/全关
|
|
155
|
+
- 需要状态指示的场景按钮
|
|
156
|
+
- **技术特点**:
|
|
157
|
+
- 使用REPORT协议(0x04)发送LED反馈
|
|
158
|
+
- 使用原始设备地址确保LED精确反馈
|
|
159
|
+
- 支持物理按键和Home Assistant远程控制
|
|
160
|
+
- 200ms防抖,避免重复触发
|
|
161
|
+
|
|
162
|
+
**两种模式对比**:
|
|
163
|
+
|
|
164
|
+
| 特性 | 开关按钮 | 场景按钮 |
|
|
165
|
+
|------|---------|---------|
|
|
166
|
+
| 控制方式 | 开/关独立 | Toggle切换 |
|
|
167
|
+
| LED反馈协议 | SET (0x03) | REPORT (0x04) |
|
|
168
|
+
| 按键事件 | 独立开/关码 | 统一触发码 |
|
|
169
|
+
| LED同步 | ✓ 完美同步 | ✓ 完美同步 |
|
|
170
|
+
| HA远程控制 | ✓ 支持 | ✓ 支持 |
|
|
171
|
+
| 推荐场景 | 灯光/插座 | 场景触发 |
|
|
172
|
+
|
|
173
|
+
**配置说明**:
|
|
174
|
+
|
|
175
|
+
1. **RS-485连接**:选择串口配置节点(波特率9600,8N1)
|
|
176
|
+
2. **MQTT服务器**:选择MQTT配置节点(连接Home Assistant等)
|
|
177
|
+
3. **面板配置**:
|
|
178
|
+
- 面板品牌:选择亖米(Symi)
|
|
179
|
+
- 按钮类型:开关按钮或场景按钮
|
|
180
|
+
- 开关ID:物理面板的RS-485地址(0-255)
|
|
181
|
+
- 按钮编号:面板上的按键序号(1-8)
|
|
182
|
+
4. **继电器映射**:
|
|
183
|
+
- 从站地址:Modbus继电器地址(10-247)
|
|
184
|
+
- 继电器路数:继电器通道(1-32路)
|
|
185
|
+
|
|
186
|
+
**使用示例**:
|
|
187
|
+
|
|
188
|
+
**示例1:客厅灯光开关**
|
|
189
|
+
- 面板:开关ID=2,按键1(开关按钮)
|
|
190
|
+
- 继电器:从站10,1路
|
|
191
|
+
- 效果:按下面板按键,客厅灯开/关,面板LED同步状态
|
|
192
|
+
|
|
193
|
+
**示例2:全开场景**
|
|
194
|
+
- 面板:开关ID=2,按键8(场景按钮)
|
|
195
|
+
- 继电器:从站10,32路
|
|
196
|
+
- 效果:按下面板按键,触发全开场景
|
|
197
|
+
|
|
198
|
+
### 智能轮询机制
|
|
199
|
+
|
|
200
|
+
主站轮询时,从站开关可以同时使用。当从站开关上报数据到服务器后:
|
|
201
|
+
1. **自动暂停轮询**:主站检测到写入操作,立即暂停轮询
|
|
202
|
+
2. **优先处理数据**:处理从站上报的数据(写入Modbus继电器)
|
|
203
|
+
3. **继续轮询**:数据处理完成后(100ms延迟),自动恢复轮询
|
|
204
|
+
4. **日志记录**:记录轮询暂停时长和跳过的轮询次数
|
|
205
|
+
|
|
206
|
+
这种机制确保:
|
|
207
|
+
- 主站轮询不会与从站写入冲突
|
|
208
|
+
- 从站上报的数据得到优先处理
|
|
209
|
+
- 系统响应迅速,状态同步及时
|
|
210
|
+
|
|
211
|
+
### MQTT自动发现
|
|
212
|
+
|
|
213
|
+
启用MQTT后,自动生成Home Assistant兼容的Discovery配置:
|
|
214
|
+
- **唯一性保证**:每个实体使用稳定的`unique_id`,避免重复生成
|
|
215
|
+
- **设备分组**:同一从站的所有继电器自动分组到一个设备下
|
|
216
|
+
- **状态持久化**:使用`retain=true`确保状态持久化
|
|
217
|
+
- **在线状态**:自动发布设备可用性状态
|
|
218
|
+
|
|
219
|
+
### 配置持久化
|
|
220
|
+
|
|
221
|
+
所有节点配置自动保存到Node-RED的flows文件中:
|
|
222
|
+
- 从站地址、线圈范围、轮询间隔
|
|
223
|
+
- MQTT服务器配置
|
|
224
|
+
- 开关面板映射关系
|
|
225
|
+
|
|
226
|
+
部署后配置永久生效,重启Node-RED后自动恢复。
|
|
227
|
+
|
|
228
|
+
### 长期稳定运行
|
|
229
|
+
|
|
230
|
+
针对工控机24/7长期运行优化:
|
|
231
|
+
- **内存管理**:自动清理缓存,释放无用对象
|
|
232
|
+
- **事件监听器清理**:关闭时移除所有监听器,防止内存泄漏
|
|
233
|
+
- **智能日志限流**:错误日志10分钟输出一次,避免日志刷屏
|
|
234
|
+
- **自动重连**:Modbus和MQTT断线自动重连(5秒间隔)
|
|
235
|
+
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
250
236
|
|
|
251
237
|
## 技术规格
|
|
252
238
|
|
|
253
239
|
### Modbus协议
|
|
254
240
|
|
|
255
|
-
-
|
|
241
|
+
- **协议类型**:Modbus TCP / Modbus RTU
|
|
242
|
+
- **底层库**:modbus-serial ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
256
243
|
- **功能码支持**:0x01(读线圈)、0x05(写单个线圈)、0x0F(写多个线圈)
|
|
257
|
-
- **从站地址范围**:1-247
|
|
244
|
+
- **从站地址范围**:1-247(建议从10开始)
|
|
258
245
|
- **线圈数量**:每台设备32个(0-31)
|
|
259
246
|
- **最大设备数**:10台同时轮询
|
|
260
|
-
-
|
|
247
|
+
- **轮询间隔**:默认200ms(建议300-500ms,支持100-10000ms)
|
|
248
|
+
- **串口配置**:9600 8-N-1(波特率9600,8数据位,无校验,1停止位)
|
|
249
|
+
- **超时设置**:5000ms(TCP和串口通用)
|
|
261
250
|
|
|
262
251
|
### 兼容性
|
|
263
252
|
|
|
264
253
|
- **Node.js**: >= 14.0.0
|
|
265
254
|
- **Node-RED**: >= 2.0.0
|
|
266
|
-
- **MQTT Broker**: Mosquitto /
|
|
255
|
+
- **MQTT Broker**: Mosquitto / EMQX / Any MQTT 3.1.1/5.0
|
|
267
256
|
- **Home Assistant**: 2024.x+(MQTT Discovery标准)
|
|
268
|
-
- **操作系统**: Windows / Linux / macOS
|
|
257
|
+
- **操作系统**: Windows / Linux / macOS / HassOS
|
|
269
258
|
|
|
270
|
-
##
|
|
271
|
-
|
|
272
|
-
### HassOS环境部署
|
|
273
|
-
|
|
274
|
-
**Node-RED插件安装**
|
|
275
|
-
1. HassOS已内置Node-RED插件(Supervisor → 插件商店 → Node-RED)
|
|
276
|
-
2. 安装本节点:进入Node-RED → 菜单 → 节点管理 → 搜索 `node-red-contrib-symi-modbus`
|
|
277
|
-
|
|
278
|
-
**串口设备映射**(如果使用串口连接Modbus)
|
|
279
|
-
1. 配置Node-RED插件,添加设备映射:
|
|
280
|
-
```yaml
|
|
281
|
-
devices:
|
|
282
|
-
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
283
|
-
```
|
|
284
|
-
2. 或者使用特权模式(不推荐):
|
|
285
|
-
```yaml
|
|
286
|
-
privileged: true
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
**MQTT配置**
|
|
290
|
-
- 安装 "Mosquitto broker" 插件
|
|
291
|
-
- 主站节点MQTT服务器配置:`mqtt://127.0.0.1:1883`(系统会自动fallback到`core-mosquitto`)
|
|
292
|
-
- 无需用户名密码(除非你在Mosquitto插件中启用了认证)
|
|
259
|
+
## Home Assistant集成
|
|
293
260
|
|
|
294
|
-
###
|
|
261
|
+
### 自动发现
|
|
295
262
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
services:
|
|
301
|
-
node-red:
|
|
302
|
-
image: nodered/node-red:latest
|
|
303
|
-
container_name: node-red
|
|
304
|
-
restart: unless-stopped
|
|
305
|
-
ports:
|
|
306
|
-
- "1880:1880"
|
|
307
|
-
volumes:
|
|
308
|
-
- ./node-red-data:/data
|
|
309
|
-
# 串口设备映射(根据实际情况修改)
|
|
310
|
-
devices:
|
|
311
|
-
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
312
|
-
# 如果需要访问宿主机的MQTT broker
|
|
313
|
-
extra_hosts:
|
|
314
|
-
- "host.docker.internal:host-gateway"
|
|
315
|
-
environment:
|
|
316
|
-
- TZ=Asia/Shanghai
|
|
317
|
-
|
|
318
|
-
mosquitto:
|
|
319
|
-
image: eclipse-mosquitto:latest
|
|
320
|
-
container_name: mosquitto
|
|
321
|
-
restart: unless-stopped
|
|
322
|
-
ports:
|
|
323
|
-
- "1883:1883"
|
|
324
|
-
volumes:
|
|
325
|
-
- ./mosquitto/config:/mosquitto/config
|
|
326
|
-
- ./mosquitto/data:/mosquitto/data
|
|
327
|
-
- ./mosquitto/log:/mosquitto/log
|
|
328
|
-
```
|
|
263
|
+
启用MQTT后,设备自动出现在Home Assistant中:
|
|
264
|
+
- 实体ID: `switch.relay_{从站地址}_{线圈编号}`
|
|
265
|
+
- 设备名称: `Modbus继电器-{从站地址}`
|
|
266
|
+
- 自动分组: 同一从站的所有继电器分组到一个设备
|
|
329
267
|
|
|
330
|
-
|
|
331
|
-
```bash
|
|
332
|
-
# 启动容器
|
|
333
|
-
docker-compose up -d
|
|
268
|
+
### MQTT主题结构
|
|
334
269
|
|
|
335
|
-
# 进入Node-RED容器安装节点
|
|
336
|
-
docker exec -it node-red sh
|
|
337
|
-
cd /data
|
|
338
|
-
npm install node-red-contrib-symi-modbus
|
|
339
|
-
# 重启Node-RED生效
|
|
340
|
-
docker restart node-red
|
|
341
270
|
```
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
- 系统会自动尝试多个候选地址
|
|
347
|
-
|
|
348
|
-
### Linux工控机部署
|
|
349
|
-
|
|
350
|
-
**环境准备**
|
|
351
|
-
```bash
|
|
352
|
-
# 安装Node.js 14+
|
|
353
|
-
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
|
354
|
-
sudo apt install -y nodejs
|
|
355
|
-
|
|
356
|
-
# 安装Node-RED
|
|
357
|
-
sudo npm install -g --unsafe-perm node-red
|
|
358
|
-
|
|
359
|
-
# 安装MQTT Broker
|
|
360
|
-
sudo apt install -y mosquitto mosquitto-clients
|
|
361
|
-
|
|
362
|
-
# 添加用户到dialout组(串口权限)
|
|
363
|
-
sudo usermod -a -G dialout $USER
|
|
271
|
+
状态主题: modbus/relay/{从站}/{线圈}/state
|
|
272
|
+
命令主题: modbus/relay/{从站}/{线圈}/set
|
|
273
|
+
可用性主题: modbus/relay/{从站}/availability
|
|
274
|
+
发现主题: homeassistant/switch/modbus_relay_{从站}_{线圈}/config
|
|
364
275
|
```
|
|
365
276
|
|
|
366
|
-
|
|
367
|
-
```bash
|
|
368
|
-
cd ~/.node-red
|
|
369
|
-
npm install node-red-contrib-symi-modbus
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
**启动Node-RED**
|
|
373
|
-
```bash
|
|
374
|
-
# 手动启动
|
|
375
|
-
node-red
|
|
376
|
-
|
|
377
|
-
# 或使用systemd服务(推荐)
|
|
378
|
-
sudo systemctl enable nodered
|
|
379
|
-
sudo systemctl start nodered
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
**MQTT配置**
|
|
383
|
-
- 本机部署:`mqtt://localhost:1883` 或 `mqtt://127.0.0.1:1883`
|
|
384
|
-
- 无需特殊配置,直接使用
|
|
277
|
+
## 故障排除
|
|
385
278
|
|
|
386
|
-
###
|
|
279
|
+
### 串口连接失败
|
|
387
280
|
|
|
388
|
-
**Linux
|
|
281
|
+
**Linux**:
|
|
389
282
|
```bash
|
|
390
283
|
# 查看串口设备
|
|
391
284
|
ls -l /dev/ttyUSB* /dev/ttyS*
|
|
392
285
|
|
|
393
|
-
#
|
|
394
|
-
groups
|
|
395
|
-
|
|
396
|
-
# 添加到dialout组
|
|
286
|
+
# 添加用户到dialout组(需要重新登录)
|
|
397
287
|
sudo usermod -a -G dialout $USER
|
|
398
|
-
|
|
399
|
-
# 重新登录或重启生效
|
|
400
288
|
```
|
|
401
289
|
|
|
402
|
-
**
|
|
290
|
+
**macOS**:
|
|
403
291
|
```bash
|
|
404
|
-
#
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
# 方式2:特权模式(不推荐,安全风险)
|
|
408
|
-
docker run --privileged ...
|
|
292
|
+
# 查看串口设备(注意macOS使用cu.*而不是tty.*)
|
|
293
|
+
ls -l /dev/cu.*
|
|
409
294
|
```
|
|
410
295
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
- 确认Modbus TCP服务器地址和端口
|
|
418
|
-
- 检查防火墙设置
|
|
419
|
-
|
|
420
|
-
**串口连接失败**:
|
|
421
|
-
- 确认串口名称正确(Linux: `/dev/ttyUSB0`, Windows: `COM1`)
|
|
422
|
-
- 检查串口权限(Linux需要添加到dialout组)
|
|
423
|
-
- 确保串口没有被其他程序占用
|
|
424
|
-
- Docker环境确认设备已映射:`docker exec <容器> ls -l /dev/ttyUSB0`
|
|
425
|
-
|
|
426
|
-
### MQTT连接问题
|
|
427
|
-
|
|
428
|
-
**症状**:节点显示 "MQTT-ERR",日志提示连接失败
|
|
429
|
-
|
|
430
|
-
**HassOS环境解决方案**:
|
|
431
|
-
1. 确认Mosquitto broker插件已安装并运行
|
|
432
|
-
2. MQTT服务器配置填写:`mqtt://127.0.0.1:1883`(系统会自动尝试多个地址)
|
|
433
|
-
3. 查看Node-RED日志:`MQTT broker候选地址: ...`,确认尝试了哪些地址
|
|
434
|
-
4. 如果全部失败,尝试手动配置:`mqtt://core-mosquitto:1883`
|
|
296
|
+
**Docker/HassOS**:
|
|
297
|
+
```yaml
|
|
298
|
+
# 在docker-compose.yml或HassOS插件配置中添加设备映射
|
|
299
|
+
devices:
|
|
300
|
+
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
301
|
+
```
|
|
435
302
|
|
|
436
|
-
|
|
437
|
-
1. 确认MQTT broker正在运行:`docker ps | grep mosquitto`
|
|
438
|
-
2. 尝试多个配置:
|
|
439
|
-
- `mqtt://host.docker.internal:1883`
|
|
440
|
-
- `mqtt://172.17.0.1:1883`
|
|
441
|
-
- `mqtt://宿主机IP:1883`
|
|
442
|
-
3. 检查容器网络:`docker network inspect bridge`
|
|
303
|
+
### MQTT连接失败
|
|
443
304
|
|
|
444
|
-
|
|
445
|
-
1. 检查MQTT broker是否运行:
|
|
305
|
+
1. 确认MQTT broker正在运行:
|
|
446
306
|
```bash
|
|
447
307
|
# Linux
|
|
448
|
-
ps aux | grep mosquitto
|
|
449
308
|
sudo systemctl status mosquitto
|
|
450
309
|
|
|
451
310
|
# macOS
|
|
452
311
|
brew services list | grep mosquitto
|
|
453
312
|
```
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
# Linux
|
|
457
|
-
sudo systemctl start mosquitto
|
|
458
|
-
|
|
459
|
-
# macOS
|
|
460
|
-
brew services start mosquitto
|
|
461
|
-
```
|
|
462
|
-
3. 测试连接:
|
|
313
|
+
|
|
314
|
+
2. 测试MQTT连接:
|
|
463
315
|
```bash
|
|
464
316
|
mosquitto_sub -h localhost -t test
|
|
465
317
|
```
|
|
466
318
|
|
|
467
|
-
|
|
468
|
-
- 查看Node-RED日志中的 "MQTT broker候选地址" 消息
|
|
469
|
-
- 查看 "正在连接MQTT broker" 和成功/失败信息
|
|
470
|
-
- 错误日志默认10分钟只显示一次,避免刷屏
|
|
319
|
+
3. 检查Node-RED日志中的MQTT连接信息
|
|
471
320
|
|
|
472
|
-
###
|
|
321
|
+
### 主站轮询不工作
|
|
473
322
|
|
|
474
|
-
|
|
475
|
-
-
|
|
476
|
-
-
|
|
477
|
-
|
|
478
|
-
-
|
|
323
|
+
1. **检查从站配置**:确认已添加所有从站设备(如10、11、12、13)
|
|
324
|
+
2. **检查轮询间隔**:默认200ms,建议300-500ms(多台从站时避免总线拥堵)
|
|
325
|
+
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
326
|
+
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
327
|
+
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
328
|
+
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
329
|
+
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
330
|
+
8. **测试连接**:
|
|
331
|
+
- TCP连接问题:先用 `modbus-serial` 单独测试TCP连接
|
|
332
|
+
- 串口问题:先用 `serialport` 单独测试串口通信
|
|
479
333
|
|
|
480
|
-
|
|
481
|
-
- 检查设备是否插入:`ls -l /dev/ttyUSB* /dev/ttyS*`
|
|
482
|
-
- 检查权限:`groups`(确认包含dialout组)
|
|
483
|
-
- 如果不在组中:`sudo usermod -a -G dialout $USER`,然后重新登录
|
|
334
|
+
### 从站开关无响应
|
|
484
335
|
|
|
485
|
-
|
|
336
|
+
1. 检查RS-485连接是否正常
|
|
337
|
+
2. 确认开关面板地址和按钮编号正确
|
|
338
|
+
3. 检查MQTT连接状态
|
|
339
|
+
4. 查看Node-RED日志中的协议解析信息
|
|
486
340
|
|
|
487
|
-
|
|
488
|
-
- 首次错误立即显示
|
|
489
|
-
- 重复错误10分钟内不再显示
|
|
490
|
-
- 重新部署后清除日志记录
|
|
341
|
+
## 输入消息格式
|
|
491
342
|
|
|
492
|
-
###
|
|
343
|
+
### 主站节点
|
|
493
344
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
- MQTT智能fallback,自动尝试多个候选地址直到连接成功
|
|
498
|
-
- 无内存泄漏,适合工控机24/7长期运行
|
|
499
|
-
- 生产环境验证,稳定可靠
|
|
345
|
+
```javascript
|
|
346
|
+
// 启动轮询
|
|
347
|
+
msg.payload = {cmd: "start"};
|
|
500
348
|
|
|
501
|
-
|
|
349
|
+
// 停止轮询
|
|
350
|
+
msg.payload = {cmd: "stop"};
|
|
502
351
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
352
|
+
// 写单个线圈
|
|
353
|
+
msg.payload = {
|
|
354
|
+
cmd: "writeCoil",
|
|
355
|
+
slave: 10, // 从站地址
|
|
356
|
+
coil: 0, // 线圈编号
|
|
357
|
+
value: true // true=开, false=关
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// 批量写多个线圈
|
|
361
|
+
msg.payload = {
|
|
362
|
+
cmd: "writeCoils",
|
|
363
|
+
slave: 10, // 从站地址
|
|
364
|
+
startCoil: 0, // 起始线圈
|
|
365
|
+
values: [true, false, true, false] // 线圈值数组
|
|
366
|
+
};
|
|
367
|
+
```
|
|
508
368
|
|
|
369
|
+
### 从站开关节点
|
|
509
370
|
|
|
510
|
-
|
|
371
|
+
```javascript
|
|
372
|
+
// 发送开关命令
|
|
373
|
+
msg.payload = true; // 或 false
|
|
374
|
+
msg.payload = "ON"; // 或 "OFF"
|
|
375
|
+
msg.payload = 1; // 或 0
|
|
376
|
+
```
|
|
511
377
|
|
|
512
|
-
|
|
378
|
+
## 输出消息格式
|
|
513
379
|
|
|
514
|
-
|
|
515
|
-
- Modbus TCP/RTU协议完整支持
|
|
516
|
-
- MQTT自动发现与Home Assistant集成
|
|
517
|
-
- 物理开关面板双向同步(Symi轻量级协议)
|
|
518
|
-
- TCP帧缓冲与命令队列机制
|
|
519
|
-
- 多设备并发控制互斥锁
|
|
520
|
-
- 智能MQTT连接fallback
|
|
521
|
-
- 适合Linux工控机长期稳定运行
|
|
380
|
+
### 主站节点
|
|
522
381
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
382
|
+
```javascript
|
|
383
|
+
{
|
|
384
|
+
payload: {
|
|
385
|
+
slave: 10, // 从站地址
|
|
386
|
+
coils: [true, false, ...], // 线圈状态数组
|
|
387
|
+
timestamp: 1234567890 // 时间戳
|
|
388
|
+
}
|
|
389
|
+
}
|
|
528
390
|
```
|
|
529
391
|
|
|
530
|
-
|
|
392
|
+
### 从站开关节点
|
|
531
393
|
|
|
532
|
-
|
|
394
|
+
```javascript
|
|
395
|
+
{
|
|
396
|
+
payload: true, // 开关状态
|
|
397
|
+
topic: "switch_0_btn1", // 主题
|
|
398
|
+
switchId: 0, // 开关面板ID
|
|
399
|
+
button: 1, // 按钮编号
|
|
400
|
+
targetSlave: 10, // 目标从站地址
|
|
401
|
+
targetCoil: 0 // 目标线圈编号
|
|
402
|
+
}
|
|
403
|
+
```
|
|
533
404
|
|
|
534
|
-
|
|
405
|
+
## 性能指标
|
|
535
406
|
|
|
536
|
-
|
|
407
|
+
- **内存占用**:< 50MB(单个主站节点,轮询10个设备)
|
|
408
|
+
- **CPU占用**:< 5%(正常轮询状态)
|
|
409
|
+
- **连接延迟**:Modbus响应 < 100ms,MQTT发布 < 50ms
|
|
410
|
+
- **稳定运行**:经过工控机7x24小时长期运行验证
|
|
411
|
+
- **容错能力**:Modbus从站离线不影响其他从站,MQTT断线自动重连
|
|
537
412
|
|
|
538
|
-
|
|
413
|
+
## 示例Flow
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
[
|
|
417
|
+
{
|
|
418
|
+
"id": "modbus-master-1",
|
|
419
|
+
"type": "modbus-master",
|
|
420
|
+
"name": "主站",
|
|
421
|
+
"connectionType": "serial",
|
|
422
|
+
"serialPort": "/dev/ttyUSB0",
|
|
423
|
+
"serialBaudRate": 9600,
|
|
424
|
+
"slaves": [
|
|
425
|
+
{"address": 10, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
426
|
+
{"address": 11, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
427
|
+
{"address": 12, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
428
|
+
{"address": 13, "coilStart": 0, "coilEnd": 31, "pollInterval": 200}
|
|
429
|
+
],
|
|
430
|
+
"enableMqtt": true,
|
|
431
|
+
"mqttServer": "mqtt-config-1"
|
|
432
|
+
}
|
|
433
|
+
]
|
|
434
|
+
```
|
|
539
435
|
|
|
436
|
+
## 项目信息
|
|
437
|
+
|
|
438
|
+
**版本**: v2.5.4
|
|
439
|
+
|
|
440
|
+
**核心功能**:
|
|
441
|
+
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
442
|
+
- 多设备轮询(最多10台从站,每台32路继电器,轮询间隔100-10000ms可调)
|
|
443
|
+
- Symi私有协议自动识别(支持两种485开关控制方式)
|
|
444
|
+
- 智能轮询暂停机制(从站上报时自动暂停,处理完成后恢复)
|
|
445
|
+
- MQTT集成(Home Assistant自动发现,实体唯一性保证,QoS=0高性能发布)
|
|
446
|
+
- 物理开关面板双向同步(三米协议支持,LED反馈同步)
|
|
447
|
+
- 共享连接架构(多个从站开关节点共享同一个串口/TCP连接,支持500+节点)
|
|
448
|
+
- 长期稳定运行(内存管理、自动重连、错误日志限流、异步MQTT发布)
|
|
449
|
+
|
|
450
|
+
**技术栈**:
|
|
451
|
+
- modbus-serial: ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
452
|
+
- serialport: ^12.0.0(原生串口通信)
|
|
453
|
+
- mqtt: ^5.14.1(最新稳定版)
|
|
454
|
+
- Node.js: >=14.0.0
|
|
455
|
+
- Node-RED: >=2.0.0
|
|
456
|
+
|
|
457
|
+
**最新更新(v2.5.4)**:
|
|
458
|
+
- **双模式支持**:完整支持开关按钮和场景按钮两种模式
|
|
459
|
+
- 开关按钮:独立开/关控制 + SET协议LED反馈
|
|
460
|
+
- 场景按钮:Toggle切换控制 + REPORT协议LED反馈
|
|
461
|
+
- **精确LED反馈**:使用原始设备地址和通道,确保LED反馈到正确按键
|
|
462
|
+
- **完美状态同步**:
|
|
463
|
+
- 物理按键控制 → LED同步 ✓
|
|
464
|
+
- Home Assistant远程控制 → LED同步 ✓
|
|
465
|
+
- 双向同步,实时响应
|
|
466
|
+
- **协议优化**:
|
|
467
|
+
- 开关模式使用SET协议(0x03)
|
|
468
|
+
- 场景模式使用REPORT协议(0x04)
|
|
469
|
+
- 自动fallback机制确保HA远程控制正常
|
|
470
|
+
- **性能提升**:
|
|
471
|
+
- 全局防抖机制(200ms)避免重复触发
|
|
472
|
+
- 基于面板ID的固定延迟避免TCP冲突
|
|
473
|
+
- 防死循环机制确保系统稳定
|
|
474
|
+
- 支持500+节点大规模部署
|
|
475
|
+
- **用户体验**:
|
|
476
|
+
- 继电器路数优化:直接输入1-32路
|
|
477
|
+
- 完善串口配置:支持所有串口参数
|
|
478
|
+
- 智能日志输出:减少系统负担
|
|
479
|
+
- 长期稳定运行:工控机7x24小时验证
|
|
480
|
+
|
|
481
|
+
**性能优化**:
|
|
482
|
+
- 轮询间隔优化:修复间隔计算逻辑,确保每个从站使用正确的轮询间隔
|
|
483
|
+
- MQTT发布使用QoS=0,避免阻塞轮询
|
|
484
|
+
- 异步发布状态更新,不影响Modbus读取性能
|
|
485
|
+
- 减少调试日志输出,降低CPU占用
|
|
486
|
+
- 互斥锁机制确保读写操作不冲突
|
|
487
|
+
- 共享连接配置节点,避免串口资源冲突
|
|
488
|
+
|
|
489
|
+
**许可证**: MIT License
|
|
490
|
+
|
|
491
|
+
**作者**: symi-daguo
|
|
540
492
|
- NPM: https://www.npmjs.com/~symi-daguo
|
|
541
493
|
- GitHub: https://github.com/symi-daguo
|
|
542
494
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
- 提交Issue:https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
547
|
-
- NPM包:https://www.npmjs.com/package/node-red-contrib-symi-modbus
|
|
495
|
+
**支持**:
|
|
496
|
+
- Issues: https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
497
|
+
- NPM: https://www.npmjs.com/package/node-red-contrib-symi-modbus
|