node-red-contrib-symi-mesh 1.5.2

Node-RED节点集合,用于通过TCP/串口连接Symi蓝牙Mesh网关,支持Home Assistant MQTT Discovery自动发现和云端数据同步

npm install node-red-contrib-symi-mesh

node-red-contrib-symi-mesh

一个为Node-RED设计的Symi蓝牙Mesh网关集成包,提供完整的设备控制和Home Assistant MQTT Discovery自动发现功能。

npm version Node-RED License: MIT

功能特性

  • 完整协议支持:TCP/串口双模式,严格遵循蓝牙MESH网关串口协议V1.0
  • 自动设备发现:连接后自动发现所有设备,无需手动配置
  • MQTT Discovery:自动发布HA Discovery配置,设备即插即用
  • 双向状态同步:支持0x80状态事件,实时反馈设备状态变化
  • 多设备类型:支持开关、灯光、窗帘、温控器、传感器等12+种设备
  • 三合一面板:完整支持空调+新风+地暖三合一控制面板
  • KNX集成:支持与KNX系统双向同步
  • 云端同步:从酒店云云平台自动获取设备名称和场景信息
  • 稳定可靠:完善的错误处理和自动重连机制

快速开始

1. 安装

方式一:通过npm安装(推荐)

cd ~/.node-red
npm install node-red-contrib-symi-mesh

方式二:通过Node-RED界面安装

  1. 打开Node-RED界面
  2. 点击右上角菜单 → 节点管理
  3. 搜索 node-red-contrib-symi-mesh
  4. 点击安装

方式三:本地开发安装

cd ~/.node-red
npm install /path/to/node-red-contrib-symi-mesh

安装后重启Node-RED:

node-red-restart

2. 配置网关节点

添加"Symi Gateway"配置节点:

网关连接配置:

  • 连接方式: TCP/IP 或 串口
  • TCP模式(推荐):
    • 主机地址: 网关IP(如 192.168.2.110)
    • 端口: 4196(默认)
  • 串口模式:
    • 串口路径: /dev/ttyUSB0
    • 波特率: 115200

MQTT配置(用于Home Assistant集成):

  • MQTT地址: mqtt://localhost:1883(默认,可修改)
  • 用户名: MQTT认证用户名(可选)
  • 密码: MQTT认证密码(可选)
  • HA前缀: homeassistant(默认,可修改)

提示: MQTT配置已集成到网关节点中,所有使用该网关的MQTT节点会自动使用这些配置。

3. 添加MQTT桥接节点

添加"Symi MQTT"节点到流程中:

  • 网关: 选择已配置的网关节点
  • 名称: 可选,用于标识节点

注意: MQTT连接参数从网关节点获取,无需重复配置。

4. 部署并验证

  1. 点击右上角"部署"按钮
  2. 检查调试面板确认连接状态:
    • Gateway connected - 网关连接成功
    • Device discovery complete - 设备发现完成
    • MQTT已连接 - MQTT连接成功
    • 发布设备 XXX - 设备发布到MQTT
  3. 在Home Assistant中查看自动发现的设备
  4. 测试设备控制和状态反馈

5. 多网关配置(可选)

对于大户型或多区域部署,可以配置多个网关节点:

  1. 添加第二个网关节点

    • 拖入新的"Symi Gateway"节点
    • 配置不同的IP地址或串口
    • 给网关起不同的名称(如"网关-客厅"、"网关-卧室")
  2. 添加对应的MQTT节点

    • 为每个网关添加独立的"Symi MQTT"节点
    • 在配置中选择对应的网关
    • 使用相同的MQTT broker配置
  3. 设备隔离

    • 每个网关的设备独立存储,互不干扰
    • 每个网关的设备在HA中独立显示
    • 可以为不同网关配置不同的MQTT主题前缀

示例配置

网关1(客厅): 192.168.2.110:4196 → MQTT主题: symi_mesh/living_room/
网关2(卧室): 192.168.2.111:4196 → MQTT主题: symi_mesh/bedroom/

支持的设备类型

设备类型 类型码 HA实体 功能说明
零火开关 0x01 switch 1-6路独立控制,状态反馈
单火开关 0x02 switch 1-6路独立控制,状态反馈
智能插座 0x03 switch 单路开关控制
双色调光灯 0x04 light 亮度+色温调节
智能窗帘 0x05 cover 开关+位置控制(0-100%)
门磁传感器 0x07 binary_sensor 门窗开关状态
人体感应 0x08 binary_sensor 人体活动检测
插卡取电 0x09 switch + binary_sensor 插卡检测+开关控制
温控器/三合一 0x0A climate 温度/模式/风速控制,当前温度采集
温湿度传感器 0x0B sensor 温湿度监测
五色调光灯 0x18 light RGB+亮度+色温调节
四输入八输出 0x27 (39) switch 8路独立控制,支持场景绑定

三合一设备说明

三合一设备集成了空调、新风和地暖控制,在Home Assistant中自动创建3个独立实体:

实体说明

1. 空调(climate实体)

  • 温度调节:16-30°C
  • 工作模式:制冷/制热/送风/除湿/关闭
  • 风速控制:高/中/低/自动

2. 新风(fan实体)

  • 开关控制:ON/OFF
  • 风速档位:高/中/低/自动
  • 送风/排风:支持送风和排风方向控制

3. 地暖(climate实体)

  • 温度调节:18-32°C
  • 工作模式:制热/关闭

使用方式

自动识别:部署后自动区分普通温控器和三合一设备,无需手动配置

控制方式

  • HA中直接控制:设置温度/模式自动开启设备
  • 面板物理操作:状态自动同步到HA
  • MQTT直接控制:支持完整的MQTT命令

KNX同步: 在Symi Device节点中选择三合一设备,通过"子实体"下拉选项选择与KNX同步的功能:

  • 空调 ↔ KNX空调控制器
  • 新风 ↔ KNX新风控制器
  • 地暖 ↔ KNX地暖控制器

每个功能独立同步,互不干扰。

协议说明

核心协议格式

[Header(0x53)] [Opcode] [Status] [Length] [Data] [Checksum]

关键操作码

操作码 名称 方向 说明
0x12 设备列表查询 主机→网关 查询所有设备
0x92 设备列表响应 网关→主机 返回设备信息
0x30 设备控制 主机→网关 控制指定设备
0xB0 控制响应 网关→主机 控制结果
0x34 场景控制 主机→网关 执行场景(群控)
0xB4 场景控制响应 网关→主机 场景控制结果
0x80 状态事件 网关→主机 设备状态主动上报
0x32 状态查询 主机→网关 查询设备状态

开关状态编码(重要)

协议规则: 每2位表示1路,b01=关,b10=开

路数 全关 全开 示例
1路 0x01 0x02 直接值
2路 0x05 0x0A 0x06=第1路开、第2路关
3路 0x15 0x2A 从低位开始
4路 0x55 0xAA 每2位1路
6路 0x5555 0xAAAA 2字节小端序

常用消息类型

消息类型 代码 数据格式 范围/说明
开关状态 0x02 1-2字节 见上表
亮度 0x03 1字节 0-100%
色温 0x04 1字节 0%=暖白, 100%=冷白
窗帘动作 0x05 1字节 1=开/2=关/3=停
窗帘位置 0x06 1字节 0-100%
人体感应 0x0C 1字节 0=无活动/1=检测到
插卡状态 0x0E 1字节 0=无卡/1=有卡
RGB颜色 0x11 5字节 R(0-255)/G/B/WW(0-100)/CW
当前温度 0x16 2字节LE 温度*100
目标温度 0x1B 2字节LE 16-30°C, *100
风速 0x1C 1字节 1=高/2=中/3=低/4=自动
模式 0x1D 1字节 1=制冷/2=制热/3=送风/4=除湿
6键开关状态 0x45 2字节LE 场景执行后状态上报

MQTT主题结构

Discovery主题

homeassistant/[platform]/[object_id]/config

例如:

  • 开关:homeassistant/switch/9361c820dacc_switch/config
  • 温控器:homeassistant/climate/142e68468cac_climate/config
  • 三合一空调:homeassistant/climate/894ab820dacc_climate/config
  • 三合一新风:homeassistant/fan/894ab820dacc_fresh_air/config
  • 三合一地暖:homeassistant/climate/894ab820dacc_floor_heating/config

状态和命令主题

普通设备

symi_mesh/[mac_clean]/[entity]/state
symi_mesh/[mac_clean]/[entity]/set

三合一设备(关键:空调使用climate主题):

空调:symi_mesh/[mac_clean]/climate/mode
新风:symi_mesh/[mac_clean]/fresh_air/state
地暖:symi_mesh/[mac_clean]/floor_heating/mode

例如(三合一设备 894ab820dacc):

  • 空调状态: symi_mesh/894ab820dacc/climate/target_temp
  • 空调命令: symi_mesh/894ab820dacc/climate/target_temp/set
  • 新风状态: symi_mesh/894ab820dacc/fresh_air/state
  • 新风命令: symi_mesh/894ab820dacc/fresh_air/set
  • 地暖状态: symi_mesh/894ab820dacc/floor_heating/mode
  • 地暖命令: symi_mesh/894ab820dacc/floor_heating/mode/set

KNX双向同步

本节点支持与node-red-contrib-knx-ultimate完整双向同步,实现Symi Mesh设备与KNX系统的互联互通。

配置步骤

1. 安装KNX节点

cd ~/.node-red
npm install node-red-contrib-knx-ultimate

2. 导入示例Flow

在Node-RED中:

  • 菜单 → 导入 → 选择文件
  • 导入 examples/knx-sync-example.json
  • 修改网关IP地址和设备MAC地址
  • 修改KNX组地址匹配您的系统

3. 设备类型映射

Symi设备 KNX类型 DPT 说明
开关 开关执行器 1.001 布尔开关
双色调光 调光执行器 1.001 + 5.001 开关+亮度(0-255)
五色调光 RGB调光器 1.001 + 5.001 + 232.600 开关+亮度+RGB
窗帘 窗帘执行器 1.008 + 5.001 上下+位置(0-255)
温控器 空调控制器 1.001 + 9.001 + 20.102 开关+温度+模式
人体感应 移动传感器 1.002 布尔值
插卡取电 开关+传感器 1.001 + 1.002 开关+插卡检测
三合一-空调 空调控制器 1.001 + 9.001 + 20.102 开关+温度+模式
三合一-新风 风机控制器 1.001 + 5.001 开关+风速
三合一-地暖 地暖控制器 1.001 + 9.001 开关+温度

同步逻辑

Symi → KNX(状态反馈)

  1. Symi设备状态变化
  2. symi-device节点输出状态
  3. function节点转换格式
  4. knxUltimate-out发送到KNX总线

KNX → Symi(远程控制)

  1. KNX总线命令
  2. knxUltimate-in接收命令
  3. function节点转换为MQTT格式
  4. mqtt-out发送到symi_mesh topic
  5. symi-mqtt节点处理并控制设备

转换函数示例

开关转换

// Symi→KNX
const value = msg.payload ? 1 : 0;
msg.destination = '1/1/1';
return msg;

// KNX→Symi
const mac = 'device_mac_clean';
return {
    topic: `symi_mesh/${mac}/switch/set`,
    payload: msg.payload === 1 ? 'ON' : 'OFF'
};

调光灯转换

// Symi→KNX (亮度)
const brightness = Math.round(msg.payload.brightness * 255 / 100);
msg.destination = '2/1/2';
msg.dpt = '5.001';
return msg;

// KNX→Symi
return {
    topic: `symi_mesh/${mac}/light/set`,
    payload: JSON.stringify({
        brightness: msg.payload  // 0-255
    })
};

窗帘转换

// Symi→KNX (位置)
const position = Math.round(msg.payload.curtainPosition * 255 / 100);
msg.destination = '3/1/2';
msg.dpt = '5.001';
return msg;

// KNX→Symi
return {
    topic: `symi_mesh/${mac}/cover/position/set`,
    payload: Math.round(msg.payload * 100 / 255).toString()
};

三合一设备转换

空调转换(使用climate主题)
// Symi→KNX (温度)
msg.destination = '4/1/1';
msg.dpt = '9.001';
msg.payload = parseFloat(msg.payload.temp);
return msg;

// KNX→Symi (温度)
return {
    topic: `symi_mesh/${mac}/climate/target_temp/set`,
    payload: msg.payload.toString()
};

// Symi→KNX (模式)
const modeMap = { 'cool': 1, 'heat': 2, 'fan_only': 3, 'dry': 4 };
msg.destination = '4/1/2';
msg.dpt = '20.102';
msg.payload = modeMap[msg.payload.mode] || 0;
return msg;

// KNX→Symi (模式)
const modes = ['off', 'cool', 'heat', 'fan_only', 'dry'];
return {
    topic: `symi_mesh/${mac}/climate/mode/set`,
    payload: modes[msg.payload] || 'off'
};
新风转换
// Symi→KNX (开关)
msg.destination = '4/2/1';
msg.dpt = '1.001';
msg.payload = msg.payload.switch ? 1 : 0;
return msg;

// KNX→Symi (开关)
return {
    topic: `symi_mesh/${mac}/fresh_air/set`,
    payload: msg.payload === 1 ? 'ON' : 'OFF'
};

// Symi→KNX (风速)
msg.destination = '4/2/2';
msg.dpt = '5.001';
msg.payload = Math.round(msg.payload.speed * 2.55);
return msg;

// KNX→Symi (风速)
return {
    topic: `symi_mesh/${mac}/fresh_air/speed/set`,
    payload: Math.round(msg.payload / 2.55).toString()
};
地暖转换
// Symi→KNX (温度)
msg.destination = '4/3/1';
msg.dpt = '9.001';
msg.payload = parseFloat(msg.payload.temp);
return msg;

// KNX→Symi (温度)
return {
    topic: `symi_mesh/${mac}/floor_heating/target_temp/set`,
    payload: msg.payload.toString()
};

注意事项

  1. 组地址配置:根据您的KNX系统修改组地址
  2. DPT类型:确保DPT类型与KNX设备匹配
  3. MAC地址:使用小写无冒号格式(如:1427c920dacc
  4. 双向同步:避免循环控制,使用outputRBE: true防抖
  5. 测试验证:先测试单向同步,确认正常后再启用双向

云端数据同步

本节点支持从酒店云云平台自动获取设备名称和场景信息,实现本地化配置的自动同步。

使用场景

  • 酒店项目:自动同步房间设备的本地化名称(如"客厅窗帘"、"床头灯"等)
  • 场景管理:获取云端配置的场景列表(如"全关"、"睡眠模式"等)并本地化调用
  • 批量部署:统一管理多个房间的设备名称,无需手动配置

配置步骤

1. 添加云端同步节点

在Node-RED中添加"Symi Cloud Sync"节点:

基础配置

  • 网关:选择已配置的Symi Gateway节点
  • MQTT节点:选择Symi MQTT节点(用于更新Discovery配置)

云端认证

  • App IDcee70459(默认已填写)
  • App Secreta719a4b58e2e57e50d758ee3762507e7(默认已填写)
  • 点击"测试连接"按钮验证认证信息

房间配置

  • 酒店ID:输入酒店ID或点击"加载酒店列表"自动获取
  • 房间号:输入房间号(如:1001)
  • 房间UUID:可选,如果有UUID可直接填写

同步选项

  • 自动同步:勾选后,启动时自动从云端获取数据(推荐)

2. 部署并验证

  1. 点击右上角"部署"按钮
  2. 检查调试面板确认同步状态:
    • 开始从云端获取数据 - 开始同步
    • 云端数据获取成功: X个设备, Y个场景 - 同步成功
    • 设备名称已更新: 旧名称 -> 新名称 - 名称更新
    • 重新发布MQTT Discovery配置 - 更新HA配置
  3. 在Home Assistant中查看设备名称是否已更新

3. 手动触发同步

如需手动触发同步,可以使用inject节点:

[inject] --> [cloud-sync]
payload: "sync"

4. 调用场景

云端同步后,可以通过inject节点调用场景:

[inject] --> [cloud-sync]
payload: { scene_id: 4 }  // 执行场景ID为4的场景(如"全关")

按键场景自动触发

v1.4.0新功能:开关按键可以绑定场景,按下时自动触发场景执行,实现本地化场景联动。

工作原理

  1. 云端配置获取:从云端获取每个按键的配置信息(sub_device)
  2. 按键类型识别
    • 普通按键(sub_type="普通"):控制本地继电器,不触发场景
    • 场景按键(sub_type="场景"):按下时触发指定场景(scene_id)
    • 双控按键(sub_type="双控"):根据当前状态触发开场景(on_scene_id)或关场景(off_scene_id)
    • 总控按键(sub_type="总控"):同双控,用于全局控制
  3. 本地化触发:按键按下时,系统自动检测并发送0x34场景控制命令到总线
  4. 状态同步:场景执行后,所有相关设备状态自动同步到Home Assistant

配置示例

云端配置(酒店云云平台):

{
  "device_name": "床头三键",
  "sub_device": [
    {
      "sub_name": "明亮",
      "sub_type": "场景",
      "scene_id": 4
    },
    {
      "sub_name": "温馨",
      "sub_type": "场景",
      "scene_id": 6
    },
    {
      "sub_name": "睡眠",
      "sub_type": "场景",
      "scene_id": 5
    }
  ]
}

日志示例

启动时显示场景绑定:

[场景绑定] 床头三键: 按键1(明亮)→场景4, 按键2(温馨)→场景6, 按键3(睡眠)→场景5
[场景绑定] 入户二键: 按键1(廊灯)→开:场景22/关:场景21, 按键2(卫浴灯)→开:场景24/关:场景23

按键按下时触发场景:

[按键场景] 检测到按键1(明亮)状态变化: 关 → 开, 触发场景4
[按键场景] ✓ 场景4(明亮)控制命令已发送
[场景控制] 场景控制命令已被网关接受
[场景执行] 收到场景执行通知事件: 场景ID=4

注意事项

  1. 云端配置必需:需要先配置云端同步节点并成功获取设备配置
  2. 完全本地化:场景触发完全在本地进行,不依赖云端
  3. 避免循环:场景执行期间不会再次触发按键场景,防止循环
  4. 状态同步:场景执行后的设备状态变化会自动同步到HA

工作原理

数据获取流程

启动/部署
  ↓
调用云端API(房间信息接口)
  ↓
解析设备列表和场景列表
  ↓
根据MAC地址匹配本地设备
  ↓
更新设备名称(device.name)
  ↓
保存场景列表到本地
  ↓
重新发布MQTT Discovery配置
  ↓
持久化存储(缓存)
  ↓
完成(不再调用)

MAC地址匹配规则

云端返回的设备MAC地址会自动反转后与本地设备MAC地址匹配:

// 云端设备(MAC地址为反序存储)
{
  "device_name": "窗帘",
  "nick_name": "客厅窗帘",
  "mac": "14d881c086d4",  // 云端反序存储
  "naddr": 256
}

// 本地设备匹配
1. 将云端MAC转换为小写并去除分隔符: "14d881c086d4"
2. 反转MAC地址(每2位反转): "d486c081d814"
3. 与本地设备MAC进行精确匹配
4. 匹配成功后更新 device.name = "客厅窗帘"
5. 如果云端名称为"未命名"或空,则保留设备类型标准名称(如"智能窗帘")
6. 重新发布MQTT Discovery(使用新名称)

场景本地化调用

云端场景信息会保存到本地,可以通过网关直接调用:

// 云端场景
{
  "scene_name": "全关",
  "scene_id": 4
}

// 本地调用
通过inject节点发送: { scene_id: 4 }
节点会查找场景名称并输出到下游节点
可以连接到其他节点进行进一步处理

数据持久化

云端同步节点会将获取的数据持久化存储到Node-RED的context中:

  • 存储内容:设备列表、场景列表、最后同步时间
  • 存储位置:节点的context存储(重启后保留)
  • 使用场景
    • 云端API调用失败时,自动使用缓存数据
    • 禁用自动同步后,仍可使用上次获取的数据
    • 网络故障时,不影响已同步的设备名称

常见问题

Q: 云端同步会影响性能吗?

A: 不会。云端同步仅在启动/部署时执行一次,不会持续轮询。同步完成后,节点处于空闲状态,不占用资源。

Q: 如果云端API调用失败怎么办?

A: 节点会自动使用上次成功获取的缓存数据。如果从未成功获取过,设备将保持原有名称。

Q: 可以禁用云端同步节点吗?

A: 可以。禁用节点不会影响其他功能(网关、MQTT、设备控制)的正常运行。已同步的设备名称会保留。

Q: 云端名称和本地设备如何匹配?

A: 通过MAC地址精确匹配。云端返回的设备MAC地址会自动反转后与本地设备MAC匹配(因为云端存储为反序)。如果云端名称为"未命名"或空,则自动保留设备类型标准名称(如"智能窗帘"、"零火开关"等)。

Q: 场景如何调用?

A: 云端同步后,场景会自动发布为Home Assistant按钮实体。在HA中点击场景按钮即可触发本地场景执行(使用0x34协议,不经过云端)。场景执行后,所有相关设备的状态会自动同步到HA,确保状态一致性。也可以通过inject节点发送 { scene_id: X } 来调用场景。

Q: 设备列表中的勾选框是做什么用的?

A: 勾选的设备会同步云端名称到本地,未勾选的设备保持原有名称不变。如果不勾选任何设备,则默认同步所有设备。场景勾选同理,勾选的场景会发布到Home Assistant。支持一键全选功能。

Q: 开关设备的按键名称如何显示?

A: 对于多键开关(1-6键),云端同步节点会显示每个按键的名称(如"床头灯"、"睡眠"等),这些名称来自云端的sub_device配置,并会同步到MQTT实体名称中。

Q: MQTT配置在哪里?

A: MQTT配置统一在网关节点中配置。所有使用该网关的节点(包括云端同步节点)都会自动使用网关中配置的MQTT客户端,无需重复配置。

Q: HA中的实体名称格式是什么?

A: HA实体名称为纯名称,不带MAC地址和ID。例如"客厅灯 床头灯"而不是"客厅灯_14d881c086d4_1"。MAC地址仅用作unique_id确保实体唯一性。

Q: 多个房间如何管理?

A: 每个房间部署一个云端同步节点,配置对应的酒店ID和房间号即可。

故障排除

症状: 云端同步失败

解决方法:

  1. 检查App ID和App Secret是否正确
  2. 点击"测试连接"按钮验证认证信息
  3. 检查网络连接是否正常
  4. 查看调试日志中的详细错误信息

症状: 设备名称未更新

解决方法:

  1. 检查云端设备MAC地址是否与本地设备一致
  2. 查看调试日志中的"设备匹配完成"信息
  3. 确认MQTT节点已正确配置
  4. 手动触发同步(发送 msg.payload = "sync"

症状: 场景无法调用

解决方法:

  1. 检查云端是否返回了场景列表
  2. 查看调试日志中的"场景列表已保存"信息
  3. 确认场景ID是否正确
  4. 检查网关连接是否正常

故障排除

网关连接失败

症状: 日志显示连接错误

解决方法:

  1. 检查网关IP和端口(默认4196)
  2. 确认网关电源和网络正常
  3. 尝试ping网关IP
  4. 检查防火墙设置

设备不显示

症状: MQTT连接正常但HA中无设备

解决方法:

  1. 确认HA的MQTT集成已启用
  2. 检查Discovery前缀是否正确(默认homeassistant)
  3. 查看MQTT日志:symi_mesh/#
  4. 重启Node-RED重新发布Discovery

状态不同步

症状: 控制正常但状态不更新

解决方法:

  1. 检查日志中是否有[状态事件]
  2. 确认0x80事件正常接收
  3. 验证设备MAC地址和网络地址映射
  4. 重启网关和Node-RED

控制无响应

症状: HA发送命令但设备不动作

解决方法:

  1. 检查MQTT命令是否发送(查看Node-RED日志)
  2. 确认网络地址正确
  3. 查看是否有[控制响应] 0xB0
  4. 尝试手动发送控制命令测试

常见日志说明

[INFO] Gateway connected - 网关连接成功
[INFO] Device discovery complete - 设备发现完成
[INFO] [TCP Frame] 接收: 53 80 ... - 状态事件接收
[INFO] [状态事件] 地址=0x... - 设备状态解析成功
[INFO] MQTT已连接 - MQTT连接成功
[INFO] 发布设备 XXX - 设备发布到MQTT
[WARN] 未找到topic订阅 - MQTT订阅问题
[ERROR] Connection refused - 连接被拒绝

节点说明

Symi Gateway(网关配置节点)

配置节点,管理与Symi蓝牙Mesh网关的连接。

配置项

  • MQTT配置:选择MQTT配置节点(用于Home Assistant Discovery)
  • 连接类型:TCP或串口
  • TCP模式:IP地址和端口(默认4196)
  • 串口模式:串口路径和波特率(默认115200)

功能

  • 自动设备发现
  • 状态事件处理
  • 自动重连机制

Symi MQTT(MQTT桥接节点)

将Symi设备桥接到MQTT broker,实现Home Assistant Discovery。

配置项

  • MQTT Broker地址
  • 用户名/密码(可选)
  • Discovery前缀(默认homeassistant)

功能

  • 自动发布Discovery配置
  • 双向MQTT消息处理
  • 设备状态同步

Symi Device(设备控制节点)

用于Flow中直接控制和监听Symi设备状态。

配置项

  • 设备MAC地址
  • 通道选择(多路开关)
  • 子实体(三合一设备)

功能

  • 接收设备状态变化
  • 发送控制命令
  • 支持KNX双向同步

Symi Cloud Sync(云端同步节点)

从酒店云云平台同步设备名称和场景信息到本地。

配置项

  • 网关:选择已配置的网关节点(自动使用网关中配置的MQTT)
  • App ID / App Secret:云端API认证信息(已预填)
  • 酒店ID / 房间号:指定要同步的房间(支持下拉选择或手动输入)
  • 设备列表:显示云端设备列表(含按键名称),支持一键全选
  • 场景列表:显示云端场景列表,支持一键全选
  • 自动同步:启动时自动从云端获取数据

功能

  • 启动时自动从云端获取设备名称和场景列表
  • 根据MAC地址精确匹配本地设备并更新名称(云端MAC地址自动反转匹配)
  • 支持开关设备的按键名称同步(1-6键的sub_device名称)
  • 云端"未命名"设备自动保留设备类型标准名称(如"智能窗帘"、"零火开关"等)
  • 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
  • 自动重新发布MQTT Discovery配置(使用云端名称)
  • HA实体名称为纯名称,不带MAC地址和ID
  • 将选中的场景发布为Home Assistant按钮实体
  • 在HA中点击场景按钮即可触发本地场景执行(使用0x31协议)
  • 场景触发通过事件机制路由,确保可靠执行
  • 数据持久化存储,获取失败时使用缓存
  • 支持手动触发同步(发送 msg.payload = "sync"
  • 支持场景调用(发送 msg.payload = { scene_id: 4 }

使用场景

  • 酒店项目:自动同步房间设备的本地化名称
  • 场景管理:将云端场景发布到Home Assistant进行控制
  • 批量部署:统一管理多个房间的设备名称和场景

注意事项

  • 仅在启动/部署时获取一次,不会持续轮询
  • 云端MAC地址自动反转匹配本地设备(云端存储为反序)
  • 云端"未命名"设备自动保留设备类型标准名称
  • 酒店和房间选择自动持久化保存,重新打开配置无需重新选择
  • 勾选的设备和场景才会同步,未勾选则同步全部(支持一键全选)
  • 场景按钮发布到HA后,点击即可触发本地场景执行(0x34协议)
  • 场景执行是本地化控制,不经过云端
  • 场景执行后,所有相关设备状态自动同步到HA(队列处理,确保可靠)
  • 按键名称会同步到MQTT实体名称,MAC地址仍作为唯一ID
  • 获取失败时自动使用上次缓存的数据
  • 可以禁用节点,不影响其他功能正常运行

开发者信息

项目结构

node-red-contrib-symi-mesh/
├── lib/
│   ├── device-manager.js     # 设备管理和状态缓存
│   ├── mqtt-helper.js        # MQTT Discovery配置生成
│   ├── protocol.js           # 协议构建和解析
│   ├── tcp-client.js         # TCP连接客户端
│   └── serial-client.js      # 串口连接客户端
├── nodes/
│   ├── symi-gateway.js/html  # 网关配置节点
│   ├── symi-mqtt.js/html     # MQTT节点
│   └── symi-device.js/html   # 设备控制节点
├── examples/
│   └── knx-sync-example.json # KNX双向同步示例
├── LICENSE
├── README.md
└── package.json

协议参考

本项目严格遵循"蓝牙MESH网关(初级版)串口协议V1.0"文档实现。

贡献指南

欢迎提交Issue和Pull Request:

  1. Fork本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 提交Pull Request

开发要求

  • 遵循现有代码风格
  • 添加必要的注释和文档
  • 测试所有更改
  • 更新README(如需要)

技术支持

如遇问题,请提供以下信息:

  1. 环境信息:

    • Node-RED版本
    • Node.js版本
    • 操作系统
  2. 网关信息:

    • 网关型号
    • 固件版本
    • 连接方式(TCP/串口)
  3. 问题描述:

    • 完整错误日志
    • 设备类型和数量
    • 复现步骤
  4. 调试日志:

    • Node-RED调试日志
    • MQTT日志(如相关)
    • 网关串口日志(如可用)

更新日志

v1.5.2 (2025-11-10)

  • 场景按钮发布修复
    • 修复场景按钮无法在Home Assistant中显示的问题
    • 原因:HA MQTT Discovery要求object_id只能包含字母、数字、下划线和连字符
    • 解决:对中文房间号进行URL编码转换,确保Discovery topic符合HA规范
    • 场景控制功能完全正常,支持通过MQTT命令或HA按钮触发场景
    • 场景触发后设备状态自动同步到Home Assistant
  • 数据持久化增强
    • 所有设备配置和状态在部署后持久化保存到Node-RED context
    • 重启Node-RED后自动恢复设备列表、配置和云端同步数据
    • 云端同步数据缓存,网络故障时自动使用缓存数据
    • 设备状态实时保存,确保断电重启后状态不丢失
    • 确保节点长期稳定运行,不受重启影响
  • 8路继电器模块完整支持
    • 新增对设备类型39(四输入八输出模块)的完整支持
    • 修复5-8路开关控制和状态上报,使用正确的msgType 0x45
    • 支持8路按键名称从云端同步到Home Assistant
    • 支持8路按键场景绑定和触发
  • 多网关支持
    • 每个网关使用独立的设备存储空间(基于网关ID隔离)
    • 支持大户型多网关部署场景
    • 各网关设备互不干扰,独立管理
  • 温控器设备优化
    • 修复温控器在HA中删除后无法重新出现的问题
    • 温控器确认后自动发布Discovery配置和订阅命令主题
    • 三合一面板和普通温控器自动识别和区分
  • 网络适应性增强
    • TCP/MQTT自动重连机制,网络恢复后自动恢复通信
    • 断网期间本地串口通信不受影响(如配置串口模式)
    • MQTT重连后自动重新发布设备Discovery配置
    • 长时间断网后恢复,设备状态自动同步
  • 稳定性和性能优化
    • 优化错误日志,避免重连时产生大量重复日志
    • 添加状态事件队列大小限制(最大100),防止内存泄漏
    • 完善资源清理机制,节点关闭时正确释放所有监听器和定时器
    • 内存管理优化,长期运行不卡顿不死机
    • 确保断网/通网、断电/通电场景下系统稳定运行

许可证

MIT License

Copyright (c) 2025 SYMI 亖米


关于

作者: SYMI 亖米 版本: 1.5.2 协议: 蓝牙MESH网关(初级版)串口协议V1.0 最后更新: 2025-11-10 仓库: https://github.com/symi-daguo/node-red-contrib-symi-mesh npm包: https://www.npmjs.com/package/node-red-contrib-symi-mesh

Node Info

Version: 1.5.2
Updated 1 week, 4 days ago
License: MIT
Rating: not yet rated

Categories

Actions

Rate:

Downloads

197 in the last week

Nodes

  • symi-gateway
  • symi-device
  • symi-mqtt
  • symi-cloud-sync

Keywords

  • node-red
  • symi
  • mesh
  • bluetooth
  • mqtt
  • smart-home
  • home-assistant
  • iot
  • 亖米
  • 智能家居
  • 蓝牙网关

Maintainers