node-red-contrib-symi-mesh 1.3.1 → 1.6.1

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 CHANGED
@@ -13,7 +13,8 @@
13
13
  - **MQTT Discovery**:自动发布HA Discovery配置,设备即插即用
14
14
  - **双向状态同步**:支持0x80状态事件,实时反馈设备状态变化
15
15
  - **多设备类型**:支持开关、灯光、窗帘、温控器、传感器等12+种设备
16
- - **三合一面板**:完整支持空调+新风+地暖三合一控制面板
16
+ - **三合一面板**:完整支持空调+新风+地暖三合一控制面板,自动识别
17
+ - **RS485/Modbus集成**:支持第三方485设备双向同步,内置协议模板
17
18
  - **KNX集成**:支持与KNX系统双向同步
18
19
  - **云端同步**:从酒店云云平台自动获取设备名称和场景信息
19
20
  - **稳定可靠**:完善的错误处理和自动重连机制
@@ -86,6 +87,31 @@ node-red-restart
86
87
  3. 在Home Assistant中查看自动发现的设备
87
88
  4. 测试设备控制和状态反馈
88
89
 
90
+ ### 5. 多网关配置(可选)
91
+
92
+ 对于大户型或多区域部署,可以配置多个网关节点:
93
+
94
+ 1. **添加第二个网关节点**:
95
+ - 拖入新的"Symi Gateway"节点
96
+ - 配置不同的IP地址或串口
97
+ - 给网关起不同的名称(如"网关-客厅"、"网关-卧室")
98
+
99
+ 2. **添加对应的MQTT节点**:
100
+ - 为每个网关添加独立的"Symi MQTT"节点
101
+ - 在配置中选择对应的网关
102
+ - 使用相同的MQTT broker配置
103
+
104
+ 3. **设备隔离**:
105
+ - 每个网关的设备独立存储,互不干扰
106
+ - 每个网关的设备在HA中独立显示
107
+ - 可以为不同网关配置不同的MQTT主题前缀
108
+
109
+ **示例配置**:
110
+ ```
111
+ 网关1(客厅): 192.168.2.110:4196 → MQTT主题: symi_mesh/living_room/
112
+ 网关2(卧室): 192.168.2.111:4196 → MQTT主题: symi_mesh/bedroom/
113
+ ```
114
+
89
115
  ## 支持的设备类型
90
116
 
91
117
  | 设备类型 | 类型码 | HA实体 | 功能说明 |
@@ -101,6 +127,7 @@ node-red-restart
101
127
  | 温控器/三合一 | 0x0A | climate | 温度/模式/风速控制,当前温度采集 || 空调+新风+地暖三合一控制面板 |
102
128
  | 温湿度传感器 | 0x0B | sensor | 温湿度监测 |
103
129
  | 五色调光灯 | 0x18 | light | RGB+亮度+色温调节 |
130
+ | 四输入八输出 | 0x27 (39) | switch | 8路独立控制,支持场景绑定 |
104
131
 
105
132
 
106
133
  ### 三合一设备说明
@@ -125,7 +152,19 @@ node-red-restart
125
152
 
126
153
  #### 使用方式
127
154
 
128
- **自动识别**:部署后自动区分普通温控器和三合一设备,无需手动配置
155
+ **自动识别机制**:
156
+ - 空调温控器和三合一面板属于同一设备品类(deviceType=10)
157
+ - 系统通过主动查询新风(0x68)和地暖(0x6B)状态来区分
158
+ - 有响应的识别为三合一面板,无响应的识别为普通温控器
159
+ - 无需手动配置,部署后自动完成识别
160
+
161
+ **识别日志示例**:
162
+ ```
163
+ [三合一检测] 发现温控器类型设备: 温控器_xxx,将通过查询新风/地暖确认类型
164
+ [三合一检测] 开始检测设备 xxx (0xABCD)
165
+ [三合一检测] 收到 xxx 的新风响应 (0x68),确认为三合一面板
166
+ [三合一检测] 确认为三合一面板(收到新风/地暖响应)
167
+ ```
129
168
 
130
169
  **控制方式**:
131
170
  - HA中直接控制:设置温度/模式自动开启设备
@@ -408,6 +447,110 @@ return {
408
447
  4. **双向同步**:避免循环控制,使用`outputRBE: true`防抖
409
448
  5. **测试验证**:先测试单向同步,确认正常后再启用双向
410
449
 
450
+ ## RS485/Modbus双向同步
451
+
452
+ 本节点支持与第三方RS485/Modbus设备进行双向状态同步,适用于对接各品牌空调、新风、地暖等设备。
453
+
454
+ ### 功能特点
455
+
456
+ - **双模式连接**:支持串口(RS485)和TCP/IP两种连接方式
457
+ - **协议模板**:内置常用协议模板,支持自定义寄存器映射
458
+ - **双向同步**:Mesh设备和485设备状态实时同步
459
+ - **多设备支持**:单个485连接可管理多达105个设备
460
+
461
+ ### 配置步骤
462
+
463
+ #### 1. 添加RS485桥接节点
464
+
465
+ 从"Symi Mesh"分类中拖入"RS485桥接"节点,双击打开配置:
466
+
467
+ **基本配置**:
468
+ - **Mesh网关**:选择已配置的Symi Gateway(点击+号可新建)
469
+ - **RS485连接**:点击+号新建连接配置
470
+
471
+ #### 2. 配置RS485连接
472
+
473
+ 点击RS485连接旁边的+号,创建新连接:
474
+
475
+ **串口模式**:
476
+ - **连接方式**:选择 串口(RS485)
477
+ - **串口**:从下拉框选择USB串口(点击刷新按钮可重新扫描)
478
+ - **波特率**:根据设备设置(常用9600)
479
+ - **校验位**:无/偶校验/奇校验
480
+
481
+ **TCP模式**:
482
+ - **连接方式**:选择 TCP/IP
483
+ - **主机地址**:485转TCP网关的IP地址
484
+ - **端口**:Modbus TCP端口(默认502)
485
+
486
+ #### 3. 配置实体映射
487
+
488
+ 点击"添加映射"按钮,每行配置一组对应关系:
489
+
490
+ | 列 | 说明 |
491
+ |----|------|
492
+ | Mesh实体/按键 | 选择Mesh设备,开关设备会显示按键选择(第1路、第2路...) |
493
+ | 品牌 | 选择RS485协议品牌(如 话语前湾) |
494
+ | 类型/按键 | 选择设备类型,开关类型会显示按键选择 |
495
+ | 地址 | Modbus从机地址(1-255) |
496
+
497
+ **开关设备命名**:按按键数命名,方便识别:
498
+ - Mesh端:一键开关、二键开关、三键开关、四键开关、六键开关、八键开关
499
+ - RS485端:一键开关、二键开关、三键开关、四键开关、六键开关、八键开关
500
+
501
+ **按键独立配置**:Mesh和RS485的按键可以自由对应,不必一一匹配:
502
+ ```
503
+ Mesh 六键开关 第3路 ↔ RS485 四键开关 第1路 地址:1 ✓ 支持
504
+ Mesh 四键开关 第2路 ↔ RS485 六键开关 第5路 地址:2 ✓ 支持
505
+ ```
506
+
507
+ #### 4. 部署
508
+
509
+ 点击"部署"按钮,所有映射自动开始双向同步
510
+
511
+ ### RS485调试节点
512
+
513
+ 新增 `RS485调试` 节点用于抓取并显示原始485字节流:
514
+
515
+ **功能**:
516
+ - 实时显示RS485总线所有通信数据(TX发送/RX接收)
517
+ - 自动解析Modbus RTU帧结构(从机地址、功能码)
518
+ - 支持手动发送测试帧(输入十六进制字符串)
519
+ - 十六进制/ASCII显示模式
520
+ - 调试窗口高度自适应
521
+
522
+ **输出示例**:
523
+ ```
524
+ [15:07:55.123] → TX: 01 06 10 31 00 01 6A 35 | 从机:1 写单寄存器
525
+ [15:07:55.180] ← RX: 01 06 10 31 00 01 6A 35 | 从机:1 写单寄存器
526
+ ```
527
+
528
+ ### 实体映射规则
529
+
530
+ | Mesh实体类型 | RS485实体类型 | 同步内容 |
531
+ |-------------|--------------|---------|
532
+ | 开关-按键N | 开关 | 开/关状态 |
533
+ | 温控器 | 空调 | 开关、温度、模式、风速 |
534
+ | 调光灯 | 调光器 | 开关、亮度 |
535
+
536
+ **部分同步**:如果RS485协议不提供某些功能点,只同步双方都支持的内容
537
+
538
+ ### 内置协议支持
539
+
540
+ | 品牌 | 支持设备 |
541
+ |-----|---------|
542
+ | 话语前湾 | 空调、地暖、新风、窗帘、1-8键开关 |
543
+
544
+ > 如需扩展其他品牌协议,请联系技术支持
545
+
546
+ ### 注意事项
547
+
548
+ 1. **Modbus地址**:同一485总线上设备地址不能重复(1-255)
549
+ 2. **自动重连**:网络断开后5秒自动重连,无需人工干预
550
+ 3. **事件驱动**:非轮询模式,设备状态变化时才同步
551
+ 4. **防循环保护**:内置同步锁机制,避免状态死循环
552
+ 5. **485转TCP网关**:Node-RED只能收到自己发送请求后的设备回应,其他TCP客户端的数据不会转发(网关机制)
553
+
411
554
  ## 云端数据同步
412
555
 
413
556
  本节点支持从酒店云云平台自动获取设备名称和场景信息,实现本地化配置的自动同步。
@@ -429,8 +572,8 @@ return {
429
572
  - **MQTT节点**:选择Symi MQTT节点(用于更新Discovery配置)
430
573
 
431
574
  **云端认证**:
432
- - **App ID**:`cee70459`(默认已填写)
433
- - **App Secret**:`a719a4b58e2e57e50d758ee3762507e7`(默认已填写)
575
+ - **App ID**:请联系Symi技术支持获取
576
+ - **App Secret**:请联系Symi技术支持获取
434
577
  - 点击"测试连接"按钮验证认证信息
435
578
 
436
579
  **房间配置**:
@@ -469,6 +612,70 @@ payload: "sync"
469
612
  payload: { scene_id: 4 } // 执行场景ID为4的场景(如"全关")
470
613
  ```
471
614
 
615
+ ### 按键场景自动触发
616
+
617
+ **v1.4.0新功能**:开关按键可以绑定场景,按下时自动触发场景执行,实现本地化场景联动。
618
+
619
+ #### 工作原理
620
+
621
+ 1. **云端配置获取**:从云端获取每个按键的配置信息(sub_device)
622
+ 2. **按键类型识别**:
623
+ - **普通按键**(sub_type="普通"):控制本地继电器,不触发场景
624
+ - **场景按键**(sub_type="场景"):按下时触发指定场景(scene_id)
625
+ - **双控按键**(sub_type="双控"):根据当前状态触发开场景(on_scene_id)或关场景(off_scene_id)
626
+ - **总控按键**(sub_type="总控"):同双控,用于全局控制
627
+ 3. **本地化触发**:按键按下时,系统自动检测并发送0x34场景控制命令到总线
628
+ 4. **状态同步**:场景执行后,所有相关设备状态自动同步到Home Assistant
629
+
630
+ #### 配置示例
631
+
632
+ 云端配置(酒店云云平台):
633
+ ```json
634
+ {
635
+ "device_name": "床头三键",
636
+ "sub_device": [
637
+ {
638
+ "sub_name": "明亮",
639
+ "sub_type": "场景",
640
+ "scene_id": 4
641
+ },
642
+ {
643
+ "sub_name": "温馨",
644
+ "sub_type": "场景",
645
+ "scene_id": 6
646
+ },
647
+ {
648
+ "sub_name": "睡眠",
649
+ "sub_type": "场景",
650
+ "scene_id": 5
651
+ }
652
+ ]
653
+ }
654
+ ```
655
+
656
+ #### 日志示例
657
+
658
+ 启动时显示场景绑定:
659
+ ```
660
+ [场景绑定] 床头三键: 按键1(明亮)→场景4, 按键2(温馨)→场景6, 按键3(睡眠)→场景5
661
+ [场景绑定] 入户二键: 按键1(廊灯)→开:场景22/关:场景21, 按键2(卫浴灯)→开:场景24/关:场景23
662
+ ```
663
+
664
+ 按键按下时触发场景:
665
+ ```
666
+ [按键场景] 检测到按键1(明亮)状态变化: 关 → 开, 触发场景4
667
+ [按键场景] ✓ 场景4(明亮)控制命令已发送
668
+ [场景控制] 场景控制命令已被网关接受
669
+ [场景执行] 收到场景执行通知事件: 场景ID=4
670
+ ```
671
+
672
+ #### 注意事项
673
+
674
+ 1. **云端配置必需**:需要先配置云端同步节点并成功获取设备配置
675
+ 2. **完全本地化**:场景触发完全在本地进行,不依赖云端
676
+ 3. **避免循环**:场景执行期间不会再次触发按键场景,防止循环
677
+ 4. **状态同步**:场景执行后的设备状态变化会自动同步到HA
678
+
472
679
  ### 工作原理
473
680
 
474
681
  #### 数据获取流程
@@ -825,48 +1032,12 @@ node-red-contrib-symi-mesh/
825
1032
 
826
1033
  ## 更新日志
827
1034
 
828
- ### v1.3.1 (2025-11-07)
829
- - **重要修复**:场景控制协议修正(从0x31改为0x34,符合最新协议规范)
830
- - **重要修复**:场景执行状态同步队列处理(确保场景触发后所有设备状态正确同步)
831
- - **重要修复**:6键开关状态同步(新增0x45消息类型支持)
832
- - **性能优化**:状态事件队列化处理,避免高频状态更新时的CPU占用
833
- - **稳定性提升**:场景执行2秒超时机制,确保状态同步窗口准确
834
- - **日志优化**:场景执行期间的状态更新使用log级别,便于调试和验证
835
- - 场景控制帧格式:`53 34 06 BC C0 00 05 01 [场景ID] [校验]`
836
- - 场景执行响应:`53 B4 00 00 E7`(网关确认)
837
- - 场景执行通知:`53 80 11 ...`(设备执行通知)
838
- - 支持场景执行后的批量设备状态同步(队列处理,非阻塞)
839
- - 6键开关场景状态同步(0x45消息类型,2字节小端序)
840
- - 所有设备类型的场景状态同步验证通过
841
-
842
- ### v1.3.0 (2025-11-06)
843
- - **新功能**:新增云端同步节点(Symi Cloud Sync)
844
- - **重要修复**:MAC地址反序处理(修复设备匹配问题)
845
- - **重要修复**:场景触发事件路由机制(修复场景无法执行问题)
846
- - **重要修复**:设备控制日志级别(从debug改为log,便于调试)
847
- - **重要修复**:酒店和房间选择持久化保存(重新打开配置无需重新选择)
848
- - **重要修复**:云端"未命名"设备自动保留设备类型标准名称
849
- - **架构优化**:MQTT配置统一到网关节点,简化配置流程
850
- - **节点优化**:Symi MQTT改为config node,不再显示在左侧面板
851
- - 支持从酒店云云平台自动获取设备名称和场景信息
852
- - 云端MAC地址自动反转匹配本地设备(云端存储为反序)
853
- - 支持开关设备的按键名称同步(sub_device)
854
- - 显示云端设备列表(所有设备都有名称)
855
- - 自动重新发布MQTT Discovery配置(使用云端名称)
856
- - HA实体名称为纯名称,不带MAC地址和ID
857
- - 场景自动发布为Home Assistant按钮实体
858
- - 支持在HA中直接触发场景(本地化控制)
859
- - 场景触发通过事件机制路由,确保可靠执行
860
- - 可选择性同步设备和场景(勾选功能,支持一键全选)
861
- - 数据持久化存储,获取失败时使用缓存
862
- - 仅在启动时获取一次,不影响系统性能
863
-
864
- ### v1.2.4 (2025-11-04)
865
- - **重大优化**:大幅减少日志输出,解决长期运行日志膨胀问题
866
- - 将高频日志(Frame接收/发送、状态事件、MQTT消息等)改为debug级别
867
- - 保留关键日志(连接/断开、设备发现、错误)用于问题排查
868
- - 提升系统性能和稳定性,适合7x24小时长期运行
869
- - 修复网关或MQTT服务器离线时的错误处理
1035
+ ### v1.6.0 (2025-12-03)
1036
+ - **MQTT订阅修复**:修复闭包问题导致的设备MAC映射错误,确保HA实体可控
1037
+ - **内存泄漏修复**:节点关闭时正确移除gateway事件监听器,防止内存累积
1038
+ - **三合一面板完善**:空调/新风/地暖控制和状态反馈全面优化
1039
+ - **RS485双向同步**:支持Mesh与第三方485设备双向状态同步
1040
+ - **代码优化**:中文注释规范化,移除冗余代码,提升可维护性
870
1041
 
871
1042
 
872
1043
  ## 许可证
@@ -880,8 +1051,8 @@ Copyright (c) 2025 SYMI 亖米
880
1051
  ## 关于
881
1052
 
882
1053
  **作者**: SYMI 亖米
883
- **版本**: 1.3.1
1054
+ **版本**: 1.6.0
884
1055
  **协议**: 蓝牙MESH网关(初级版)串口协议V1.0
885
- **最后更新**: 2025-11-07
1056
+ **最后更新**: 2025-12-03
886
1057
  **仓库**: https://github.com/symi-daguo/node-red-contrib-symi-mesh
887
1058
  **npm包**: https://www.npmjs.com/package/node-red-contrib-symi-mesh
@@ -0,0 +1,151 @@
1
+ [
2
+ {
3
+ "id": "basic_flow",
4
+ "type": "tab",
5
+ "label": "Symi Mesh 基础示例",
6
+ "disabled": false,
7
+ "info": "展示Symi Mesh网关的基本配置和使用方法"
8
+ },
9
+ {
10
+ "id": "symi_gateway_config",
11
+ "type": "symi-gateway",
12
+ "name": "Symi网关",
13
+ "connectionType": "tcp",
14
+ "host": "192.168.2.110",
15
+ "port": "4196",
16
+ "serialPort": "",
17
+ "baudRate": "115200",
18
+ "mqttBroker": "mqtt://localhost:1883",
19
+ "mqttUsername": "",
20
+ "mqttPassword": "",
21
+ "mqttPrefix": "homeassistant"
22
+ },
23
+ {
24
+ "id": "comment_intro",
25
+ "type": "comment",
26
+ "z": "basic_flow",
27
+ "name": "说明: 修改网关IP地址后部署即可使用",
28
+ "info": "1. 双击上方网关节点修改IP地址\n2. 点击部署按钮\n3. 设备将自动发现并发布到MQTT",
29
+ "x": 220,
30
+ "y": 60,
31
+ "wires": []
32
+ },
33
+ {
34
+ "id": "symi_mqtt_node",
35
+ "type": "symi-mqtt",
36
+ "z": "basic_flow",
37
+ "name": "MQTT桥接",
38
+ "gateway": "symi_gateway_config",
39
+ "x": 130,
40
+ "y": 140,
41
+ "wires": []
42
+ },
43
+ {
44
+ "id": "comment_mqtt",
45
+ "type": "comment",
46
+ "z": "basic_flow",
47
+ "name": "MQTT节点自动发布设备到Home Assistant",
48
+ "info": "部署后设备会自动通过MQTT Discovery发布到HA",
49
+ "x": 230,
50
+ "y": 200,
51
+ "wires": []
52
+ },
53
+ {
54
+ "id": "comment_three_in_one",
55
+ "type": "comment",
56
+ "z": "basic_flow",
57
+ "name": "三合一面板控制示例 (空调+新风+地暖)",
58
+ "info": "三合一面板会被自动识别,发布为独立的climate和fan实体",
59
+ "x": 220,
60
+ "y": 280,
61
+ "wires": []
62
+ },
63
+ {
64
+ "id": "inject_climate_cool",
65
+ "type": "inject",
66
+ "z": "basic_flow",
67
+ "name": "空调制冷",
68
+ "props": [
69
+ {"p": "topic", "vt": "str"},
70
+ {"p": "payload"}
71
+ ],
72
+ "repeat": "",
73
+ "crontab": "",
74
+ "once": false,
75
+ "onceDelay": 0.1,
76
+ "topic": "symi_mesh/894ab820dacc/climate/mode/set",
77
+ "payload": "cool",
78
+ "payloadType": "str",
79
+ "x": 130,
80
+ "y": 340,
81
+ "wires": [["mqtt_out"]]
82
+ },
83
+ {
84
+ "id": "inject_fresh_air_on",
85
+ "type": "inject",
86
+ "z": "basic_flow",
87
+ "name": "新风开启",
88
+ "props": [
89
+ {"p": "topic", "vt": "str"},
90
+ {"p": "payload"}
91
+ ],
92
+ "repeat": "",
93
+ "crontab": "",
94
+ "once": false,
95
+ "onceDelay": 0.1,
96
+ "topic": "symi_mesh/894ab820dacc/fresh_air/set",
97
+ "payload": "ON",
98
+ "payloadType": "str",
99
+ "x": 130,
100
+ "y": 400,
101
+ "wires": [["mqtt_out"]]
102
+ },
103
+ {
104
+ "id": "inject_floor_heat",
105
+ "type": "inject",
106
+ "z": "basic_flow",
107
+ "name": "地暖制热",
108
+ "props": [
109
+ {"p": "topic", "vt": "str"},
110
+ {"p": "payload"}
111
+ ],
112
+ "repeat": "",
113
+ "crontab": "",
114
+ "once": false,
115
+ "onceDelay": 0.1,
116
+ "topic": "symi_mesh/894ab820dacc/floor_heating/mode/set",
117
+ "payload": "heat",
118
+ "payloadType": "str",
119
+ "x": 130,
120
+ "y": 460,
121
+ "wires": [["mqtt_out"]]
122
+ },
123
+ {
124
+ "id": "mqtt_out",
125
+ "type": "mqtt out",
126
+ "z": "basic_flow",
127
+ "name": "MQTT发送",
128
+ "topic": "",
129
+ "qos": "",
130
+ "retain": "",
131
+ "respTopic": "",
132
+ "contentType": "",
133
+ "userProps": "",
134
+ "correl": "",
135
+ "expiry": "",
136
+ "broker": "",
137
+ "x": 350,
138
+ "y": 400,
139
+ "wires": []
140
+ },
141
+ {
142
+ "id": "comment_note",
143
+ "type": "comment",
144
+ "z": "basic_flow",
145
+ "name": "注意: 修改topic中的MAC地址为您的实际设备MAC",
146
+ "info": "MAC地址格式: 小写无冒号,如894ab820dacc",
147
+ "x": 250,
148
+ "y": 520,
149
+ "wires": []
150
+ }
151
+ ]