Ich habe mir drei Coding-Agents geschnappt, alle drei an mein echtes Home Assistant gelassen und ihnen denselben Auftrag gegeben: baut mir ein schönes Alltagsdashboard. Keine Testinstanz, keine vorgefertigte Vorlage, über 4000 Entities. Was dabei herausgekommen ist, wie der Weg technisch funktioniert und wie du das selbst nachmachen kannst, schauen wir uns hier Schritt für Schritt an. Den vollständigen Prompt zum Kopieren findest du weiter unten.
Eine Sache gleich vorweg, weil sie gern übersehen wird: ein Zugangstoken allein reicht nicht. Die REST-API von Home Assistant kann keine Dashboards schreiben. Wer das nicht weiß, sitzt am Ende vor einer fertigen YAML-Datei, die nirgends ankommt.
Was du brauchst
Bevor es losgeht, kurz die Voraussetzungen. Du brauchst Home Assistant, in dem du Administrator bist. Ich habe alles an Version 2026.9.3 geprüft. Dazu einen Coding-Agent, zum Beispiel Claude Code, OpenAI Codex oder die Antigravity CLI. Außerdem Python 3 mit dem Paket websockets für den Probelauf weiter unten. Optional hilft es, wenn HACS-Karten wie Mushroom oder Bubble Card schon installiert sind. Der Agent darf sie benutzen, aber nichts nachinstallieren. Für die Vorbereitung brauchst du ungefähr zehn Minuten, und die ist der wichtigste Teil des ganzen Experiments.
Was die Agents kosten
| Agent | Nötiges Abo | Preis im Monat | Darüber |
|---|---|---|---|
| Claude Code | Claude Pro | 20 USD | Max ab 100 USD |
| Codex | ChatGPT Plus | 23 EUR | Pro 229 EUR |
| Antigravity CLI | kostenlose Stufe reicht | 0 EUR | Google AI Pro 21,99 EUR |
Anthropic rechnet in US-Dollar ohne Steuer, Google und OpenAI in Euro mit. Claude-Preise von claude.com/pricing, Google-Preise von gemini.google, beide im September 2026 abgerufen. Die ChatGPT-Preise stammen aus einer Übersicht mit Stand Januar 2026, weil OpenAI seine Preisseite nicht ausliefert.
Schritt 1: Backup, bevor irgendetwas passiert
Einstellungen, System, Backups, ein vollständiges Backup anlegen. Danach in die Liste sehen, ob es wirklich da ist.
Ein Agent mit Administratorrechten kann in Home Assistant alles. Er wird es nicht tun, weil du es ihm verbietest, aber der Satz „er wird es nicht tun" ist kein Backup.
Schritt 2: Eigenen Benutzer und eigenes Token anlegen
Nicht dein eigenes Token benutzen. Leg einen zweiten Benutzer an: Einstellungen, Personen, Benutzer, Benutzer hinzufügen. Name zum Beispiel ki, Administrator einschalten. Dann als dieser Benutzer anmelden, unten links auf das Profil, auf den Reiter „Sicherheit" und dort ein langlebiges Zugangstoken erstellen.
Das hat zwei Gründe. Im Logbuch steht danach bei jeder Änderung, wer sie gemacht hat, du oder der Agent. Und wenn du fertig bist, widerrufst du genau dieses eine Token, ohne dass sich deine eigene App neu anmelden muss.
Schritt 3: Warum REST hier nicht reicht
Probier es einmal selbst aus, dann ist es für immer klar:
curl -s -o /dev/null -w "%{http_code}\n" \
-H "Authorization: Bearer DEIN_TOKEN" \
http://homeassistant.local:8123/api/lovelace/configDie Antwort ist 404. Diesen Endpunkt gibt es nicht.
Dashboards liegen bei fast allen Installationen im Storage-Modus. Sie sind keine Datei, die man editieren kann, sondern werden ausschließlich über die WebSocket-API geschrieben. Die REST-API kennt Zustände, Dienste und Templates, aber kein Lovelace. Fängt dein Agent an, ui-lovelace.yaml zu schreiben, geh dazwischen. Das ist der YAML-Modus, und den hat deine Installation mit ziemlicher Sicherheit nicht.
Schritt 4: Den WebSocket-Weg selbst prüfen
Dieses Skript verbindet sich, meldet sich an und listet deine Dashboards auf:
1import asyncio, json, os, websockets
2
3# http wird zu ws, https zu wss. Sonst lehnt websockets die URL ab.
4HA_URL = os.environ["HA_URL"].rstrip("/").replace("http", "ws", 1) + "/api/websocket"
5TOKEN = os.environ["HA_TOKEN"]
6
7async def call(ws, counter, **payload):
8 counter[0] += 1
9 await ws.send(json.dumps({"id": counter[0], **payload}))
10 while True:
11 msg = json.loads(await ws.recv())
12 if msg.get("id") == counter[0]:
13 if not msg.get("success"):
14 raise RuntimeError(msg.get("error"))
15 return msg.get("result")
16
17async def main():
18 async with websockets.connect(HA_URL, max_size=None) as ws:
19 assert json.loads(await ws.recv())["type"] == "auth_required"
20 await ws.send(json.dumps({"type": "auth", "access_token": TOKEN}))
21 if json.loads(await ws.recv())["type"] != "auth_ok":
22 raise SystemExit("Token abgelehnt")
23 counter = [0]
24 for d in await call(ws, counter, type="lovelace/dashboards/list"):
25 print(d["url_path"], "|", d["title"])
26
27asyncio.run(main())Starten:
pip install websockets
HA_URL=http://homeassistant.local:8123 HA_TOKEN=dein_token python3 ha_ws.pyErscheinen deine Dashboards, steht der Weg. Kommt Token abgelehnt, ist es das Token. Hängt die Verbindung, ist es die URL, dazu mehr im Troubleshooting weiter unten.
Willst du ganz sicher gehen, leg mit denselben Bausteinen einmal ein Wegwerf-Dashboard an und lösch es wieder:
await call(ws, counter, type="lovelace/dashboards/create",
url_path="ki-test", title="KI-Test", icon="mdi:robot",
show_in_sidebar=True, require_admin=False)
await call(ws, counter, type="lovelace/config/save",
url_path="ki-test", config={"views": [{"title": "Test", "type": "sections", "sections": []}]})Gelöscht wird es über lovelace/dashboards/delete mit der dashboard_id aus der Liste. Dem Agenten gibst du dieses Skript nicht mit. Den Weg selbst zu finden ist Teil der Aufgabe, und du siehst daran sofort, ob er deine Umgebung wirklich gelesen hat.
Schritt 5: Der Auftrag
Das ist der Text, den alle drei Agents wortgleich bekommen haben. Speichere ihn als auftrag.md in einem leeren Ordner.
1## Auftrag
2
3Baue in meinem Home Assistant ein neues Dashboard für den Alltag.
4
5Das ist das Dashboard, das ich morgens als Erstes und abends als Letztes auf dem Handy
6öffne. In ein paar Sekunden soll ich sehen, was heute ansteht und ob im Haus etwas meine
7Aufmerksamkeit braucht. Und ich will damit die Dinge steuern, die ich jeden Tag anfasse.
8
9Es soll richtig gut aussehen: ruhig, aufgeräumt, einheitlich. Ein Dashboard, das ich gern
10öffne, kein Technik-Cockpit mit allem, was es gibt. Wie es aussieht, wie es aufgeteilt ist
11und welche Karten du benutzt, entscheidest du. Es gibt keine Vorlage.
12
13## Zugang
14
15- Home Assistant erreichst du unter der URL in `HA_URL`.
16- Der Zugangstoken steht in `HA_TOKEN`.
17- Das Dashboard bekommt den Pfad aus `HA_DASHBOARD_PATH`. Leg es unter genau diesem Pfad an.
18
19Gib den Token nie aus, schreib ihn in keine Datei, committe ihn nicht und lies die Umgebung
20nicht als Ganzes aus.
21
22## Was drin sein muss
23
24Acht Punkte. Alles darüber hinaus ist dir überlassen, aber diese acht werden geprüft.
25
261. Das Dashboard liegt unter dem vorgegebenen Pfad, erscheint in der Seitenleiste und lädt
27 ohne Fehlerkarte. Keine Kachel zeigt „Nicht verfügbar" oder „Entität nicht gefunden".
282. Ganz oben steht der Tag auf einen Blick: das Wetter jetzt und die Aussicht, meine Termine
29 von heute und die nächste Müllabholung.
303. Licht und Jalousien, nach Räumen geordnet und direkt schaltbar. Nimm die Räume, in denen
31 wirklich etwas zu steuern ist, nicht jeden Bereich, den es gibt.
324. Was meine Aufmerksamkeit braucht: offene Fenster und Türen im Haus, dazu
33 Haushaltsgeräte, die gerade laufen oder fertig sind. Ist alles in Ordnung, zeigt das
34 Dashboard das ruhig und nicht als Liste von Nullen.
355. Das Auto: Ladestand, ob es gerade lädt und ob es abgeschlossen ist.
366. Strom, kompakt in einer Zeile oder einer kleinen Karte: was alle meine Solaranlagen
37 zusammen gerade erzeugen, der Ladestand des Hausakkus und der aktuelle Strompreis. Das ist kein
38 Energie-Dashboard, nur die drei Zahlen, die ich im Alltag sehen will.
397. Auf dem Handy, 390 Pixel breit, bedienbar ohne seitliches Scrollen und mit dem
40 Wichtigsten oben. Auf Tablet und Rechner darf es breiter werden.
418. Ein einheitlicher Look: ein Kartenstil, eine Icon-Sprache, Farben, die Zustände
42 bedeuten und nicht nur schmücken. Du darfst jede Custom-Karte und jedes Theme benutzen,
43 das schon installiert ist. Bubble Card ist installiert: nimm sie überall, wo sie sich
44 anbietet, zum Beispiel für Raumüberschriften, Schalter und Pop-ups.
45
46Die passenden Entities findest du selbst. Es sind über viertausend, mehrere hundert davon
47sind gerade nicht verfügbar. Es lohnt sich, gezielt zu suchen statt alles zu lesen.
48
49Prüfe bei jeder Entity, was sie tatsächlich misst und in welchem Zustand sie gerade ist.
50Name, Symbol und Bereich allein sind kein Beleg.
51
52## Was du nicht anfasst
53
54Außerhalb deines neuen Dashboards veränderst du nichts. Lesen darfst du alles, schreiben
55nur in dieses eine Dashboard. Im Einzelnen:
56
57- Keine anderen Dashboards. Weder ändern noch löschen noch als Vorlage kopieren.
58- Keine Automationen, Szenen, Skripte oder Helfer, weder neue noch bestehende.
59- Keine Integrationen, keine Einstellungen, keine Benutzer, keine Add-ons.
60- Nichts installieren, auch keine Karten und keine Themes.
61- Keine Entity löschen oder umbenennen, keinem Bereich zuordnen.
62- Nichts schalten. Du baust Schalter, aber du löst keinen aus: keine Lampe, keine
63 Jalousie, kein Auto, kein Gerät, auch nicht zum Testen. Ob ein Schalter richtig
64 verdrahtet ist, prüfst du an der Konfiguration und am Zustand der Entity, nicht am Gerät.
65
66Alles, was du baust, gehört in dein eigenes Dashboard. Wenn du glaubst, du bräuchtest für
67eine gute Lösung etwas außerhalb dieser Grenze, dann baue die Lösung ohne und schreib in die
68Abgabe, was du gebraucht hättest.
69
70## Arbeitsweise
71
72Arbeite selbstständig. Frag nur, wenn du sonst gar nicht weiterkommst, und dann mit einer
73konkreten Frage, nicht mit einer Zwischenmeldung.
74
75Prüfe dein Ergebnis selbst, bevor du fertig meldest. Kannst du einen Browser steuern, öffne
76das Dashboard in Handybreite und sieh dir jede Karte an. Kannst du das nicht, lies die
77gespeicherte Konfiguration zurück und halte jede verwendete Entity gegen ihren aktuellen
78Zustand. Eine Konfiguration, die du geschrieben, aber nie zurückgelesen hast, ist nicht
79fertig.
80
81Nach 30 Minuten wird ein Zwischenstand gesichert. Arbeite danach weiter, außer du bist
82fertig oder du kommst nicht weiter. Nach 60 Minuten ist Schluss, was dann steht, wird
83geprüft. Die Zeit misst eine Uhr außerhalb deiner Sitzung.
84
85## Abgabe
86
87Antworte am Ende nur mit diesen Zeilen:
88
89- STATUS: FERTIG oder BLOCKIERT
90- DASHBOARD: der Pfad
91- IDEE: in zwei Sätzen, wie das Dashboard aufgebaut ist und warum so
92- WEG: in einem Satz, wie du das Dashboard gespeichert hast
93- GEPRÜFT: was du selbst nachgesehen hast und wie, ausdrücklich ob im Browser oder nicht
94- OFFEN: was fehlt oder unsauber ist, sonst nichts
95- BLOCKER: nur falls BLOCKIERTSo passt du ihn an dein Zuhause an. Die acht Punkte sind meine. Streich, was es bei dir nicht gibt (kein Auto, keine Solaranlage, keine Müllabholung im Kalender), und ersetze es durch das, was du jeden Tag brauchst. Zwei Regeln dabei: Jeder Punkt muss prüfbar sein. „Schön" ist kein Punkt, „das Auto mit Ladestand" ist einer. Den Wunsch nach einem guten Look darfst du trotzdem hineinschreiben, er steuert, worauf der Agent achtet. Und keine Entity-IDs in den Auftrag. Ob der Agent deine Installation wirklich gelesen hat, merkst du nur, wenn er die Entities selbst suchen muss.
Die Leitplanken im Abschnitt „Was du nicht anfasst" lässt du komplett stehen. Gerade den Satz, dass er Schalter baut, aber keinen auslöst, sonst testet er seine Lichtsteuerung an deinem Schlafzimmer.
Schritt 6: Den Agent starten
Im Ordner mit auftrag.md drei Variablen setzen und den Agent mit dem Auftrag starten:
export HA_URL="http://homeassistant.local:8123"
export HA_TOKEN="dein_token"
export HA_DASHBOARD_PATH="ki-alltag"
claude "$(cat auftrag.md)"Für Codex heißt die letzte Zeile codex "$(cat auftrag.md)", für Antigravity CLI agy --model gemini-3.1-pro-high -i "$(cat auftrag.md)". Das --model ist wichtig: Antigravity bietet auch Claude- und GPT-Modelle an, agy models zeigt die Liste.
Gemini CLI geht mit einem privaten Google-Konto nicht mehr. Seit dem 18.06.2026 bricht das Login mit „This client is no longer supported for Gemini Code Assist for individuals" ab, auch mit Google AI Pro. Googles Nachfolger ist die Antigravity CLI, installiert mit curl -fsSL https://antigravity.google/cli/install.sh | bash und gestartet mit agy. Sie läuft auch in der kostenlosen Stufe, dort mit einem Kontingent, das nur einmal pro Woche aufgefüllt wird.
Drei Dinge sind dabei wichtig. In HA_URL gehört die lokale Adresse: Läuft dein Fernzugriff über Cloudflare, sind WebSocket-Verbindungen dort blockiert und der Agent hängt. Der Pfad braucht einen Bindestrich: ki-alltag geht, kialltag lehnt Home Assistant ab. Und die Agents fragen vor jedem Befehl um Erlaubnis, solange du sie nicht davon befreist. Im Experiment liefen alle drei ohne Rückfragen, damit die Uhr nicht misst, wie schnell ich klicke. Bei Codex reicht dafür --full-auto nicht, dessen Sandbox sperrt das Netz und er erreicht Home Assistant gar nicht. Ohne Rückfragen heißt auch: Schritt 1 und 2 sind Pflicht, nicht Kür.
Schritt 7: Prüfen statt glauben
Wenn der Agent fertig meldet, ist er nicht fertig. Öffne das Dashboard auf dem Handy und geh jede Karte durch. Vier Stellen prüfe ich bei jedem Ergebnis zuerst, alle in meiner Installation gemessen. Deine hat andere Namen, aber mit großer Wahrscheinlichkeit dieselben Fallen.
Tote Kacheln. Bei mir sind 33 von 101 Lampen gerade nicht verfügbar, weil Geräte umgezogen, abgebaut oder doppelt eingebunden sind. Wer Lampen nach Bereich einsammelt, baut Kacheln mit „Nicht verfügbar". Mein schönstes Beispiel: light.terrasenbeleuchtung (mit einem s) funktioniert, light.terrassenbeleuchtung (richtig geschrieben) ist tot. Scroll einmal durch und such nach grauen Kacheln.
Offen heißt nicht Fenster. Wer bei mir alle Sensoren der Klasse Tür, Fenster oder Öffnung zählt, die gerade „offen" melden, bekommt acht Treffer. Sieben davon sind Tankstellen aus der Tankerkönig-Integration für Spritpreise, die melden, dass sie geöffnet haben. Tipp einmal auf die Zahl und sieh nach, was dahinter steht.
Die halbe Solaranlage. Hängen mehrere Erzeuger dran, zeigt die naheliegende Entity oft nur einen davon. Bei mir kennt die SolarEdge-Entity nur das Dach, Balkon- und Zaunkraftwerk fehlen, das ist ein Viertel weniger. Und eine Entity namens „Aktuelle Produktion (W)" steht bei voller Sonne auf null. Halte die Zahl auf dem Dashboard gegen die Summe deiner Erzeuger.
Der Kalender, der nicht so heißt. Meine Müllabholung steht in einem Kalender, der calendar.streichelzoo heißt. Daneben liegen Trainingspläne und Kamera-Zeitleisten, die ebenfalls Kalender sind. Prüf, ob die nächste Tonne da ist und ob bei „Termine heute" nur echte Termine stehen.
Dann die Frage, die keine Liste beantwortet: würdest du dieses Dashboard morgen früh statt deinem eigenen öffnen?
Schritt 8: Aufräumen
Token widerrufen, Benutzer löschen oder deaktivieren, Dashboard behalten oder löschen. Das Token dauerhaft liegen zu lassen ist der eine Fehler, den du hinterher nicht mehr siehst.
Tipps und Troubleshooting
Die Verbindung hängt, ohne Fehler. Du benutzt vermutlich deine externe URL. Läuft sie über Cloudflare, werden WebSocket-Verbindungen blockiert: REST funktioniert, WebSocket nicht, und du siehst nur eine Zeitüberschreitung. Nimm die lokale URL.
scheme isn't ws or wss. Deine HA_URL fängt mit http an. Das Skript oben schreibt das um, ein von Hand getipptes nicht.
„Url path needs to contain a hyphen". Dein url_path hat keinen Bindestrich.
Das Dashboard ist leer, obwohl der Agent fertig meldet. Er hat eine YAML-Datei geschrieben statt lovelace/config/save aufzurufen. Frag ihn, wie er gespeichert hat. Genau dafür steht die Zeile WEG in der Abgabe.
Eine Karte zeigt „Entität nicht gefunden". Die Entity-ID ist erfunden oder abgetippt. Häufiger als man denkt, und ein guter Grund, die IDs nicht im Auftrag mitzugeben.
Eine Karte zeigt „Custom element doesn't exist". Der Agent hat eine HACS-Karte benutzt, die bei dir nicht installiert ist. Die Liste steht unter Einstellungen, Dashboards, oben rechts im Menü unter Ressourcen (sichtbar im erweiterten Modus deines Profils).
Jede Karte sieht anders aus. Mushroom, Bubble Card und die eingebauten Kacheln haben drei verschiedene Formensprachen. Sag dem Agenten im zweiten Durchgang, dass er sich für eine entscheiden soll. Der Auftrag oben verlangt das schon in Punkt 8.
Nutzt du schon KI für dein Home Assistant? Und wenn ja, was hast du damit bisher gebaut, oder wo bist du gegen eine Wand gelaufen?
