node-red-contrib-symi-mesh 1.6.5 → 1.6.7
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 +313 -329
- package/examples/knx-sync-example.json +48 -410
- package/lib/device-manager.js +30 -3
- package/lib/mqtt-helper.js +3 -3
- package/lib/tcp-client.js +33 -13
- package/nodes/symi-485-bridge.html +15 -3
- package/nodes/symi-485-bridge.js +747 -206
- package/nodes/symi-485-config.js +90 -5
- package/nodes/symi-device.js +7 -7
- package/nodes/symi-gateway.js +86 -14
- package/nodes/symi-knx-bridge.html +368 -0
- package/nodes/symi-knx-bridge.js +1065 -0
- package/nodes/symi-mqtt.js +74 -25
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -202,7 +202,7 @@ node-red-restart
|
|
|
202
202
|
|
|
203
203
|
### 开关状态编码(重要)
|
|
204
204
|
|
|
205
|
-
**协议规则**: 每2位表示1
|
|
205
|
+
**协议规则**: 每2位表示1路,`01`=关,`10`=开,从最低位开始
|
|
206
206
|
|
|
207
207
|
| 路数 | 全关 | 全开 | 示例 |
|
|
208
208
|
|-----|------|------|------|
|
|
@@ -211,24 +211,57 @@ node-red-restart
|
|
|
211
211
|
| 3路 | 0x15 | 0x2A | 从低位开始 |
|
|
212
212
|
| 4路 | 0x55 | 0xAA | 每2位1路 |
|
|
213
213
|
| 6路 | 0x5555 | 0xAAAA | 2字节小端序 |
|
|
214
|
+
| 8路 | 0x5555 | 0xAAAA | 2字节小端序 |
|
|
215
|
+
|
|
216
|
+
#### 8路开关状态详解
|
|
217
|
+
|
|
218
|
+
8路开关使用2字节(16位)表示状态,小端序传输。实测帧示例:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
帧格式: 53 80 [Status] [Length] [网络地址LE] [AttrType] [状态LE] [Checksum]
|
|
222
|
+
示例帧: 53 80 05 05 E4 01 45 56 55 70
|
|
223
|
+
│ │ │ │ └─────┘ │ └───┘ └─ 校验和
|
|
224
|
+
│ │ │ │ │ │ └─ 状态值 0x5556 (第1路开)
|
|
225
|
+
│ │ │ │ │ └─ AttrType=0x45 (8路开关)
|
|
226
|
+
│ │ │ │ └─ 网络地址 0x01E4
|
|
227
|
+
│ │ │ └─ 数据长度=5字节
|
|
228
|
+
│ │ └─ 状态码
|
|
229
|
+
│ └─ Opcode=0x80 (事件上报)
|
|
230
|
+
└─ 帧头
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**状态值对照表**(小端序):
|
|
234
|
+
| 状态数据 | 16位值 | 二进制 | 含义 |
|
|
235
|
+
|---------|--------|--------|------|
|
|
236
|
+
| 55 55 | 0x5555 | 01010101 01010101 | 全关 |
|
|
237
|
+
| 56 55 | 0x5556 | 01010101 01010110 | 第1路开 |
|
|
238
|
+
| 59 55 | 0x5559 | 01010101 01011001 | 第2路开 |
|
|
239
|
+
| 65 55 | 0x5565 | 01010101 01100101 | 第3路开 |
|
|
240
|
+
| 95 55 | 0x5595 | 01010101 10010101 | 第4路开 |
|
|
241
|
+
| 55 56 | 0x5655 | 01010110 01010101 | 第5路开 |
|
|
242
|
+
| 55 59 | 0x5955 | 01011001 01010101 | 第6路开 |
|
|
243
|
+
| 55 65 | 0x6555 | 01100101 01010101 | 第7路开 |
|
|
244
|
+
| 55 95 | 0x9555 | 10010101 01010101 | 第8路开 |
|
|
245
|
+
| AA AA | 0xAAAA | 10101010 10101010 | 全开 |
|
|
214
246
|
|
|
215
247
|
### 常用消息类型
|
|
216
248
|
|
|
217
249
|
| 消息类型 | 代码 | 数据格式 | 范围/说明 |
|
|
218
250
|
|---------|------|---------|----------|
|
|
219
|
-
| 开关状态 | 0x02 | 1
|
|
251
|
+
| 开关状态 | 0x02 | 1字节 | 1-4路开关,见上表 |
|
|
220
252
|
| 亮度 | 0x03 | 1字节 | 0-100% |
|
|
221
253
|
| 色温 | 0x04 | 1字节 | 0%=暖白, 100%=冷白 |
|
|
222
254
|
| 窗帘动作 | 0x05 | 1字节 | 1=开/2=关/3=停 |
|
|
223
255
|
| 窗帘位置 | 0x06 | 1字节 | 0-100% |
|
|
224
256
|
| 人体感应 | 0x0C | 1字节 | 0=无活动/1=检测到 |
|
|
225
257
|
| 插卡状态 | 0x0E | 1字节 | 0=无卡/1=有卡 |
|
|
226
|
-
|
|
|
227
|
-
| 当前温度 | 0x16 | 2字节LE | 温度*100
|
|
228
|
-
| 目标温度 | 0x1B |
|
|
258
|
+
| 湿度 | 0x17 | 1字节 | 0-100% |
|
|
259
|
+
| 当前温度 | 0x16 | 2字节LE | 温度*100(如2500=25.00°C)|
|
|
260
|
+
| 目标温度 | 0x1B | 1字节 | 16-30°C(直接温度值)|
|
|
229
261
|
| 风速 | 0x1C | 1字节 | 1=高/2=中/3=低/4=自动 |
|
|
230
262
|
| 模式 | 0x1D | 1字节 | 1=制冷/2=制热/3=送风/4=除湿 |
|
|
231
|
-
| 6
|
|
263
|
+
| 6-8路开关 | 0x45 | 2字节LE | 多路开关状态,见上表 |
|
|
264
|
+
| 五色RGB | 0x4C | 5字节 | R/G/B/WW/CW (各0-255) |
|
|
232
265
|
|
|
233
266
|
## MQTT主题结构
|
|
234
267
|
|
|
@@ -272,180 +305,118 @@ symi_mesh/[mac_clean]/[entity]/set
|
|
|
272
305
|
|
|
273
306
|
本节点支持与`node-red-contrib-knx-ultimate`完整双向同步,实现Symi Mesh设备与KNX系统的互联互通。
|
|
274
307
|
|
|
275
|
-
###
|
|
308
|
+
### 方式一:KNX桥接节点(推荐)
|
|
276
309
|
|
|
277
|
-
|
|
310
|
+
**v1.6.7新增**:使用`symi-knx-bridge`节点实现一站式配置,支持KNX实体导入和批量映射。
|
|
311
|
+
|
|
312
|
+
#### 功能特点
|
|
313
|
+
|
|
314
|
+
- **KNX实体库**:导入KNX组地址,快速选择实体
|
|
315
|
+
- **一行映射**:紧凑表格,适合大量设备映射
|
|
316
|
+
- **多设备类型**:开关、调光灯、窗帘、空调、新风、地暖
|
|
317
|
+
- **双向同步**:自动处理Mesh↔KNX状态同步
|
|
318
|
+
- **防死循环**:内置1.5秒防抖机制
|
|
319
|
+
|
|
320
|
+
#### 配置步骤
|
|
321
|
+
|
|
322
|
+
1. **安装KNX节点**
|
|
278
323
|
```bash
|
|
279
324
|
cd ~/.node-red
|
|
280
325
|
npm install node-red-contrib-knx-ultimate
|
|
281
326
|
```
|
|
282
327
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
- 菜单 → 导入 → 选择文件
|
|
286
|
-
- 导入 `examples/knx-sync-example.json`
|
|
287
|
-
- 修改网关IP地址和设备MAC地址
|
|
288
|
-
- 修改KNX组地址匹配您的系统
|
|
289
|
-
|
|
290
|
-
#### 3. 设备类型映射
|
|
291
|
-
|
|
292
|
-
| Symi设备 | KNX类型 | DPT | 说明 |
|
|
293
|
-
|---------|--------|-----|------|
|
|
294
|
-
| 开关 | 开关执行器 | 1.001 | 布尔开关 |
|
|
295
|
-
| 双色调光 | 调光执行器 | 1.001 + 5.001 | 开关+亮度(0-255) |
|
|
296
|
-
| 五色调光 | RGB调光器 | 1.001 + 5.001 + 232.600 | 开关+亮度+RGB |
|
|
297
|
-
| 窗帘 | 窗帘执行器 | 1.008 + 5.001 | 上下+位置(0-255) |
|
|
298
|
-
| 温控器 | 空调控制器 | 1.001 + 9.001 + 20.102 | 开关+温度+模式 |
|
|
299
|
-
| 人体感应 | 移动传感器 | 1.002 | 布尔值 |
|
|
300
|
-
| 插卡取电 | 开关+传感器 | 1.001 + 1.002 | 开关+插卡检测 |
|
|
301
|
-
| 三合一-空调 | 空调控制器 | 1.001 + 9.001 + 20.102 | 开关+温度+模式 |
|
|
302
|
-
| 三合一-新风 | 风机控制器 | 1.001 + 5.001 | 开关+风速 |
|
|
303
|
-
| 三合一-地暖 | 地暖控制器 | 1.001 + 9.001 | 开关+温度 |
|
|
304
|
-
|
|
305
|
-
### 同步逻辑
|
|
306
|
-
|
|
307
|
-
#### Symi → KNX(状态反馈)
|
|
308
|
-
1. Symi设备状态变化
|
|
309
|
-
2. symi-device节点输出状态
|
|
310
|
-
3. function节点转换格式
|
|
311
|
-
4. knxUltimate-out发送到KNX总线
|
|
312
|
-
|
|
313
|
-
#### KNX → Symi(远程控制)
|
|
314
|
-
1. KNX总线命令
|
|
315
|
-
2. knxUltimate-in接收命令
|
|
316
|
-
3. function节点转换为MQTT格式
|
|
317
|
-
4. mqtt-out发送到symi_mesh topic
|
|
318
|
-
5. symi-mqtt节点处理并控制设备
|
|
319
|
-
|
|
320
|
-
### 转换函数示例
|
|
321
|
-
|
|
322
|
-
#### 开关转换
|
|
323
|
-
```javascript
|
|
324
|
-
// Symi→KNX
|
|
325
|
-
const value = msg.payload ? 1 : 0;
|
|
326
|
-
msg.destination = '1/1/1';
|
|
327
|
-
return msg;
|
|
328
|
-
|
|
329
|
-
// KNX→Symi
|
|
330
|
-
const mac = 'device_mac_clean';
|
|
331
|
-
return {
|
|
332
|
-
topic: `symi_mesh/${mac}/switch/set`,
|
|
333
|
-
payload: msg.payload === 1 ? 'ON' : 'OFF'
|
|
334
|
-
};
|
|
335
|
-
```
|
|
328
|
+
2. **添加KNX桥接节点**
|
|
329
|
+
从"Symi Mesh"分类中拖入"KNX桥接"节点
|
|
336
330
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const brightness = Math.round(msg.payload.brightness * 255 / 100);
|
|
341
|
-
msg.destination = '2/1/2';
|
|
342
|
-
msg.dpt = '5.001';
|
|
343
|
-
return msg;
|
|
344
|
-
|
|
345
|
-
// KNX→Symi
|
|
346
|
-
return {
|
|
347
|
-
topic: `symi_mesh/${mac}/light/set`,
|
|
348
|
-
payload: JSON.stringify({
|
|
349
|
-
brightness: msg.payload // 0-255
|
|
350
|
-
})
|
|
351
|
-
};
|
|
352
|
-
```
|
|
331
|
+
3. **导入KNX实体**
|
|
332
|
+
- 点击"下载模板"获取导入格式
|
|
333
|
+
- 填写KNX组地址后点击"导入"
|
|
353
334
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
// KNX→Symi
|
|
363
|
-
return {
|
|
364
|
-
topic: `symi_mesh/${mac}/cover/position/set`,
|
|
365
|
-
payload: Math.round(msg.payload * 100 / 255).toString()
|
|
366
|
-
};
|
|
335
|
+
4. **添加映射**
|
|
336
|
+
- 点击"添加"按钮
|
|
337
|
+
- 选择Mesh设备和KNX实体
|
|
338
|
+
- 开关设备可选择通道
|
|
339
|
+
|
|
340
|
+
5. **连接KNX节点**
|
|
341
|
+
```
|
|
342
|
+
[knxUltimate-in] → [symi-knx-bridge] → [knxUltimate-out]
|
|
367
343
|
```
|
|
368
344
|
|
|
369
|
-
####
|
|
345
|
+
#### KNX实体导入格式
|
|
370
346
|
|
|
371
|
-
|
|
372
|
-
```javascript
|
|
373
|
-
// Symi→KNX (温度)
|
|
374
|
-
msg.destination = '4/1/1';
|
|
375
|
-
msg.dpt = '9.001';
|
|
376
|
-
msg.payload = parseFloat(msg.payload.temp);
|
|
377
|
-
return msg;
|
|
378
|
-
|
|
379
|
-
// KNX→Symi (温度)
|
|
380
|
-
return {
|
|
381
|
-
topic: `symi_mesh/${mac}/climate/target_temp/set`,
|
|
382
|
-
payload: msg.payload.toString()
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
// Symi→KNX (模式)
|
|
386
|
-
const modeMap = { 'cool': 1, 'heat': 2, 'fan_only': 3, 'dry': 4 };
|
|
387
|
-
msg.destination = '4/1/2';
|
|
388
|
-
msg.dpt = '20.102';
|
|
389
|
-
msg.payload = modeMap[msg.payload.mode] || 0;
|
|
390
|
-
return msg;
|
|
391
|
-
|
|
392
|
-
// KNX→Symi (模式)
|
|
393
|
-
const modes = ['off', 'cool', 'heat', 'fan_only', 'dry'];
|
|
394
|
-
return {
|
|
395
|
-
topic: `symi_mesh/${mac}/climate/mode/set`,
|
|
396
|
-
payload: modes[msg.payload] || 'off'
|
|
397
|
-
};
|
|
347
|
+
Tab分隔,每行一个实体:
|
|
398
348
|
```
|
|
399
|
-
|
|
400
|
-
##### 新风转换
|
|
401
|
-
```javascript
|
|
402
|
-
// Symi→KNX (开关)
|
|
403
|
-
msg.destination = '4/2/1';
|
|
404
|
-
msg.dpt = '1.001';
|
|
405
|
-
msg.payload = msg.payload.switch ? 1 : 0;
|
|
406
|
-
return msg;
|
|
407
|
-
|
|
408
|
-
// KNX→Symi (开关)
|
|
409
|
-
return {
|
|
410
|
-
topic: `symi_mesh/${mac}/fresh_air/set`,
|
|
411
|
-
payload: msg.payload === 1 ? 'ON' : 'OFF'
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
// Symi→KNX (风速)
|
|
415
|
-
msg.destination = '4/2/2';
|
|
416
|
-
msg.dpt = '5.001';
|
|
417
|
-
msg.payload = Math.round(msg.payload.speed * 2.55);
|
|
418
|
-
return msg;
|
|
419
|
-
|
|
420
|
-
// KNX→Symi (风速)
|
|
421
|
-
return {
|
|
422
|
-
topic: `symi_mesh/${mac}/fresh_air/speed/set`,
|
|
423
|
-
payload: Math.round(msg.payload / 2.55).toString()
|
|
424
|
-
};
|
|
349
|
+
名称 类型 命令地址 状态地址 扩展1 扩展2 扩展3
|
|
425
350
|
```
|
|
426
351
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
352
|
+
支持的类型和地址字段:
|
|
353
|
+
| 类型 | 字段 | 说明 |
|
|
354
|
+
|------|------|------|
|
|
355
|
+
| switch | 命令, 状态 | 开关 DPT1.001 |
|
|
356
|
+
| light_mono | 命令, 状态, 亮度 | 单色调光 |
|
|
357
|
+
| light_cct | 命令, 状态, 亮度, 色温 | 双色调光 |
|
|
358
|
+
| light_rgb | 命令, 状态, 亮度, RGB | RGB调光 |
|
|
359
|
+
| light_rgbcw | 命令, 状态, 亮度, 色温, RGB | RGBCW |
|
|
360
|
+
| cover | 上下, 位置, 停止 | 窗帘 |
|
|
361
|
+
| climate | 开关, 温度, 模式, 风速, 当前温度 | 空调 |
|
|
362
|
+
| fresh_air | 开关, 风速 | 新风 |
|
|
363
|
+
| floor_heating | 开关, 温度, 当前温度 | 地暖 |
|
|
364
|
+
|
|
365
|
+
示例:
|
|
366
|
+
```
|
|
367
|
+
玄关射灯 switch 1/1/28 1/2/28
|
|
368
|
+
客厅吊灯 light_cct 1/1/10 1/2/10 1/3/10 1/4/10
|
|
369
|
+
客厅布帘 cover 2/1/5 2/2/5 2/3/5
|
|
370
|
+
主卧空调 climate 3/1/1 3/2/1 3/3/1 3/4/1 3/5/1
|
|
440
371
|
```
|
|
441
372
|
|
|
442
|
-
|
|
373
|
+
#### 输入/输出
|
|
374
|
+
|
|
375
|
+
- **输入**:接收来自`knxUltimate-in`节点的KNX消息
|
|
376
|
+
- **输出1**:发送到`knxUltimate-out`节点的KNX命令
|
|
377
|
+
- **输出2**:调试信息(连接Debug节点查看同步过程)
|
|
378
|
+
|
|
379
|
+
#### knxUltimate节点配置(关键)
|
|
380
|
+
|
|
381
|
+
**输入节点(knxUltimate-in)**:
|
|
382
|
+
| 配置项 | 值 | 说明 |
|
|
383
|
+
|-------|-----|------|
|
|
384
|
+
| Listen to all GA | 勾选 | 必须,否则收不到消息 |
|
|
385
|
+
| Telegram type | 写入 | 接收写入命令 |
|
|
386
|
+
| Notify on write | 勾选 | 接收写入事件 |
|
|
387
|
+
| Notify on response | 勾选 | 接收响应事件 |
|
|
388
|
+
| RBE过滤 | 禁用 | 确保所有消息通过 |
|
|
443
389
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
390
|
+
**输出节点(knxUltimate-out)**:
|
|
391
|
+
| 配置项 | 值 | 说明 |
|
|
392
|
+
|-------|-----|------|
|
|
393
|
+
| Listen to all GA | 勾选 | **必须**,Universal Mode |
|
|
394
|
+
| topic | 留空 | 桥接节点动态设置 |
|
|
395
|
+
| 数据类型 | 0 (自动) | 桥接节点动态设置 |
|
|
396
|
+
| Output type | Write | 写入模式 |
|
|
397
|
+
| RBE过滤 | 禁用 | 确保每次都发送 |
|
|
398
|
+
|
|
399
|
+
> 示例配置见`examples/knx-sync-example.json`
|
|
400
|
+
|
|
401
|
+
#### 注意事项
|
|
402
|
+
|
|
403
|
+
1. **20秒初始化延迟**:部署后前20秒不同步,等待Mesh设备发现完成
|
|
404
|
+
2. **首次状态缓存**:启动后第一次状态仅缓存,第二次操作才会同步
|
|
405
|
+
3. **防死循环**:KNX控制后1秒内,Mesh状态变化不会反向同步
|
|
406
|
+
|
|
407
|
+
#### 故障排查
|
|
408
|
+
|
|
409
|
+
**Mesh->KNX不工作**:
|
|
410
|
+
1. 检查日志是否有`[Mesh->KNX]`输出
|
|
411
|
+
2. 确认映射中的MAC地址与设备列表中的MAC一致
|
|
412
|
+
3. 等待20秒初始化完成
|
|
413
|
+
4. 手动操作Mesh设备,观察日志
|
|
414
|
+
|
|
415
|
+
**KNX->Mesh不工作**:
|
|
416
|
+
1. 检查knxUltimate-in节点是否收到KNX消息
|
|
417
|
+
2. 确认KNX组地址与映射中的命令地址一致
|
|
418
|
+
3. 查看日志是否有`[KNX输入]`输出
|
|
419
|
+
4. 如果显示`未找到映射`,检查配置的组地址
|
|
449
420
|
|
|
450
421
|
## RS485/Modbus双向同步
|
|
451
422
|
|
|
@@ -531,10 +502,35 @@ Mesh 四键开关 第2路 ↔ RS485 六键开关 第5路 地址:2 ✓ 支持
|
|
|
531
502
|
|-------------|--------------|---------|
|
|
532
503
|
| 开关-按键N | 开关 | 开/关状态 |
|
|
533
504
|
| 温控器 | 空调 | 开关、温度、模式、风速 |
|
|
505
|
+
| 三合一面板 | 空调+新风+地暖 | 分别配置,独立同步 |
|
|
534
506
|
| 调光灯 | 调光器 | 开关、亮度 |
|
|
535
507
|
|
|
536
508
|
**部分同步**:如果RS485协议不提供某些功能点,只同步双方都支持的内容
|
|
537
509
|
|
|
510
|
+
### 三合一面板配置
|
|
511
|
+
|
|
512
|
+
三合一面板(温控器类型)可同时控制空调、新风、地暖,需要创建3个独立映射:
|
|
513
|
+
|
|
514
|
+
#### 配置示例(话语前湾协议)
|
|
515
|
+
|
|
516
|
+
| Mesh设备 | RS485设备类型 | 从机地址 | 说明 |
|
|
517
|
+
|---------|--------------|---------|------|
|
|
518
|
+
| 三合一面板_xxx | 次卧1空调 | 0 | 空调寄存器0x0FA4-0x0FA7 |
|
|
519
|
+
| 三合一面板_xxx | 新风 | 60 | 开关0x0039,风速0x004B |
|
|
520
|
+
| 三合一面板_xxx | 次卧1地暖 | 62 | 开关0x0039,温度0x0043 |
|
|
521
|
+
|
|
522
|
+
#### 话语前湾地暖/新风从机地址
|
|
523
|
+
|
|
524
|
+
| 设备 | 从机地址 | 十六进制 |
|
|
525
|
+
|------|---------|---------|
|
|
526
|
+
| 客餐厅地暖 | 60 | 0x3C |
|
|
527
|
+
| 新风 | 60 | 0x3C |
|
|
528
|
+
| 主卧地暖 | 61 | 0x3D |
|
|
529
|
+
| 次卧1地暖 | 62 | 0x3E |
|
|
530
|
+
| 次卧2地暖 | 63 | 0x3F |
|
|
531
|
+
|
|
532
|
+
> **注意**:新风和客餐厅地暖共用从机地址60,但开关值不同(新风开=1,地暖开=2),请分别创建映射。
|
|
533
|
+
|
|
538
534
|
### 内置协议支持
|
|
539
535
|
|
|
540
536
|
| 品牌 | 支持设备 |
|
|
@@ -847,150 +843,17 @@ A: 每个房间部署一个云端同步节点,配置对应的酒店ID和房间
|
|
|
847
843
|
3. 确认场景ID是否正确
|
|
848
844
|
4. 检查网关连接是否正常
|
|
849
845
|
|
|
850
|
-
##
|
|
851
|
-
|
|
852
|
-
### 网关连接失败
|
|
853
|
-
|
|
854
|
-
**症状**: 日志显示连接错误
|
|
855
|
-
|
|
856
|
-
**解决方法**:
|
|
857
|
-
1. 检查网关IP和端口(默认4196)
|
|
858
|
-
2. 确认网关电源和网络正常
|
|
859
|
-
3. 尝试ping网关IP
|
|
860
|
-
4. 检查防火墙设置
|
|
861
|
-
|
|
862
|
-
### 设备不显示
|
|
846
|
+
## 节点概览
|
|
863
847
|
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
**症状**: 控制正常但状态不更新
|
|
875
|
-
|
|
876
|
-
**解决方法**:
|
|
877
|
-
1. 检查日志中是否有`[状态事件]`
|
|
878
|
-
2. 确认0x80事件正常接收
|
|
879
|
-
3. 验证设备MAC地址和网络地址映射
|
|
880
|
-
4. 重启网关和Node-RED
|
|
881
|
-
|
|
882
|
-
### 控制无响应
|
|
883
|
-
|
|
884
|
-
**症状**: HA发送命令但设备不动作
|
|
885
|
-
|
|
886
|
-
**解决方法**:
|
|
887
|
-
1. 检查MQTT命令是否发送(查看Node-RED日志)
|
|
888
|
-
2. 确认网络地址正确
|
|
889
|
-
3. 查看是否有`[控制响应] 0xB0`
|
|
890
|
-
4. 尝试手动发送控制命令测试
|
|
891
|
-
|
|
892
|
-
### 常见日志说明
|
|
893
|
-
|
|
894
|
-
```
|
|
895
|
-
[INFO] Gateway connected - 网关连接成功
|
|
896
|
-
[INFO] Device discovery complete - 设备发现完成
|
|
897
|
-
[INFO] [TCP Frame] 接收: 53 80 ... - 状态事件接收
|
|
898
|
-
[INFO] [状态事件] 地址=0x... - 设备状态解析成功
|
|
899
|
-
[INFO] MQTT已连接 - MQTT连接成功
|
|
900
|
-
[INFO] 发布设备 XXX - 设备发布到MQTT
|
|
901
|
-
[WARN] 未找到topic订阅 - MQTT订阅问题
|
|
902
|
-
[ERROR] Connection refused - 连接被拒绝
|
|
903
|
-
```
|
|
904
|
-
|
|
905
|
-
## 节点说明
|
|
906
|
-
|
|
907
|
-
### Symi Gateway(网关配置节点)
|
|
908
|
-
|
|
909
|
-
配置节点,管理与Symi蓝牙Mesh网关的连接。
|
|
910
|
-
|
|
911
|
-
**配置项**:
|
|
912
|
-
- MQTT配置:选择MQTT配置节点(用于Home Assistant Discovery)
|
|
913
|
-
- 连接类型:TCP或串口
|
|
914
|
-
- TCP模式:IP地址和端口(默认4196)
|
|
915
|
-
- 串口模式:串口路径和波特率(默认115200)
|
|
916
|
-
|
|
917
|
-
**功能**:
|
|
918
|
-
- 自动设备发现
|
|
919
|
-
- 状态事件处理
|
|
920
|
-
- 自动重连机制
|
|
921
|
-
|
|
922
|
-
### Symi MQTT(MQTT桥接节点)
|
|
923
|
-
|
|
924
|
-
将Symi设备桥接到MQTT broker,实现Home Assistant Discovery。
|
|
925
|
-
|
|
926
|
-
**配置项**:
|
|
927
|
-
- MQTT Broker地址
|
|
928
|
-
- 用户名/密码(可选)
|
|
929
|
-
- Discovery前缀(默认homeassistant)
|
|
930
|
-
|
|
931
|
-
**功能**:
|
|
932
|
-
- 自动发布Discovery配置
|
|
933
|
-
- 双向MQTT消息处理
|
|
934
|
-
- 设备状态同步
|
|
935
|
-
|
|
936
|
-
### Symi Device(设备控制节点)
|
|
937
|
-
|
|
938
|
-
用于Flow中直接控制和监听Symi设备状态。
|
|
939
|
-
|
|
940
|
-
**配置项**:
|
|
941
|
-
- 设备MAC地址
|
|
942
|
-
- 通道选择(多路开关)
|
|
943
|
-
- 子实体(三合一设备)
|
|
944
|
-
|
|
945
|
-
**功能**:
|
|
946
|
-
- 接收设备状态变化
|
|
947
|
-
- 发送控制命令
|
|
948
|
-
- 支持KNX双向同步
|
|
949
|
-
|
|
950
|
-
### Symi Cloud Sync(云端同步节点)
|
|
951
|
-
|
|
952
|
-
从酒店云云平台同步设备名称和场景信息到本地。
|
|
953
|
-
|
|
954
|
-
**配置项**:
|
|
955
|
-
- 网关:选择已配置的网关节点(自动使用网关中配置的MQTT)
|
|
956
|
-
- App ID / App Secret:云端API认证信息(已预填)
|
|
957
|
-
- 酒店ID / 房间号:指定要同步的房间(支持下拉选择或手动输入)
|
|
958
|
-
- 设备列表:显示云端设备列表(含按键名称),支持一键全选
|
|
959
|
-
- 场景列表:显示云端场景列表,支持一键全选
|
|
960
|
-
- 自动同步:启动时自动从云端获取数据
|
|
961
|
-
|
|
962
|
-
**功能**:
|
|
963
|
-
- 启动时自动从云端获取设备名称和场景列表
|
|
964
|
-
- 根据MAC地址精确匹配本地设备并更新名称(云端MAC地址自动反转匹配)
|
|
965
|
-
- 支持开关设备的按键名称同步(1-6键的sub_device名称)
|
|
966
|
-
- 云端"未命名"设备自动保留设备类型标准名称(如"智能窗帘"、"零火开关"等)
|
|
967
|
-
- 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
|
|
968
|
-
- 自动重新发布MQTT Discovery配置(使用云端名称)
|
|
969
|
-
- HA实体名称为纯名称,不带MAC地址和ID
|
|
970
|
-
- 将选中的场景发布为Home Assistant按钮实体
|
|
971
|
-
- 在HA中点击场景按钮即可触发本地场景执行(使用0x31协议)
|
|
972
|
-
- 场景触发通过事件机制路由,确保可靠执行
|
|
973
|
-
- 数据持久化存储,获取失败时使用缓存
|
|
974
|
-
- 支持手动触发同步(发送 `msg.payload = "sync"`)
|
|
975
|
-
- 支持场景调用(发送 `msg.payload = { scene_id: 4 }`)
|
|
976
|
-
|
|
977
|
-
**使用场景**:
|
|
978
|
-
- 酒店项目:自动同步房间设备的本地化名称
|
|
979
|
-
- 场景管理:将云端场景发布到Home Assistant进行控制
|
|
980
|
-
- 批量部署:统一管理多个房间的设备名称和场景
|
|
981
|
-
|
|
982
|
-
**注意事项**:
|
|
983
|
-
- 仅在启动/部署时获取一次,不会持续轮询
|
|
984
|
-
- 云端MAC地址自动反转匹配本地设备(云端存储为反序)
|
|
985
|
-
- 云端"未命名"设备自动保留设备类型标准名称
|
|
986
|
-
- 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
|
|
987
|
-
- 勾选的设备和场景才会同步,未勾选则同步全部(支持一键全选)
|
|
988
|
-
- 场景按钮发布到HA后,点击即可触发本地场景执行(0x34协议)
|
|
989
|
-
- 场景执行是本地化控制,不经过云端
|
|
990
|
-
- 场景执行后,所有相关设备状态自动同步到HA(队列处理,确保可靠)
|
|
991
|
-
- 按键名称会同步到MQTT实体名称,MAC地址仍作为唯一ID
|
|
992
|
-
- 获取失败时自动使用上次缓存的数据
|
|
993
|
-
- 可以禁用节点,不影响其他功能正常运行
|
|
848
|
+
| 节点 | 用途 | 详见章节 |
|
|
849
|
+
|-----|------|---------|
|
|
850
|
+
| **Symi Gateway** | 网关连接(TCP/串口) | [快速开始](#快速开始) |
|
|
851
|
+
| **Symi MQTT** | MQTT桥接,设备发布到HA | [快速开始](#快速开始) |
|
|
852
|
+
| **Symi Device** | Flow中单设备控制/监听 | 可用于KNX/自定义同步 |
|
|
853
|
+
| **Symi Cloud Sync** | 云端同步设备名称和场景 | [云端数据同步](#云端数据同步) |
|
|
854
|
+
| **Symi RS485 Bridge** | RS485设备双向同步 | [RS485/Modbus双向同步](#rs485modbus双向同步) |
|
|
855
|
+
| **Symi KNX Bridge** | KNX系统双向同步 | [KNX双向同步](#knx双向同步) |
|
|
856
|
+
| **RS485 Debug** | RS485总线数据抓包调试 | [RS485调试节点](#rs485调试节点) |
|
|
994
857
|
|
|
995
858
|
## 开发者信息
|
|
996
859
|
|
|
@@ -1007,9 +870,16 @@ node-red-contrib-symi-mesh/
|
|
|
1007
870
|
├── nodes/
|
|
1008
871
|
│ ├── symi-gateway.js/html # 网关配置节点
|
|
1009
872
|
│ ├── symi-mqtt.js/html # MQTT节点
|
|
1010
|
-
│
|
|
873
|
+
│ ├── symi-device.js/html # 设备控制节点
|
|
874
|
+
│ ├── symi-cloud-sync.js/html # 云端同步节点
|
|
875
|
+
│ ├── symi-485-bridge.js/html # RS485桥接节点
|
|
876
|
+
│ ├── symi-485-config.js/html # RS485配置节点
|
|
877
|
+
│ ├── symi-knx-bridge.js/html # KNX桥接节点
|
|
878
|
+
│ └── rs485-debug.js/html # RS485调试节点
|
|
1011
879
|
├── examples/
|
|
1012
|
-
│
|
|
880
|
+
│ ├── basic-example.json # 基础示例
|
|
881
|
+
│ ├── knx-sync-example.json # KNX Function节点示例
|
|
882
|
+
│ └── knx-bridge-example.json # KNX桥接节点示例
|
|
1013
883
|
├── LICENSE
|
|
1014
884
|
├── README.md
|
|
1015
885
|
└── package.json
|
|
@@ -1035,6 +905,35 @@ node-red-contrib-symi-mesh/
|
|
|
1035
905
|
- 测试所有更改
|
|
1036
906
|
- 更新README(如需要)
|
|
1037
907
|
|
|
908
|
+
## 技术栈兼容性
|
|
909
|
+
|
|
910
|
+
### 版本要求
|
|
911
|
+
|
|
912
|
+
| 组件 | 最低版本 | 推荐版本 | 说明 |
|
|
913
|
+
|------|---------|---------|------|
|
|
914
|
+
| Node-RED | ≥3.0.0 | 4.0+ | 支持最新API |
|
|
915
|
+
| Node.js | ≥18.0.0 | 22.x LTS | 官方推荐LTS版本 |
|
|
916
|
+
| MQTT Broker | 任意 | Mosquitto 2.x | 支持MQTT 3.1.1+ |
|
|
917
|
+
|
|
918
|
+
### Node.js 18+ 兼容性
|
|
919
|
+
|
|
920
|
+
本项目已针对Node.js 18+进行优化:
|
|
921
|
+
|
|
922
|
+
- **AggregateError处理**:全局异常处理器捕获`AggregateError`,防止崩溃
|
|
923
|
+
- **Happy Eyeballs禁用**:通过`net.setDefaultAutoSelectFamily(false)`禁用
|
|
924
|
+
- **强制IPv4连接**:TCP连接使用`family: 4`参数,避免IPv6连接超时
|
|
925
|
+
- **网络异常恢复**:自动捕获`ECONNREFUSED`、`ETIMEDOUT`等网络错误
|
|
926
|
+
|
|
927
|
+
### 代码质量
|
|
928
|
+
|
|
929
|
+
经2025-12-10代码审查确认:
|
|
930
|
+
- 遵循Node-RED节点开发规范
|
|
931
|
+
- 使用标准日志接口(`node.log()`、`node.error()`等)
|
|
932
|
+
- 正确处理节点关闭事件,清理事件监听器防止内存泄漏
|
|
933
|
+
- 无未处理的Promise rejection
|
|
934
|
+
- 无TODO/FIXME/HACK标记
|
|
935
|
+
- 代码无重复,模块化设计
|
|
936
|
+
|
|
1038
937
|
## 技术支持
|
|
1039
938
|
|
|
1040
939
|
如遇问题,请提供以下信息:
|
|
@@ -1059,8 +958,112 @@ node-red-contrib-symi-mesh/
|
|
|
1059
958
|
- MQTT日志(如相关)
|
|
1060
959
|
- 网关串口日志(如可用)
|
|
1061
960
|
|
|
961
|
+
## 常见问题排查
|
|
962
|
+
|
|
963
|
+
### MQTT连接失败
|
|
964
|
+
|
|
965
|
+
**问题**:节点状态显示"Broker不可用"或"连接失败"
|
|
966
|
+
|
|
967
|
+
**排查步骤**:
|
|
968
|
+
|
|
969
|
+
1. **检查MQTT Broker地址配置**
|
|
970
|
+
```
|
|
971
|
+
# Docker部署时使用容器名
|
|
972
|
+
mqttBroker: mqtt://mosquitto:1883
|
|
973
|
+
|
|
974
|
+
# 本地安装时使用localhost
|
|
975
|
+
mqttBroker: mqtt://localhost:1883
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
2. **确认MQTT Broker运行状态**
|
|
979
|
+
```bash
|
|
980
|
+
# Docker方式
|
|
981
|
+
docker ps | grep mosquitto
|
|
982
|
+
docker start mosquitto # 如未运行
|
|
983
|
+
|
|
984
|
+
# Homebrew方式(macOS)
|
|
985
|
+
brew services list | grep mosquitto
|
|
986
|
+
brew services start mosquitto
|
|
987
|
+
|
|
988
|
+
# 测试连接
|
|
989
|
+
nc -zv localhost 1883
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
3. **检查防火墙/网络**
|
|
993
|
+
- 确保1883端口未被占用或阻断
|
|
994
|
+
- 如使用Docker,确保网络配置正确
|
|
995
|
+
|
|
996
|
+
### 网关连接失败
|
|
997
|
+
|
|
998
|
+
**问题**:节点状态显示"连接失败"或频繁重连
|
|
999
|
+
|
|
1000
|
+
**排查步骤**:
|
|
1001
|
+
|
|
1002
|
+
1. 确认网关IP地址和端口(默认4196)
|
|
1003
|
+
2. 使用`ping`测试网络连通性
|
|
1004
|
+
3. 检查网关是否开启TCP服务模式
|
|
1005
|
+
4. 查看Node-RED日志中的详细错误信息
|
|
1006
|
+
|
|
1007
|
+
### 设备状态不同步
|
|
1008
|
+
|
|
1009
|
+
**问题**:HA中设备状态与实际不一致
|
|
1010
|
+
|
|
1011
|
+
**排查步骤**:
|
|
1012
|
+
|
|
1013
|
+
1. 检查网关节点是否显示"已连接"
|
|
1014
|
+
2. 检查MQTT节点是否显示"已连接"
|
|
1015
|
+
3. 在Node-RED调试面板查看是否收到设备状态事件
|
|
1016
|
+
4. 确认MQTT Broker中的topic消息是否正确
|
|
1017
|
+
|
|
1062
1018
|
## 更新日志
|
|
1063
1019
|
|
|
1020
|
+
### v1.6.7 (2025-12-10)
|
|
1021
|
+
- **KNX双向同步完善**:`symi-knx-bridge`节点全面升级
|
|
1022
|
+
- **knxUltimate消息格式**:符合官方规范,使用`destination`+`payload`+`dpt`+`event`
|
|
1023
|
+
- **Universal Mode支持**:输出节点需启用"Listen to all GA",动态设置组地址
|
|
1024
|
+
- **消息事件**:添加`event: "GroupValue_Write"`,确保写入操作正确执行
|
|
1025
|
+
- **payload类型修复**:DPT 1.001使用boolean类型(true/false),不是number
|
|
1026
|
+
- **地址映射修复**:根据设备类型正确映射扩展地址到具体功能
|
|
1027
|
+
- **KNX输入匹配增强**:支持所有配置地址的匹配,通过地址函数确定功能类型
|
|
1028
|
+
- **DPT格式兼容**:支持"DPT1.001"和"1.001"两种格式
|
|
1029
|
+
- **新增处理器**:色温(light_color_temp)、空调风速(climate_fan)
|
|
1030
|
+
- **防死循环**:1秒防抖机制,智能防止状态回环
|
|
1031
|
+
- **命令队列**:最大100条,100ms防抖,50ms间隔
|
|
1032
|
+
- **内存安全**:节点关闭时清理所有缓存和事件监听器
|
|
1033
|
+
- **KNX桥接节点功能**:
|
|
1034
|
+
- KNX实体库:支持从模板导入KNX组地址
|
|
1035
|
+
- 一行映射:紧凑表格显示,适合大量设备配置
|
|
1036
|
+
- 多设备类型:开关、调光灯、窗帘、空调、新风、地暖
|
|
1037
|
+
- 智能通道选择:根据Mesh设备实际路数显示可选通道
|
|
1038
|
+
|
|
1039
|
+
### v1.6.6 (2025-12-09)
|
|
1040
|
+
- **三合一面板完整双向同步**:支持空调+新风+地暖独立RS485映射
|
|
1041
|
+
- 三合一0x94协议完整解析:空调(开关/模式/风速/温度)、地暖(开关/温度)、新风(开关/风速)
|
|
1042
|
+
- Mesh→RS485:三合一状态变化自动发送对应RS485帧
|
|
1043
|
+
- RS485→Mesh:RS485帧自动同步到三合一面板对应功能
|
|
1044
|
+
- 支持climateSwitch/climateMode/fanMode/floorHeatingSwitch/freshAirSwitch等字段
|
|
1045
|
+
- **开关双向同步修复**:修复米家App全开/全关只触发部分按键的问题
|
|
1046
|
+
- 命令队列防抖逻辑修复:只有完全相同映射才合并,不同映射独立处理
|
|
1047
|
+
- 支持同一Mesh设备多通道分别绑定不同RS485设备
|
|
1048
|
+
- **RS485多映射匹配**:修复同一从机地址多个映射时只匹配第一个的问题
|
|
1049
|
+
- findAllRS485Mappings返回所有匹配的映射
|
|
1050
|
+
- rs485Channel精确匹配:根据寄存器地址确定通道
|
|
1051
|
+
- **网络异常处理增强**:彻底修复Node.js 18+ AggregateError导致崩溃的问题
|
|
1052
|
+
- 全局uncaughtException/unhandledRejection处理器
|
|
1053
|
+
- TCP连接过程同步错误捕获
|
|
1054
|
+
- 只捕获网络相关错误,不影响其他异常
|
|
1055
|
+
- **三合一面板自动识别**:设备列表API返回isThreeInOne标志
|
|
1056
|
+
- **窗帘双协议兼容**:同时支持米家和小程序两种控制协议
|
|
1057
|
+
- 米家协议: `subOpcode=0x06, status: 0=打开中, 1=关闭中, 2=停止`
|
|
1058
|
+
- 小程序协议: `subOpcode=0x05, status: 1=打开, 2=关闭, 3=停止`
|
|
1059
|
+
- **话语前湾协议完善**:
|
|
1060
|
+
- 空调:客厅/主卧/次卧1/次卧2,寄存器0x0FA0-0x0FAF
|
|
1061
|
+
- 地暖:客餐厅(60)/主卧(61)/次卧1(62)/次卧2(63),寄存器0x0039/0x0043
|
|
1062
|
+
- 新风:从机60,开关0x0039(开=1),风速0x004B(高=2,低=0)
|
|
1063
|
+
- **地址输入修复**:允许从机地址为0(话语前湾空调地址是0)
|
|
1064
|
+
- **内存安全**:命令队列限制100条,节点关闭时清理所有缓存
|
|
1065
|
+
- **文档更新**:添加三合一面板RS485配置说明和协议对照表
|
|
1066
|
+
|
|
1064
1067
|
### v1.6.5 (2025-12-06)
|
|
1065
1068
|
- **杜亚窗帘协议**:原生支持杜亚窗帘协议(A6B6),2字节地址,自动CRC16计算
|
|
1066
1069
|
- 帧格式:55 [地址高] [地址低] 03 [动作/位置] [CRC16低] [CRC16高]
|
|
@@ -1078,25 +1081,6 @@ node-red-contrib-symi-mesh/
|
|
|
1078
1081
|
- **RS485调试增强**:新增协议测试发送功能
|
|
1079
1082
|
- **初始化延迟**:20秒,避免部署时误发命令
|
|
1080
1083
|
|
|
1081
|
-
### v1.6.4 (2025-12-05)
|
|
1082
|
-
- **代码优化**:移除未使用的 `three-in-one-detected` 事件监听器(死代码清理)
|
|
1083
|
-
- **TCP连接优化**:移除可能导致连接问题的keep-alive设置
|
|
1084
|
-
- **多从机支持修复**:修复只能配置从机ID1的问题,现在支持任意从机地址(1-255)
|
|
1085
|
-
- **映射数值类型修复**:确保address/meshChannel/rs485Channel字段为正确的数字类型
|
|
1086
|
-
|
|
1087
|
-
### v1.6.3 (2025-12-05)
|
|
1088
|
-
- **自定义协议模式**:支持任意RS485十六进制码双向匹配
|
|
1089
|
-
- **按键寄存器优化**:只处理按键寄存器(0x1031-0x1036),移除指示灯寄存器处理
|
|
1090
|
-
- **CRC校验正确**:发送帧与协议文档完全匹配
|
|
1091
|
-
|
|
1092
|
-
### v1.6.2 (2025-12-05)
|
|
1093
|
-
- **MQTT订阅修复**:修复闭包问题导致的设备MAC映射错误,确保HA实体可控
|
|
1094
|
-
- **内存泄漏修复**:节点关闭时正确移除gateway事件监听器,防止内存累积
|
|
1095
|
-
- **三合一面板完善**:空调/新风/地暖控制和状态反馈全面优化
|
|
1096
|
-
- **RS485双向同步**:支持Mesh与第三方485设备双向状态同步
|
|
1097
|
-
- **代码优化**:中文注释规范化,移除冗余代码,提升可维护性
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
1084
|
## 许可证
|
|
1101
1085
|
|
|
1102
1086
|
MIT License
|
|
@@ -1108,8 +1092,8 @@ Copyright (c) 2025 SYMI 亖米
|
|
|
1108
1092
|
## 关于
|
|
1109
1093
|
|
|
1110
1094
|
**作者**: SYMI 亖米
|
|
1111
|
-
**版本**: 1.6.
|
|
1095
|
+
**版本**: 1.6.7
|
|
1112
1096
|
**协议**: 蓝牙MESH网关(初级版)串口协议V1.0
|
|
1113
|
-
**最后更新**: 2025-12-
|
|
1097
|
+
**最后更新**: 2025-12-10
|
|
1114
1098
|
**仓库**: https://github.com/symi-daguo/node-red-contrib-symi-mesh
|
|
1115
1099
|
**npm包**: https://www.npmjs.com/package/node-red-contrib-symi-mesh
|