모든 Home Assistant 음성 명령을 커스텀 에이전트로 라우팅하기

모든 음성 명령이 본인의 에이전트로 전달되기를 원할 수 있습니다. 로컬 LLM이거나 MCP를 지원하는 어시스턴트일 수도 있습니다.

Home Assistant 2026.5 버전 이상에서는 이 작업을 수행하는 표준 방식이 작동하지 않습니다.

자동화(automation)에서 단순 와일드카드를 사용하면 HTTP 500 오류가 발생합니다. 이 오류는 시스템이 존재하지 않는 리스트를 찾으려 하기 때문에 발생합니다.

오류를 피하더라도, 내장 명령어가 사용자의 질의를 가로챌 수 있습니다. 예를 들어 "다음 저조 시간은 언제야?"라고 물으면, Home Assistant는 대신 다음 곡을 재생하려고 시도할 수도 있습니다.

이 두 가지 문제를 해결하는 방법은 다음과 같습니다.

문제점

  1. MissingListError: 자동화에서 {text}를 사용하면 Home Assistant는 "text"라는 이름으로 등록된 리스트를 기대합니다. 자동화 내에서는 리스트를 정의할 수 없으므로 시스템이 충돌합니다.

  2. Intent Hijacking: "turn on"이나 "play next"와 같은 내장 명령어가 커스텀 에이전트가 처리할 기회를 갖기도 전에 사용자의 말을 먼저 매칭해 버립니다.

해결 방법

catch-all(모든 명령 수집) 로직을 자동화에서 커스텀 문장(custom sentences)으로 옮겨야 합니다. 이렇게 하면 실제 와일드카드를 정의할 수 있으며, 사용자의 명령이 가장 먼저 로드되도록 보장할 수 있습니다.

1단계: 커스텀 문장 생성 custom_sentences 폴더에 파일을 생성합니다. 이렇게 하면 실제 와일드카드 리스트가 등록됩니다.

language: "en"
intents:
  NaturaliQuery:
    data:
      - sentences:
          - "{text}"
lists:
  text:
    wildcard: true

2단계: intent_script 사용 자동화 대신 configuration.yamlintent_script를 사용하세요. 이는 응답을 처리하고 음성 파이프라인을 원활하게 유지합니다.

intent_script:
  NaturaliQuery:
    speech:
      text: "One moment."
    action:
      - action: mqtt.publish
        data:
          topic: my/agent/ask
          payload: '{"text": "{{ text }}"}'

작동 원리

• 와일드카드 리스트가 HTTP 500 오류를 방지합니다. • 커스텀 문장이 내장 인텐트(intents)보다 먼저 로드됩니다. 따라서 에이전트가 명령을 먼저 낚아챌 수 있습니다. • intent_script를 사용하면 많은 하드웨어 새틀라이트(satellites)에서 발생하는 음성 데드락(deadlock) 현상을 피할 수 있습니다.

참고: 전체 와일드카드를 사용하면 "turn on the lights"를 포함한 모든 명령을 낚아챕니다. 기본 제어 기능을 유지하고 싶다면, 커스텀 문장에 접두사(prefix) 단어를 추가하여 원하는 경우에만 트리거되도록 설정하세요.

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

선택 사항 학습 커뮤니티: https://t.me/GyaanSetuAi