本项目是为亖米Mesh网关开发的Home Assistant自定义集成,实现对蓝牙Mesh智能设备的控制和管理。
-
局域网发现阶段:
- 扫描局域网4196端口发现网关
- 发送协议测试消息验证连接
- 用户选择网关或手动输入IP
-
设备发现阶段:
- 连接成功后发送读取设备列表命令 (0x12)
- 接收设备列表响应 (0x92)
- 解析设备数据并持久化保存
-
实体创建阶段:
- 根据设备类型和子类型创建对应实体
- 确保设备ID唯一性,避免重复创建
- 一次性完成所有实体创建
-
运行阶段:
- 监听设备状态事件 (0x80)
- 响应用户控制命令
- 维护设备在线状态
发送格式:头码(0x53) + 操作码 + 数据长度 + 数据 + 校验码
响应格式:头码(0x53) + 操作码 + 状态 + 数据长度 + 数据 + 校验码
0x12: 读取设备列表0x92: 设备列表响应0x30: 设备控制0xB0: 设备控制响应0x80: 设备状态事件
Byte 0-5: MAC地址 (6字节)
Byte 6-7: 网络地址 (2字节,小端序)
Byte 8: 设备类型
Byte 9: 设备子类型 (路数/通道数)
Byte 10: RSSI信号强度
Byte 11: 厂商ID
Byte 12-15: 扩展数据
根据协议文档3.5.2节,设备类型定义:
| 类型码 | 设备名称 | 子类型含义 | Home Assistant平台 |
|---|---|---|---|
| 1 | 零火开关 | 1-6路 | switch |
| 2 | 单火开关 | 1-6路 | switch |
| 3 | 智能插座 | - | switch |
| 4 | 智能灯 | - | light |
| 5 | 智能窗帘 | - | cover |
| 6 | 情景面板 | - | - |
| 7 | 门磁传感器 | - | binary_sensor |
| 8 | 人体感应 | - | binary_sensor |
| 9 | 插卡取电 | - | switch |
| 10 | 温控器 | - | climate |
| 11 | 温湿度传感器 | - | sensor |
| 24 | 五色调光灯 | - | light |
# 单路开关
param = [0x01] # 关闭
param = [0x02] # 开启
# 多路开关 (按位控制)
# bit1-2: 第1路, bit3-4: 第2路, 以此类推
# 01=关闭, 10=开启
param = [0x05] # 第1路关闭,第2路关闭 (01 01)
param = [0x0A] # 第1路开启,第2路开启 (10 10)param = [brightness_percent] # 0-100param = [color_temp_percent] # 0-100coordinator.py # 协调器 - 管理TCP连接和设备
├── tcp_comm.py # TCP通信层
├── protocol.py # 协议解析层
├── device_manager.py # 设备管理器
└── platforms/ # 平台实体
├── switch.py # 开关实体
├── light.py # 灯光实体
├── binary_sensor.py # 传感器实体
└── cover.py # 窗帘实体
用户操作 → Platform Entity → Coordinator → TCP Comm → 网关设备
↓
设备状态 ← Platform Entity ← Coordinator ← TCP Comm ← 网关设备
- 设备发现只在初始化时执行一次
- 使用事件驱动而非轮询机制
- 设置合理的超时和重试机制
def generate_unique_id(mac_address: str, channel: int = None) -> str:
"""生成唯一设备ID"""
base_id = mac_address.replace(":", "").lower()
if channel:
return f"{base_id}_ch{channel}"
return base_id# 为多路开关创建独立实体
for channel in range(1, device.channels + 1):
entity = SwitchEntity(device, channel)
entity.unique_id = f"{device.unique_id}_switch_{channel}"- TCP连接建立
- 协议解析器
- 设备列表读取
- 正确解析16字节设备数据
- 设备类型映射
- 设备状态管理
- 唯一ID生成 (修复冲突问题)
- 开关实体 (1-6路)
- 灯光实体 (调光/色温)
- 传感器实体
- 透传模块实体
- 修复重复创建问题
- 开关控制命令
- 调光控制命令
- 状态查询命令
- 事件处理
- 设备在线状态
- 错误处理
- 重新配置支持
- 持久化存储
- unique_id冲突错误 - 修复"Platform symi_gateway does not generate unique IDs"
- 实体重复创建 - 优化实体创建逻辑,只为新设备创建实体
- 透传模块支持 - 正确处理类型74透传模块的capabilities
- 设备发现优化 - 改进设备发现流程,支持多次查询
- 实体创建优化: 传递新设备列表而非所有设备,避免重复创建
- unique_id生成: 确保每个实体都有唯一的ID,包含通道信息
- 错误处理: 更完善的异常处理和日志记录
- 代码结构: 清理冗余代码,提高可维护性
- ✅ TCP通信正常 - 能收到设备数据
- ✅ 设备解析正确 - 16字节格式解析
- ✅ 实体创建成功 - 避免重复创建
- ✅ 控制功能正常 - 开关/调光控制工作
- Python 3.12+
- Home Assistant 2025.1.0+
- 异步编程模式
- 事件驱动架构
- 协议版本: V1.0 (BCM/QM10-202112)