Midea AC LAN深度解析:局域网智能家电控制与集成开发指南
Midea AC LAN是一款专注于局域网环境下美的智能设备控制的集成解决方案,支持空调、风扇、热水器等多种家电类型的自动配置与远程管理。该项目通过本地网络直接通信,无需依赖云端服务,既保障了数据隐私安全,又提升了设备响应速度,特别适合智能家居爱好者和开发者构建本地化控制中心。本文将从项目架构、核心功能、设备集成到实际应用场景进行全面剖析,为技术人员提供从部署到定制开发的完整指导。
项目概述与核心价值
技术定位与解决的核心问题
Midea AC LAN作为Home Assistant生态的重要组成部分,解决了传统智能家居依赖云端控制带来的延迟高、隐私泄露风险大、网络依赖性强等痛点。通过实现设备与控制中心的直接局域网通信,该项目确保了在无互联网环境下的稳定运行,并将响应时间缩短至毫秒级。与同类解决方案相比,其独特优势在于:支持设备类型广泛(覆盖20+设备品类)、通信协议完整实现(包含加密与认证机制)、以及与Home Assistant平台的深度集成能力。
支持的设备类型与品牌矩阵
项目通过模块化设计支持多品牌多品类智能设备,核心覆盖以下产品系列:
- 环境控制类:空调(美的、东芝、COLMO等品牌)、除湿机、风扇(包括吊顶风扇、塔扇)
- 厨房电器类:微波炉、电烤箱、洗碗机、消毒柜
- 卫浴电器类:浴霸、热水器
- 生活电器类:加湿器、空气净化器
设备支持通过设备类型代码(如0xAC代表空调,0xA1代表除湿机)进行标准化管理,每个设备类型对应独立的通信协议处理模块和状态解析逻辑。项目根目录下的brands/文件夹包含17个品牌Logo资源,显示其对跨品牌设备的广泛支持能力。
项目架构设计特点
分层架构与模块解耦设计
项目采用清晰的三层架构设计,实现了业务逻辑与通信协议的高度解耦:
- 设备通信层:位于
midea/core/目录,包含网络发现(discover.py)、数据包构建(packet_builder.py)、安全认证(security.py)等核心模块,负责处理与设备的底层通信。 - 设备抽象层:通过
midea/devices/目录下的设备类型分类(如ac/、a1/、b0/),为每种设备实现特定的消息解析和命令生成逻辑,封装了设备特有协议细节。 - 集成应用层:位于
custom_components/midea_ac_lan/目录,实现Home Assistant平台的实体集成(climate.py、fan.py等),将设备功能映射为标准智能家居实体。
这种架构设计使新增设备支持时只需关注设备特定的通信协议实现,无需修改上层集成逻辑,显著提升了代码可维护性和扩展性。
协议实现与安全机制
项目完整实现了美的M-Smart协议栈,包括:
- 设备发现机制:通过UDP广播实现局域网内设备自动发现,支持指定IP地址定向搜索
- 数据加密传输:采用AES加密和HMAC签名确保通信安全,security.py中实现了多种加密模式(CBC、ECB)和密钥派生算法
- 设备认证流程:支持令牌(token)和密钥(key)双向认证,在device.py的authenticate()方法中实现完整握手过程
- 数据包校验:通过CRC8校验和32位数据编码确保传输完整性,相关实现位于crc8.py和packet_builder.py
协议实现遵循"最小权限"原则,仅实现必要的通信命令集,减少攻击面,同时所有加密算法均使用行业标准实现,避免安全隐患。
事件驱动的状态管理机制
设备状态管理采用事件驱动模型,核心实现位于device.py:
- 状态更新流程:设备状态变化时通过register_update()方法注册回调,触发Home Assistant实体状态更新
- 心跳保活机制:通过send_heartbeat()定期发送心跳包,维持设备连接
- 属性变更通知:set_attribute()方法在修改设备属性时,自动触发状态广播和UI刷新
这种设计确保了设备状态的实时性和一致性,当网络中断恢复后,系统能自动重建连接并同步最新状态。
核心功能模块解析
设备发现与网络通信模块
设备发现模块(discover.py)实现局域网内设备的自动探测,核心功能包括:
- 多模式发现:支持广播发现(适用于未知设备)和定向查询(适用于已知IP设备)两种模式
- 协议解析:能够从设备响应中提取设备ID、IP地址、端口号等关键信息
- 网络枚举:自动枚举所有广播地址进行设备扫描,提高发现成功率
发现流程采用UDP广播+TCP确认的组合策略:首先通过UDP发送广播包(默认端口6444),接收到响应后使用TCP连接验证设备可达性,最终返回包含设备ID、型号、支持协议版本的完整设备信息。
设备抽象与状态管理
Device类(device.py)作为所有设备的基类,封装了通用的设备操作方法:
- 连接管理:connect()方法处理TCP连接建立,支持自动重连机制
- 消息处理:parse_message()和build_send()分别负责消息解析与命令构建
- 状态维护:通过attributes字典维护设备当前状态,支持属性监听和批量更新
每个具体设备类型(如空调)通过继承Device类并实现特定消息处理逻辑,形成设备类型层次结构。以空调设备为例,其特有的"摇摆模式"、"节能模式"等功能通过ACAttributes枚举(位于midea/devices/ac/device.py)进行标准化定义。
安全认证与数据加密
security.py实现了完整的安全通信机制,包括:
- 密码加密:支持登录密码的AES加密(encrypt_password方法)和IAM密码加密(encrypt_iam_password方法)
- 签名算法:实现基于HMAC的请求签名机制,防止请求被篡改
- 密钥管理:支持固定密钥和动态密钥两种模式,动态密钥通过设备握手过程协商获得
- 数据编码:提供AES-CBC加解密、32位数据编码等工具方法
安全模块采用适配器模式设计,可根据不同设备类型和协议版本选择合适的加密策略,确保与设备固件的兼容性。
Home Assistant集成框架
集成框架通过custom_components/midea_ac_lan/目录实现与Home Assistant的无缝对接,核心组件包括:
- 配置流程:config_flow.py实现设备添加向导,支持手动配置和自动发现两种添加方式
- 实体注册:通过async_setup_entry()方法(位于__init__.py)注册climate、fan等平台实体
- 服务定义:services.yaml定义自定义服务接口,支持高级设备控制功能
- 多语言支持:translations/目录提供6种语言的本地化文本,包括英语、法语、俄语和中文
框架设计遵循Home Assistant的"单一职责"原则,每个设备功能对应独立的平台实体(如空调对应climate平台,风扇对应fan平台),通过统一的属性映射机制实现设备状态与UI展示的同步。
核心代码实现解析
初始化流程与设备注册
项目初始化入口位于custom_components/midea_ac_lan/__init__.py,核心流程包括:
- 组件初始化:async_setup()方法设置基础数据结构,初始化DOMAIN作用域
- 配置加载:async_setup_entry()处理配置条目,建立设备连接并注册实体
- 实体创建:根据设备类型(通过MIDEA_DEVICES配置)创建对应的Home Assistant实体
初始化过程中,系统会为每个设备创建独立的工作任务,负责状态轮询和命令发送,通过hass.async_create_task()实现异步调度,避免阻塞主线程。
设备配置与能力映射
midea_devices.py定义了设备类型与Home Assistant实体的映射关系,采用JSON-like配置结构:
MIDEA_DEVICES = {
0xAC: { # 空调设备类型代码
"name": "Air Conditioner",
"entities": {
"climate": { # 对应Home Assistant的climate平台
"type": Platform.CLIMATE,
"icon": "mdi:air-conditioner",
"default": True
},
"fresh_air": { # 新风功能映射为fan实体
"type": Platform.FAN,
"icon": "mdi:fan",
"name": "Fresh Air"
},
# 其他功能实体定义...
}
},
# 其他设备类型配置...
}
这种声明式配置使设备功能扩展变得简单,新增设备支持只需添加对应的类型配置和协议处理模块,无需修改框架代码。
通信协议实现关键点
以空调设备为例,其通信协议实现位于midea/devices/ac/message.py,核心包括:
- 消息结构:定义请求/响应消息的格式,包括头部(设备类型、协议版本)、消息体(命令类型、参数)
- 状态解析:从二进制响应中提取温度、模式、风速等状态信息
- 命令构建:将用户操作转换为设备可识别的二进制命令
协议实现采用"消息类"设计模式,每个命令类型对应独立的消息类,如MessageQueryACState负责状态查询,MessageSetACState负责状态设置,通过统一的serialize()方法转换为二进制数据。
安装与部署指南
环境准备与依赖要求
项目部署需要以下环境依赖:
- 运行环境:Python 3.9+,Home Assistant 2021.10+
- 网络要求:设备与控制中心位于同一局域网,支持UDP广播(无多播隔离)
- 系统权限:需要创建TCP socket的权限(默认使用6444端口)
对于Docker环境部署,需确保容器网络模式为host或具备macvlan配置,以支持局域网设备发现。
获取与安装流程
通过以下步骤将Midea AC LAN集成到Home Assistant:
-
获取代码:
git clone https://gitcode.com/gh_mirrors/mi/midea_ac_lan -
部署集成: 将
custom_components/midea_ac_lan/目录复制到Home Assistant的custom_components/目录下:cp -r midea_ac_lan/custom_components/midea_ac_lan /path/to/homeassistant/custom_components/ -
重启Home Assistant:使系统识别新安装的集成组件
-
配置设备:
- 通过Home Assistant界面:进入"配置>设备与服务>添加集成",搜索"Midea AC LAN"
- 选择发现的设备或手动输入设备信息(IP地址、设备ID等)
- 完成设备初始化并验证实体状态
使用场景与实践案例
智能家居自动化场景设计
基于Midea AC LAN可构建丰富的自动化场景,以下为典型应用案例:
1. 基于室内外温差的空调自动调节
实现逻辑:
- 通过室外温度传感器(如WeatherFlow设备)获取环境温度
- 当室外温度>28℃且室内温度>26℃时,自动开启空调制冷模式
- 当室外温度<10℃时,自动切换为制热模式并设置温度为22℃
核心代码片段:
alias: "智能空调调节"
trigger:
platform: numeric_state
entity_id: sensor.outdoor_temperature
above: 28
condition:
condition: numeric_state
entity_id: climate.midea_ac
attribute: current_temperature
above: 26
action:
service: climate.set_hvac_mode
target:
entity_id: climate.midea_ac
data:
hvac_mode: cool
temperature: 24
2. 浴室场景联动控制
实现逻辑:
- 浴霸(设备类型0x26)与人体传感器联动,检测到人员进入浴室时自动开启照明
- 湿度传感器检测到洗澡结束(湿度开始下降)后,自动开启排风并延时30分钟关闭
- 儿童锁功能在检测到儿童模式开启时自动激活
设备状态监控与数据分析
项目支持将设备运行数据接入Home Assistant的历史记录系统,通过以下方式实现设备监控:
- 能耗监控:空调设备的"实时功率"(realtime_power)和"总能耗"(total_energy_consumption)属性可用于构建用电分析仪表盘
- 运行状态追踪:记录设备开关机时间、模式切换、异常状态等信息,通过Logbook查看完整操作历史
- 故障预警:基于设备错误代码(error_code属性)实现故障自动报警,支持邮件、短信等通知方式
高级开发与定制
新增设备支持的开发流程
为新设备类型添加支持需完成以下开发步骤:
- 确定设备类型代码:在
const.py中定义新设备类型常量(如0xAD = "NewDeviceType") - 实现消息处理模块:在
midea/devices/下创建新设备目录(如ad/),实现message.py(消息解析)和device.py(设备逻辑) - 配置实体映射:在midea_devices.py中添加设备类型配置,定义对应的Home Assistant实体
- 测试与验证:通过
python -m custom_components.midea_ac_lan.midea.cli运行命令行工具测试设备通信
开发过程中可参考现有设备实现(如ac/或a1/目录),重点关注消息格式定义、状态解析逻辑和命令构建方法三个核心部分。
协议分析与调试工具
项目提供多种方式辅助协议调试与开发:
-
命令行工具:通过自定义Python脚本发送测试命令,示例代码:
from midea.core.device import Device from midea.core.discover import discover # 发现设备 devices = discover() # 连接设备 device = Device( name="Test Device", device_id=devices[0]["device_id"], ip_address=devices[0]["ip"], port=6444, token=devices[0]["token"], key=devices[0]["key"], device_type=0xAC ) device.connect() # 获取状态 print(device.attributes()) -
日志调试:在Home Assistant配置中开启调试日志:
logger: default: info logs: custom_components.midea_ac_lan: debug custom_components.midea_ac_lan.midea: debug -
网络抓包:使用Wireshark捕获设备通信包,过滤条件为
tcp port 6444,配合security.py中的解密方法解析加密内容
问题排查与常见故障处理
设备发现问题解决策略
当设备无法被自动发现时,可按以下步骤排查:
-
网络连通性检查:
- 验证设备与Home Assistant在同一网段
- 检查防火墙设置,确保UDP 6444端口开放
- 使用
ping命令测试设备网络可达性
-
设备兼容性确认:
- 在项目文档(doc/目录)中查找设备型号支持列表
- 确认设备已开启局域网控制功能(部分设备需在官方APP中手动启用)
-
手动添加设备: 若自动发现失败,可通过"手动配置"输入设备IP、设备ID、端口等信息强制添加
通信故障与状态异常处理
常见通信问题及解决方法:
-
连接超时:
- 检查设备是否在线(尝试从Home Assistant主机telnet设备6444端口)
- 验证token和key是否正确(可通过官方APP获取或重置设备)
-
状态不同步:
- 触发设备状态刷新:调用设备的refresh_status()方法
- 检查网络稳定性:查看信号强度,减少网络拥堵
- 调整刷新间隔:在设备配置中增加refresh_interval参数值
-
命令执行失败:
- 检查设备是否支持该命令(部分低端型号可能不支持高级功能)
- 验证参数范围:如温度设置是否在设备支持范围内(通常为16-30℃)
- 查看错误日志:通过Home Assistant日志获取详细错误信息
总结与未来展望
Midea AC LAN通过精心设计的架构和完整的协议实现,为智能家居本地化控制提供了可靠解决方案。其分层设计、模块化设备支持和安全通信机制使其成为开发自定义智能家居系统的理想基础。随着物联网技术的发展,项目未来可向以下方向演进:支持Matter协议、增加AI预测性维护功能、以及扩展更多品牌设备支持。
对于开发者而言,该项目不仅提供了设备控制的现成解决方案,更展示了如何设计一个可扩展、高兼容性的智能家居集成框架。通过深入理解其协议实现和架构设计,能够显著提升智能家居系统开发能力,构建更加智能、可靠的本地化家居控制中心。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



