🎤 小爱同学 + Home Assistant:一键语音控制 PVE 宿主机及虚拟机开关机(更新误触发设置)
告别繁琐!无需 Node-RED / 巴法云 / 额外硬件,仅用 HA 自动化实现小爱音箱直接控制 PVE 主机。
市面上常见的方案(音箱+HA+Node-RED / 巴法云 / 小米中枢网关)略显复杂。本文将分享一种仅依赖 Home Assistant (HA) 自动化的简洁方案,安全高效地实现小爱同学语音控制 PVE 宿主机唤醒/关机以及虚拟机启动/停止。
🛠 前置要求
Home Assistant (HA): 已安装并正常运行。
Xiaomi Miot Auto 集成:
安装并配置好
Xiaomi Miot Auto集成。为什么不用官方
xiaomihome? 因为官方集成通常不提供音箱的播放控制 conversation实体,而Xiaomi Miot Auto会提供此关键实体。
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 宿主机
创建新自动化: 在 HA 的
设置->自动化与场景->创建自动化。触发条件 (When):
类型:
实体-状态。实体:选择你的小爱音箱对应的
播放控制 conversation实体(例如Mi AI Speaker Pro 播放控制 conversation)。如有多个音箱,可添加多个触发实体。属性:
Content从:
空白(留空不填)变为:输入你的语音指令文本,例如
唤醒PVE(注意与小爱训练时一致)。
条件 (If): (可选)
如需要特定时间、设备状态等限制条件可在此添加。初学者可不加。
执行动作 (Then):
类型:
按钮。服务:
按下。目标:选择宿主机唤醒按钮实体
button.node_home_wake_on_lan。
保存: 给自动化命名,例如
语音 - 唤醒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实体的状态变化当小爱音箱检测到对话内容更新时触发
验证逻辑
内容匹配:使用
'打开电脑' in c检查对话内容支持"打开电脑"、"请打开电脑"等多种表达方式
| string确保转换为字符串类型
时间验证:
获取
timestamp属性(ISO格式时间字符串)使用
as_timestamp()转换为Unix时间戳计算当前时间与说话时间的时间差
只接受30秒内的新鲜指令
状态检查:
检查虚拟机是否处于关闭状态(
off)避免重复启动已运行的虚拟机
🗣 步骤二:训练小爱同学(优化语音反馈)
为了让小爱只回复一句你指定的、简洁的确认语,需要在 小米音箱 App 中进行训练:
打开 小米音箱 App。
进入:
首页->更多->小爱训练->个人训练->右下+。训练设置:
对小爱说:输入你在 HA 自动化中设定的 精确 语音指令(例如
唤醒PVE)。小爱会执行:
选择
一句话:。输入你希望小爱回复的确认语(例如
好呀!已经唤醒了)。
其他设置:
生效设备:选择同类设备(音箱)。响应方式:选择全部执行。关键! 取消勾选
静默执行(确保小爱说出你设定的回复语)。
保存。
重复训练:
为其他三个语音指令(
关闭PVE,启动虚拟机,关闭虚拟机)分别创建训练。修改
当对小爱说和一句话:的内容为对应的指令和回复语(例如关闭虚拟机->好的,虚拟机正在关闭)。
✅ 语音反馈优化完成! 现在对小爱说出指令,它会执行 HA 操作,并只回复你设定的那一句确认语,体验更佳。
📱 步骤三(可选):在米家 App 创建手动控制按钮
如果你希望在 米家 App 内或 安卓桌面小部件 上也能方便地点击按钮控制,可以创建手动场景:
打开 米家 App。
进入:
智能-> 右上角+->手动控制。创建手动场景:
名称:输入场景名称(例如唤醒PVE)。执行动作->添加设备-> 找到并选择你的 小爱音箱 Pro(或你使用的音箱)。执行动作:选择自定义指令。内容:输入你在 HA 自动化中设定的 精确 语音指令(例如唤醒pve)。注意大小写通常不敏感,但建议与训练一致。关键! 开启
静默执行(确保执行指令时小爱音箱 不会 发出任何语音反馈,只执行后台指令)。保存场景。
重复创建:
为其他三个操作(宿主机、虚拟机的关机/开机)创建对应的手动场景。
修改
名称和自定义指令内容(例如关闭虚拟机-> 指令内容关闭虚拟机)。
✅ 可选步骤完成! 现在在米家 App 的“智能”页签或安卓桌面小部件(添加“米家智能”小部件)中,你可以看到并点击这些按钮来触发对应的语音指令(静默执行),实现手动控制。
🎉 大功告成!
经过以上三步配置,你的小爱同学已经能够:
完美响应语音指令: 唤醒/关闭 PVE 宿主机、启动/停止指定虚拟机。
提供简洁友好的语音反馈。
(可选)提供米家 App 内的手动控制按钮。
享受无缝、高效的语音控制体验吧!