Skip to content

Latest commit

 

History

History
208 lines (167 loc) · 5.69 KB

File metadata and controls

208 lines (167 loc) · 5.69 KB

亖米Mesh网关 Home Assistant 集成开发文档

项目概述

本项目是为亖米Mesh网关开发的Home Assistant自定义集成,实现对蓝牙Mesh智能设备的控制和管理。

核心需求分析

1. 工作流程要求

  1. 局域网发现阶段

    • 扫描局域网4196端口发现网关
    • 发送协议测试消息验证连接
    • 用户选择网关或手动输入IP
  2. 设备发现阶段

    • 连接成功后发送读取设备列表命令 (0x12)
    • 接收设备列表响应 (0x92)
    • 解析设备数据并持久化保存
  3. 实体创建阶段

    • 根据设备类型和子类型创建对应实体
    • 确保设备ID唯一性,避免重复创建
    • 一次性完成所有实体创建
  4. 运行阶段

    • 监听设备状态事件 (0x80)
    • 响应用户控制命令
    • 维护设备在线状态

2. 协议规范

2.1 通信协议格式

发送格式:头码(0x53) + 操作码 + 数据长度 + 数据 + 校验码
响应格式:头码(0x53) + 操作码 + 状态 + 数据长度 + 数据 + 校验码

2.2 关键操作码

  • 0x12: 读取设备列表
  • 0x92: 设备列表响应
  • 0x30: 设备控制
  • 0xB0: 设备控制响应
  • 0x80: 设备状态事件

2.3 设备数据格式 (16字节)

Byte 0-5:   MAC地址 (6字节)
Byte 6-7:   网络地址 (2字节,小端序)
Byte 8:     设备类型
Byte 9:     设备子类型 (路数/通道数)
Byte 10:    RSSI信号强度
Byte 11:    厂商ID
Byte 12-15: 扩展数据

3. 设备类型映射

根据协议文档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

4. 控制命令格式

4.1 开关控制 (MSG_TYPE = 0x02)

# 单路开关
param = [0x01]  # 关闭
param = [0x02]  # 开启

# 多路开关 (按位控制)
# bit1-2: 第1路, bit3-4: 第2路, 以此类推
# 01=关闭, 10=开启
param = [0x05]  # 第1路关闭,第2路关闭 (01 01)
param = [0x0A]  # 第1路开启,第2路开启 (10 10)

4.2 调光控制 (MSG_TYPE = 0x03)

param = [brightness_percent]  # 0-100

4.3 色温控制 (MSG_TYPE = 0x04)

param = [color_temp_percent]  # 0-100

架构设计

1. 核心组件

coordinator.py          # 协调器 - 管理TCP连接和设备
├── tcp_comm.py         # TCP通信层
├── protocol.py         # 协议解析层
├── device_manager.py   # 设备管理器
└── platforms/          # 平台实体
    ├── switch.py       # 开关实体
    ├── light.py        # 灯光实体
    ├── binary_sensor.py # 传感器实体
    └── cover.py        # 窗帘实体

2. 数据流

用户操作 → Platform Entity → Coordinator → TCP Comm → 网关设备
                                ↓
设备状态 ← Platform Entity ← Coordinator ← TCP Comm ← 网关设备

关键问题解决

1. 避免死循环

  • 设备发现只在初始化时执行一次
  • 使用事件驱动而非轮询机制
  • 设置合理的超时和重试机制

2. 设备ID唯一性

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

3. 多路开关处理

# 为多路开关创建独立实体
for channel in range(1, device.channels + 1):
    entity = SwitchEntity(device, channel)
    entity.unique_id = f"{device.unique_id}_switch_{channel}"

实现检查清单

Phase 1: 基础通信 ✅

  • TCP连接建立
  • 协议解析器
  • 设备列表读取

Phase 2: 设备管理 ✅

  • 正确解析16字节设备数据
  • 设备类型映射
  • 设备状态管理
  • 唯一ID生成 (修复冲突问题)

Phase 3: 实体创建 ✅

  • 开关实体 (1-6路)
  • 灯光实体 (调光/色温)
  • 传感器实体
  • 透传模块实体
  • 修复重复创建问题

Phase 4: 控制功能 ✅

  • 开关控制命令
  • 调光控制命令
  • 状态查询命令
  • 事件处理

Phase 5: 优化功能 ✅

  • 设备在线状态
  • 错误处理
  • 重新配置支持
  • 持久化存储

最新修复记录 (v5.1.3)

已解决的问题 ✅

  1. unique_id冲突错误 - 修复"Platform symi_gateway does not generate unique IDs"
  2. 实体重复创建 - 优化实体创建逻辑,只为新设备创建实体
  3. 透传模块支持 - 正确处理类型74透传模块的capabilities
  4. 设备发现优化 - 改进设备发现流程,支持多次查询

技术改进

  1. 实体创建优化: 传递新设备列表而非所有设备,避免重复创建
  2. unique_id生成: 确保每个实体都有唯一的ID,包含通道信息
  3. 错误处理: 更完善的异常处理和日志记录
  4. 代码结构: 清理冗余代码,提高可维护性

当前状态

  • ✅ TCP通信正常 - 能收到设备数据
  • ✅ 设备解析正确 - 16字节格式解析
  • ✅ 实体创建成功 - 避免重复创建
  • ✅ 控制功能正常 - 开关/调光控制工作

技术规范

  • Python 3.12+
  • Home Assistant 2025.1.0+
  • 异步编程模式
  • 事件驱动架构
  • 协议版本: V1.0 (BCM/QM10-202112)