将所有 Home Assistant 语音指令路由到自定义 Agent

你希望所有的语音指令都发送到你自己的 Agent。它可能是一个本地 LLM,或者是一个支持 MCP 的助手。

在 Home Assistant 2026.5 及更高版本中,实现这一目标的标准方法会失效。

如果你在自动化 (automation) 中使用裸通配符 (bare wildcard),会收到 HTTP 500 错误。出现此错误是因为系统在查找一个不存在的列表。

即使你避开了这个错误,内置命令也会劫持你的查询。如果你问 "When is the next low tide",Home Assistant 可能会尝试播放下一首歌。

以下是解决这两个问题的方法。

问题所在

  1. MissingListError:当你在自动化中使用 {text} 时,Home Assistant 会寻找一个名为 "text" 的已注册列表。由于你无法在自动化中定义列表,系统会崩溃。

  2. 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"。如果你想保留原生控制,请为你的自定义句子添加一个前缀词,使其仅在你想要时触发。

Source: https://dev.to/clarkbw--/route-all-home-assistant-voice-to-a-custom-agent-with-a-wildcard-sentence-4iee

可选学习社区: https://t.me/GyaanSetuAi