告别繁琐!无需 Node-RED / 巴法云 / 额外硬件,仅用 HA 自动化实现小爱音箱直接控制 PVE 主机。

市面上常见的方案(音箱+HA+Node-RED / 巴法云 / 小米中枢网关)略显复杂。本文将分享一种仅依赖 Home Assistant (HA) 自动化的简洁方案,安全高效地实现小爱同学语音控制 PVE 宿主机唤醒/关机以及虚拟机启动/停止。

🛠 前置要求

  1. Home Assistant (HA): 已安装并正常运行。

  2. Xiaomi Miot Auto 集成

    • 安装并配置好 Xiaomi Miot Auto 集成。

    • 为什么不用官方 xiaomihome 因为官方集成通常不提供音箱的 播放控制 conversation 实体,而 Xiaomi Miot Auto 会提供此关键实体。

  3. PVE 集成

    • 确保你的 PVE 宿主机和虚拟机已通过合适的集成(如 Proxmox VE 集成)接入 HA。

    • 必须创建以下实体(名称根据你的实际配置调整):

      • button.node_home_wake_on_lan - 宿主机唤醒 (Wake-on-LAN)

      • button.node_home_shutdown - 宿主机正常关机

      • button.qemu_windows11_100_start - 虚拟机开机 (示例:Windows 11, VMID 100)

      • button.qemu_windows11_100_stop - 虚拟机关机 (示例:Windows 11, VMID 100)

📝 步骤一:创建核心自动化(2026.2.6已更新配置,见后文)

我们需要创建 4 个自动化,分别对应 4 个语音指令控制 4 个操作。

自动化示例:唤醒 PVE 宿主机

  1. 创建新自动化: 在 HA 的 设置 -> 自动化与场景 -> 创建自动化

  2. 触发条件 (When)

    • 类型:实体 - 状态

    • 实体:选择你的小爱音箱对应的 播放控制 conversation 实体(例如 Mi AI Speaker Pro 播放控制 conversation)。如有多个音箱,可添加多个触发实体。

    • 属性:Content

    • 从:空白 (留空不填)

    • 变为:输入你的语音指令文本,例如 唤醒PVE (注意与小爱训练时一致)。

  3. 条件 (If): (可选)

    • 如需要特定时间、设备状态等限制条件可在此添加。初学者可不加。

  4. 执行动作 (Then)

    • 类型:按钮

    • 服务:按下

    • 目标:选择宿主机唤醒按钮实体 button.node_home_wake_on_lan

  5. 保存: 给自动化命名,例如 语音 - 唤醒PVE宿主机,然后保存。

🔁 创建其余三个自动化

  • 重复上述步骤 1-5,修改触发条件的语音指令和执行的按钮实体

    • 宿主机关机

      • 触发:语音指令变为 关闭PVE (或其他你设定的指令)。

      • 动作:按 button.node_home_shutdown

      • 自动化名:语音 - 关闭PVE宿主机

    • 虚拟机开机

      • 触发:语音指令变为 启动虚拟机 (或其他指令)。

      • 动作:按 button.qemu_windows11_100_start (替换为你的虚拟机开机按钮)。

      • 自动化名:语音 - 启动Windows11虚拟机

    • 虚拟机关机

      • 触发:语音指令变为 关闭虚拟机 (或其他指令)。

      • 动作:按 button.qemu_windows11_100_stop (替换为你的虚拟机关机按钮)。

      • 自动化名:语音 - 关闭Windows11虚拟机

至此,核心功能已完成! 对小爱说出指令(如“唤醒PVE”),它应该能正确执行对应的 HA 按钮操作(如发送 Wake-on-LAN 包唤醒宿主机)。但小爱同学会回复默认的“好的,已操作XXX”等多次语音,体验不佳。 下一步解决这个问题。

2026.2.6更新

使用一段时间后发现有小概率会误触发开机事件,经过检查HA日志发现这个问题是由 Xiaomi Miot 集成的认证失效(401 Unauthorized) 引起了一连串反应,导致 Home Assistant (HA) 获取到了旧的或错误的语音指令状态,从而误触发了开启虚拟机的自动化。

HA日志如下:

xml

日志记录器: custom_components.xiaomi_miot.core.xiaomi_cloud
来源: custom_components/xiaomi_miot/core/xiaomi_cloud.py:269
集成: Xiaomi Miot (文档, 问题)
首次出现: 02:08:08 (2 次出现)
上次记录: 02:08:09

Bad logger message: Request xiaomi api: https://userprofile.mina.mi.*** {'hardware': 'LX04', 'timestamp': 1770314888609, 'limit': 3} failed, response: <!doctype html><html lang="en"><head><title>HTTP Status 401 – Unauthorized</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 401 – Unauthorized</h1></body></html> (('https://userprofile.mina.mi.com/device_profile/v2/conversation', {'hardware': 'LX04', 'timestamp': 1770314888609, 'limit': 3}, '<!doctype html><html lang="en"><head><title>HTTP Status 401 – Unauthorized</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 401 – Unauthorized</h1></body></html>'))
Bad logger message: Request xiaomi api: https://userprofile.mina.mi.*** {'hardware': 'LX06', 'timestamp': 1770314889806, 'limit': 3} failed, response: <!doctype html><html lang="en"><head><title>HTTP Status 401 – Unauthorized</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 401 – Unauthorized</h1></body></html> (('https://userprofile.mina.mi.com/device_profile/v2/conversation', {'hardware': 'LX06', 'timestamp': 1770314889806, 'limit': 3}, '<!doctype html><html lang="en"><head><title>HTTP Status 401 – Unauthorized</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 401 – Unauthorized</h1></body></html>'))

经过测试修改了HA自动化的触发规则如下

yaml

alias: 打开电脑
description: ""
triggers:
  - entity_id: sensor.xiaomi_lx06_ac65_conversation
    trigger: state
conditions:
  - condition: template
    value_template: >
      {# 1. 获取语音内容 #} {% set c = state_attr(trigger.entity_id, 'content') |
      string %}

      {# 2. 获取属性里的原始时间戳字符串 #} {% set raw_ts = state_attr(trigger.entity_id,
      'timestamp') %}

      {# 3. 转化为秒。注意:as_timestamp 可以直接解析 ISO 格式字符串 #} {% set msg_ts =
      as_timestamp(raw_ts, default=0) %}

      {# 4. 逻辑判断:内容匹配 + (当前时间 - 说话时间) < 40秒 #} {# 建议设为 30-40秒,因为云端同步有延迟
      #} {{ 
         '打开电脑' in c 
         and msg_ts > 0
         and (as_timestamp(now()) - msg_ts) < 40 
      }}
  - condition: state
    entity_id: binary_sensor.qemu_windows11_100_status
    state:
      - "off"
actions:
  - target:
      entity_id: button.qemu_windows11_100_start
    action: button.press
mode: single

配置说明

触发条件

  • 监听 sensor.xiaomi_lx06_ac65_conversation 实体的状态变化

  • 当小爱音箱检测到对话内容更新时触发

验证逻辑

  1. 内容匹配:使用 '打开电脑' in c 检查对话内容

    • 支持"打开电脑"、"请打开电脑"等多种表达方式

    • | string 确保转换为字符串类型

  2. 时间验证

    • 获取 timestamp 属性(ISO格式时间字符串)

    • 使用 as_timestamp() 转换为Unix时间戳

    • 计算当前时间与说话时间的时间差

    • 只接受30秒内的新鲜指令

  3. 状态检查

    • 检查虚拟机是否处于关闭状态(off

    • 避免重复启动已运行的虚拟机

🗣 步骤二:训练小爱同学(优化语音反馈)

为了让小爱只回复一句你指定的、简洁的确认语,需要在 小米音箱 App 中进行训练:

  1. 打开 小米音箱 App

  2. 进入:首页 -> 更多 -> 小爱训练 -> 个人训练 -> 右下+

  3. 训练设置

    • 对小爱说:输入你在 HA 自动化中设定的 精确 语音指令(例如 唤醒PVE)。

    • 小爱会执行

      • 选择 一句话:

      • 输入你希望小爱回复的确认语(例如 好呀!已经唤醒了)。

    • 其他设置

      • 生效设备:选择 同类设备(音箱)

      • 响应方式:选择 全部执行

      • 关键! 取消勾选 静默执行(确保小爱说出你设定的回复语)。

  4. 保存

  5. 重复训练

    • 为其他三个语音指令(关闭PVE, 启动虚拟机, 关闭虚拟机)分别创建训练。

    • 修改 当对小爱说一句话: 的内容为对应的指令和回复语(例如 关闭虚拟机 -> 好的,虚拟机正在关闭)。

语音反馈优化完成! 现在对小爱说出指令,它会执行 HA 操作,并只回复你设定的那一句确认语,体验更佳。

📱 步骤三(可选):在米家 App 创建手动控制按钮

如果你希望在 米家 App 内或 安卓桌面小部件 上也能方便地点击按钮控制,可以创建手动场景:

  1. 打开 米家 App

  2. 进入:智能 -> 右上角 + -> 手动控制

  3. 创建手动场景

    • 名称:输入场景名称(例如 唤醒PVE)。

    • 执行动作 -> 添加设备 -> 找到并选择你的 小爱音箱 Pro(或你使用的音箱)。

    • 执行动作:选择 自定义指令

    • 内容:输入你在 HA 自动化中设定的 精确 语音指令(例如 唤醒pve)。注意大小写通常不敏感,但建议与训练一致。

    • 关键! 开启 静默执行(确保执行指令时小爱音箱 不会 发出任何语音反馈,只执行后台指令)。

    • 保存场景。

  4. 重复创建

    • 为其他三个操作(宿主机、虚拟机的关机/开机)创建对应的手动场景。

    • 修改 名称自定义指令 内容(例如 关闭虚拟机 -> 指令内容 关闭虚拟机)。

可选步骤完成! 现在在米家 App 的“智能”页签或安卓桌面小部件(添加“米家智能”小部件)中,你可以看到并点击这些按钮来触发对应的语音指令(静默执行),实现手动控制。

🎉 大功告成!

经过以上三步配置,你的小爱同学已经能够:

  1. 完美响应语音指令: 唤醒/关闭 PVE 宿主机、启动/停止指定虚拟机。

  2. 提供简洁友好的语音反馈

  3. (可选)提供米家 App 内的手动控制按钮

享受无缝、高效的语音控制体验吧!