node-red-contrib-symi-mesh 1.6.6 → 1.6.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/README.md +233 -429
- package/examples/knx-sync-example.json +48 -410
- package/lib/device-manager.js +11 -3
- package/lib/tcp-client.js +6 -2
- package/nodes/symi-485-bridge.js +26 -27
- package/nodes/symi-485-config.js +38 -3
- package/nodes/symi-gateway.js +27 -20
- package/nodes/symi-knx-bridge.html +368 -0
- package/nodes/symi-knx-bridge.js +1110 -0
- package/nodes/symi-mqtt.js +52 -10
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -305,180 +305,118 @@ symi_mesh/[mac_clean]/[entity]/set
|
|
|
305
305
|
|
|
306
306
|
本节点支持与`node-red-contrib-knx-ultimate`完整双向同步,实现Symi Mesh设备与KNX系统的互联互通。
|
|
307
307
|
|
|
308
|
-
###
|
|
308
|
+
### 方式一:KNX桥接节点(推荐)
|
|
309
|
+
|
|
310
|
+
**v1.6.7新增**:使用`symi-knx-bridge`节点实现一站式配置,支持KNX实体导入和批量映射。
|
|
311
|
+
|
|
312
|
+
#### 功能特点
|
|
313
|
+
|
|
314
|
+
- **KNX实体库**:导入KNX组地址,快速选择实体
|
|
315
|
+
- **一行映射**:紧凑表格,适合大量设备映射
|
|
316
|
+
- **多设备类型**:开关、调光灯、窗帘、空调、新风、地暖
|
|
317
|
+
- **双向同步**:自动处理Mesh↔KNX状态同步
|
|
318
|
+
- **防死循环**:内置1.5秒防抖机制
|
|
309
319
|
|
|
310
|
-
####
|
|
320
|
+
#### 配置步骤
|
|
321
|
+
|
|
322
|
+
1. **安装KNX节点**
|
|
311
323
|
```bash
|
|
312
324
|
cd ~/.node-red
|
|
313
325
|
npm install node-red-contrib-knx-ultimate
|
|
314
326
|
```
|
|
315
327
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
- 菜单 → 导入 → 选择文件
|
|
319
|
-
- 导入 `examples/knx-sync-example.json`
|
|
320
|
-
- 修改网关IP地址和设备MAC地址
|
|
321
|
-
- 修改KNX组地址匹配您的系统
|
|
322
|
-
|
|
323
|
-
#### 3. 设备类型映射
|
|
324
|
-
|
|
325
|
-
| Symi设备 | KNX类型 | DPT | 说明 |
|
|
326
|
-
|---------|--------|-----|------|
|
|
327
|
-
| 开关 | 开关执行器 | 1.001 | 布尔开关 |
|
|
328
|
-
| 双色调光 | 调光执行器 | 1.001 + 5.001 | 开关+亮度(0-255) |
|
|
329
|
-
| 五色调光 | RGB调光器 | 1.001 + 5.001 + 232.600 | 开关+亮度+RGB |
|
|
330
|
-
| 窗帘 | 窗帘执行器 | 1.008 + 5.001 | 上下+位置(0-255) |
|
|
331
|
-
| 温控器 | 空调控制器 | 1.001 + 9.001 + 20.102 | 开关+温度+模式 |
|
|
332
|
-
| 人体感应 | 移动传感器 | 1.002 | 布尔值 |
|
|
333
|
-
| 插卡取电 | 开关+传感器 | 1.001 + 1.002 | 开关+插卡检测 |
|
|
334
|
-
| 三合一-空调 | 空调控制器 | 1.001 + 9.001 + 20.102 | 开关+温度+模式 |
|
|
335
|
-
| 三合一-新风 | 风机控制器 | 1.001 + 5.001 | 开关+风速 |
|
|
336
|
-
| 三合一-地暖 | 地暖控制器 | 1.001 + 9.001 | 开关+温度 |
|
|
337
|
-
|
|
338
|
-
### 同步逻辑
|
|
339
|
-
|
|
340
|
-
#### Symi → KNX(状态反馈)
|
|
341
|
-
1. Symi设备状态变化
|
|
342
|
-
2. symi-device节点输出状态
|
|
343
|
-
3. function节点转换格式
|
|
344
|
-
4. knxUltimate-out发送到KNX总线
|
|
345
|
-
|
|
346
|
-
#### KNX → Symi(远程控制)
|
|
347
|
-
1. KNX总线命令
|
|
348
|
-
2. knxUltimate-in接收命令
|
|
349
|
-
3. function节点转换为MQTT格式
|
|
350
|
-
4. mqtt-out发送到symi_mesh topic
|
|
351
|
-
5. symi-mqtt节点处理并控制设备
|
|
352
|
-
|
|
353
|
-
### 转换函数示例
|
|
354
|
-
|
|
355
|
-
#### 开关转换
|
|
356
|
-
```javascript
|
|
357
|
-
// Symi→KNX
|
|
358
|
-
const value = msg.payload ? 1 : 0;
|
|
359
|
-
msg.destination = '1/1/1';
|
|
360
|
-
return msg;
|
|
361
|
-
|
|
362
|
-
// KNX→Symi
|
|
363
|
-
const mac = 'device_mac_clean';
|
|
364
|
-
return {
|
|
365
|
-
topic: `symi_mesh/${mac}/switch/set`,
|
|
366
|
-
payload: msg.payload === 1 ? 'ON' : 'OFF'
|
|
367
|
-
};
|
|
368
|
-
```
|
|
328
|
+
2. **添加KNX桥接节点**
|
|
329
|
+
从"Symi Mesh"分类中拖入"KNX桥接"节点
|
|
369
330
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
const brightness = Math.round(msg.payload.brightness * 255 / 100);
|
|
374
|
-
msg.destination = '2/1/2';
|
|
375
|
-
msg.dpt = '5.001';
|
|
376
|
-
return msg;
|
|
377
|
-
|
|
378
|
-
// KNX→Symi
|
|
379
|
-
return {
|
|
380
|
-
topic: `symi_mesh/${mac}/light/set`,
|
|
381
|
-
payload: JSON.stringify({
|
|
382
|
-
brightness: msg.payload // 0-255
|
|
383
|
-
})
|
|
384
|
-
};
|
|
385
|
-
```
|
|
331
|
+
3. **导入KNX实体**
|
|
332
|
+
- 点击"下载模板"获取导入格式
|
|
333
|
+
- 填写KNX组地址后点击"导入"
|
|
386
334
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
// KNX→Symi
|
|
396
|
-
return {
|
|
397
|
-
topic: `symi_mesh/${mac}/cover/position/set`,
|
|
398
|
-
payload: Math.round(msg.payload * 100 / 255).toString()
|
|
399
|
-
};
|
|
335
|
+
4. **添加映射**
|
|
336
|
+
- 点击"添加"按钮
|
|
337
|
+
- 选择Mesh设备和KNX实体
|
|
338
|
+
- 开关设备可选择通道
|
|
339
|
+
|
|
340
|
+
5. **连接KNX节点**
|
|
341
|
+
```
|
|
342
|
+
[knxUltimate-in] → [symi-knx-bridge] → [knxUltimate-out]
|
|
400
343
|
```
|
|
401
344
|
|
|
402
|
-
####
|
|
345
|
+
#### KNX实体导入格式
|
|
403
346
|
|
|
404
|
-
|
|
405
|
-
```javascript
|
|
406
|
-
// Symi→KNX (温度)
|
|
407
|
-
msg.destination = '4/1/1';
|
|
408
|
-
msg.dpt = '9.001';
|
|
409
|
-
msg.payload = parseFloat(msg.payload.temp);
|
|
410
|
-
return msg;
|
|
411
|
-
|
|
412
|
-
// KNX→Symi (温度)
|
|
413
|
-
return {
|
|
414
|
-
topic: `symi_mesh/${mac}/climate/target_temp/set`,
|
|
415
|
-
payload: msg.payload.toString()
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
// Symi→KNX (模式)
|
|
419
|
-
const modeMap = { 'cool': 1, 'heat': 2, 'fan_only': 3, 'dry': 4 };
|
|
420
|
-
msg.destination = '4/1/2';
|
|
421
|
-
msg.dpt = '20.102';
|
|
422
|
-
msg.payload = modeMap[msg.payload.mode] || 0;
|
|
423
|
-
return msg;
|
|
424
|
-
|
|
425
|
-
// KNX→Symi (模式)
|
|
426
|
-
const modes = ['off', 'cool', 'heat', 'fan_only', 'dry'];
|
|
427
|
-
return {
|
|
428
|
-
topic: `symi_mesh/${mac}/climate/mode/set`,
|
|
429
|
-
payload: modes[msg.payload] || 'off'
|
|
430
|
-
};
|
|
347
|
+
Tab分隔,每行一个实体:
|
|
431
348
|
```
|
|
432
|
-
|
|
433
|
-
##### 新风转换
|
|
434
|
-
```javascript
|
|
435
|
-
// Symi→KNX (开关)
|
|
436
|
-
msg.destination = '4/2/1';
|
|
437
|
-
msg.dpt = '1.001';
|
|
438
|
-
msg.payload = msg.payload.switch ? 1 : 0;
|
|
439
|
-
return msg;
|
|
440
|
-
|
|
441
|
-
// KNX→Symi (开关)
|
|
442
|
-
return {
|
|
443
|
-
topic: `symi_mesh/${mac}/fresh_air/set`,
|
|
444
|
-
payload: msg.payload === 1 ? 'ON' : 'OFF'
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
// Symi→KNX (风速)
|
|
448
|
-
msg.destination = '4/2/2';
|
|
449
|
-
msg.dpt = '5.001';
|
|
450
|
-
msg.payload = Math.round(msg.payload.speed * 2.55);
|
|
451
|
-
return msg;
|
|
452
|
-
|
|
453
|
-
// KNX→Symi (风速)
|
|
454
|
-
return {
|
|
455
|
-
topic: `symi_mesh/${mac}/fresh_air/speed/set`,
|
|
456
|
-
payload: Math.round(msg.payload / 2.55).toString()
|
|
457
|
-
};
|
|
349
|
+
名称 类型 命令地址 状态地址 扩展1 扩展2 扩展3
|
|
458
350
|
```
|
|
459
351
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
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
|
|
473
371
|
```
|
|
474
372
|
|
|
475
|
-
|
|
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过滤 | 禁用 | 确保所有消息通过 |
|
|
389
|
+
|
|
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设备,观察日志
|
|
476
414
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
415
|
+
**KNX->Mesh不工作**:
|
|
416
|
+
1. 检查knxUltimate-in节点是否收到KNX消息
|
|
417
|
+
2. 确认KNX组地址与映射中的命令地址一致
|
|
418
|
+
3. 查看日志是否有`[KNX输入]`输出
|
|
419
|
+
4. 如果显示`未找到映射`,检查配置的组地址
|
|
482
420
|
|
|
483
421
|
## RS485/Modbus双向同步
|
|
484
422
|
|
|
@@ -905,275 +843,17 @@ A: 每个房间部署一个云端同步节点,配置对应的酒店ID和房间
|
|
|
905
843
|
3. 确认场景ID是否正确
|
|
906
844
|
4. 检查网关连接是否正常
|
|
907
845
|
|
|
908
|
-
##
|
|
846
|
+
## 节点概览
|
|
909
847
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
### 设备不显示
|
|
921
|
-
|
|
922
|
-
**症状**: MQTT连接正常但HA中无设备
|
|
923
|
-
|
|
924
|
-
**解决方法**:
|
|
925
|
-
1. 确认HA的MQTT集成已启用
|
|
926
|
-
2. 检查Discovery前缀是否正确(默认homeassistant)
|
|
927
|
-
3. 查看MQTT日志:`symi_mesh/#`
|
|
928
|
-
4. 重启Node-RED重新发布Discovery
|
|
929
|
-
|
|
930
|
-
### 状态不同步
|
|
931
|
-
|
|
932
|
-
**症状**: 控制正常但状态不更新
|
|
933
|
-
|
|
934
|
-
**解决方法**:
|
|
935
|
-
1. 检查日志中是否有`[状态事件]`
|
|
936
|
-
2. 确认0x80事件正常接收
|
|
937
|
-
3. 验证设备MAC地址和网络地址映射
|
|
938
|
-
4. 重启网关和Node-RED
|
|
939
|
-
|
|
940
|
-
### 控制无响应
|
|
941
|
-
|
|
942
|
-
**症状**: HA发送命令但设备不动作
|
|
943
|
-
|
|
944
|
-
**解决方法**:
|
|
945
|
-
1. 检查MQTT命令是否发送(查看Node-RED日志)
|
|
946
|
-
2. 确认网络地址正确
|
|
947
|
-
3. 查看是否有`[控制响应] 0xB0`
|
|
948
|
-
4. 尝试手动发送控制命令测试
|
|
949
|
-
|
|
950
|
-
### 常见日志说明
|
|
951
|
-
|
|
952
|
-
```
|
|
953
|
-
[INFO] Gateway connected - 网关连接成功
|
|
954
|
-
[INFO] Device discovery complete - 设备发现完成
|
|
955
|
-
[INFO] [TCP Frame] 接收: 53 80 ... - 状态事件接收
|
|
956
|
-
[INFO] [状态事件] 地址=0x... - 设备状态解析成功
|
|
957
|
-
[INFO] MQTT已连接 - MQTT连接成功
|
|
958
|
-
[INFO] 发布设备 XXX - 设备发布到MQTT
|
|
959
|
-
[WARN] 未找到topic订阅 - MQTT订阅问题
|
|
960
|
-
[ERROR] Connection refused - 连接被拒绝
|
|
961
|
-
```
|
|
962
|
-
|
|
963
|
-
## 节点说明
|
|
964
|
-
|
|
965
|
-
### Symi Gateway(网关配置节点)
|
|
966
|
-
|
|
967
|
-
配置节点,管理与Symi蓝牙Mesh网关的连接。
|
|
968
|
-
|
|
969
|
-
**配置项**:
|
|
970
|
-
- MQTT配置:选择MQTT配置节点(用于Home Assistant Discovery)
|
|
971
|
-
- 连接类型:TCP或串口
|
|
972
|
-
- TCP模式:IP地址和端口(默认4196)
|
|
973
|
-
- 串口模式:串口路径和波特率(默认115200)
|
|
974
|
-
|
|
975
|
-
**功能**:
|
|
976
|
-
- 自动设备发现
|
|
977
|
-
- 状态事件处理
|
|
978
|
-
- 自动重连机制
|
|
979
|
-
|
|
980
|
-
### Symi MQTT(MQTT桥接节点)
|
|
981
|
-
|
|
982
|
-
将Symi设备桥接到MQTT broker,实现Home Assistant Discovery。
|
|
983
|
-
|
|
984
|
-
**配置项**:
|
|
985
|
-
- MQTT Broker地址
|
|
986
|
-
- 用户名/密码(可选)
|
|
987
|
-
- Discovery前缀(默认homeassistant)
|
|
988
|
-
|
|
989
|
-
**功能**:
|
|
990
|
-
- 自动发布Discovery配置
|
|
991
|
-
- 双向MQTT消息处理
|
|
992
|
-
- 设备状态同步
|
|
993
|
-
|
|
994
|
-
### Symi Device(设备控制节点)
|
|
995
|
-
|
|
996
|
-
用于Flow中直接控制和监听Symi设备状态。
|
|
997
|
-
|
|
998
|
-
**配置项**:
|
|
999
|
-
- 设备MAC地址
|
|
1000
|
-
- 通道选择(多路开关)
|
|
1001
|
-
- 子实体(三合一设备)
|
|
1002
|
-
|
|
1003
|
-
**功能**:
|
|
1004
|
-
- 接收设备状态变化
|
|
1005
|
-
- 发送控制命令
|
|
1006
|
-
- 支持KNX双向同步
|
|
1007
|
-
|
|
1008
|
-
### Symi Cloud Sync(云端同步节点)
|
|
1009
|
-
|
|
1010
|
-
从酒店云云平台同步设备名称和场景信息到本地。
|
|
1011
|
-
|
|
1012
|
-
**配置项**:
|
|
1013
|
-
- 网关:选择已配置的网关节点(自动使用网关中配置的MQTT)
|
|
1014
|
-
- App ID / App Secret:云端API认证信息(已预填)
|
|
1015
|
-
- 酒店ID / 房间号:指定要同步的房间(支持下拉选择或手动输入)
|
|
1016
|
-
- 设备列表:显示云端设备列表(含按键名称),支持一键全选
|
|
1017
|
-
- 场景列表:显示云端场景列表,支持一键全选
|
|
1018
|
-
- 自动同步:启动时自动从云端获取数据
|
|
1019
|
-
|
|
1020
|
-
**功能**:
|
|
1021
|
-
- 启动时自动从云端获取设备名称和场景列表
|
|
1022
|
-
- 根据MAC地址精确匹配本地设备并更新名称(云端MAC地址自动反转匹配)
|
|
1023
|
-
- 支持开关设备的按键名称同步(1-6键的sub_device名称)
|
|
1024
|
-
- 云端"未命名"设备自动保留设备类型标准名称(如"智能窗帘"、"零火开关"等)
|
|
1025
|
-
- 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
|
|
1026
|
-
- 自动重新发布MQTT Discovery配置(使用云端名称)
|
|
1027
|
-
- HA实体名称为纯名称,不带MAC地址和ID
|
|
1028
|
-
- 将选中的场景发布为Home Assistant按钮实体
|
|
1029
|
-
- 在HA中点击场景按钮即可触发本地场景执行(使用0x31协议)
|
|
1030
|
-
- 场景触发通过事件机制路由,确保可靠执行
|
|
1031
|
-
- 数据持久化存储,获取失败时使用缓存
|
|
1032
|
-
- 支持手动触发同步(发送 `msg.payload = "sync"`)
|
|
1033
|
-
- 支持场景调用(发送 `msg.payload = { scene_id: 4 }`)
|
|
1034
|
-
|
|
1035
|
-
**使用场景**:
|
|
1036
|
-
- 酒店项目:自动同步房间设备的本地化名称
|
|
1037
|
-
- 场景管理:将云端场景发布到Home Assistant进行控制
|
|
1038
|
-
- 批量部署:统一管理多个房间的设备名称和场景
|
|
1039
|
-
|
|
1040
|
-
**注意事项**:
|
|
1041
|
-
- 仅在启动/部署时获取一次,不会持续轮询
|
|
1042
|
-
- 云端MAC地址自动反转匹配本地设备(云端存储为反序)
|
|
1043
|
-
- 云端"未命名"设备自动保留设备类型标准名称
|
|
1044
|
-
- 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
|
|
1045
|
-
- 勾选的设备和场景才会同步,未勾选则同步全部(支持一键全选)
|
|
1046
|
-
- 场景按钮发布到HA后,点击即可触发本地场景执行(0x34协议)
|
|
1047
|
-
- 场景执行是本地化控制,不经过云端
|
|
1048
|
-
- 场景执行后,所有相关设备状态自动同步到HA(队列处理,确保可靠)
|
|
1049
|
-
- 按键名称会同步到MQTT实体名称,MAC地址仍作为唯一ID
|
|
1050
|
-
- 获取失败时自动使用上次缓存的数据
|
|
1051
|
-
- 可以禁用节点,不影响其他功能正常运行
|
|
1052
|
-
|
|
1053
|
-
## RS485网桥节点
|
|
1054
|
-
|
|
1055
|
-
### 功能概述
|
|
1056
|
-
|
|
1057
|
-
RS485网桥节点实现Mesh网关与第三方RS485设备的**双向同步**:
|
|
1058
|
-
|
|
1059
|
-
- **事件驱动**:状态变化时立即同步,无轮询
|
|
1060
|
-
- **多协议支持**:标准Modbus RTU、杜亚窗帘、自定义十六进制码
|
|
1061
|
-
- **按键对按键**:Mesh开关的每一路可独立映射到RS485的任意按键
|
|
1062
|
-
- **防循环保护**:智能防抖机制,避免无限循环
|
|
1063
|
-
- **内存安全**:命令队列限制100条,缓存自动清理
|
|
1064
|
-
|
|
1065
|
-
### 配置说明
|
|
1066
|
-
|
|
1067
|
-
#### 1. 添加RS485配置节点
|
|
1068
|
-
|
|
1069
|
-
首先配置RS485连接(串口或TCP):
|
|
1070
|
-
|
|
1071
|
-
- **连接方式**: 串口 或 TCP
|
|
1072
|
-
- **串口模式**: 选择串口路径,波特率默认9600
|
|
1073
|
-
- **TCP模式**: 输入IP地址和端口
|
|
1074
|
-
|
|
1075
|
-
#### 2. 添加RS485桥接节点
|
|
1076
|
-
|
|
1077
|
-
配置实体映射:
|
|
1078
|
-
|
|
1079
|
-
| 配置项 | 说明 |
|
|
1080
|
-
|-------|------|
|
|
1081
|
-
| **Mesh实体** | 选择要同步的Mesh设备 |
|
|
1082
|
-
| **Mesh按键** | 选择具体哪一路(多路开关) |
|
|
1083
|
-
| **品牌** | 选择协议品牌(话语前湾、杜亚、自定义等) |
|
|
1084
|
-
| **设备类型** | 选择设备类型(决定寄存器配置) |
|
|
1085
|
-
| **RS485按键** | 选择RS485端的哪一路 |
|
|
1086
|
-
| **从机地址** | Modbus从机地址(0-255,空调填0) |
|
|
1087
|
-
|
|
1088
|
-
### 话语前湾协议配置
|
|
1089
|
-
|
|
1090
|
-
话语前湾项目使用以下协议:
|
|
1091
|
-
|
|
1092
|
-
#### 开关设备 (A4B3)
|
|
1093
|
-
|
|
1094
|
-
| 设备 | 从机地址 | 配置方式 |
|
|
1095
|
-
|-----|---------|---------|
|
|
1096
|
-
| 客厅主灯 | 3 | 选择"话语前湾" → "一键开关",地址填3 |
|
|
1097
|
-
| 餐厅主灯 | 3 | 选择"话语前湾" → "三键开关",按键3,地址填3 |
|
|
1098
|
-
| 玄关灯带 | 1 | 选择"话语前湾" → "四键开关",按键4,地址填1 |
|
|
1099
|
-
|
|
1100
|
-
**寄存器映射**:
|
|
1101
|
-
- 按键1: 0x1031
|
|
1102
|
-
- 按键2: 0x1032
|
|
1103
|
-
- 按键3: 0x1033
|
|
1104
|
-
- 按键4: 0x1034
|
|
1105
|
-
- 按键5: 0x1035
|
|
1106
|
-
- 按键6: 0x1036
|
|
1107
|
-
|
|
1108
|
-
#### 空调设备 (A5B5)
|
|
1109
|
-
|
|
1110
|
-
**所有空调从机地址都是0**,通过设备类型区分房间:
|
|
1111
|
-
|
|
1112
|
-
| 房间 | 设备类型 | 寄存器范围 |
|
|
1113
|
-
|-----|---------|-----------|
|
|
1114
|
-
| 客厅空调 | ac_living | 0x0FA0-0x0FA3 |
|
|
1115
|
-
| 次卧1空调 | ac_bedroom2_1 | 0x0FA4-0x0FA7 |
|
|
1116
|
-
| 次卧2空调 | ac_bedroom2_2 | 0x0FA8-0x0FAB |
|
|
1117
|
-
| 主卧空调 | ac_master | 0x0FAC-0x0FAF |
|
|
1118
|
-
|
|
1119
|
-
**配置示例**:选择"话语前湾" → "主卧空调",地址填**0**
|
|
1120
|
-
|
|
1121
|
-
#### 地暖设备 (A3B3)
|
|
1122
|
-
|
|
1123
|
-
| 房间 | 从机地址 | 说明 |
|
|
1124
|
-
|-----|---------|------|
|
|
1125
|
-
| 客餐厅 | 60 (0x3C) | 开关:0x0039, 温度:0x0043 |
|
|
1126
|
-
| 主卧 | 61 (0x3D) | 开关:0x0039, 温度:0x0043 |
|
|
1127
|
-
| 次卧1 | 62 (0x3E) | 开关:0x0039, 温度:0x0043 |
|
|
1128
|
-
| 次卧2 | 63 (0x3F) | 开关:0x0039, 温度:0x0043 |
|
|
1129
|
-
|
|
1130
|
-
**配置示例**:选择"话语前湾" → "地暖",地址填60/61/62/63
|
|
1131
|
-
|
|
1132
|
-
#### 新风设备 (A3B3)
|
|
1133
|
-
|
|
1134
|
-
| 参数 | 从机地址 | 说明 |
|
|
1135
|
-
|-----|---------|------|
|
|
1136
|
-
| 新风 | 60 (0x3C) | 开关:0x0039(值01), 风速:0x004B |
|
|
1137
|
-
|
|
1138
|
-
**配置示例**:选择"话语前湾" → "新风",地址填60
|
|
1139
|
-
|
|
1140
|
-
#### 杜亚窗帘 (A6B6)
|
|
1141
|
-
|
|
1142
|
-
| 窗帘 | 地址高 | 地址低 |
|
|
1143
|
-
|-----|-------|-------|
|
|
1144
|
-
| 主卧窗帘 | 2 | 2 |
|
|
1145
|
-
| 主卧窗纱 | 1 | 1 |
|
|
1146
|
-
|
|
1147
|
-
**配置示例**:选择"杜亚窗帘" → "窗帘",地址高填2,地址低填2
|
|
1148
|
-
|
|
1149
|
-
### 双向同步流程
|
|
1150
|
-
|
|
1151
|
-
```
|
|
1152
|
-
Mesh面板按键 → 网关 → device-state-changed事件
|
|
1153
|
-
↓
|
|
1154
|
-
RS485桥接节点检测状态变化
|
|
1155
|
-
↓
|
|
1156
|
-
匹配映射配置 + 检查isUserControl
|
|
1157
|
-
↓
|
|
1158
|
-
生成RS485帧 → 发送到485总线
|
|
1159
|
-
↓
|
|
1160
|
-
485设备执行动作
|
|
1161
|
-
|
|
1162
|
-
485面板/遥控器 → 485总线 → RS485桥接节点接收帧
|
|
1163
|
-
↓
|
|
1164
|
-
解析帧 + 匹配映射配置
|
|
1165
|
-
↓
|
|
1166
|
-
调用gateway.sendControl()
|
|
1167
|
-
↓
|
|
1168
|
-
Mesh设备执行动作 → HA状态更新
|
|
1169
|
-
```
|
|
1170
|
-
|
|
1171
|
-
### 注意事项
|
|
1172
|
-
|
|
1173
|
-
1. **HA只对接Mesh设备**:485设备不会发布到HA,避免重复实体
|
|
1174
|
-
2. **窗帘防抖**:窗帘操作有1-2秒防抖,防止电机反馈误触发
|
|
1175
|
-
3. **初始化延迟**:启动后20秒才开始同步,等待Mesh设备发现完成
|
|
1176
|
-
4. **场景执行**:场景触发时多设备状态会排队同步,每命令间隔50ms
|
|
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调试节点) |
|
|
1177
857
|
|
|
1178
858
|
## 开发者信息
|
|
1179
859
|
|
|
@@ -1190,9 +870,16 @@ node-red-contrib-symi-mesh/
|
|
|
1190
870
|
├── nodes/
|
|
1191
871
|
│ ├── symi-gateway.js/html # 网关配置节点
|
|
1192
872
|
│ ├── symi-mqtt.js/html # MQTT节点
|
|
1193
|
-
│
|
|
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调试节点
|
|
1194
879
|
├── examples/
|
|
1195
|
-
│
|
|
880
|
+
│ ├── basic-example.json # 基础示例
|
|
881
|
+
│ ├── knx-sync-example.json # KNX Function节点示例
|
|
882
|
+
│ └── knx-bridge-example.json # KNX桥接节点示例
|
|
1196
883
|
├── LICENSE
|
|
1197
884
|
├── README.md
|
|
1198
885
|
└── package.json
|
|
@@ -1218,6 +905,35 @@ node-red-contrib-symi-mesh/
|
|
|
1218
905
|
- 测试所有更改
|
|
1219
906
|
- 更新README(如需要)
|
|
1220
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
|
+
|
|
1221
937
|
## 技术支持
|
|
1222
938
|
|
|
1223
939
|
如遇问题,请提供以下信息:
|
|
@@ -1242,8 +958,96 @@ node-red-contrib-symi-mesh/
|
|
|
1242
958
|
- MQTT日志(如相关)
|
|
1243
959
|
- 网关串口日志(如可用)
|
|
1244
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
|
+
|
|
1245
1018
|
## 更新日志
|
|
1246
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.8 (2025-12-15)
|
|
1040
|
+
- **KNX双向同步修复**:彻底修复米家/面板操作KNX不同步的问题
|
|
1041
|
+
- 修复0x45消息类型处理:米家/面板操作发送msgType=0x45,不再限制channels>=6
|
|
1042
|
+
- 支持1-4路开关2字节参数解析(米家/面板场景触发格式)
|
|
1043
|
+
- 场景执行通知(0x11)后自动查询设备状态
|
|
1044
|
+
- **syncLock阻塞修复**:移除handleMeshStateChange中syncLock检查
|
|
1045
|
+
- 避免队列处理期间丢失状态变化事件
|
|
1046
|
+
- 改用per-device时间戳防回环机制
|
|
1047
|
+
- **processQueue健壮性**:添加try/finally确保processing标志正确重置
|
|
1048
|
+
- **防死循环参数调整**:LOOP_PREVENTION_MS调整为800ms
|
|
1049
|
+
- **同时修复RS485桥接**:应用相同syncLock修复
|
|
1050
|
+
|
|
1247
1051
|
### v1.6.6 (2025-12-09)
|
|
1248
1052
|
- **三合一面板完整双向同步**:支持空调+新风+地暖独立RS485映射
|
|
1249
1053
|
- 三合一0x94协议完整解析:空调(开关/模式/风速/温度)、地暖(开关/温度)、新风(开关/风速)
|
|
@@ -1300,8 +1104,8 @@ Copyright (c) 2025 SYMI 亖米
|
|
|
1300
1104
|
## 关于
|
|
1301
1105
|
|
|
1302
1106
|
**作者**: SYMI 亖米
|
|
1303
|
-
**版本**: 1.6.
|
|
1107
|
+
**版本**: 1.6.8
|
|
1304
1108
|
**协议**: 蓝牙MESH网关(初级版)串口协议V1.0
|
|
1305
|
-
**最后更新**: 2025-12-
|
|
1109
|
+
**最后更新**: 2025-12-15
|
|
1306
1110
|
**仓库**: https://github.com/symi-daguo/node-red-contrib-symi-mesh
|
|
1307
1111
|
**npm包**: https://www.npmjs.com/package/node-red-contrib-symi-mesh
|