Alihkan Semua Suara Home Assistant ke Ejen Tersuai

Anda mahu setiap arahan suara dihantar ke ejen anda sendiri. Mungkin ia adalah LLM tempatan atau pembantu dengan sokongan MCP.

Pada Home Assistant 2026.5 dan yang lebih baharu, cara standard untuk melakukan ini akan gagal.

Jika anda menggunakan wildcard kosong dalam automasi, anda akan mendapat ralat HTTP 500. Ralat ini berlaku kerana sistem mencari senarai yang tidak wujud.

Walaupun anda dapat mengelakkan ralat tersebut, arahan terbina dalam akan merampas pertanyaan anda. Jika anda bertanya "When is the next low tide," Home Assistant mungkin cuba memainkan lagu seterusnya sebagai ganti.

Berikut adalah cara untuk menyelesaikan kedua-dua masalah tersebut.

Masalah-masalah Tersebut

  1. MissingListError: Apabila anda menggunakan {text} dalam automasi, Home Assistant menjangkakan senarai berdaftar bernama "text." Oleh kerana anda tidak boleh mentakrifkan senarai dalam automasi, sistem akan terhenti (crash).

  2. Intent Hijacking: Arahan terbina dalam seperti "turn on" atau "play next" akan memadankan kata-kata anda sebelum ejen tersuai anda sempat bertindak.

Penyelesaian

Anda mesti memindahkan logik "catch-all" keluar daripada automasi dan ke dalam ayat tersuai (custom sentences). Ini membolehkan anda mentakrifkan wildcard yang sebenar dan memastikan arahan anda dimuatkan terlebih dahulu.

Langkah 1: Cipta ayat tersuai Cipta satu fail dalam folder custom_sentences anda. Ini akan mendaftarkan senarai wildcard yang sebenar.

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

Langkah 2: Gunakan intent_script Daripada menggunakan automasi, gunakan intent_script dalam configuration.yaml anda. Ini mengendalikan respons dan memastikan saluran (pipeline) suara berjalan lancar.

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

Mengapa ini berkesan

• Senarai wildcard menghentikan ralat HTTP 500. • Ayat tersuai dimuatkan sebelum intent terbina dalam. Ejen anda akan menangkap arahan tersebut terlebih dahulu. • Menggunakan intent_script mengelakkan kebuntuan (deadlock) suara pada banyak satelit perkakasan.

Nota: Wildcard penuh akan menangkap segalanya, termasuk "turn on the lights." Jika anda mahu mengekalkan kawalan asli, tambahkan perkataan awalan (prefix) pada ayat tersuai anda supaya ia hanya dicetuskan apabila anda mahukannya.

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

Komuniti pembelajaran pilihan: https://t.me/GyaanSetuAi