将所有 Home Assistant 语音指令路由到自定义 Agent
你希望所有的语音指令都发送到你自己的 Agent。它可能是一个本地 LLM,或者是一个支持 MCP 的助手。
在 Home Assistant 2026.5 及更高版本中,实现这一目标的标准方法会失效。
如果你在自动化 (automation) 中使用裸通配符 (bare wildcard),会收到 HTTP 500 错误。出现此错误是因为系统在查找一个不存在的列表。
即使你避开了这个错误,内置命令也会劫持你的查询。如果你问 "When is the next low tide",Home Assistant 可能会尝试播放下一首歌。
以下是解决这两个问题的方法。
问题所在
MissingListError:当你在自动化中使用
{text}时,Home Assistant 会寻找一个名为 "text" 的已注册列表。由于你无法在自动化中定义列表,系统会崩溃。Intent Hijacking(意图劫持):像 "turn on" 或 "play next" 这样的内置命令会在你的自定义 Agent 有机会处理之前就匹配了你的话语。
解决方案
你必须将“全捕获”逻辑从自动化移至自定义句子 (custom sentences)。这允许你定义一个真正的通配符,并确保你的指令优先加载。
步骤 1:创建自定义句子
在你的 custom_sentences 文件夹中创建一个文件。这将注册一个真正的通配符列表。
language: "en"
intents:
NaturaliQuery:
data:
- sentences:
- "{text}"
lists:
text:
wildcard: true
步骤 2:使用 intent_script
不要使用自动化,而是在 configuration.yaml 中使用 intent_script。这可以处理响应并保持语音流水线 (voice pipeline) 的顺畅。
intent_script:
NaturaliQuery:
speech:
text: "One moment."
action:
- action: mqtt.publish
data:
topic: my/agent/ask
payload: '{"text": "{{ text }}"}'
为什么这样做有效
• 通配符列表阻止了 HTTP 500 错误。
• 自定义句子在内置意图 (intents) 之前加载。你的 Agent 会首先捕获指令。
• 使用 intent_script 可以避免许多硬件卫星设备 (hardware satellites) 上的语音死锁。
注意:全通配符会捕获所有内容,包括 "turn on the lights"。如果你想保留原生控制,请为你的自定义句子添加一个前缀词,使其仅在你想要时触发。
可选学习社区: https://t.me/GyaanSetuAi
