1. Home Assistant 中集成米家设备的核心机制

Home Assistant 与米家生态的集成并非基于直接硬件通信,而是通过米家官方云服务作为中间桥梁完成数据交换。这种设计决定了整个集成过程的本质:Home Assistant 本身不运行米家协议栈,也不直连米家设备的本地网络;它依赖于米家开放平台提供的云 API 接口,以 OAuth2 方式授权访问用户账户下的设备列表、状态数据及控制指令。因此,所有“添加设备”的操作,实质上是将米家账户中已配网、已在线的设备,通过云接口同步其元信息(型号、名称、能力集)与实时状态(开关、温湿度、电量等)到 Home Assistant 的实体(Entity)体系中。

这一架构带来三个关键约束:第一,设备必须已在米家 App 中完成初始配网并处于在线状态;第二,用户需在米家开放平台开通开发者权限并创建接入应用(App ID / App Secret),这是 Home Assistant 插件认证的必要前提;第三,所有状态更新与指令下发均受制于云服务延迟与米家服务器的响应策略——这正是视频中观察到“温湿度数据几分钟后才刷新”、“语音查询返回青岛而非本地房间数据”的根本原因。所谓“小爱同学获取的是青岛数据”,实为米家云服务根据用户账户绑定的默认地理位置(通常为注册时 IP 归属地或手动设置的城市)返回的气象服务接口结果,与 Home Assistant 本地部署位置无关。而“米加智能温湿度计3”的温度读数能被准确识别,则说明该设备上报的传感器数据已成功经由米家云通道抵达 Home Assistant 实体,并被正确解析为 sensor.mijia_smart_temperature_humidity_sensor_3_temperature 类型的传感器实体。

理解这一云桥接模型,是排除后续所有集成问题的逻辑起点。当设备在 Home Assistant 界面不可见、状态不更新或控制无响应时,排查路径必须首先确认:米家 App 内设备是否在线?米家开放平台应用是否启用且配额未耗尽?Home Assistant 的 xiaomi_miot miio 集成是否已完成 OAuth2 授权且 Token 有效?跳过这些云层验证而直接检查本地网络或 Home Assistant 日志,往往徒劳无功。

2. 米家设备接入 Home Assistant 的完整工程流程

2.1 前置条件验证与环境准备

在执行任何配置前,必须确保以下四项基础条件全部满足:

  • 米家 App 设备状态 :目标设备(如温湿度传感器、蓝牙音箱)必须已在米家 App 中完成配网,且当前显示为“在线”。离线设备无法被云接口发现,Home Assistant 将完全无法同步其存在。可通过米家 App 底部“我的”→“家庭管理”→选择对应家庭→查看设备列表确认在线状态。

  • 米家开放平台账号与应用 :访问 https://miot-spec.org (小米 IoT 开发者平台),使用与米家 App 相同的手机号登录。进入“我的应用”→“创建应用”,填写应用名称(如 HA_MiHome_Integration )、应用描述,选择“智能家居”类型。创建完成后,记录下生成的 App ID App Secret 。此应用需在“应用设置”中启用“设备控制”与“设备状态读取”权限,并确保“应用状态”为“已上线”。

  • Home Assistant 版本与核心组件 :推荐使用 Home Assistant OS 2023.12 或更高版本,或 Supervised 安装方式。核心依赖为 xiaomi_miot 集成(自 HA 2022.12 起成为官方内置集成,替代旧版 miio )。若使用较老版本,需通过 HACS 手动安装 xiaomi_miot 自定义集成,并确保其版本 ≥ 0.6.0。

  • 网络与时间同步 :Home Assistant 主机必须能稳定访问互联网(特别是 api.io.mi.com api.home.mi.com 域名),DNS 解析正常。系统时间需严格校准,误差超过 5 分钟将导致 OAuth2 Token 签名失效,表现为“Invalid token”错误。建议在 HA 系统设置中启用 NTP 时间同步。

2.2 OAuth2 授权与集成配置

Home Assistant 的米家集成采用标准 OAuth2 授权码流程,全程在 Web 界面交互完成,无需手动处理 Token:

  1. 进入 Home Assistant 前端 → 设置 系统 集成 → 点击右下角 + 添加集成
  2. 在搜索框中输入 Xiaomi MIoT ,选择官方集成;
  3. 点击 下一步 ,系统将跳转至米家开放平台的授权页面;
  4. 使用与米家 App 相同的账号密码登录;
  5. 在授权确认页,勾选“读取设备状态”、“控制设备”两项权限,点击 允许
  6. 授权成功后,页面自动跳回 Home Assistant,显示“配置成功”提示。

此过程本质是 Home Assistant 向米家云发起授权请求,获得一个短期有效的 Authorization Code ,随后后台静默交换为长期有效的 Access Token Refresh Token 。该 Token 对应用户账户下所有已授权家庭中的设备,无需为每个设备单独授权。若后续在米家 App 中删除了某设备,Home Assistant 会在下次同步周期(默认 30 分钟)自动将其对应的实体标记为“不可用”,但不会自动移除实体条目——这解释了视频中“已删除设备仍残留于概览界面”的现象。此时需手动在 HA 的 设置 系统 集成 → 找到 Xiaomi MIoT 集成 → 点击右上角 重新配置 ,触发全量设备列表刷新。

2.3 设备同步与实体映射原理

授权完成后,Home Assistant 后台服务会立即调用米家云的 /v2/homeroom/gethome 接口,获取用户所有家庭(Home)的 ID 列表;随后对每个家庭 ID 调用 /v2/home/getdevices ,拉取该家庭下所有设备的详细信息,包括 did (设备唯一 ID)、 model (设备型号,如 lumi.sensor_ht.v1 )、 name (设备名称)、 siid (服务 ID)、 piid (属性 ID)等核心字段。

以视频中的 米加智能温湿度计3 为例,其 model 字段实际值为 miaomiaoce.temperature_humidity 。Home Assistant 的 xiaomi_miot 集成内置了针对该型号的设备规范(Device Spec),明确声明其提供 temperature (温度)、 humidity (湿度)、 battery (电量)三个可读属性。集成框架据此自动创建三个传感器实体:
- sensor.miaomiaoce_temperature_humidity_temperature
- sensor.miaomiaoce_temperature_humidity_humidity
- sensor.miaomiaoce_temperature_humidity_battery

实体 ID 的生成规则为 domain.model_name_property ,其中 domain 固定为 sensor model_name 是型号字符串标准化后的短名称(去除点号、下划线替换为短横线), property 为属性名。这一映射过程完全自动化,开发者无需编写 YAML 配置。用户仅需在米家 App 中修改设备名称(如从“温湿度计”改为“客厅温湿度”),Home Assistant 会在下一次同步中自动更新对应实体的 friendly_name 属性,前端显示即刻变更。

对于蓝牙音箱(如视频中提到的 speaker ),其 model 通常为 xiaomi.speaker.* 系列。MIoT 集成识别出其支持 play_control (播放控制)服务后,会创建 media_player.xiaomi_speaker_xxx 实体,具备 play pause volume_set 等服务。但需注意:该实体仅提供基础媒体控制能力, 不支持 播放指定歌曲(如“播放《风吹麦浪》”),因为米家云 API 未向第三方开放音乐内容搜索与推送接口。视频中“小爱同学播放歌曲”成功,是音箱自身唤醒小爱语音助手后,在米家 App 内部完成的本地音乐流处理,与 Home Assistant 无关。HA 的 media_player 实体仅能触发 play / pause 等通用指令。

2.4 实体可见性与 Lovelace 卡片配置

设备实体在 Home Assistant 前端不可见,最常见的原因是 Lovelace 界面未显式添加对应卡片。Home Assistant 的概览(Overview)视图默认仅显示 binary_sensor light switch climate 等少数域的实体, sensor 类实体(如温湿度)默认不显示。解决方法如下:

  1. 进入 概览 → 点击右上角 编辑 Dashboard
  2. 点击 + 添加卡片 → 选择 Entities 卡片;
  3. 在卡片配置中,点击 + 添加实体 ,搜索 miaomiaoce_temperature_humidity
  4. 从列表中勾选 temperature humidity battery 三个传感器;
  5. 点击 保存

此时,概览界面将出现一个包含三项读数的卡片。若希望更直观地展示,可选用 Glance 卡片(适合单个设备多属性)或 Sensor 卡片(支持图表趋势)。例如,为温湿度传感器配置 Glance 卡片:

type: glance
entities:
  - entity: sensor.miaomiaoce_temperature_humidity_temperature
    name: 温度
  - entity: sensor.miaomiaoce_temperature_humidity_humidity
    name: 湿度
  - entity: sensor.miaomiaoce_temperature_humidity_battery
    name: 电量
title: 客厅温湿度

此配置将三者聚合在一个紧凑卡片中, name 字段覆盖默认的 friendly_name ,使界面更符合中文习惯。值得注意的是,视频中“点三个点添加小米卡片”的操作,实质就是上述 Lovelace 编辑流程的图形化入口,其底层逻辑完全一致。

3. 米家设备状态同步延迟与电池供电设备的特性分析

视频中明确指出温湿度传感器数据“不是非常实时,得等几分钟才传过来”,这并非 Home Assistant 或网络配置问题,而是由设备硬件特性与米家云协议共同决定的固有行为。深入理解其根源,是合理设定系统预期与优化体验的关键。

3.1 低功耗蓝牙(BLE)设备的通信范式

米家温湿度传感器(如 miaomiaoce.temperature_humidity )属于典型的纽扣电池供电 BLE 设备。其核心设计目标是续航最大化,而非实时性。为此,固件层面实施了严格的通信节律:

  • 广播间隔(Advertising Interval) :设备以固定周期(通常为 1–2 秒)向外广播包含最新温湿度数据的 BLE 广播包(Advertisement Packet)。此广播是单向、无连接的,不保证接收方一定收到。
  • 云端同步策略 :米家网关(如多模网关、蓝牙 Mesh 网关)持续监听广播包。一旦捕获到新数据,网关立即将其通过局域网 HTTP POST 至米家云服务器。 关键点在于:网关并非每秒都上传,而是采用“批处理+延迟上报”策略 。网关内部维护一个缓存队列,当缓存达到阈值(如 5 条数据)或等待超时(如 60 秒)后,才将整批数据打包上传。此举极大降低了网关与云服务器的连接频次,节省网关功耗与流量。
  • 云服务分发延迟 :米家云服务器接收到数据后,需进行校验、存储、触发事件通知。Home Assistant 的 xiaomi_miot 集成通过长连接(WebSocket)订阅设备状态变更事件。但该连接本身存在心跳保活机制,且事件推送路径经过多层服务中转,端到端延迟通常在 30 秒至 5 分钟之间波动。视频中观察到的“几分钟”,正是这一链路延迟的典型表现。

因此,“几分钟才更新”是系统在功耗、可靠性、实时性三者间权衡后的最优解。试图通过修改 Home Assistant 的轮询间隔(如 scan_interval )来缩短延迟,完全无效——因为数据源(米家云)并未产生新事件,轮询只是重复读取旧值。

3.2 优化用户体验的实践方案

尽管无法消除物理延迟,但可通过软件层设计提升感知实时性:

  • 本地缓存与插值 :在 Lovelace 卡片中启用 show_last_changed: true ,显示数据最后更新时间戳,让用户明确知晓信息的新鲜度。对于温湿度这类变化缓慢的参数,可编写简单模板传感器(Template Sensor),对历史数据进行线性插值,平滑显示过渡值(需谨慎评估业务需求,避免误导)。

  • 告警阈值前置 :若用于环境监控(如湿度低于 30% 触发加湿器),不应依赖传感器实体的实时值做判断。而应在米家 App 中设置设备级告警(如“湿度低于 35% 时推送通知”),或利用 Home Assistant 的 device_trigger 功能监听 xiaomi_miot 集成发出的原始事件( xiaomi_miot.action ),在事件到达瞬间即刻触发自动化。事件触发的延迟远低于状态轮询。

  • 网关部署优化 :确保蓝牙网关与传感器直线距离 ≤ 5 米,无厚墙阻隔。网关固件保持最新(米家 App 内可升级),新版固件常优化 BLE 扫描灵敏度与上报算法。避免将网关置于金属柜内或 WiFi 路由器旁,减少无线干扰。

4. 语音控制与 Home Assistant 的协同工作模式

视频中演示了两种语音控制路径:“小爱同学播放歌曲”与“小爱同学查询米加温湿度”。二者技术实现截然不同,体现了智能家居中“本地语音”与“云语音”的混合架构。

4.1 小爱同学的双模语音处理

小米音箱内置的小爱语音助手,其语音识别(ASR)与自然语言理解(NLU)模块运行在设备本地芯片(如 Cortex-A53)上,具备毫秒级响应能力。但语音指令的最终执行,取决于指令语义:

  • 本地指令(Local Command) :如“音量调大”、“暂停播放”。此类指令不涉及外部数据源,音箱固件直接解析并执行硬件操作,全程无需联网。Home Assistant 对此无感知,也无需参与。

  • 云指令(Cloud Command) :如“播放《风吹麦浪》”、“查询青岛天气”。此类指令需调用米家云的音乐服务或气象服务 API。音箱将语音文本发送至小爱云服务器,云服务解析意图后,调用对应服务接口,再将结果(如音乐流 URL 或天气 JSON)下发至音箱播放。 此过程完全绕过 Home Assistant ,HA 的 media_player 实体仅反映音箱当前播放状态(playing/paused),无法干预云服务的内容分发。

4.2 Home Assistant 语音集成的正确姿势

Home Assistant 本身不提供语音识别能力,其语音控制必须通过第三方语音助手桥接。主流方案为 Google Assistant 或 Amazon Alexa,二者均支持将 HA 实体暴露为“智能设备”。但视频中使用的是小爱同学,其官方并未开放将第三方平台实体接入小爱的 API。因此,视频里“小爱同学查询米加温湿度”的成功,本质是 小爱同学主动向米家云查询该设备数据,并将结果播报 ,而非小爱与 Home Assistant 之间的直接通信。

若需在 Home Assistant 生态内实现真正意义上的语音控制(如“打开客厅灯”),必须采用以下任一合规路径:

  • Google Assistant 集成 :在 HA 中启用 google_assistant 集成,将 light.living_room 等实体标记为可控制,再在 Google Home App 中关联 HA 账户。此后,“Ok Google,打开客厅灯”指令由 Google 云识别,调用 HA 的 REST API 执行。

  • Alexa Smart Home 集成 :启用 alexa_media 或官方 alexa 集成,原理同上。

  • 本地语音(实验性) :使用 voice_assistant 集成搭配 whisper (OpenAI 语音识别)与 llama.cpp (本地 LLM),在树莓派等边缘设备上构建纯离线语音控制闭环。此方案复杂度高,且不兼容小爱音箱。

因此,视频中所有“小爱同学”的操作,其技术主体始终是米家云生态。Home Assistant 在此场景中扮演的是“数据可视化与状态同步”的辅助角色,而非控制中枢。开发者必须清醒区分:哪些能力属于米家原生,哪些需通过 HA 自动化扩展。混淆二者将导致对系统能力的误判。

5. 故障排查与常见问题的工程化诊断

当米家设备在 Home Assistant 中出现“不可见”、“状态不更新”、“控制无响应”等问题时,需遵循一套结构化诊断流程,避免盲目重启或重配。

5.1 日志驱动的根因定位

Home Assistant 提供了详尽的集成日志,是诊断的第一手资料:

  1. 进入 设置 系统 日志
  2. 点击右上角 设置日志级别
  3. 找到 custom_components.xiaomi_miot (若使用 HACS 版本)或 homeassistant.components.xiaomi_miot (官方版本),将其日志级别设为 DEBUG
  4. 复现问题(如等待 5 分钟观察温湿度是否更新);
  5. 返回日志页面,筛选包含 xiaomi_miot 的条目。

关键日志线索解读:
- Failed to get device list: 401 Unauthorized :OAuth2 Token 失效,需重新配置集成;
- No devices found for home_id xxx :米家开放平台应用未授权该家庭,或家庭 ID 在米家 App 中已被删除;
- Device model 'xxx' not supported :设备型号未被 xiaomi_miot 集成覆盖,需提交 Issue 至 GitHub 仓库或等待新版支持;
- Update failed for <device_name>: Timeout :Home Assistant 无法连接米家云,检查主机网络、DNS、防火墙;
- Received update for sensor.xxx: {value: 22.4} :数据已成功接收并更新,证明云链路正常,问题在前端显示或 Lovelace 配置。

5.2 网络与 DNS 的隐蔽陷阱

一个极易被忽视的故障点是 DNS 解析。米家云服务使用多个动态域名(如 api.io.mi.com api.home.mi.com api2.io.mi.com ),部分 ISP 的公共 DNS(如 114.114.114.114)可能返回错误的 IP 地址或缓存过期记录。解决方案是强制 Home Assistant 使用可信 DNS:

  • 若为 Home Assistant OS:在 设置 系统 网络 → 选择对应网卡 → 高级选项 → 设置 DNS 服务器为 8.8.8.8 (Google)或 1.1.1.1 (Cloudflare);
  • 若为 Supervised:修改宿主机 /etc/resolv.conf ,添加 nameserver 8.8.8.8
  • 验证:在 HA 终端(SSH 或 Portainer)中执行 nslookup api.io.mi.com ,确认返回的 IP 地址有效(非 0.0.0.0 或私有地址)。

5.3 设备固件与集成版本的兼容性矩阵

米家设备频繁迭代固件,新固件可能引入新的属性 ID(piid)或修改通信协议,导致旧版 xiaomi_miot 集成无法解析。建立版本兼容性意识至关重要:

设备型号 最低兼容 xiaomi_miot 版本 关键变更
miaomiaoce.temperature_humidity 0.7.0 新增 battery_voltage 属性,旧版仅支持 battery 百分比
xiaomi.speaker.v1 0.6.5 修复蓝牙音箱 media_player 实体 source_list 为空的问题
lumi.plug.mmeu01 0.5.0 支持功率计量( power_consumption )的精确读取

用户应定期检查 xiaomi_miot GitHub Releases 页面,将集成更新至最新稳定版。更新后,务必重启 Home Assistant 核心服务,而非仅重启集成。

6. 安全边界与权限最小化实践

将米家账户接入 Home Assistant,意味着授予 HA 对用户全部米家设备的读写权限。这构成了一个显著的安全攻击面。工程师必须实施严格的权限最小化策略:

  • 专用米家子账户 :切勿使用主账号(绑定银行卡、身份证)进行集成。应在米家 App 中创建一个仅用于 Home Assistant 的子账户(设置 → 账户安全 → 添加家人),并将该子账户添加为家庭管理员。随后,仅授权此子账户访问必要设备(如关闭“智能插座”、“空调”的控制权限,仅保留“温湿度传感器”的读取权限)。米家开放平台的应用权限亦应仅勾选“读取设备状态”,禁用“控制设备”,除非确实需要远程开关。

  • Token 生命周期管理 :OAuth2 Token 具有有效期(通常数月)。 xiaomi_miot 集成会自动刷新,但若长期未使用,Token 可能被云服务主动吊销。建议每季度手动进入 设置 系统 集成 Xiaomi MIoT 重新配置 ,强制刷新凭证,同时审查授权设备列表。

  • 网络隔离 :Home Assistant 主机应部署在独立 VLAN 中,禁止其直接访问企业内网核心区域。若使用 Docker,为 homeassistant 容器配置 --network=host 存在风险,推荐使用自定义桥接网络并仅开放必需端口(8123)。

这些措施并非过度防御,而是嵌入式系统工程师在构建物联网平台时必须植入的安全基因。每一次集成,都是在信任边界上开凿一个新通道;唯有持续审视通道的宽度与守卫强度,系统才能在功能与安全间取得可持续的平衡。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐