node-red-contrib-symi-mesh 1.8.3 → 1.8.5

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
@@ -14,9 +14,11 @@
14
14
  - **双向状态同步**:支持0x80状态事件,实时反馈设备状态变化
15
15
  - **多设备类型**:支持开关、灯光、窗帘、温控器、传感器等12+种设备
16
16
  - **三合一面板**:完整支持空调+新风+地暖三合一控制面板,自动识别
17
- - **RS485/Modbus集成**:支持第三方485设备双向同步,内置协议模板
17
+ - **RS485/Modbus集成**:支持第三方485设备双向同步,内置协议模板,支持中弘VRF、SYMI面板协议
18
+ - **RS485同步增强**:`symi-rs485-sync` 节点已全面重构,采用统一防环路机制,支持多台空调内机批量状态同步和三合一子实体增强映射
18
19
  - **KNX集成**:支持与KNX系统双向同步
19
20
  - **KNX-HA集成**:支持KNX与Home Assistant实体直接双向同步
21
+ - **窗帘同步优化**:专门针对无限位Mesh窗帘模组优化,支持控制锁定(40s)和即时状态同步,彻底解决状态死循环和丢包问题
20
22
  - **云端同步**:从酒店云云平台自动获取设备名称和场景信息
21
23
  - **稳定可靠**:完善的错误处理和自动重连机制
22
24
 
@@ -180,214 +182,11 @@ node-red-restart
180
182
 
181
183
  每个功能独立同步,互不干扰。
182
184
 
183
- ## KNX-HA双向同步
184
-
185
- 本节点支持KNX与Home Assistant实体直接双向同步,实现KNX系统与HA的实时互联互通。
186
-
187
- ### 功能特点
188
-
189
- - **直接实体同步**:通过HA events-state节点实时接收HA状态变化事件
190
- - **KNX实体导入**:支持Tab分隔格式导入KNX组地址配置,与KNX桥接节点100%一致
191
- - **HA实体加载**:从HA服务器节点自动加载所有支持的实体
192
- - **快速输入**:支持直接输入实体ID或名称搜索,带autocomplete提示,支持806+实体
193
- - **多设备类型**:开关、灯光、窗帘、空调、风扇
194
- - **双向同步**:自动处理KNX↔HA状态同步
195
- - **智能防抖**:调光300ms、窗帘500ms防抖,避免过程中频繁同步
196
- - **防死循环**:内置800ms防抖机制
197
- - **持久化保存**:映射配置自动保存,重启后保持
198
- - **宽屏界面**:对话框最小900px宽度,适配大屏幕
199
-
200
- ### 配置步骤
201
-
202
- #### 1. 安装依赖节点
203
-
204
- ```bash
205
- cd ~/.node-red
206
- npm install node-red-contrib-knx-ultimate
207
- npm install node-red-contrib-home-assistant-websocket
208
- ```
209
-
210
- #### 2. 配置HA服务器
211
-
212
- 1. 添加Home Assistant服务器配置节点(如果还没有)
213
- 2. 输入HA的URL和访问令牌
214
- 3. 测试连接确保成功
215
-
216
- #### 3. 添加KNX-HA桥接节点
217
-
218
- 从"Symi Mesh"分类中拖入"KNX-HA桥接"节点
219
-
220
- #### 4. 选择HA服务器
221
-
222
- 在节点配置中选择已配置的Home Assistant服务器节点
223
-
224
- #### 5. 导入KNX实体
225
-
226
- 1. 点击"下载模板"获取导入格式示例
227
- 2. 按照Tab分隔格式准备KNX组地址数据
228
- 3. 点击"导入"按钮,粘贴数据
229
- 4. 确认导入
230
-
231
- **导入格式示例**:
232
- ```
233
- 玄关射灯 switch 1/1/28 1/2/28
234
- 客厅吊灯 light 1/1/10 1/2/10 1/3/10 1/4/10
235
- 客厅布帘 cover 2/1/5 2/2/5 2/3/5
236
- 主卧空调 climate 3/1/1 3/2/1 3/3/1 3/4/1 3/5/1
237
- ```
238
-
239
- #### 6. 加载HA实体
240
-
241
- 1. 选择HA服务器后,系统会自动加载实体(约2秒延迟)
242
- 2. 如果未成功加载,点击"刷新"按钮重新加载
243
- 3. 系统使用HA REST API直接获取实体列表
244
-
245
- #### 7. 配置映射
246
-
247
- 1. 点击"添加"按钮
248
- 2. 选择KNX实体
249
- 3. 输入或选择HA实体(支持直接输入实体ID或输入名称快速搜索)
250
- 4. 可以配置多个映射关系
251
-
252
- #### 8. 连接KNX节点
253
-
254
- ```
255
- [knxUltimate-in] → [KNX-HA桥接] → [knxUltimate-out]
256
- ```
257
-
258
- **knxUltimate-in配置**:
259
- - Listen to all GA:勾选
260
- - Telegram type:写入
261
- - Notify on write:勾选
262
- - Notify on response:勾选
263
-
264
- **knxUltimate-out配置**:
265
- - Listen to all GA:勾选(Universal Mode)
266
- - Output type:Write
267
-
268
- #### 9. 连接HA节点(实现HA→KNX同步)
269
-
270
- ```
271
- [HA server-state-changed] → [KNX-HA桥接]
272
- ```
273
-
274
- **HA server-state-changed配置**:
275
- - 节点类型:events: state changed
276
- - 实体ID:选择映射中的HA实体(或留空监听所有)
277
- - 输出属性:data(包含entity_id、new_state、old_state)
278
-
279
- **重要**:server-state-changed节点必须直接连接到KNX-HA桥接节点的输入,不要通过knxUltimate-in
280
-
281
- #### 10. 部署
282
-
283
- 点击"部署"按钮,开始双向同步
284
-
285
- ### 支持的设备类型
286
-
287
- | KNX设备类型 | HA实体类型 | 同步内容 | KNX地址字段 |
288
- |------------|-----------|----------|-------------|
289
- | 开关 | switch | 开/关状态 | 命令, 状态 |
290
- | 灯光 | light | 开关、亮度、色温 | 开关, 状态, 亮度, 色温 |
291
- | 窗帘 | cover | 开关、位置、停止 | 上下, 位置, 停止 |
292
- | 空调 | climate | 开关、温度、模式 | 开关, 温度, 模式, 风速, 当前温度 |
293
- | 风扇 | fan | 开关、风速 | 开关, 风速 |
294
-
295
- ### 连接方式
296
-
297
- ```
298
- [knxUltimate-in] → [KNX-HA桥接] → [knxUltimate-out]
299
- [server-state-changed] → [KNX-HA桥接] ↗
300
- ```
301
-
302
- **说明**:
303
- - KNX→HA:knxUltimate-in → KNX-HA桥接,自动调用HA服务
304
- - HA→KNX:server-state-changed → KNX-HA桥接,桥接节点发送KNX命令到knxUltimate-out
305
-
306
- ### 工作原理
307
-
308
- #### KNX → HA 同步
309
-
310
- 1. KNX设备状态变化(如开关按下)
311
- 2. knxUltimate-in节点接收GroupValue_Write
312
- 3. KNX-HA桥接节点检测到变化
313
- 4. 调用HA REST API服务(如switch.turn_on)
314
- 5. HA实体状态更新
315
-
316
- #### HA → KNX 同步
317
-
318
- 1. HA实体状态变化(如在HA界面操作)
319
- 2. server-state-changed节点实时推送state_changed事件
320
- 3. KNX-HA桥接节点接收HA事件
321
- 4. 桥接节点发送KNX GroupValue_Write命令到knxUltimate-out
322
- 5. KNX设备执行动作
323
-
324
- **防抖机制**:
325
- - 调光灯亮度:300ms防抖,只同步最终值
326
- - 窗帘位置:500ms防抖,避免移动过程中频繁同步
327
- - 开关控制:立即同步,无延迟
328
-
329
- ### 注意事项
330
-
331
- 1. **5秒初始化延迟**:部署后前5秒不同步,等待系统初始化
332
- 2. **事件驱动**:HA→KNX通过events-state节点实时推送,无轮询开销
333
- 3. **防死循环**:KNX/HA控制后800ms内,反向状态变化不会同步
334
- 4. **智能防抖**:调光300ms、窗帘500ms防抖,只同步最终值
335
- 5. **持久化配置**:所有映射配置自动保存,重启后保持
336
- 6. **内存优化**:命令队列限制100条,自动清理过期缓存
337
- 7. **宽屏界面**:对话框最小1000px,映射列表高度400px
338
- 8. **快速输入**:支持直接输入实体ID或输入名称快速定位
339
- 9. **断线恢复**:支持断电断网后自动重连
340
-
341
- ### 故障排查
342
-
343
- **KNX→HA不工作**:
344
- 1. 检查日志是否有`[KNX输入]`输出
345
- 2. 确认knxUltimate-in节点已启用"Listen to all GA"
346
- 3. 确认KNX组地址与映射中的地址一致
347
- 4. 检查HA URL和Token是否正确
348
- 5. 手动操作KNX设备,观察日志
349
- 6. 查看调试输出端口的消息
350
-
351
- **HA→KNX不工作**:
352
- 1. 检查日志是否有`[HA->KNX]`输出
353
- 2. 确认HA实体ID与映射中的实体ID一致
354
- 3. 确认HA服务器节点已连接并启用WebSocket
355
- 4. 在HA中操作实体,观察日志
356
- 5. 检查knxUltimate-out节点配置
357
- 6. 确认knxUltimate-out已启用"Listen to all GA"(Universal Mode)
358
-
359
- **加载HA实体失败**:
360
- 1. 检查HA服务器节点是否正确配置
361
- 2. 确认HA服务器节点已连接
362
- 3. 点击"刷新"按钮重新加载
363
- 4. 检查是否安装了node-red-contrib-home-assistant-websocket
364
- 5. 查看Node-RED日志中的详细错误信息
365
-
366
- ### 使用场景
367
-
368
- **适合使用KNX-HA桥接的场景**:
369
- - HA中已有KNX集成,希望与其他系统整合
370
- - 需要KNX设备与HA中的Zigbee、WiFi等设备联动
371
- - 可以在HA中统一管理所有设备
372
- - 需要利用HA的自动化和场景功能
373
- - 已安装node-red-contrib-home-assistant-websocket,共享HA配置
374
-
375
- **与KNX直接集成的区别**:
376
- - KNX直接集成:HA作为KNX系统的一部分
377
- - KNX-HA桥接:KNX与HA作为两个独立系统,通过桥接互通
378
-
379
- **优势**:
380
- - 无需修改现有KNX配置
381
- - 可以选择性同步部分设备
382
- - 支持与HA中任意实体同步
383
- - 配置灵活,易于调整
384
-
385
-
386
- ### HA双向同步
185
+ ## HA双向同步
387
186
 
388
187
  Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Assistant实体的直接双向同步。
389
188
 
390
- #### 功能特性
189
+ ### 功能特性
391
190
 
392
191
  1. **配置复用**:
393
192
  - 复用`symi-mqtt`配置节点获取Symi设备信息
@@ -403,7 +202,7 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
403
202
  - 支持按键通道选择(1-4键)
404
203
  - 支持实体ID搜索和下拉选择
405
204
 
406
- #### ⚠️ 双向同步连接方式(重要)
205
+ ### ⚠️ 双向同步连接方式(重要)
407
206
 
408
207
  要实现完整的双向同步,必须连接HA事件节点到`symi-ha-sync`节点的输入端:
409
208
 
@@ -428,13 +227,13 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
428
227
  2. 实体ID可留空(监听所有实体)或指定特定实体
429
228
  3. 将输出连接到 symi-ha-sync 节点的输入端
430
229
 
431
- #### 状态指示
230
+ ### 状态指示
432
231
 
433
232
  - **蓝色 "Mesh→HA (N组)"**:仅 Mesh 到 HA 方向工作(未连接 HA 事件节点)
434
233
  - **绿色 "双向同步 (N组)"**:双向同步正常工作
435
234
  - **红色**:配置错误
436
235
 
437
- #### 配置步骤
236
+ ### 配置步骤
438
237
 
439
238
  1. **添加节点**:从左侧拖入`Symi HA Sync`节点
440
239
  2. **选择MQTT配置**:选择已有的`symi-mqtt`配置节点(共享Symi网关连接)
@@ -447,7 +246,7 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
447
246
  5. **连接HA事件节点**:添加`events: all`或`events: state`节点,连接到输入端
448
247
  6. **部署**:点击部署,立即生效
449
248
 
450
- #### 注意事项
249
+ ### 注意事项
451
250
 
452
251
  - **MQTT配置**:必须选择`symi-mqtt`配置节点,用于获取设备列表和接收Mesh事件
453
252
  - **HA连接**:必须确保HA服务器节点连接正常
@@ -456,7 +255,7 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
456
255
  - **多通道设备**:对于多键开关,请分别为每个按键添加一条映射
457
256
  - **event实体过滤**:系统自动过滤`event.`开头的实体(如按键点击事件),不会同步
458
257
 
459
- #### 三合一面板配置
258
+ ### 三合一面板配置
460
259
 
461
260
  三合一面板(空调+新风+地暖)需要分别配置每个子设备的映射:
462
261
 
@@ -477,7 +276,7 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
477
276
  三合一面板_xxx [地暖] ↔ climate.living_room_floor_heating
478
277
  ```
479
278
 
480
- #### 窗帘同步说明
279
+ ### 窗帘同步说明
481
280
 
482
281
  窗帘设备采用特殊的同步机制,避免运动过程中的步进反馈干扰:
483
282
 
@@ -486,12 +285,11 @@ Symi HA同步节点 (`symi-ha-sync`) 用于实现Symi蓝牙Mesh设备与Home Ass
486
285
  - **运动状态跟踪**:记录运动发起方(Symi/HA),忽略对方的中间状态反馈
487
286
  - **opening/closing过滤**:HA窗帘处于运动状态时,不同步位置变化到Mesh
488
287
 
489
-
490
- ### MQTT品牌同步
288
+ ## MQTT品牌同步
491
289
 
492
290
  Symi MQTT同步节点 (`symi-mqtt-sync`) 用于实现第三方MQTT品牌设备与Symi Mesh设备的双向状态同步。
493
291
 
494
- #### 功能特性
292
+ ### 功能特性
495
293
 
496
294
  1. **双MQTT配置**:
497
295
  - Mesh MQTT:连接Symi网关获取设备列表
@@ -500,7 +298,7 @@ Symi MQTT同步节点 (`symi-mqtt-sync`) 用于实现第三方MQTT品牌设备
500
298
  3. **双向同步**:品牌设备↔Mesh设备实时状态同步
501
299
  4. **配置持久化**:设备列表和映射配置持久保存,断线后仍可显示
502
300
 
503
- #### 支持的品牌协议
301
+ ### 支持的品牌协议
504
302
 
505
303
  | 品牌 | 设备类型 | 功能码映射 |
506
304
  |------|---------|-----------|
@@ -510,7 +308,7 @@ Symi MQTT同步节点 (`symi-mqtt-sync`) 用于实现第三方MQTT品牌设备
510
308
  | | 地暖(16) | 开关(fn=1)、温度(fn=2, 5-35°C) |
511
309
  | | 新风(36) | 开关(fn=1)、风速(fn=3) |
512
310
 
513
- #### 配置步骤
311
+ ### 配置步骤
514
312
 
515
313
  1. **添加品牌MQTT配置节点**:
516
314
  - 从左侧拖入`Symi MQTT Brand`配置节点
@@ -530,143 +328,20 @@ Symi MQTT同步节点 (`symi-mqtt-sync`) 用于实现第三方MQTT品牌设备
530
328
 
531
329
  4. **部署**:点击部署,开始双向同步
532
330
 
533
- #### 注意事项
331
+ ### 注意事项
534
332
 
535
333
  - **设备类型匹配**:建议同步相同类型的设备(灯具对灯具,空调对空调)
536
334
  - **离线设备显示**:[离线]标记缓存中但当前不在线的设备
537
335
  - **防死循环**:内置2秒防抖机制,避免状态震荡
538
336
  - **自动重连**:5秒重连间隔,断线自动恢复
539
337
 
540
-
541
- ## 协议说明
542
-
543
- ### 核心协议格式
544
-
545
- ```
546
- [Header(0x53)] [Opcode] [Status] [Length] [Data] [Checksum]
547
- ```
548
-
549
- ### 关键操作码
550
-
551
- | 操作码 | 名称 | 方向 | 说明 |
552
- |-------|------|------|------|
553
- | 0x12 | 设备列表查询 | 主机→网关 | 查询所有设备 |
554
- | 0x92 | 设备列表响应 | 网关→主机 | 返回设备信息 |
555
- | 0x30 | 设备控制 | 主机→网关 | 控制指定设备 |
556
- | 0xB0 | 控制响应 | 网关→主机 | 控制结果 |
557
- | 0x34 | 场景控制 | 主机→网关 | 执行场景(群控) |
558
- | 0xB4 | 场景控制响应 | 网关→主机 | 场景控制结果 |
559
- | 0x80 | 状态事件 | 网关→主机 | 设备状态主动上报 |
560
- | 0x32 | 状态查询 | 主机→网关 | 查询设备状态 |
561
-
562
- ### 开关状态编码(重要)
563
-
564
- **协议规则**: 每2位表示1路,`01`=关,`10`=开,从最低位开始
565
-
566
- | 路数 | 全关 | 全开 | 示例 |
567
- |-----|------|------|------|
568
- | 1路 | 0x01 | 0x02 | 直接值 |
569
- | 2路 | 0x05 | 0x0A | 0x06=第1路开、第2路关 |
570
- | 3路 | 0x15 | 0x2A | 从低位开始 |
571
- | 4路 | 0x55 | 0xAA | 每2位1路 |
572
- | 6路 | 0x5555 | 0xAAAA | 2字节小端序 |
573
- | 8路 | 0x5555 | 0xAAAA | 2字节小端序 |
574
-
575
- #### 8路开关状态详解
576
-
577
- 8路开关使用2字节(16位)表示状态,小端序传输。实测帧示例:
578
-
579
- ```
580
- 帧格式: 53 80 [Status] [Length] [网络地址LE] [AttrType] [状态LE] [Checksum]
581
- 示例帧: 53 80 05 05 E4 01 45 56 55 70
582
- │ │ │ │ └─────┘ │ └───┘ └─ 校验和
583
- │ │ │ │ │ │ └─ 状态值 0x5556 (第1路开)
584
- │ │ │ │ │ └─ AttrType=0x45 (8路开关)
585
- │ │ │ │ └─ 网络地址 0x01E4
586
- │ │ │ └─ 数据长度=5字节
587
- │ │ └─ 状态码
588
- │ └─ Opcode=0x80 (事件上报)
589
- └─ 帧头
590
- ```
591
-
592
- **状态值对照表**(小端序):
593
- | 状态数据 | 16位值 | 二进制 | 含义 |
594
- |---------|--------|--------|------|
595
- | 55 55 | 0x5555 | 01010101 01010101 | 全关 |
596
- | 56 55 | 0x5556 | 01010101 01010110 | 第1路开 |
597
- | 59 55 | 0x5559 | 01010101 01011001 | 第2路开 |
598
- | 65 55 | 0x5565 | 01010101 01100101 | 第3路开 |
599
- | 95 55 | 0x5595 | 01010101 10010101 | 第4路开 |
600
- | 55 56 | 0x5655 | 01010110 01010101 | 第5路开 |
601
- | 55 59 | 0x5955 | 01011001 01010101 | 第6路开 |
602
- | 55 65 | 0x6555 | 01100101 01010101 | 第7路开 |
603
- | 55 95 | 0x9555 | 10010101 01010101 | 第8路开 |
604
- | AA AA | 0xAAAA | 10101010 10101010 | 全开 |
605
-
606
- ### 常用消息类型
607
-
608
- | 消息类型 | 代码 | 数据格式 | 范围/说明 |
609
- |---------|------|---------|----------|
610
- | 开关状态 | 0x02 | 1字节 | 1-4路开关,见上表 |
611
- | 亮度 | 0x03 | 1字节 | 0-100% |
612
- | 色温 | 0x04 | 1字节 | 0%=暖白, 100%=冷白 |
613
- | 窗帘动作 | 0x05 | 1字节 | 1=开/2=关/3=停 |
614
- | 窗帘位置 | 0x06 | 1字节 | 0-100% |
615
- | 人体感应 | 0x0C | 1字节 | 0=无活动/1=检测到 |
616
- | 插卡状态 | 0x0E | 1字节 | 0=无卡/1=有卡 |
617
- | 湿度 | 0x17 | 1字节 | 0-100% |
618
- | 当前温度 | 0x16 | 2字节LE | 温度*100(如2500=25.00°C)|
619
- | 目标温度 | 0x1B | 1字节 | 16-30°C(直接温度值)|
620
- | 风速 | 0x1C | 1字节 | 1=高/2=中/3=低/4=自动 |
621
- | 模式 | 0x1D | 1字节 | 1=制冷/2=制热/3=送风/4=除湿 |
622
- | 6-8路开关 | 0x45 | 2字节LE | 多路开关状态,见上表 |
623
- | 五色RGB | 0x4C | 5字节 | R/G/B/WW/CW (各0-255) |
624
-
625
- ## MQTT主题结构
626
-
627
- ### Discovery主题
628
-
629
- ```
630
- homeassistant/[platform]/[object_id]/config
631
- ```
632
-
633
- 例如:
634
- - 开关:`homeassistant/switch/9361c820dacc_switch/config`
635
- - 温控器:`homeassistant/climate/142e68468cac_climate/config`
636
- - 三合一空调:`homeassistant/climate/894ab820dacc_climate/config`
637
- - 三合一新风:`homeassistant/fan/894ab820dacc_fresh_air/config`
638
- - 三合一地暖:`homeassistant/climate/894ab820dacc_floor_heating/config`
639
-
640
- ### 状态和命令主题
641
-
642
- **普通设备**:
643
- ```
644
- symi_mesh/[mac_clean]/[entity]/state
645
- symi_mesh/[mac_clean]/[entity]/set
646
- ```
647
-
648
- **三合一设备**(关键:空调使用climate主题):
649
- ```
650
- 空调:symi_mesh/[mac_clean]/climate/mode
651
- 新风:symi_mesh/[mac_clean]/fresh_air/state
652
- 地暖:symi_mesh/[mac_clean]/floor_heating/mode
653
- ```
654
-
655
- 例如(三合一设备 894ab820dacc):
656
- - 空调状态: `symi_mesh/894ab820dacc/climate/target_temp`
657
- - 空调命令: `symi_mesh/894ab820dacc/climate/target_temp/set`
658
- - 新风状态: `symi_mesh/894ab820dacc/fresh_air/state`
659
- - 新风命令: `symi_mesh/894ab820dacc/fresh_air/set`
660
- - 地暖状态: `symi_mesh/894ab820dacc/floor_heating/mode`
661
- - 地暖命令: `symi_mesh/894ab820dacc/floor_heating/mode/set`
662
-
663
338
  ## KNX双向同步
664
339
 
665
340
  本节点支持与`node-red-contrib-knx-ultimate`完整双向同步,实现Symi Mesh设备与KNX系统的互联互通。
666
341
 
667
- ### 方式一:KNX桥接节点(推荐)
342
+ ### KNX桥接节点(推荐)
668
343
 
669
- **v1.6.7新增**:使用`symi-knx-bridge`节点实现一站式配置,支持KNX实体导入和批量映射。
344
+ 使用`symi-knx-bridge`节点实现一站式配置,支持KNX实体导入和批量映射。
670
345
 
671
346
  #### 功能特点
672
347
 
@@ -729,12 +404,6 @@ Tab分隔,每行一个实体:
729
404
  主卧空调 climate 3/1/1 3/2/1 3/3/1 3/4/1 3/5/1
730
405
  ```
731
406
 
732
- #### 输入/输出
733
-
734
- - **输入**:接收来自`knxUltimate-in`节点的KNX消息
735
- - **输出1**:发送到`knxUltimate-out`节点的KNX命令
736
- - **输出2**:调试信息(连接Debug节点查看同步过程)
737
-
738
407
  #### knxUltimate节点配置(关键)
739
408
 
740
409
  **输入节点(knxUltimate-in)**:
@@ -763,410 +432,101 @@ Tab分隔,每行一个实体:
763
432
  2. **首次状态缓存**:启动后第一次状态仅缓存,第二次操作才会同步
764
433
  3. **防死循环**:KNX控制后1秒内,Mesh状态变化不会反向同步
765
434
 
766
- #### 故障排查
767
-
768
- **Mesh->KNX不工作**:
769
- 1. 检查日志是否有`[Mesh->KNX]`输出
770
- 2. 确认映射中的MAC地址与设备列表中的MAC一致
771
- 3. 等待20秒初始化完成
772
- 4. 手动操作Mesh设备,观察日志
773
-
774
- **KNX->Mesh不工作**:
775
- 1. 检查knxUltimate-in节点是否收到KNX消息
776
- 2. 确认KNX组地址与映射中的命令地址一致
777
- 3. 查看日志是否有`[KNX输入]`输出
778
- 4. 如果显示`未找到映射`,检查配置的组地址
779
-
780
- ## RS485/Modbus双向同步
435
+ ## KNX-HA双向同步
781
436
 
782
- 本节点支持与第三方RS485/Modbus设备进行双向状态同步,适用于对接各品牌空调、新风、地暖等设备。
437
+ 本节点支持KNX与Home Assistant实体直接双向同步,实现KNX系统与HA的实时互联互通。
783
438
 
784
439
  ### 功能特点
785
440
 
786
- - **双模式连接**:支持串口(RS485)和TCP/IP两种连接方式
787
- - **协议模板**:内置常用协议模板,支持自定义寄存器映射
788
- - **双向同步**:Mesh设备和485设备状态实时同步
789
- - **多设备支持**:单个485连接可管理多达105个设备
441
+ - **直接实体同步**:通过HA events-state节点实时接收HA状态变化事件
442
+ - **KNX实体导入**:支持Tab分隔格式导入KNX组地址配置
443
+ - **HA实体加载**:从HA服务器节点自动加载所有支持的实体
444
+ - **快速输入**:支持直接输入实体ID或名称搜索,带autocomplete提示
445
+ - **多设备类型**:开关、灯光、窗帘、空调、风扇
446
+ - **双向同步**:自动处理KNX↔HA状态同步
447
+ - **智能防抖**:调光300ms、窗帘500ms防抖,避免过程中频繁同步
448
+ - **防死循环**:内置800ms防抖机制
790
449
 
791
450
  ### 配置步骤
792
451
 
793
- #### 1. 添加RS485桥接节点
794
-
795
- 从"Symi Mesh"分类中拖入"RS485桥接"节点,双击打开配置:
796
-
797
- **基本配置**:
798
- - **Mesh网关**:选择已配置的Symi Gateway(点击+号可新建)
799
- - **RS485连接**:点击+号新建连接配置
800
-
801
- #### 2. 配置RS485连接
802
-
803
- 点击RS485连接旁边的+号,创建新连接:
804
-
805
- **串口模式**:
806
- - **连接方式**:选择 串口(RS485)
807
- - **串口**:从下拉框选择USB串口(点击刷新按钮可重新扫描)
808
- - **波特率**:根据设备设置(常用9600)
809
- - **校验位**:无/偶校验/奇校验
810
-
811
- **TCP模式**:
812
- - **连接方式**:选择 TCP/IP
813
- - **主机地址**:485转TCP网关的IP地址
814
- - **端口**:Modbus TCP端口(默认502)
815
-
816
- #### 3. 配置实体映射
817
-
818
- 点击"添加映射"按钮,每行配置一组对应关系:
819
-
820
- | 列 | 说明 |
821
- |----|------|
822
- | Mesh实体/按键 | 选择Mesh设备,开关设备会显示按键选择(第1路、第2路...) |
823
- | 品牌 | 选择RS485协议品牌(如 话语前湾) |
824
- | 类型/按键 | 选择设备类型,开关类型会显示按键选择 |
825
- | 地址 | Modbus从机地址(1-255) |
826
-
827
- **开关设备命名**:按按键数命名,方便识别:
828
- - Mesh端:一键开关、二键开关、三键开关、四键开关、六键开关、八键开关
829
- - RS485端:一键开关、二键开关、三键开关、四键开关、六键开关、八键开关
830
-
831
- **按键独立配置**:Mesh和RS485的按键可以自由对应,不必一一匹配:
832
- ```
833
- Mesh 六键开关 第3路 ↔ RS485 四键开关 第1路 地址:1 ✓ 支持
834
- Mesh 四键开关 第2路 ↔ RS485 六键开关 第5路 地址:2 ✓ 支持
452
+ 1. **安装依赖节点**
453
+ ```bash
454
+ cd ~/.node-red
455
+ npm install node-red-contrib-knx-ultimate
456
+ npm install node-red-contrib-home-assistant-websocket
835
457
  ```
836
458
 
837
- #### 4. 部署
838
-
839
- 点击"部署"按钮,所有映射自动开始双向同步
459
+ 2. **配置HA服务器**
460
+ 添加Home Assistant服务器配置节点,输入HA的URL和访问令牌
840
461
 
841
- ### RS485调试节点
462
+ 3. **添加KNX-HA桥接节点**
463
+ 从"Symi Mesh"分类中拖入"KNX-HA桥接"节点
842
464
 
843
- 新增 `RS485调试` 节点用于抓取并显示原始485字节流:
465
+ 4. **导入KNX实体**
466
+ 按照Tab分隔格式准备KNX组地址数据,点击"导入"按钮
844
467
 
845
- **功能**:
846
- - 实时显示RS485总线所有通信数据(TX发送/RX接收)
847
- - 自动解析Modbus RTU帧结构(从机地址、功能码)
848
- - 支持手动发送测试帧(输入十六进制字符串)
849
- - 十六进制/ASCII显示模式
850
- - 调试窗口高度自适应
468
+ 5. **配置映射**
469
+ 选择KNX实体和对应的HA实体
851
470
 
852
- **输出示例**:
471
+ 6. **连接节点**
853
472
  ```
854
- [15:07:55.123] → TX: 01 06 10 31 00 01 6A 35 | 从机:1 写单寄存器
855
- [15:07:55.180] RX: 01 06 10 31 00 01 6A 35 | 从机:1 写单寄存器
473
+ [knxUltimate-in] → [KNX-HA桥接] [knxUltimate-out]
474
+ [server-state-changed] [KNX-HA桥接]
856
475
  ```
857
476
 
858
- ### 实体映射规则
477
+ ### 支持的设备类型
859
478
 
860
- | Mesh实体类型 | RS485实体类型 | 同步内容 |
861
- |-------------|--------------|---------|
862
- | 开关-按键N | 开关 | 开/关状态 |
863
- | 温控器 | 空调 | 开关、温度、模式、风速 |
864
- | 三合一面板 | 空调+新风+地暖 | 分别配置,独立同步 |
865
- | 调光灯 | 调光器 | 开关、亮度 |
479
+ | KNX设备类型 | HA实体类型 | 同步内容 |
480
+ |------------|-----------|----------|
481
+ | 开关 | switch | 开/关状态 |
482
+ | 灯光 | light | 开关、亮度、色温 |
483
+ | 窗帘 | cover | 开关、位置、停止 |
484
+ | 空调 | climate | 开关、温度、模式 |
485
+ | 风扇 | fan | 开关、风速 |
866
486
 
867
- **部分同步**:如果RS485协议不提供某些功能点,只同步双方都支持的内容
487
+ ## RS485/Modbus双向同步
868
488
 
869
- ### 三合一面板配置
489
+ 本节点支持与第三方RS485/Modbus设备进行双向状态同步,适用于对接各品牌空调、新风、地暖等设备。
870
490
 
871
- 三合一面板(温控器类型)可同时控制空调、新风、地暖,需要创建3个独立映射:
491
+ ### 功能特点
872
492
 
873
- #### 配置示例(话语前湾协议)
493
+ - **双模式连接**:支持串口(RS485)和TCP/IP两种连接方式
494
+ - **协议模板**:内置常用协议模板,支持自定义寄存器映射
495
+ - **双向同步**:Mesh设备和485设备状态实时同步
496
+ - **多设备支持**:单个485连接可管理多达105个设备
874
497
 
875
- | Mesh设备 | RS485设备类型 | 从机地址 | 说明 |
876
- |---------|--------------|---------|------|
877
- | 三合一面板_xxx | 次卧1空调 | 0 | 空调寄存器0x0FA4-0x0FA7 |
878
- | 三合一面板_xxx | 新风 | 60 | 开关0x0039,风速0x004B |
879
- | 三合一面板_xxx | 次卧1地暖 | 62 | 开关0x0039,温度0x0043 |
498
+ ### 配置步骤
880
499
 
881
- #### 话语前湾地暖/新风从机地址
500
+ 1. **添加RS485桥接节点**
501
+ 从"Symi Mesh"分类中拖入"RS485桥接"节点
882
502
 
883
- | 设备 | 从机地址 | 十六进制 |
884
- |------|---------|---------|
885
- | 客餐厅地暖 | 60 | 0x3C |
886
- | 新风 | 60 | 0x3C |
887
- | 主卧地暖 | 61 | 0x3D |
888
- | 次卧1地暖 | 62 | 0x3E |
889
- | 次卧2地暖 | 63 | 0x3F |
503
+ 2. **配置RS485连接**
504
+ - **串口模式**:选择USB串口,设置波特率(常用9600)
505
+ - **TCP模式**:输入485转TCP网关的IP地址和端口
890
506
 
891
- > **注意**:新风和客餐厅地暖共用从机地址60,但开关值不同(新风开=1,地暖开=2),请分别创建映射。
507
+ 3. **配置实体映射**
508
+ 选择Mesh设备和RS485设备类型、地址
509
+
510
+ 4. **部署**
511
+ 点击"部署"按钮,开始双向同步
892
512
 
893
513
  ### 内置协议支持
894
514
 
895
515
  | 品牌 | 支持设备 |
896
516
  |-----|---------|
897
- | 话语前湾 | 空调(客厅/主卧/次卧1/次卧2)、地暖、新风、窗帘、1-8键开关 |
517
+ | 话语前湾 | 空调、地暖、新风、窗帘、1-8键开关 |
898
518
  | 通用Modbus | 各类标准Modbus设备 |
899
519
  | 自定义协议 | 任意485码匹配(开关/窗帘/场景) |
900
520
 
901
- ### 自定义协议模式(v1.7.0增强)
902
-
903
- 当内置协议无法满足需求时,可使用"自定义协议"模式,手动录入RS485十六进制码进行双向匹配。
904
-
905
- #### 反馈选项
906
-
907
- 每个映射可设置"反馈"复选框:
908
- - **勾选反馈**(默认):RS485收码触发Mesh动作后,Mesh状态变化会再发送发码到RS485总线
909
- - **不勾选反馈**:RS485收码触发Mesh动作后,不再发送反馈码,避免总线重复数据
910
-
911
- 适用场景:当第三方设备已经知道自己的状态,不需要收到确认反馈时,取消勾选可减少总线流量。
912
-
913
- #### 自定义开关(4组码)
914
-
915
- - **发开码**:Mesh开关打开时,发送此码到RS485总线
916
- - **发关码**:Mesh开关关闭时,发送此码到RS485总线
917
- - **收开码**:RS485总线收到此码时,触发Mesh开关打开
918
- - **收关码**:RS485总线收到此码时,触发Mesh开关关闭
919
-
920
- **翻转模式**:当收开码=收关码时,收到后自动翻转开关状态
921
-
922
- #### 自定义窗帘(6组码)
923
-
924
- - **发开码**、**发关码**、**发停码**:Mesh→RS485
925
- - **收开码**、**收关码**、**收停码**:RS485→Mesh
926
-
927
- #### 自定义空调(完整收发码)
928
-
929
- - **开关**:发开码、发关码、收开码、收关码
930
- - **风速**:发高风、发中风、发低风、收高风、收中风、收低风
931
- - **模式**:发制冷、发制热、发除湿、发送风、收制冷、收制热、收除湿、收送风
932
- - **温度**:发温度码、收温度码(支持16-30度,使用{TEMP}占位符)
933
-
934
- #### 配置示例
935
-
936
- **自定义开关(花语前湾大屏)**:
937
- ```
938
- 品牌: 自定义协议
939
- 类型: 自定义开关
940
- 发开码: 01 20 10 14 00 01 00 7F 82 B6
941
- 发关码: 01 20 10 14 00 01 00 FF 83 16
942
- 收开码: 01 20
943
- 收关码: 01 20
944
- ```
945
- 说明:收开码=收关码,收到后翻转开关状态
946
-
947
- **自定义窗帘**:
948
- ```
949
- 品牌: 自定义协议
950
- 类型: 自定义窗帘
951
- 发开码: 55 02 02 03 01 49 44
952
- 发关码: 55 02 02 03 02 09 45
953
- 发停码: 55 02 02 03 03 C8 85
954
- 收开码: 55 02 02 03 01
955
- 收关码: 55 02 02 03 02
956
- 收停码: 55 02 02 03 03
957
- ```
958
-
959
- #### 工作原理
960
- 1. **Mesh→RS485**:Mesh设备状态变化时,发送对应的发码
961
- 2. **RS485→Mesh**:收到的RS485帧与收码匹配,触发对应Mesh设备
962
- 3. **翻转逻辑**:开关的收开码=收关码时,收到后翻转当前状态
963
- 4. **防死循环**:500ms内不重复触发,避免Mesh→RS485→Mesh循环
964
-
965
- #### 注意事项
966
- - 支持最多24字节(72个十六进制字符)数据录入
967
- - 支持空格分隔(如 `55 01 01` 或 `550101`)
968
- - 自定义模式不需要填写地址字段(自动隐藏)
969
- - 配置持久化保存,重启后保持
970
-
971
- ### 注意事项
972
-
973
- 1. **Modbus地址**:同一485总线上设备地址不能重复(1-255)
974
- 2. **自动重连**:网络断开后5秒自动重连,无需人工干预
975
- 3. **事件驱动**:非轮询模式,设备状态变化时才同步
976
- 4. **防循环保护**:内置同步锁机制,避免状态死循环
977
- 5. **485转TCP网关**:Node-RED只能收到自己发送请求后的设备回应,其他TCP客户端的数据不会转发(网关机制)
978
-
979
- ## RS485协议同步
980
-
981
- 本节点支持两种不同RS485协议之间的双向数据同步,适用于对接中弘VRF网关与SYMI空调面板等场景。
982
-
983
- ### 功能特点
984
-
985
- - **协议互转**:中弘VRF ↔ SYMI空调面板 ↔ 自定义码
986
- - **双向同步**:A侧状态变化自动同步到B侧,反之亦然
987
- - **自动轮询**:内置定时轮询中弘VRF设备状态(默认1秒)
988
- - **多组映射**:单节点支持多组设备映射
989
- - **防死循环**:2秒防抖机制,避免状态回环
990
- - **持久化配置**:重启后保持所有映射设置
991
-
992
- ### 支持的协议
993
-
994
- | 协议类型 | 说明 | 帧格式 |
995
- |---------|------|--------|
996
- | 中弘VRF | 中弘品牌VRF空调网关(需轮询) | `[从机] [功能码] [控制值] [数量] [外机] [内机] [校验和]` |
997
- | SYMI空调面板 | SYMI Mesh空调面板RS485接口(主动上报) | `[地址] [0x60] [开关] [温度] [模式] [风速] [...] [校验和]` |
998
- | 自定义码 | 任意十六进制码匹配 | 用户自定义 |
999
-
1000
- ### 中弘VRF协议详解(需轮询)
1001
-
1002
- | 功能码 | 用途 | 控制值 |
1003
- |--------|------|--------|
1004
- | 0x31 | 开关控制 | 0x00=关, 0x01=开 |
1005
- | 0x32 | 温度控制 | 16-30(直接温度值) |
1006
- | 0x33 | 模式控制 | 0x01=制冷, 0x02=除湿, 0x04=送风, 0x08=制热 |
1007
- | 0x34 | 风速控制 | 0x01=高, 0x02=中, 0x04=低 |
1008
- | 0x50 | 状态查询 | - |
1009
-
1010
- > **注意**:中弘VRF是被动响应式协议,需要主动轮询才能获取设备状态。启用轮询后会定时发送0x50查询命令。
1011
-
1012
- ### SYMI空调面板协议详解(主动上报)
1013
-
1014
- SYMI空调面板会主动上报状态变化,无需轮询。
1015
-
1016
- **帧格式**:`[地址] [0x60] [开关] [温度] [模式] [风速] [x] [x] [x] [校验和]`
1017
-
1018
- | 字节 | 说明 | 值域 |
1019
- |------|------|------|
1020
- | 0 | 设备地址 | 1-255 |
1021
- | 1 | 功能码 | 0x60 |
1022
- | 2 | 开关状态 | 0x00=关, 0x01=开 |
1023
- | 3 | 目标温度 | 16-30 (0x10-0x1E) |
1024
- | 4 | 运行模式 | 0x01=制冷, 0x02=除湿, 0x04=送风, 0x08=制热 |
1025
- | 5 | 风速 | 0x01=低, 0x02=中, 0x04=高 |
1026
- | 6-8 | 保留 | - |
1027
- | 9 | 校验和 | 前9字节累加和的低8位 |
1028
-
1029
- **示例帧**:`01 60 01 18 08 02 01 01 00 86`
1030
- - 地址1, 开机, 24°C, 制热, 中风
1031
-
1032
- **帧示例**(开机):
1033
- ```
1034
- 01 31 01 01 01 01 36
1035
- │ │ │ │ │ │ └─ 校验和
1036
- │ │ │ │ │ └─ 内机地址
1037
- │ │ │ │ └─ 外机地址
1038
- │ │ │ └─ 空调数量
1039
- │ │ └─ 控制值(开)
1040
- │ └─ 功能码(开关)
1041
- └─ 从机地址
1042
- ```
1043
-
1044
- ### 配置步骤
1045
-
1046
- #### 1. 添加RS485同步节点
1047
-
1048
- 从"Symi Mesh"分类中拖入"RS485同步"节点
1049
-
1050
- #### 2. 配置RS485连接
1051
-
1052
- **RS485连接A**:选择第一种协议的RS485配置(如中弘VRF网关)
1053
- **RS485连接B**:选择第二种协议的RS485配置(如SYMI空调面板)
1054
-
1055
- > **注意**:A和B必须是两个不同的RS485配置节点
1056
-
1057
- #### 3. 添加协议映射
1058
-
1059
- 点击"添加映射"按钮,配置每组对应关系:
1060
-
1061
- | 配置项 | 说明 |
1062
- |--------|------|
1063
- | A侧协议 | 选择A侧使用的协议(中弘VRF/SYMI空调面板/自定义码) |
1064
- | B侧协议 | 选择B侧使用的协议 |
1065
- | 详细参数 | 点击齿轮按钮展开,配置地址等参数 |
1066
-
1067
- #### 4. 轮询设置
1068
-
1069
- | 参数 | 说明 | 默认值 |
1070
- |------|------|--------|
1071
- | 启用轮询 | 开启后自动轮询中弘VRF设备状态 | 启用 |
1072
- | 轮询间隔 | 轮询周期(毫秒) | 1000ms |
1073
-
1074
- > **说明**:中弘VRF是被动响应式协议,需要主动查询才能获取设备状态。启用轮询后会逐个查询所有配置的中弘VRF设备。
1075
-
1076
- #### 5. 中弘VRF参数配置
1077
-
1078
- | 参数 | 说明 | 范围 |
1079
- |------|------|------|
1080
- | 外机地址 | VRF外机地址 | 0-255 |
1081
- | 内机地址 | VRF内机地址 | 0-255 |
1082
-
1083
- #### 6. SYMI空调面板参数配置
1084
-
1085
- | 参数 | 说明 | 范围 |
1086
- |------|------|------|
1087
- | 设备地址 | SYMI面板Modbus地址 | 1-255 |
1088
-
1089
- #### 7. 自定义码参数配置
1090
-
1091
- | 参数 | 说明 |
1092
- |------|------|
1093
- | 开机发码 | 检测到开机时发送的十六进制码 |
1094
- | 关机发码 | 检测到关机时发送的十六进制码 |
1095
- | 开机收码 | 收到此码时认为设备开机 |
1096
- | 关机收码 | 收到此码时认为设备关机 |
1097
-
1098
- #### 8. 部署
1099
-
1100
- 点击"部署"按钮,节点自动开始双向同步
1101
-
1102
- ### 配置示例
1103
-
1104
- **中弘VRF ↔ SYMI空调面板**:
1105
- ```
1106
- RS485连接A: 192.168.2.100:502 (中弘VRF网关)
1107
- RS485连接B: 192.168.2.110:1031 (SYMI面板总线)
1108
-
1109
- 映射1:
1110
- A侧: 中弘VRF (从机1, 外机1, 内机1)
1111
- B侧: SYMI空调面板 (地址1)
1112
-
1113
- 映射2:
1114
- A侧: 中弘VRF (从机1, 外机1, 内机2)
1115
- B侧: SYMI空调面板 (地址2)
1116
- ```
1117
-
1118
- ### 工作原理
1119
-
1120
- #### A→B同步流程
1121
-
1122
- 1. A侧RS485收到状态帧
1123
- 2. 解析协议,提取状态(开关/温度/模式/风速)
1124
- 3. 根据B侧协议生成控制命令
1125
- 4. 发送到B侧RS485
1126
-
1127
- #### B→A同步流程
1128
-
1129
- 1. B侧RS485收到状态帧
1130
- 2. 解析协议,提取状态
1131
- 3. 根据A侧协议生成控制命令
1132
- 4. 发送到A侧RS485
1133
-
1134
- #### 防死循环机制
1135
-
1136
- - 同步后2秒内忽略反向状态变化
1137
- - 每组映射独立防抖,互不影响
1138
- - 状态缓存避免重复同步
1139
-
1140
- ### 手动触发查询
1141
-
1142
- 可以使用inject节点发送查询命令:
1143
-
1144
- ```json
1145
- {
1146
- "payload": {
1147
- "action": "query"
1148
- }
1149
- }
1150
- ```
1151
-
1152
- 这将向A侧所有中弘VRF设备发送状态查询命令。
1153
-
1154
- ### 故障排查
1155
-
1156
- **A→B不工作**:
1157
- 1. 检查日志是否有`[A侧收到]`输出
1158
- 2. 确认A侧协议参数(从机/外机/内机地址)正确
1159
- 3. 检查RS485连接A是否已连接
521
+ ### 三合一面板配置
1160
522
 
1161
- **B→A不工作**:
1162
- 1. 检查日志是否有`[B侧收到]`输出
1163
- 2. 确认B侧协议参数正确
1164
- 3. 检查RS485连接B是否已连接
523
+ 三合一面板需要创建3个独立映射:
1165
524
 
1166
- **状态不同步**:
1167
- 1. 检查节点状态是否显示"同步中"
1168
- 2. 确认两个RS485连接都已连接(绿色状态)
1169
- 3. 查看日志中的同步消息
525
+ | Mesh设备 | RS485设备类型 | 从机地址 |
526
+ |---------|--------------|---------|
527
+ | 三合一面板_xxx | 空调 | 0 |
528
+ | 三合一面板_xxx | 新风 | 60 |
529
+ | 三合一面板_xxx | 地暖 | 62 |
1170
530
 
1171
531
  ## 云端数据同步
1172
532
 
@@ -1174,283 +534,139 @@ RS485连接B: 192.168.2.110:1031 (SYMI面板总线)
1174
534
 
1175
535
  ### 使用场景
1176
536
 
1177
- - **酒店项目**:自动同步房间设备的本地化名称(如"客厅窗帘"、"床头灯"等)
1178
- - **场景管理**:获取云端配置的场景列表(如"全关"、"睡眠模式"等)并本地化调用
1179
- - **批量部署**:统一管理多个房间的设备名称,无需手动配置
537
+ - **酒店项目**:自动同步房间设备的本地化名称
538
+ - **场景管理**:获取云端配置的场景列表并本地化调用
539
+ - **批量部署**:统一管理多个房间的设备名称
1180
540
 
1181
541
  ### 配置步骤
1182
542
 
1183
- #### 1. 添加云端同步节点
1184
-
1185
- 在Node-RED中添加"Symi Cloud Sync"节点:
543
+ 1. **添加云端同步节点**
544
+ 2. **配置云端认证**:App ID和App Secret
545
+ 3. **配置房间信息**:酒店ID和房间号
546
+ 4. **部署并验证**
1186
547
 
1187
- **基础配置**:
1188
- - **网关**:选择已配置的Symi Gateway节点
1189
- - **MQTT节点**:选择Symi MQTT节点(用于更新Discovery配置)
1190
-
1191
- **云端认证**:
1192
- - **App ID**:请联系Symi技术支持获取
1193
- - **App Secret**:请联系Symi技术支持获取
1194
- - 点击"测试连接"按钮验证认证信息
548
+ ### 按键场景自动触发
1195
549
 
1196
- **房间配置**:
1197
- - **酒店ID**:输入酒店ID或点击"加载酒店列表"自动获取
1198
- - **房间号**:输入房间号(如:1001)
1199
- - **房间UUID**:可选,如果有UUID可直接填写
550
+ 开关按键可以绑定场景,按下时自动触发场景执行:
1200
551
 
1201
- **同步选项**:
1202
- - **自动同步**:勾选后,启动时自动从云端获取数据(推荐)
552
+ - **普通按键**:控制本地继电器
553
+ - **场景按键**:按下时触发指定场景
554
+ - **双控按键**:根据当前状态触发开/关场景
555
+ - **总控按键**:全局控制
1203
556
 
1204
- #### 2. 部署并验证
557
+ ## 节点概览
1205
558
 
1206
- 1. 点击右上角"部署"按钮
1207
- 2. 检查调试面板确认同步状态:
1208
- - `开始从云端获取数据` - 开始同步
1209
- - `云端数据获取成功: X个设备, Y个场景` - 同步成功
1210
- - `设备名称已更新: 旧名称 -> 新名称` - 名称更新
1211
- - `重新发布MQTT Discovery配置` - 更新HA配置
1212
- 3. 在Home Assistant中查看设备名称是否已更新
559
+ | 节点 | 用途 |
560
+ |-----|------|
561
+ | **Symi Gateway** | 网关连接(TCP/串口) |
562
+ | **Symi MQTT** | MQTT桥接,设备发布到HA |
563
+ | **Symi Device** | Flow中单设备控制/监听 |
564
+ | **Symi Cloud Sync** | 云端同步设备名称和场景 |
565
+ | **Symi RS485 Bridge** | RS485设备双向同步 |
566
+ | **Symi KNX Bridge** | KNX系统双向同步 |
567
+ | **Symi KNX-HA Bridge** | KNX与HA实体双向同步 |
568
+ | **Symi HA Sync** | HA实体双向同步 |
569
+ | **Symi MQTT Sync** | 第三方MQTT品牌设备同步 |
570
+ | **Symi MQTT Brand** | 品牌MQTT配置节点 |
571
+ | **RS485 Debug** | RS485总线数据抓包调试 |
572
+ | **Symi RS485 Sync** | 两种RS485协议双向同步 |
1213
573
 
1214
- #### 3. 手动触发同步
574
+ ## 协议说明
1215
575
 
1216
- 如需手动触发同步,可以使用inject节点:
576
+ ### 核心协议格式
1217
577
 
1218
578
  ```
1219
- [inject] --> [cloud-sync]
1220
- payload: "sync"
579
+ [Header(0x53)] [Opcode] [Status] [Length] [Data] [Checksum]
1221
580
  ```
1222
581
 
1223
- #### 4. 调用场景
1224
-
1225
- 云端同步后,可以通过inject节点调用场景:
582
+ ### 关键操作码
1226
583
 
1227
- ```
1228
- [inject] --> [cloud-sync]
1229
- payload: { scene_id: 4 } // 执行场景ID为4的场景(如"全关")
1230
- ```
584
+ | 操作码 | 名称 | 方向 | 说明 |
585
+ |-------|------|------|------|
586
+ | 0x12 | 设备列表查询 | 主机→网关 | 查询所有设备 |
587
+ | 0x92 | 设备列表响应 | 网关→主机 | 返回设备信息 |
588
+ | 0x30 | 设备控制 | 主机→网关 | 控制指定设备 |
589
+ | 0xB0 | 控制响应 | 网关→主机 | 控制结果 |
590
+ | 0x34 | 场景控制 | 主机→网关 | 执行场景(群控) |
591
+ | 0xB4 | 场景控制响应 | 网关→主机 | 场景控制结果 |
592
+ | 0x80 | 状态事件 | 网关→主机 | 设备状态主动上报 |
593
+ | 0x32 | 状态查询 | 主机→网关 | 查询设备状态 |
1231
594
 
1232
- ### 按键场景自动触发
595
+ ### 开关状态编码
1233
596
 
1234
- **v1.4.0新功能**:开关按键可以绑定场景,按下时自动触发场景执行,实现本地化场景联动。
1235
-
1236
- #### 工作原理
1237
-
1238
- 1. **云端配置获取**:从云端获取每个按键的配置信息(sub_device)
1239
- 2. **按键类型识别**:
1240
- - **普通按键**(sub_type="普通"):控制本地继电器,不触发场景
1241
- - **场景按键**(sub_type="场景"):按下时触发指定场景(scene_id)
1242
- - **双控按键**(sub_type="双控"):根据当前状态触发开场景(on_scene_id)或关场景(off_scene_id)
1243
- - **总控按键**(sub_type="总控"):同双控,用于全局控制
1244
- 3. **本地化触发**:按键按下时,系统自动检测并发送0x34场景控制命令到总线
1245
- 4. **状态同步**:场景执行后,所有相关设备状态自动同步到Home Assistant
1246
-
1247
- #### 配置示例
1248
-
1249
- 云端配置(酒店云云平台):
1250
- ```json
1251
- {
1252
- "device_name": "床头三键",
1253
- "sub_device": [
1254
- {
1255
- "sub_name": "明亮",
1256
- "sub_type": "场景",
1257
- "scene_id": 4
1258
- },
1259
- {
1260
- "sub_name": "温馨",
1261
- "sub_type": "场景",
1262
- "scene_id": 6
1263
- },
1264
- {
1265
- "sub_name": "睡眠",
1266
- "sub_type": "场景",
1267
- "scene_id": 5
1268
- }
1269
- ]
1270
- }
1271
- ```
597
+ **协议规则**: 每2位表示1路,`01`=关,`10`=开,从最低位开始
1272
598
 
1273
- #### 日志示例
599
+ | 路数 | 全关 | 全开 |
600
+ |-----|------|------|
601
+ | 1路 | 0x01 | 0x02 |
602
+ | 2路 | 0x05 | 0x0A |
603
+ | 4路 | 0x55 | 0xAA |
604
+ | 8路 | 0x5555 | 0xAAAA |
1274
605
 
1275
- 启动时显示场景绑定:
1276
- ```
1277
- [场景绑定] 床头三键: 按键1(明亮)→场景4, 按键2(温馨)→场景6, 按键3(睡眠)→场景5
1278
- [场景绑定] 入户二键: 按键1(廊灯)→开:场景22/关:场景21, 按键2(卫浴灯)→开:场景24/关:场景23
1279
- ```
606
+ ### 常用消息类型
1280
607
 
1281
- 按键按下时触发场景:
1282
- ```
1283
- [按键场景] 检测到按键1(明亮)状态变化: 开, 触发场景4
1284
- [按键场景] 场景4(明亮)控制命令已发送
1285
- [场景控制] 场景控制命令已被网关接受
1286
- [场景执行] 收到场景执行通知事件: 场景ID=4
1287
- ```
608
+ | 消息类型 | 代码 | 数据格式 | 范围/说明 |
609
+ |---------|------|---------|----------|
610
+ | 开关状态 | 0x02 | 1字节 | 1-4路开关 |
611
+ | 亮度 | 0x03 | 1字节 | 0-100% |
612
+ | 色温 | 0x04 | 1字节 | 0%=暖白, 100%=冷白 |
613
+ | 窗帘动作 | 0x05 | 1字节 | 1=开/2=关/3=停 |
614
+ | 窗帘位置 | 0x06 | 1字节 | 0-100% |
615
+ | 当前温度 | 0x16 | 2字节LE | 温度*100 |
616
+ | 目标温度 | 0x1B | 1字节 | 16-30°C |
617
+ | 风速 | 0x1C | 1字节 | 1=高/2=中/3=低/4=自动 |
618
+ | 模式 | 0x1D | 1字节 | 1=制冷/2=制热/3=送风/4=除湿 |
1288
619
 
1289
- #### 注意事项
620
+ ## MQTT主题结构
1290
621
 
1291
- 1. **云端配置必需**:需要先配置云端同步节点并成功获取设备配置
1292
- 2. **完全本地化**:场景触发完全在本地进行,不依赖云端
1293
- 3. **避免循环**:场景执行期间不会再次触发按键场景,防止循环
1294
- 4. **状态同步**:场景执行后的设备状态变化会自动同步到HA
622
+ ### Discovery主题
1295
623
 
1296
- ### 工作原理
624
+ ```
625
+ homeassistant/[platform]/[object_id]/config
626
+ ```
1297
627
 
1298
- #### 数据获取流程
628
+ ### 状态和命令主题
1299
629
 
630
+ **普通设备**:
1300
631
  ```
1301
- 启动/部署
1302
-
1303
- 调用云端API(房间信息接口)
1304
-
1305
- 解析设备列表和场景列表
1306
-
1307
- 根据MAC地址匹配本地设备
1308
-
1309
- 更新设备名称(device.name)
1310
-
1311
- 保存场景列表到本地
1312
-
1313
- 重新发布MQTT Discovery配置
1314
-
1315
- 持久化存储(缓存)
1316
-
1317
- 完成(不再调用)
632
+ symi_mesh/[mac_clean]/[entity]/state
633
+ symi_mesh/[mac_clean]/[entity]/set
1318
634
  ```
1319
635
 
1320
- #### MAC地址匹配规则
1321
-
1322
- 云端返回的设备MAC地址会自动反转后与本地设备MAC地址匹配:
1323
-
1324
- ```javascript
1325
- // 云端设备(MAC地址为反序存储)
1326
- {
1327
- "device_name": "窗帘",
1328
- "nick_name": "客厅窗帘",
1329
- "mac": "14d881c086d4", // 云端反序存储
1330
- "naddr": 256
1331
- }
1332
-
1333
- // 本地设备匹配
1334
- 1. 将云端MAC转换为小写并去除分隔符: "14d881c086d4"
1335
- 2. 反转MAC地址(每2位反转): "d486c081d814"
1336
- 3. 与本地设备MAC进行精确匹配
1337
- 4. 匹配成功后更新 device.name = "客厅窗帘"
1338
- 5. 如果云端名称为"未命名"或空,则保留设备类型标准名称(如"智能窗帘")
1339
- 6. 重新发布MQTT Discovery(使用新名称)
636
+ **三合一设备**:
1340
637
  ```
1341
-
1342
- #### 场景本地化调用
1343
-
1344
- 云端场景信息会保存到本地,可以通过网关直接调用:
1345
-
1346
- ```javascript
1347
- // 云端场景
1348
- {
1349
- "scene_name": "全关",
1350
- "scene_id": 4
1351
- }
1352
-
1353
- // 本地调用
1354
- 通过inject节点发送: { scene_id: 4 }
1355
- 节点会查找场景名称并输出到下游节点
1356
- 可以连接到其他节点进行进一步处理
638
+ 空调:symi_mesh/[mac_clean]/climate/mode
639
+ 新风:symi_mesh/[mac_clean]/fresh_air/state
640
+ 地暖:symi_mesh/[mac_clean]/floor_heating/mode
1357
641
  ```
1358
642
 
1359
- ### 数据持久化
1360
-
1361
- 云端同步节点会将获取的数据持久化存储到Node-RED的context中:
1362
-
1363
- - **存储内容**:设备列表、场景列表、最后同步时间
1364
- - **存储位置**:节点的context存储(重启后保留)
1365
- - **使用场景**:
1366
- - 云端API调用失败时,自动使用缓存数据
1367
- - 禁用自动同步后,仍可使用上次获取的数据
1368
- - 网络故障时,不影响已同步的设备名称
1369
-
1370
- ### 常见问题
1371
-
1372
- #### Q: 云端同步会影响性能吗?
1373
-
1374
- A: 不会。云端同步仅在启动/部署时执行一次,不会持续轮询。同步完成后,节点处于空闲状态,不占用资源。
1375
-
1376
- #### Q: 如果云端API调用失败怎么办?
1377
-
1378
- A: 节点会自动使用上次成功获取的缓存数据。如果从未成功获取过,设备将保持原有名称。
1379
-
1380
- #### Q: 可以禁用云端同步节点吗?
1381
-
1382
- A: 可以。禁用节点不会影响其他功能(网关、MQTT、设备控制)的正常运行。已同步的设备名称会保留。
1383
-
1384
- #### Q: 云端名称和本地设备如何匹配?
1385
-
1386
- A: 通过MAC地址精确匹配。云端返回的设备MAC地址会自动反转后与本地设备MAC匹配(因为云端存储为反序)。如果云端名称为"未命名"或空,则自动保留设备类型标准名称(如"智能窗帘"、"零火开关"等)。
1387
-
1388
- #### Q: 场景如何调用?
1389
-
1390
- A: 云端同步后,场景会自动发布为Home Assistant按钮实体。在HA中点击场景按钮即可触发本地场景执行(使用0x34协议,不经过云端)。场景执行后,所有相关设备的状态会自动同步到HA,确保状态一致性。也可以通过inject节点发送 `{ scene_id: X }` 来调用场景。
1391
-
1392
- #### Q: 设备列表中的勾选框是做什么用的?
1393
-
1394
- A: 勾选的设备会同步云端名称到本地,未勾选的设备保持原有名称不变。如果不勾选任何设备,则默认同步所有设备。场景勾选同理,勾选的场景会发布到Home Assistant。支持一键全选功能。
1395
-
1396
- #### Q: 开关设备的按键名称如何显示?
1397
-
1398
- A: 对于多键开关(1-6键),云端同步节点会显示每个按键的名称(如"床头灯"、"睡眠"等),这些名称来自云端的sub_device配置,并会同步到MQTT实体名称中。
1399
-
1400
- #### Q: MQTT配置在哪里?
1401
-
1402
- A: MQTT配置统一在**网关节点**中配置。所有使用该网关的节点(包括云端同步节点)都会自动使用网关中配置的MQTT客户端,无需重复配置。
1403
-
1404
- #### Q: HA中的实体名称格式是什么?
1405
-
1406
- A: HA实体名称为纯名称,不带MAC地址和ID。例如"客厅灯 床头灯"而不是"客厅灯_14d881c086d4_1"。MAC地址仅用作unique_id确保实体唯一性。
1407
-
1408
- #### Q: 多个房间如何管理?
1409
-
1410
- A: 每个房间部署一个云端同步节点,配置对应的酒店ID和房间号即可。
1411
-
1412
- ### 故障排除
1413
-
1414
- **症状**: 云端同步失败
643
+ ## 技术栈兼容性
1415
644
 
1416
- **解决方法**:
1417
- 1. 检查App ID和App Secret是否正确
1418
- 2. 点击"测试连接"按钮验证认证信息
1419
- 3. 检查网络连接是否正常
1420
- 4. 查看调试日志中的详细错误信息
645
+ ### 版本要求
1421
646
 
1422
- **症状**: 设备名称未更新
647
+ | 组件 | 最低版本 | 推荐版本 |
648
+ |------|---------|---------|
649
+ | Node-RED | ≥3.0.0 | 4.0+ |
650
+ | Node.js | ≥18.0.0 | 22.x LTS |
651
+ | MQTT Broker | 任意 | Mosquitto 2.x |
1423
652
 
1424
- **解决方法**:
1425
- 1. 检查云端设备MAC地址是否与本地设备一致
1426
- 2. 查看调试日志中的"设备匹配完成"信息
1427
- 3. 确认MQTT节点已正确配置
1428
- 4. 手动触发同步(发送 `msg.payload = "sync"`)
653
+ ### Node.js 18+ 兼容性
1429
654
 
1430
- **症状**: 场景无法调用
655
+ 本项目已针对Node.js 18+进行优化:
1431
656
 
1432
- **解决方法**:
1433
- 1. 检查云端是否返回了场景列表
1434
- 2. 查看调试日志中的"场景列表已保存"信息
1435
- 3. 确认场景ID是否正确
1436
- 4. 检查网关连接是否正常
657
+ - **AggregateError处理**:全局异常处理器捕获`AggregateError`,防止崩溃
658
+ - **Happy Eyeballs禁用**:通过`net.setDefaultAutoSelectFamily(false)`禁用
659
+ - **强制IPv4连接**:TCP连接使用`family: 4`参数
660
+ - **网络异常恢复**:自动捕获网络错误
1437
661
 
1438
- ## 节点概览
662
+ ### 代码质量
1439
663
 
1440
- | 节点 | 用途 | 详见章节 |
1441
- |-----|------|---------|
1442
- | **Symi Gateway** | 网关连接(TCP/串口) | [快速开始](#快速开始) |
1443
- | **Symi MQTT** | MQTT桥接,设备发布到HA | [快速开始](#快速开始) |
1444
- | **Symi Device** | Flow中单设备控制/监听 | 可用于KNX/自定义同步 |
1445
- | **Symi Cloud Sync** | 云端同步设备名称和场景 | [云端数据同步](#云端数据同步) |
1446
- | **Symi RS485 Bridge** | RS485设备双向同步 | [RS485/Modbus双向同步](#rs485modbus双向同步) |
1447
- | **Symi KNX Bridge** | KNX系统双向同步 | [KNX双向同步](#knx双向同步) |
1448
- | **Symi KNX-HA Bridge** | KNX与HA实体双向同步 | [KNX-HA双向同步](#knx-ha双向同步) |
1449
- | **Symi HA Sync** | HA实体双向同步 | [HA双向同步](#ha双向同步) |
1450
- | **Symi MQTT Sync** | 第三方MQTT品牌设备同步 | [MQTT品牌同步](#mqtt品牌同步) |
1451
- | **Symi MQTT Brand** | 品牌MQTT配置节点 | [MQTT品牌同步](#mqtt品牌同步) |
1452
- | **RS485 Debug** | RS485总线数据抓包调试 | [RS485调试节点](#rs485调试节点) |
1453
- | **Symi RS485 Sync** | 两种RS485协议双向同步 | [RS485协议同步](#rs485协议同步) |
664
+ 经2025-12-10代码审查确认:
665
+ - 遵循Node-RED节点开发规范
666
+ - 使用标准日志接口
667
+ - 正确处理节点关闭事件
668
+ - 无未处理的Promise rejection
669
+ - 代码无重复,模块化设计
1454
670
 
1455
671
  ## 开发者信息
1456
672
 
@@ -1470,232 +686,113 @@ node-red-contrib-symi-mesh/
1470
686
  │ ├── symi-device.js/html # 设备控制节点
1471
687
  │ ├── symi-cloud-sync.js/html # 云端同步节点
1472
688
  │ ├── symi-485-bridge.js/html # RS485桥接节点
1473
- │ ├── symi-485-config.js/html # RS485配置节点
1474
689
  │ ├── symi-knx-bridge.js/html # KNX桥接节点
1475
690
  │ ├── symi-knx-ha-bridge.js/html # KNX-HA桥接节点
1476
- │ ├── symi-rs485-sync.js/html # RS485协议同步节点
691
+ │ ├── symi-ha-sync.js/html # HA同步节点
1477
692
  │ ├── symi-mqtt-sync.js/html # MQTT品牌同步节点
1478
- ├── symi-mqtt-brand.js/html # 品牌MQTT配置节点
1479
- │ └── rs485-debug.js/html # RS485调试节点
693
+ └── ...
1480
694
  ├── examples/
1481
- │ ├── basic-example.json # 基础示例
1482
- │ ├── knx-sync-example.json # KNX桥接节点示例
1483
- │ └── rs485-sync-example.json # RS485协议同步示例
695
+ │ ├── basic-example.json
696
+ │ ├── knx-sync-example.json
697
+ │ └── rs485-sync-example.json
1484
698
  ├── LICENSE
1485
699
  ├── README.md
1486
700
  └── package.json
1487
701
  ```
1488
702
 
1489
- ### 协议参考
1490
-
1491
- 本项目严格遵循"蓝牙MESH网关(初级版)串口协议V1.0"文档实现。
1492
-
1493
- ### 贡献指南
1494
-
1495
- 欢迎提交Issue和Pull Request:
1496
-
1497
- 1. Fork本仓库
1498
- 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
1499
- 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
1500
- 4. 推送到分支 (`git push origin feature/AmazingFeature`)
1501
- 5. 提交Pull Request
1502
-
1503
- **开发要求**:
1504
- - 遵循现有代码风格
1505
- - 添加必要的注释和文档
1506
- - 测试所有更改
1507
- - 更新README(如需要)
1508
-
1509
- ## 技术栈兼容性
1510
-
1511
- ### 版本要求
1512
-
1513
- | 组件 | 最低版本 | 推荐版本 | 说明 |
1514
- |------|---------|---------|------|
1515
- | Node-RED | ≥3.0.0 | 4.0+ | 支持最新API |
1516
- | Node.js | ≥18.0.0 | 22.x LTS | 官方推荐LTS版本 |
1517
- | MQTT Broker | 任意 | Mosquitto 2.x | 支持MQTT 3.1.1+ |
1518
-
1519
- ### Node.js 18+ 兼容性
1520
-
1521
- 本项目已针对Node.js 18+进行优化:
1522
-
1523
- - **AggregateError处理**:全局异常处理器捕获`AggregateError`,防止崩溃
1524
- - **Happy Eyeballs禁用**:通过`net.setDefaultAutoSelectFamily(false)`禁用
1525
- - **强制IPv4连接**:TCP连接使用`family: 4`参数,避免IPv6连接超时
1526
- - **网络异常恢复**:自动捕获`ECONNREFUSED`、`ETIMEDOUT`等网络错误
1527
-
1528
- ### 代码质量
1529
-
1530
- 经2025-12-10代码审查确认:
1531
- - 遵循Node-RED节点开发规范
1532
- - 使用标准日志接口(`node.log()`、`node.error()`等)
1533
- - 正确处理节点关闭事件,清理事件监听器防止内存泄漏
1534
- - 无未处理的Promise rejection
1535
- - 无TODO/FIXME/HACK标记
1536
- - 代码无重复,模块化设计
1537
-
1538
703
  ## 更新日志
1539
704
 
1540
- ### v1.8.3 (2026-01-05)
1541
-
1542
- **HA同步节点重大修复**:
1543
- - 修复HA→Symi方向不工作的问题(input监听器未正确注册)
1544
- - 支持多种HA节点消息格式(server-events、server-state-changed、trigger:state等)
1545
- - 自动过滤event类型实体(如按键点击事件),避免无效同步
1546
- - 优化状态显示:蓝色"Mesh→HA"表示单向,绿色"双向同步"表示双向正常
1547
- - 精简日志输出,只记录映射中的实体状态变化
1548
- - 更新HTML帮助文档,详细说明双向同步连接方式
1549
- - 更新README文档,添加完整的HA同步配置指南
1550
-
1551
- **连接方式说明**:
1552
- - Symi→HA:自动工作,无需额外配置
1553
- - HA→Symi:需连接`events: all`或`events: state`节点到symi-ha-sync输入端
1554
-
1555
- ### v1.8.2 (2025-12-xx)
1556
-
1557
- - 窗帘和调光灯智能防抖,只同步最终状态
1558
- - 三合一面板完整双向同步支持
1559
-
1560
- ## 技术支持
1561
-
1562
- 如遇问题,请提供以下信息:
1563
-
1564
- 1. **环境信息**:
1565
- - Node-RED版本
1566
- - Node.js版本
1567
- - 操作系统
1568
-
1569
- 2. **网关信息**:
1570
- - 网关型号
1571
- - 固件版本
1572
- - 连接方式(TCP/串口)
1573
-
1574
- 3. **问题描述**:
1575
- - 完整错误日志
1576
- - 设备类型和数量
1577
- - 复现步骤
1578
-
1579
- 4. **调试日志**:
1580
- - Node-RED调试日志
1581
- - MQTT日志(如相关)
1582
- - 网关串口日志(如可用)
705
+ ### v1.8.5 (2026-01-06)
706
+
707
+ **通用同步工具类重构**:
708
+ - 新增 `lib/sync-utils.js` 通用同步工具模块
709
+ - 统一 SyncUtils 类:提供防环路逻辑,支持不同设备类型的超时配置
710
+ - 统一 StateCache 类:状态缓存对比,避免重复同步
711
+ - 统一 SyncQueue 类:同步命令队列管理,支持高负载场景
712
+
713
+ **所有同步节点统一使用 SyncUtils**:
714
+ - HA同步节点 (`symi-ha-sync.js`) 使用 SyncUtils 替代原有防环路实现
715
+ - MQTT同步节点 (`symi-mqtt-sync.js`) 使用 SyncUtils 替代原有防环路实现
716
+ - KNX桥接节点 (`symi-knx-bridge.js`) 重构使用 SyncUtils,移除独立的 LOOP_PREVENTION_MS
717
+ - RS485桥接节点 (`symi-485-bridge.js`) 重构使用 SyncUtils,统一防环路逻辑
718
+ - 统一超时配置:普通设备2秒、窗帘30秒、亮度800ms
719
+
720
+ **MQTT品牌同步三合一子实体支持**:
721
+ - 新增 `meshSubEntity` 映射字段,支持三合一面板子实体映射
722
+ - 空调子实体 → HYQW type 12 (开关/温度/模式/风速)
723
+ - 新风子实体 → HYQW type 36 (开关/风速)
724
+ - 地暖子实体 → HYQW type 16 (开关/温度)
725
+ - 双向同步:HYQW设备状态变化自动同步到Mesh三合一面板
726
+
727
+ **代码质量优化**:
728
+ - 消除重复的防环路代码,所有同步节点共用 SyncUtils
729
+ - 节点关闭时正确调用 SyncUtils.destroy() 清理资源
730
+ - 减少内存泄漏风险,统一时间戳清理机制
731
+
732
+ **三合一状态缓存细粒度优化**:
733
+ - HA同步节点使用 StateCache 实现细粒度状态对比
734
+ - 缓存key格式优化为 `{mac}_{subEntity}_{property}`
735
+ - 只同步真正变化的属性,减少冗余HA API调用
736
+ - 支持空调、新风、地暖各属性独立变化检测
737
+
738
+ ### v1.8.4 (2026-01-06)
739
+
740
+ **HA同步节点窗帘双向同步重大修复**:
741
+ - 实现"谁发起控制就只听谁的命令"逻辑,彻底解决窗帘双向同步死循环问题
742
+ - Mesh控制时:只同步位置到HA,不发送动作命令
743
+ - HA控制时:发送动作/位置到Mesh,运动过程中忽略Mesh的所有反馈
744
+ - 停止后延迟5秒释放控制权,确保延迟反馈也被正确过滤
745
+ - 只处理HA的`opening`/`closing`状态,忽略`open`/`closed`状态反馈
746
+
747
+ **其他优化**:
748
+ - 修复HA state_changed事件解析,支持更多消息格式变体
749
+ - 优化空调同步逻辑:只在开关状态真正变化时同步
750
+ - 优化调光同步逻辑:HA发起调光时忽略Mesh步进反馈
751
+ - 增加状态变化检测:无变化时跳过处理
752
+ - 过滤sensor类型实体,避免不必要的处理
753
+
754
+ **MQTT品牌同步协议修复**:
755
+ - 窗帘设备协议修复:修复窗帘fn=1功能码的正确解析
756
+ - 设备类型独立处理:重构syncToMesh和syncToMqtt函数
757
+ - 完整功能码支持:灯具、空调、窗帘、地暖、新风
758
+
759
+ **三合一面板深度集成**:
760
+ - 子设备选择:HA同步节点新增三合一子设备选择功能
761
+ - 完整属性同步:支持空调、新风、地暖的全功能双向同步
762
+
763
+ **稳定性修复**:
764
+ - 修复Mesh控制窗帘时HA反向发送命令导致窗帘停止的问题
765
+ - 修复HA控制窗帘时Mesh反馈导致循环控制的问题
766
+ - 修复窗帘打开命令被防死循环机制阻止的问题
767
+ - 修复空调off->off重复日志的问题
1583
768
 
1584
769
  ## 常见问题排查
1585
770
 
1586
771
  ### MQTT连接失败
1587
772
 
1588
- **问题**:节点状态显示"Broker不可用"或"连接失败"
1589
-
1590
- **排查步骤**:
1591
-
1592
- 1. **检查MQTT Broker地址配置**
1593
- ```
1594
- # Docker部署时使用容器名
1595
- mqttBroker: mqtt://mosquitto:1883
1596
-
1597
- # 本地安装时使用localhost
1598
- mqttBroker: mqtt://localhost:1883
1599
- ```
1600
-
1601
- 2. **确认MQTT Broker运行状态**
1602
- ```bash
1603
- # Docker方式
1604
- docker ps | grep mosquitto
1605
- docker start mosquitto # 如未运行
1606
-
1607
- # Homebrew方式(macOS)
1608
- brew services list | grep mosquitto
1609
- brew services start mosquitto
1610
-
1611
- # 测试连接
1612
- nc -zv localhost 1883
1613
- ```
1614
-
1615
- 3. **检查防火墙/网络**
1616
- - 确保1883端口未被占用或阻断
1617
- - 如使用Docker,确保网络配置正确
773
+ 1. 检查MQTT Broker地址配置
774
+ 2. 确认MQTT Broker运行状态
775
+ 3. 检查防火墙/网络
1618
776
 
1619
777
  ### 网关连接失败
1620
778
 
1621
- **问题**:节点状态显示"连接失败"或频繁重连
1622
-
1623
- **排查步骤**:
1624
-
1625
779
  1. 确认网关IP地址和端口(默认4196)
1626
780
  2. 使用`ping`测试网络连通性
1627
781
  3. 检查网关是否开启TCP服务模式
1628
- 4. 查看Node-RED日志中的详细错误信息
1629
782
 
1630
783
  ### 设备状态不同步
1631
784
 
1632
- **问题**:HA中设备状态与实际不一致
1633
-
1634
- **排查步骤**:
1635
-
1636
785
  1. 检查网关节点是否显示"已连接"
1637
786
  2. 检查MQTT节点是否显示"已连接"
1638
787
  3. 在Node-RED调试面板查看是否收到设备状态事件
1639
- 4. 确认MQTT Broker中的topic消息是否正确
1640
788
 
1641
- ## 更新日志
789
+ ## 技术支持
1642
790
 
1643
- ### v1.8.3 (2026-01-05)
1644
-
1645
- **HA同步节点重大修复**:
1646
- - 修复HA→Symi方向不工作的问题(input监听器未正确注册)
1647
- - 支持多种HA节点消息格式(server-events、server-state-changed、trigger:state等)
1648
- - 自动过滤event类型实体(如按键点击事件),避免无效同步
1649
- - 优化状态显示:蓝色"Mesh→HA"表示单向,绿色"双向同步"表示双向正常
1650
- - 精简日志输出,只记录映射中的实体状态变化
1651
- - 更新HTML帮助文档,详细说明双向同步连接方式
1652
- - 更新README文档,添加完整的HA同步配置指南
1653
-
1654
- **连接方式说明**:
1655
- - Symi→HA:自动工作,无需额外配置
1656
- - HA→Symi:需连接`events: all`或`events: state`节点到symi-ha-sync输入端
1657
-
1658
- ### v1.8.2 (2026-01-05)
1659
- - **MQTT品牌同步协议修复**:
1660
- - **窗帘设备协议修复**:修复窗帘fn=1功能码的正确解析(0=关闭, 1=打开, 2=停止),之前错误地当作开关处理
1661
- - **设备类型独立处理**:重构syncToMesh和syncToMqtt函数,按设备类型(8/12/14/16/36)独立处理功能码映射
1662
- - **完整功能码支持**:
1663
- - 灯具(8): fn=1开关, fn=2亮度
1664
- - 空调(12): fn=1开关, fn=2温度, fn=3模式, fn=4风速
1665
- - 窗帘(14): fn=1动作(开/关/停), fn=2位置
1666
- - 地暖(16): fn=1开关, fn=2温度
1667
- - 新风(36): fn=1开关, fn=3风速
1668
- - **错误日志增强**:同步失败时输出详细错误信息,便于调试
1669
-
1670
- ### v1.8.1 (2026-01-05)
1671
- - **三合一面板深度集成**:
1672
- - **子设备选择**:HA同步节点新增三合一子设备选择功能,可分别选择“空调”、“新风”、“地暖”进行独立映射。
1673
- - **完整属性同步**:支持空调(开关/模式/温度/风速)、新风(开关/风速)、地暖(开关/温度)的全功能双向同步。
1674
- - **配置与文档优化**:
1675
- - **纯配置同步**:明确HA同步节点为纯配置模式,无需额外连线即可实现双向同步。
1676
- - **文档更新**:全面更新README,增加三合一配置示例和Config-Only说明。
1677
- - **稳定性修复**:
1678
- - 修复 Symi→HA 同步时的调试日志重复输出问题。
1679
- - 增强 HA 事件监听的健壮性,支持多种输入格式。
1680
- - **窗帘双向同步修复**:
1681
- - **运动状态跟踪**:新增 `coverMoving` 状态跟踪机制,记录窗帘运动的发起方(Symi/HA)和开始时间
1682
- - **步进反馈过滤**:当 HA 发起窗帘控制时,自动忽略 Mesh 窗帘运动过程中的步进位置反馈,避免干扰
1683
- - **运动中状态过滤**:当 HA 窗帘处于 `opening`/`closing` 状态时,不同步位置变化到 Mesh,只同步最终位置
1684
- - **专用防死循环时间**:窗帘使用 30 秒防死循环窗口(普通设备 2 秒),适应窗帘较长的运动时间
1685
- - **防抖时间优化**:窗帘防抖时间从 500ms 增加到 1500ms,确保位置稳定后再同步
1686
- - **自动清理机制**:运动状态超时(30秒)自动清理,防止内存泄漏
1687
-
1688
- ### v1.8.0 (2026-01-05)
1689
- - **HA同步节点重大增强**:
1690
- - **同步模式选择**:新增“双向同步”、“仅Symi→HA”、“仅HA→Symi”三种模式,配置更加灵活。
1691
- - **持久化修复**:修复了 `syncMode` 和 `symiEntityType` 在节点保存时丢失的问题,确保配置 100% 永久保存。
1692
- - **UI 体验优化**:重新设计了映射列表布局,增加了“同步模式”列,并优化了窄屏下的显示效果。
1693
- - **容错能力增强**:修复了设备离线时无法正确显示按键选择器的问题,现在会自动回退到保存的配置。
1694
- - **发布包质量保证**:
1695
- - 重新核对并优化了 `package.json` 的 `files` 字段,确保所有必要的 `lib` 和 `nodes` 文件在发布包中完整无缺,解决部分客户反馈的安装不完整问题。
1696
- - **性能与稳定性**:
1697
- - 优化了双向同步的防死循环逻辑,减少了在高频触发场景下的 CPU 占用。
1698
- - 修复了 MQTT 配置下拉框在节点编辑面板打开时偶尔出现的加载卡顿问题。
791
+ 如遇问题,请提供以下信息:
792
+
793
+ 1. **环境信息**: Node-RED版本、Node.js版本、操作系统
794
+ 2. **网关信息**: 网关型号、固件版本、连接方式
795
+ 3. **问题描述**: 完整错误日志、设备类型和数量、复现步骤
1699
796
 
1700
797
  ## 许可证
1701
798
 
@@ -1705,11 +802,9 @@ Copyright (c) 2025 SYMI 亖米
1705
802
 
1706
803
  ---
1707
804
 
1708
- ## 关于
1709
-
1710
805
  **作者**: SYMI 亖米
1711
- **版本**: 1.8.3
806
+ **版本**: 1.8.5
1712
807
  **协议**: 蓝牙MESH网关(初级版)串口协议V1.0
1713
- **最后更新**: 2026-01-05
808
+ **最后更新**: 2026-01-06
1714
809
  **仓库**: https://github.com/symi-daguo/node-red-contrib-symi-mesh
1715
810
  **npm包**: https://www.npmjs.com/package/node-red-contrib-symi-mesh