هدایت تمام دستورات صوتی Home Assistant به یک عامل (Agent) سفارشی

شما می‌خواهید هر دستور صوتی به عامل خودتان ارسال شود. شاید این یک LLM محلی یا دستیاری با پشتیبانی از MCP باشد.

در نسخه‌های 2026.5 و جدیدتر Home Assistant، روش استاندارد برای انجام این کار با شکست مواجه می‌شود.

اگر از یک wildcard خام در یک automation استفاده کنید، با خطای HTTP 500 مواجه می‌شوید. این خطا به این دلیل رخ می‌دهد که سیستم به دنبال لیستی می‌گردد که وجود ندارد.

حتی اگر از این خطا جلوگیری کنید، دستورات داخلی (built-in) پرس‌وجوهای شما را تصاحب می‌کنند. اگر بپرسید "When is the next low tide"، Home Assistant ممکن است به جای پاسخ دادن، سعی کند آهنگ بعدی را پخش کند.

در اینجا نحوه رفع هر دو مشکل آورده شده است.

مشکلات

  1. MissingListError: وقتی از {text} در یک automation استفاده می‌کنید، Home Assistant انتظار یک لیست ثبت‌شده به نام "text" را دارد. از آنجایی که نمی‌توانید لیست‌ها را در automationها تعریف کنید، سیستم کرش می‌کند.

  2. تصاحب دستورات (Intent Hijacking): دستورات داخلی مانند "turn on" یا "play next" قبل از اینکه عامل سفارشی شما فرصتی پیدا کند، با کلمات شما مطابقت پیدا می‌کنند.

راه حل

شما باید منطق catch-all را از automationها خارج کرده و به custom sentences منتقل کنید. این کار به شما اجازه می‌دهد یک wildcard واقعی تعریف کنید و تضمین می‌کند که دستور شما ابتدا بارگذاری شود.

مرحله ۱: ایجاد یک custom sentence یک فایل در پوشه custom_sentences خود ایجاد کنید. این کار یک لیست wildcard واقعی را ثبت می‌کند.

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

مرحله ۲: استفاده از یک intent_script به جای یک automation، از یک intent_script در configuration.yaml استفاده کنید. این کار پاسخ را مدیریت کرده و خط لوله صوتی (voice pipeline) را روان نگه می‌دارد.

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

چرا این روش کار می‌کند

• لیست wildcard مانع بروز خطای HTTP 500 می‌شود. • جملات سفارشی (custom sentences) قبل از اینتنت‌های داخلی بارگذاری می‌شوند. بنابراین عامل شما ابتدا دستور را دریافت می‌کند. • استفاده از intent_script از بن‌بست‌های صوتی (voice deadlocks) در بسیاری از ماهواره‌های سخت‌افزاری (hardware satellites) جلوگیری می‌کند.

نکته: یک wildcard کامل همه چیز، از جمله "turn on the lights" را دریافت می‌کند. اگر می‌خواهید کنترل بومی (native control) را حفظ کنید، یک کلمه پیشوند (prefix) به جمله سفارشی خود اضافه کنید تا فقط زمانی که می‌خواهید فعال شود.

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

انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi