{"id":666,"date":"2026-05-25T19:09:54","date_gmt":"2026-05-25T17:09:54","guid":{"rendered":"https:\/\/www.coremind.ch\/wordpress\/?p=666"},"modified":"2026-05-25T19:09:54","modified_gmt":"2026-05-25T17:09:54","slug":"ai-tasks-in-home-assistant-llms-strukturiert-nutzen","status":"publish","type":"post","link":"https:\/\/www.coremind.ch\/wordpress\/ai-tasks-in-home-assistant-llms-strukturiert-nutzen\/","title":{"rendered":"AI Tasks in Home Assistant: LLMs strukturiert nutzen"},"content":{"rendered":"<p>Mit Home Assistant 2025.6 wurde <code>ai_task<\/code> als eigene Domain eingef\u00fchrt \u2013 ein lange \u00fcberf\u00e4lliger Baustein, der das Aufrufen von Sprachmodellen aus Automationen heraus in eine strukturierte, reproduzierbare Form bringt. Wer bisher OpenAI nur \u00fcber die <code>conversation<\/code>-Domain angesprochen hat, kennt das Problem: Antworten kamen als Freitext, mussten mit Templates geparst werden und brachen bei jedem Modell-Update. Mit <code>ai_task<\/code> lassen sich Aufgaben jetzt als JSON-Schema definieren, das Modell liefert strukturierte Daten zur\u00fcck, und Automationen k\u00f6nnen diese ohne Parsing direkt verwenden.<\/p>\n<h2>Was <code>ai_task<\/code> von <code>conversation<\/code> unterscheidet<\/h2>\n<p>Die <code>conversation<\/code>-Entity (im System als <code>conversation.openai_conversation<\/code>) ist f\u00fcr Dialoge optimiert: Du sagst etwas, das Modell antwortet im nat\u00fcrlichen Sprachstil. Das ist perfekt f\u00fcr Sprachassistenten und Chat-UIs, aber ungeeignet, wenn die Antwort in einer Automation weiterverarbeitet werden soll.<\/p>\n<p><code>ai_task<\/code> (Entit\u00e4t <code>ai_task.openai_ai_task_2<\/code>) verfolgt einen anderen Ansatz: Du \u00fcbergibst eine Aufgabe mit klarem Eingabekontext und optional einem Schema, das Modell liefert eine maschinenlesbare Antwort. Die zugrundeliegende Logik nutzt Function Calling bzw. Structured Outputs der LLM-Provider. Verf\u00fcgbar sind aktuell OpenAI, Anthropic, Google Gemini und lokale Modelle via Ollama.<\/p>\n<h2>Setup-Beispiel: t\u00e4gliche Kalender-Synthese<\/h2>\n<p>Ein praktisches Einsatzfeld: Morgens um 06:30 Uhr alle Kalender-Eintr\u00e4ge des Tages durch das Modell schicken und drei Priorit\u00e4ten zur\u00fcckbekommen. Die Eingabe ist ein Liste von Terminen, die Ausgabe ein strukturiertes Objekt mit den drei wichtigsten Punkten und einer Empfehlung f\u00fcr die Tageskleidung anhand der Wettervorhersage.<\/p>\n<pre><code>\u2029automation:\u2029  - alias: Tages-Briefing per AI Task\u2029    trigger:\u2029      - platform: time\u2029        at: \"06:30:00\"\u2029    action:\u2029      - service: ai_task.generate_data\u2029        target:\u2029          entity_id: ai_task.openai_ai_task_2\u2029        data:\u2029          task_name: tages_briefing\u2029          instructions: &gt;\u2029            Erstelle aus den Kalender-Eintr\u00e4gen ein priorisiertes\u2029            Tages-Briefing f\u00fcr einen Schweizer Berufst\u00e4tigen.\u2029          input:\u2029            calendar: \"{{ state_attr('calendar.privat', 'events') }}\"\u2029            weather: \"{{ states('sensor.weather_station_outdoor_module_temperatur') }}\"\u2029          structure:\u2029            top_termin:\u2029              description: Wichtigster Termin des Tages\u2029              required: true\u2029              selector:\u2029                text:\u2029            risiko:\u2029              description: Konflikt oder Stress-Risiko\u2029              required: false\u2029              selector:\u2029                text:\u2029            kleidung:\u2029              description: Kleidungsempfehlung anhand Wetter\u2029              required: true\u2029              selector:\u2029                text:\u2029        response_variable: briefing\u2029      - service: tts.cloud_say\u2029        data:\u2029          entity_id: media_player.homepod\u2029          message: &gt;\u2029            Guten Morgen. Top-Termin heute: {{ briefing.data.top_termin }}.\u2029            Empfehlung: {{ briefing.data.kleidung }}.\u2029<\/code><\/pre>\n<p>Wichtig ist die <code>structure<\/code>-Definition: Sie zwingt das Modell, die Antwort in genau diese Felder zu pressen. Wer einen Wert nicht braucht, l\u00e4sst ihn weg. Wer ihn braucht, kann sich auf das Format verlassen.<\/p>\n<h2>Bild-Eingabe mit Roborock-Karten<\/h2>\n<p><code>ai_task<\/code> unterst\u00fctzt auch Bild-Eingaben. Eine elegante Anwendung: Die Roborock-Karte nach jeder Reinigung an das Modell schicken und pr\u00fcfen lassen, ob ein Bereich nicht abgedeckt wurde. Mehr zu Saugroboter-Karten und Zonen-Reinigung steht im Beitrag <a href=\"https:\/\/www.coremind.ch\/wordpress\/saugroboter-karten-zonen-reinigung-roborock-s6-maxv\/\">Saugroboter-Karten und Zonen-Reinigung mit Roborock S6 MaxV<\/a>.<\/p>\n<pre><code>\u2029action:\u2029  - service: ai_task.generate_data\u2029    target:\u2029      entity_id: ai_task.openai_ai_task_2\u2029    data:\u2029      task_name: roborock_karte_pruefen\u2029      instructions: &gt;\u2029        Pr\u00fcfe diese Reinigungskarte. Gibt es ungereinigte Bereiche\u2029        oder verd\u00e4chtige Hindernisse? Antworte knapp.\u2029      attachments:\u2029        - media_content_id: \"{{ states('image.roborock_s6_maxv_erdgeschoss') }}\"\u2029          media_content_type: image\/png\u2029      structure:\u2029        status:\u2029          description: ok oder warnung\u2029          selector:\u2029            select:\u2029              options: [ok, warnung]\u2029        bemerkung:\u2029          description: Erl\u00e4uterung wenn warnung\u2029          selector:\u2029            text:\u2029    response_variable: roborock_check\u2029<\/code><\/pre>\n<h2>Kostenkontrolle und Privatsph\u00e4re<\/h2>\n<p>Jeder <code>ai_task<\/code>-Aufruf kostet API-Tokens. Wer OpenAI nutzt, sollte das g\u00fcnstigere <code>gpt-4o-mini<\/code>-Modell f\u00fcr Standard-Aufgaben in der Integration konfigurieren \u2013 das senkt die Kosten pro Anfrage auf wenige Rappen monatlich. Wer aus Datenschutzgr\u00fcnden keine Daten an OpenAI senden m\u00f6chte, kann Ollama lokal auf einem Mini-PC betreiben und mit Llama 3.2 oder Qwen 2.5 vergleichbare Resultate f\u00fcr einfache Strukturierungsaufgaben erzielen. Die Anbindung erfolgt \u00fcber die Ollama-Integration, der Aufruf ist identisch.<\/p>\n<h2>Fazit \u2013 der n\u00e4chste Schritt<\/h2>\n<p><code>ai_task<\/code> macht aus dem LLM in Home Assistant zum ersten Mal ein zuverl\u00e4ssiges Werkzeug f\u00fcr Automationen. Wer bisher mit Templates und br\u00fcchigen Parsing-Pipelines k\u00e4mpft, sollte den Wechsel ernsthaft pr\u00fcfen. Erster konkreter Schritt: Integration einrichten, eine einfache Aufgabe wie das morgendliche Briefing implementieren und das Resultat eine Woche beobachten. Wer schon die Voice-Pipeline mit Dual-Wake-Word eingerichtet hat, findet im Beitrag <a href=\"https:\/\/www.coremind.ch\/wordpress\/dual-wake-word-dual-assistant-ha-voice\/\">Dual Wake-Word und Dual Assistant mit HA Voice<\/a> die erg\u00e4nzende Frontend-Schicht zu den neuen Backend-Aufgaben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit Home Assistant 2025.6 wurde ai_task als eigene Domain eingef\u00fchrt \u2013 ein lange \u00fcberf\u00e4lliger Baustein, der das Aufrufen von Sprachmodellen aus Automationen heraus in eine strukturierte, reproduzierbare Form bringt. Wer bisher OpenAI nur \u00fcber die conversation-Domain angesprochen hat, kennt das Problem: Antworten kamen als Freitext, mussten mit Templates geparst werden und brachen bei jedem Modell-Update. &#8230; <a title=\"AI Tasks in Home Assistant: LLMs strukturiert nutzen\" class=\"read-more\" href=\"https:\/\/www.coremind.ch\/wordpress\/ai-tasks-in-home-assistant-llms-strukturiert-nutzen\/\" aria-label=\"Mehr Informationen \u00fcber AI Tasks in Home Assistant: LLMs strukturiert nutzen\">Weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-666","post","type-post","status-publish","format-standard","hentry","category-ha"],"_links":{"self":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/comments?post=666"}],"version-history":[{"count":1,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/666\/revisions"}],"predecessor-version":[{"id":671,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/666\/revisions\/671"}],"wp:attachment":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/media?parent=666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/categories?post=666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/tags?post=666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}