Externe Integrationen in Gladys Assistant

Status: Entwurf, offen für Diskussion
Diskussion: dieses Foren-Thema


Hallo zusammen,

Ich schlage ein neues Feature vor, das die Art und Weise, wie Integrationen in Gladys entwickelt werden, verändern wird.

Es ist ein lang gereiftes Projekt, und ich würde mich freuen, euer Feedback, eure Ideen und eure Anmerkungen zu erhalten, um es weiter zu verbessern :slight_smile:

Warum jetzt

Seit Beginn des Projekts leben alle Integrationen von Gladys im Core. Jeder kann eine entwickeln oder über einen Pull Request verbessern, aber jede Zeile muss von mir überprüft werden, bevor sie gemerged wird. Diese Wahl hat einen enormen Vorteil: Wenn ihr Gladys installiert, ist alles bereits vorhanden. Kein Store, keine Abhängigkeiten zu verwalten, keine kaputten Plugins nach einem Update. Das ist einer der Gründe, warum Gladys einfacher zu bedienen ist als andere Lösungen.

Aber dieses Modell hat eine Grenze, und ich stoße langsam daran. Es gibt tausende Marken, Protokolle, Dienste, und die geringste Änderung einer Integration, selbst eine einfache Übersetzung, muss über mich laufen: Review, Merge, Release. Das ist nicht skalierbar, und es macht mich zum Engpass des Projekts.

Man könnte denken, dass Matter dieses Problem lösen wird. Matter kommt, und wird meiner Meinung nach zum Referenzprotokoll, das alle verbundenen Geräte in der Zukunft steuern wird: ein einziger Standard, alle Geräte nativ kompatibel, keine Integration pro Marke mehr nötig. Aber wir wissen nicht, wann diese Zukunft Realität wird, und das Projekt kann es sich nicht leisten, unbestimmt auf den Wechsel des installierten Parks zu warten.

Und vor allem deckt Matter nur die Steuerung verbundener Geräte ab. Es gibt noch einen ganzen Bereich von Integrationen, die nichts mit Geräten zu tun haben: Kommunikation (Telegram, etc.), Wetter (OpenWeather, Météo France), Kalender (CalDAV, Google Calendar)… All das wird nie über Matter laufen. Wenn wir wollen, dass Gladys zu einem Projekt mit der gleichen Ambition wie Home Assistant wird, müssen wir die Installation externer Integrationen ermöglichen.

Diese RFC schlägt daher vor, Gladys für externe Integrationen zu öffnen: Integrationen, die von jedermann entwickelt und veröffentlicht werden, ohne vorherige Validierung durch mich, installierbar mit einem Klick aus der Benutzeroberfläche.

Die Herausforderung besteht darin, dies zu tun ohne das zu opfern, was Gladys ausmacht. Konkret wurden vier nicht verhandelbare Anforderungen diese Vorschlag geleitet:

  1. Eine Integration, die abstürzt, darf Gladys nie zum Absturz bringen.
  2. Keine unverständlichen Zustände: Wenn eine Integration nicht mehr antwortet, muss der Benutzer dies sehen und etwas unternehmen können.
  3. Die Benutzeroberflächen müssen sauber und untereinander konsistent bleiben.
  4. Null technische Manipulation für den Benutzer. Kein Terminal, kein YAML, kein manuelles Neustarten.

Was diese RFC nicht vorschlägt

  • Wir ersetzen nicht die nativen Integrationen. Die Integrationen der universellen Protokolle (Matter, Zigbee, Z-Wave…) bleiben immer im Core, vorinstalliert, wie heute gepflegt. Das neue System wird daneben hinzugefügt und zielt auf alle Integrationen von Protokollen oder Diensten ab, die nicht universell sind: Von nun an kann jeder eine separate Integration erstellen.
  • Wir zielen nicht auf die Kompatibilität mit den Home Assistant / HACS-Integrationen ab. Sie sind tief mit der Architektur von HA gekoppelt; sie in Gladys auszuführen ist unrealistisch. Allerdings lasse ich mich von ihrem Verteilungsmodell inspirieren (Git-Repository + Manifest + Store).
  • Wir erlauben den Integrationen nicht, Code in die Benutzeroberfläche zu injizieren. Das ist eine bewusste Entscheidung, die weiter unten detailliert wird.

Vorgeschlagene Architektur

Ein Docker-Container pro Integration

Gladys läuft bereits ausschließlich in Docker, mit dem Docker-Socket gemountet. Wir nutzen dies: Jede externe Integration läuft in ihrem eigenen Container, erstellt und überwacht durch den Gladys-Core.

Dieser Container ist maximal gesperrt:

  • Kein privilegierter Modus, kein Zugriff auf das Docker-Socket
  • Kein Zugriff auf die Datenbank oder die Dateien von Gladys
  • Read-only-Dateisystem, außer einem kleinen Datenverzeichnis, das ihm eigen ist
  • Strenge Grenzen für Speicher, CPU und Anzahl der Prozesse
  • Netzwerk eingeschränkt auf die Hosts, die die Integration in ihrem Manifest deklariert hat.

Eine Integration, die abstürzt, die Speicherlecks hat oder die in eine Endlosschleife gerät, bleibt in ihrem Container eingeschlossen. Und eine böswillige oder schlecht geschriebene Integration kann nicht „die Datenbank direkt ändern“: Die SQLite-Datei existiert einfach nicht in ihrem Dateisystem.

Diese Wahl bringt einen wichtigen Bonus: Die Integrationen sind nicht mehr auf Node.js beschränkt. Ein Docker-Image kann Python, Go, Rust enthalten. Jeder Autor packt seine Abhängigkeiten in sein Image, und der gesamte Build wird im Voraus, zum Zeitpunkt der Veröffentlichung, und nie zur Laufzeit beim Benutzer erledigt.

Langfristig bringt diese Wahl auch etwas Interessantes: Es wird möglich sein, entfernte Integrationen auszuführen!

Alle Kommunikation läuft über die Host-API

Eine Integration greift nie auf die Internals von Gladys zu. Ihr einziger Zugang ist eine Host-API: Die Integration kommuniziert mit dem Core über eine einfache REST HTTP JSON API, im gleichen Geist wie das, was bereits in Gladys heute existiert.

Die für die v1 vorgesehenen Grundlagen:

  • Geräte und deren Funktionen im bestehenden device/feature-Modell von Gladys deklarieren;
  • Zustände veröffentlichen und Befehle empfangen
  • Konfiguration und Geheimnisse speichern (in der DB auf der Core-Seite gespeichert)
  • Strukturierte Logs schreiben
  • Eine vermittelte Netzwerkentdeckung anfordern: Es ist der Core, der Zugriff auf das Netzwerk des Hosts hat, der die mDNS-Scans und den Passthrough der USB-Geräte durchführt und dann die Ergebnisse überträgt. Die Integration benötigt somit nie den Modus host oder direkten Hardwarezugriff.

Dieser Vertrag auf Protokollebene ist das eigentliche Fundament des Vorschlags. Der Container ist „nur“ der Mechanismus, der diesen Vertrag unumgehbar macht. Er ermöglicht auch die Weiterentwicklung des internen Schemas von Gladys ohne das Ökosystem zu brechen: Solange die Host-API stabil ist, funktionieren die Integrationen weiter.

Überwachung: Keine Zombie-Zustände

Der Core enthält einen Supervisor, der den gesamten Lebenszyklus jeder Integration verwaltet, mit einer Zustandsmaschine immer sichtbar in der Benutzeroberfläche:

Installiert → Start → Laufend → Degradiert → Fehlerhaft → Gestoppt

Der Supervisor sendet regelmäßig ein Heartbeat an jede Integration. Keine Antwort? Die Integration wechselt in „Degradiert“ und wird automatisch neu gestartet, mit einer zunehmenden Verzögerung zwischen den Versuchen. Wenn sie in einer Schleife abstürzt, hört man auf, darauf zu bestehen: Sie wechselt in „Fehlerhaft“, und der Benutzer sieht eine klare Nachricht mit den Logs der Integration und den möglichen Aktionen (neu starten, deaktivieren, dem Entwickler melden).

Alle Aufrufe zwischen dem Core und der Integration haben ein Timeout. Eine Integration, die hängt, blockiert Gladys nie.

Das Ziel: Es sollte keinen nicht beobachtbaren oder nicht wiederherstellbaren Zustand mehr geben. Wenn etwas nicht stimmt, sieht man es, versteht es, handelt, alles aus der Benutzeroberfläche.

Benutzeroberfläche: Deklarativ, kein beliebiger Code

Das ist wahrscheinlich die am meisten diskutierbare Wahl dieser RFC, also ist es besser, sie klar zu vertreten.

Die Integrationen liefern keine Benutzeroberflächenkomponenten. Sie beschreiben ihre Bedürfnisse, und es ist Gladys, der die Benutzeroberfläche mit seinem eigenen Design-System rendert:

  • Die Konfiguration wird durch ein Schema (z. B. JSON Schema) beschrieben: Gladys generiert das Formular, die Validierung, die Fehlermeldungen, auf identische Weise für alle Integrationen;
  • Geräte werden im bestehenden device/feature-Modell deklariert: Sie werden automatisch mit den gleichen Karten und Steuerungen wie die nativen Integrationen angezeigt;
  • Für spezifischere Bedürfnisse wird ein Vokabular deklarativer Widgets definiert und schrittweise erweitert, basierend auf den tatsächlichen Bedürfnissen, die von den Entwicklern gemeldet werden.

Was es kostet: Ein Entwickler kann keinen vollständig maßgeschneiderten Bildschirm erstellen. Was es garantiert: eine konsistente Schnittstelle überall, keine XSS-Lücken von einem Plugin, keine Frontend-Versionenkonflikte und eine identische Erfahrung für den Benutzer, unabhängig vom Ursprung der Integration. Angesichts der Projektprioritäten denke ich, dass dies der richtige Kompromiss ist. Aber genau das ist die Art von Punkt, auf den ich eure Rückmeldungen erwarte.

Verteilung: Ein Store in Gladys

Der Benutzer entdeckt und installiert Integrationen über einen in die Oberfläche integrierten Store. Installieren = ein Klick. Der Kern lädt das Bild herunter, überprüft es, startet den Container und zeigt das Konfigurationsformular an, falls die Integration Anmeldedaten benötigt. Kein Terminal, keine Dateien zum Bearbeiten.

Jede Integration wird mit einem Manifest veröffentlicht: Name, Version, kompatible Gladys-Versionen, angeforderte Berechtigungen (Netzwerkhosts, Geräte), Konfigurationsschema. Die Berechtigungen werden dem Benutzer vor der Installation angezeigt, wie in einem mobilen Store.

Alle externen Integrationen sind „communitybasiert“: Ich plane nicht, sie einzeln zu überprüfen, das würde in die Flaschenhalsituation zurückfallen, die diese RFC gerade zu beseitigen versucht. Eine klare Warnung wird bei der Installation angezeigt, um darauf hinzuweisen, dass es sich um nicht überprüften Fremdcode handelt. Die Aufgabe der deklarierten Berechtigungen und der Containerisolierung besteht darin, diese Öffnung akzeptabel zu machen.

Eine Integration in der Ära der KI entwickeln

Ein Punkt, der alles im Vergleich zu vor einigen Jahren verändert hat: Die Entwicklung einer Integration ist dank KI sehr einfach geworden. Meine Absicht ist es, ein offizielles, sauberes und dokumentiertes Integrationstemplate bereitzustellen. Ausgehend von diesem Template kann mit Claude Code/Cursor die Erstellung einer Integration für einen bestimmten Dienst oder ein bestimmtes Protokoll in wenigen Stunden statt in wenigen Tagen erfolgen.

Dadurch wird dieser Vorschlag wirklich mächtig: Statt zu warten, dass ich jede Integration entwickle oder überprüfe, kann die Community viel mehr und viel schneller produzieren.

Das Tempo, mit dem neue Integrationen erscheinen, wird nicht mehr durch meine Verfügbarkeit begrenzt.

Vorgeschlagener Fahrplan

  1. Definieren Sie die Host-API und das SDK und bitten Sie einige Entwickler, die ersten externen Integrationen darauf zu erstellen.
  2. Spezifizieren Sie das Manifest und das Schema der deklarativen Schnittstelle.
  3. Implementieren Sie den Supervisor und den Start von gesperrten Containern als Proof of Concept für eine einzige Integration.
  4. Bauen Sie den Store und den Installationspfad mit dem offiziellen Integrationstemplate.
  5. Öffnen Sie die Veröffentlichung für alle.

Mein Ziel ist es, dieses neue System so schnell wie möglich einzuführen: Mit den KIs ist es möglich, sehr schnell voranzukommen.

Ich plane, die Arbeit diese Woche mit Fable 5 zu beginnen, solange es verfügbar ist.

Offene Fragen an die Community

  • Finden Sie den Kompromiss „Nur deklarative UI“ akzeptabel? Welche echten Anwendungsfälle würden nicht darunter fallen?
  • Welche Primitiven fehlen in der Host-API für Ihre Traumintegrationen?
  • Sollte die v1 auf Node.js-Integrationen (mit einem offiziellen SDK) beschränkt werden, um es zu vereinfachen, oder alle Sprachen von Anfang an öffnen?

Dieser Vorschlag ist ein Ausgangspunkt, keine in Stein gemeißelte Entscheidung: Eure Kritik, Einwände und Ideen sind genau das, was ich brauche, um ihn zu verbessern :slight_smile:

Hallo @pierre-gilles,

Ich bin kein Experte für Smart Home, aber ich freue mich natürlich sehr über die Möglichkeit einer maßgeschneiderten Integration!

Ich nehme an, wenn eine Erweiterung besonders relevant und stark nachgefragt ist, wird sie irgendwann in den Kern von Gladys integriert?

Wird es Probleme mit der Performance geben, wenn eine hundert Docker-Container über einen einzigen API-Host-Kanal laufen?

Ich nutze Gladys erst seit weniger als 2 Monaten, aber ich bin beeindruckt von der Reaktionsfähigkeit und der Entwicklungsgeschwindigkeit dieses Tools!

Vielen Dank nochmal!

Es ist in der Tat eine große Veränderung, aber ich denke auch, dass sie notwendig ist. Du allein kannst nicht alle Integrationen entwickeln, prüfen und warten, selbst mit KI. Selbst mit super Contributoren nimmt das Überprüfen der Beiträge sicherlich viel Zeit in Anspruch.

Außerdem, auch wenn es zu bevorzugen ist, muss man auch anerkennen, dass die Integration von MatterBridge ihre Grenzen haben kann, wenn das Matter-Protokoll bestimmte Funktionen nicht unterstützt.

Ich bin mit deinem Ansatz einverstanden, den Kern und die Integrationen gut zu trennen. Es ist auch ein sehr guter Punkt, den Integrationen keinen Zugriff auf das System zu erlauben. Ich würde auch präzisieren, dass die Integrationen kostenlos und Open Source sein müssen, um akzeptiert zu werden.

Was eine Version v1 betrifft, würde ich die Programmiersprache Python hinzufügen, die in der Hausautomatisierung sehr verbreitet und einfach zu erlernen ist. Zudem funktionieren KI-Agenten sehr gut, um Python-Code zu generieren.

Gute Frage, aber keine Sorge: Die API ist keine einzelne Warteschlange, in der Anfragen nacheinander abgearbeitet werden. Es ist ein HTTP-Server, genau wie der, den Gladys bereits heute für das Frontend bereitstellt.

Da Node asynchron ist, werden während eine Anfrage auf die Datenbank wartet, viele andere parallel in der Event-Loop verarbeitet. 100 Container, die darauf zugreifen, sind eine lächerliche Last.

Der eigentliche kritische Punkt ist nicht die API, sondern der RAM. Ein Container selbst wiegt fast nichts (es ist keine VM), aber jeder Node-Prozess enthält die V8-Runtime, sodass man mit 50-80 MB RAM pro Integration rechnen muss, abhängig davon, was sie tut. Bei einer Handvoll Integrationen kein Problem auf einem Mini-PC. Bei Hunderten, die gleichzeitig laufen, hängt es von deinem verfügbaren RAM ab :smiley:

In der Praxis werden die meisten Installationen zwischen 5 und 20 externe Integrationen haben, was auf den meisten Mini-PCs völlig komfortabel ist.

Danke!!

Auf jeden Fall wird die API vollständig offen und dokumentiert sein, sodass jeder Entwickler sie nach Belieben nutzen kann :wink:

Das eigentliche Thema ist eher, welche Beispiele wir bereitstellen und in welchen Sprachen. Persönlich habe ich keine Erfahrung mit Python, daher könnte ich eventuell ein Beispiel durch KI generieren lassen, aber ich wäre nicht wirklich in der Lage, es zu überprüfen, zu validieren oder die Nutzer effektiv dabei zu unterstützen.

Aber das ist die Stärke dieser externen Integrationen: Jeder wird frei sein und ich werde nicht der Engpass :smiley:

Für den zukünftigen Integrations-Store möchte ich eine vollständig dezentrale Architektur einführen, ohne manuelle Validierung, ohne Reviews und ohne die Notwendigkeit, eine Genehmigung zum Veröffentlichen zu beantragen.

Konkreter gesagt, wird jeder Entwickler seine Integration einfach in seinem eigenen GitHub-Repository veröffentlichen, indem er ein spezifisches Topic hinzufügt. Dieses Repository bleibt die einzige Wahrheit : Jeder behält die Kontrolle über seinen Code und seine Updates.

Auf der anderen Seite wird ein vollständig automatischer Indexer (eine öffentliche GitHub Action) regelmäßig alle Repositories durchsuchen, die dieses Topic tragen. Er wird nur objektive Kriterien überprüfen: Vorhandensein eines gültigen Manifests, Einhaltung des Schemas, Zugänglichkeit der Bilder, Konsistenz der Versionen usw. Wenn alles konform ist, wird die Integration automatisch zu einer statischen index.json hinzugefügt, die anschließend über GitHub Pages und ein CDN verteilt wird.

Die Gladys-Instanzen werden nur diesen statischen Index herunterladen, was hohe Leistung garantiert, die API-Beschränkungen von GitHub umgeht und das einfache Cachen des Inhalts ermöglicht. Und selbst wenn der Indexer vorübergehend nicht verfügbar sein sollte, würde der zuletzt veröffentlichte Index weiterhin funktionieren.

Das Ziel ist einfach: niemand benötigt meine Genehmigung, um eine Integration zu veröffentlichen. Die einzigen Regeln sind diejenigen, die automatisch vom Skript überprüft werden, dessen Code ebenfalls öffentlich sein wird. Somit kann jeder sofort verstehen, warum seine Integration indiziert wird… oder warum nicht.

Also ich habe nicht alles verstanden :face_with_head_bandage:, aber ich finde die Idee ausgezeichnet, denn sie wird es ermöglichen, einen großen Sprung nach vorne zu machen, was die Möglichkeiten von Gladys betrifft, mit HA zu konkurrieren. Und das wird es jedem ermöglichen, „einfach“ zur Verbesserung von Gladys beizutragen, die mit einem intakten Kern bleibt!

Es wäre gut, in einem zweiten Schritt die Wahl zu lassen, eine andere Git-Plattform wie GitLab und Codeberg zu verwenden.

Hallo @contributors :waving_hand:

Heute habe ich gute Fortschritte bei diesem Thema gemacht! Ich habe den ganzen Tag damit verbracht, die technische Spezifikation mit Fable 5 zu erstellen.

Die Implementierungsspezifikation ist hier verfügbar:

https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md

Mein Ziel ist es, diese Entwicklung schnell voranzutreiben, ohne dabei die hohe Qualität zu vernachlässigen.

Wie immer sind alle eure Rückmeldungen willkommen. :slightly_smiling_face:

3 neue Repositories erstellt:

Umsetzung durch 3 Fable 5-Agenten:

Ich gehe voran, da Fable 5 nicht garantiert bleibt, nachdem der 19. Juli vorbei ist.

Falls ihr Feedback habt, natürlich ist alles noch änderbar, ich bin wirklich offen für Rückmeldungen!

Ich denke, es ist gut, dass die Integrationen auf diese Weise verwaltet werden können.

Keine Sprachbarriere und Zeitersparnis auf deiner Seite, da du jeden PR überprüfen musst, was besonders jetzt mit der KI viel Zeit in Anspruch nimmt.

Aber konkret, wenn wir das Beispiel der Integration von Meteo France nehmen, gibt es den API-Teil, der mit der Integration zu verwalten ist, aber auch den Widget-Teil und den Szenenauslöser und die Szenenaktion.
Sollte man in mehrere Teile aufteilen, um den Integrationsteil vom Widget- und Szenenteil zu trennen? Es gäbe also einen PR für den Kern mit den Widgets/Szenen und den Meteo France-Integrationsteil für den Gladys-Store?

Und die bereits bestehenden Integrationen? Sollten sie in den Store wechseln oder lässt du sie, wie sie sind?

Langfristig denke ich, dass viele Integrationen aus dem Core entfernt werden können, aber es ist wichtig, klar zu unterscheiden, was zum Core gehört und was extern ist. Da externe Integrationen nicht auf die Hardware zugreifen können, kann man bereits sagen, dass der Core die „Protokolle“ wie Zigbee, Z-Wave und Matter verwaltet, da man auf die USB-Dongles zugreifen muss. Die Benutzeroberfläche und der Supervisor sind ebenfalls Teil des Core. Eine Liste mit Erklärungen wäre willkommen.

Um eine neue Sprache einfacher hinzuzufügen, schlage ich zwei Dinge vor:

  • Ein « JSON Schema » vorschlagen, um die Struktur der JSON-Nachrichten zu validieren
  • Einen Docker-Server, der die Validierung eines SDK ermöglicht. Die Idee wäre folgende:
    • Ich entwickle ein SDK in Sprache X basierend auf der offiziellen JS-Version mit denselben Validierungstests
    • Sobald die Entwicklung abgeschlossen ist, starte ich den SDK-Validierungsserver
    • Ich starte die Validierungstests, indem ich mich mit dem Server verbinde
    • Mein SDK wird validiert, wenn 100% der Tests erfolgreich sind
      Zusätzlich ermöglicht diese Methode die Automatisierung der Entwicklung und Validierung durch eine KI.

Ein weiterer Punkt ist, wie stark die Ressourcen der externen Integrationen begrenzt werden sollten, um zu vermeiden, dass Monster entstehen und die Gladys-Erfahrung beeinträchtigt wird. Je nach Sprache kann der Speicherbedarf und die CPU-Last einfach bis dreimal so hoch sein. Wenn wir zu streng sind, schließen wir viele interpretierte Sprachen (Python, Ruby und sogar JS mit NodeJS) aus, und wenn es zu locker ist, wird eine Maschine mit viel RAM benötigt. Daher sind Maschinen wie Raspberry Pis, NAS, Freebox usw. ausgeschlossen. Außerdem ist RAM jetzt sehr teuer.
Nun, da ich C/C+±Entwickler bin, neige ich eher zu strengen Regeln :slight_smile:

Kurze Zwischenmeldung: Fable 5 hat hier gut gearbeitet und PRs für alle betroffenen Repositories erstellt, fast wortwörtlich nach der Spezifikation, die ich am Montag verfasst habe. :rocket:

Ich werde auf meiner Seite in die Review- und Testphase eintreten, bis zum Ende der Woche.

Das ist ziemlich beeindruckend, denn das ist ein Projekt, das vor einigen Jahren wahrscheinlich mehrere Monate Entwicklung gedauert hätte. Wenn alles nach Plan läuft, sollten wir sehr schnell etwas herausbringen können.

Ich halte euch auf dem Laufenden! :slightly_smiling_face:


Die Idee ist es, die Integrationen vollständig vom Core zu entkoppeln und eine klare und stabile API-Oberfläche zwischen beiden zu haben.

Bisher decken Spezifikation und Implementierung nur den Geräte-Teil ab. Ich habe das Wetter, die Kommunikation oder andere Bereiche noch nicht behandelt, aber sie werden natürlich nach dem gleichen Muster hinzugefügt werden.

Um eine Idee zu geben, wird eine Integration so aussehen:

Quelle: GitHub - GladysAssistant/integration-sdk-js: Gladys Assistant SDK for JS external integration · GitHub

Andererseits, wenn eine Integration eine neue Core-Funktionalität benötigt (z. B. einen neuen Gerätetyp), muss man tatsächlich:

  1. Einen PR für den Core erstellen, um diese Funktion hinzuzufügen.
  2. Sobald diese Funktion verfügbar ist, wird sie automatisch über die API bereitgestellt und kann in externen Integrationen verwendet werden.

Das hängt von der Integration ab.

Alle universellen Integrationen (Matter, Zigbee, etc.) sollen im Core bleiben. Meine Philosophie hat sich nicht geändert: Das Ziel ist es, vor allem die beste Benutzererfahrung zu bieten, und diese Bausteine müssen nativ sein, ohne zusätzliche Installation.

Andererseits werden sehr spezifische Integrationen für bestimmte Hersteller oder Dienste (z. B. Mitsubishi) schrittweise in den Store migriert.


Externe Integrationen werden Zugriff auf die Hardware haben, aber über APIs, die vom Core bereitgestellt werden.

Das ist übrigens in der Spezifikation vorgesehen:

eine vermittelte Netzwerkentdeckung anfordern: Das ist der Core, der Zugriff auf das Netzwerk des Hosts hat, der die mDNS-Scans und den USB-Geräte-Passthrough durchführt und dann die Ergebnisse überträgt. Die Integration benötigt daher nie den host-Modus oder direkten Hardwarezugriff.

Das Ziel ist es, alle notwendigen Fähigkeiten ohne Kompromisse bei der Sicherheit anzubieten.

Und wenn eine Integration wirklich besondere Berechtigungen benötigt, bin ich nicht gegen ein System expliziter Berechtigungen, ähnlich wie bei iOS oder Android, bei dem der Benutzer die angeforderten Zugriffe bestätigt.


Ja, das ist bereits in der Spezifikation vorgesehen: https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md

Derzeit ist jede Integration auf folgende Werte begrenzt:

  • 0,5 vCPU
  • 256 MB RAM
  • Maximal 100 PID (Schutz vor Fork Bombs)

Diese Werte sind ein Ausgangspunkt und können je nach den tatsächlichen Bedürfnissen der Integrationen und dem Feedback der Community angepasst werden.

Hallo Pierre-Gilles,

Thema, das perfekt passt: Ich arbeite gerade an zwei Integrationen, die die beiden Extremfälle deines Modells darstellen — Zendure (Cloud + Token + Polling, das du übrigens als Beispiel nennst :grinning_face_with_smiling_eyes:) und eine lokale Videoüberwachung Frigate/go2rtc (siehe meinen Post), die Docker-Container, GPU und Video-Streams orchestriert. Meine Rückmeldungen basieren auf diesen beiden Erfahrungen.

Ich bin bereit, als Testumgebung zu dienen, wenn du die Host-API prototypst — Frigate auf der Seite der „Überwachung externer Systeme“, Zendure auf der Seite des „einfachen Cloud-Dienstes“. Ich würde hier Zendure bevorzugen ^^

Um die Grenzen jeder Integration, die du beschlossen hast, zu testen, wäre Frigate der richtige Kandidat … Denn ich bin mir sicher, dass es nicht ausreichen wird. Zum Beispiel werden 256 MB RAM für eine Kamera empfohlen, und für zwei musste ich auf 384 MB erhöhen.

Danke @Terdious, das ist großartig, wir können das alles in externe Integrationen einbinden!!

Ich teste gerade und es ist wirklich verrückt, die Benutzererfahrung ist genau die gleiche wie nativ, aber es ist viel einfacher zu entwickeln, denn es muss nur der Backend entwickelt werden, und vor allem keine PR-Reviews :slight_smile: Du kannst dich richtig austoben :joy:

Ich habe die native Melcloud-Integration in eine externe Integration umgewandelt (GitHub - GladysAssistant/gladys-melcloud: Gladys Assistant external integration for Mitsubishi AC · GitHub), natürlich one-shotted von Fable 5.

Beispiel für die Anzeige einer „Community“-Integration vs. „nativ“:

Die Integrationsliste enthält sowohl native als auch Community-Integrationen aus dem Store.

Es ist auch möglich, eine Integration von Github aus zu starten:

Oder von einem Docker-Image zum Testen:

Anschließend gibt es nicht viele Unterschiede zu einer klassischen Integration:

Kurz gesagt, es funktioniert wirklich gut!!

Ich denke, wenn du dich an einer Zendure-Entwicklung versuchen willst, kannst du jetzt gleich anfangen, um es zu testen und mir Feedback zur Gesamterfahrung zu geben.

Das externe Integrations-Template, das du Claude als Quelle geben kannst: GitHub - GladysAssistant/integration-template-js: Gladys Assistant Integration template for a JS external integration · GitHub

Das JS-SDK: GitHub - GladysAssistant/integration-sdk-js: Gladys Assistant SDK for JS external integration · GitHub

Zum Testen in Gladys kannst du Gladys lokal auf deinem Rechner auf diesem Branch starten: External integrations (RFC phase 1): Docker supervisor, host API, integration WebSocket, decentralized store and generic frontend by Pierre-Gilles · Pull Request #2665 · GladysAssistant/Gladys · GitHub

Und im Reiter „Integrationen“ findest du den Button „Von Github installieren“.

Ja, Frigate ist wirklich ein besonderer Fall. Die Hauptherausforderung betrifft die Container-Architektur.

Heute entspricht eine externe Integration einem dedizierten Container. Mit Frigate sind zwei Ansätze möglich:

  • drei separate Container starten (Frigate + Mosquitto + die externe Gladys-Frigate-Integration);
  • oder ein Docker-Image basierend auf Frigate erstellen, das den Code der Gladys-Integration direkt enthält.

Jeder Ansatz hat seine Vor- und Nachteile. Es ist ein Fall, der heute nicht in der aktuellen Architektur berücksichtigt wird, daher muss dieser Punkt weiterentwickelt werden. :slightly_smiling_face:

@Terdious Ich habe eine ganze Spezifikation mit Fable 5 für das Management von Subcontainern geschrieben.

Die allgemeine Idee ist, dass eine externe Integration in JSON « Subcontainer » deklarieren kann, die sie benötigt. In unserem Fall könnte man zum Beispiel Frigate + Mosquitto direkt von der Integration aus deklarieren.

Die Spezifikation ist hier verfügbar:
https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md
(siehe den Abschnitt Subcontainer)

Anschließend übernimmt Gladys den gesamten Lebenszyklus dieser Container: Erstellung, Start, Stopp, Löschung… Und wenn die Integration gelöscht wird, wird alles automatisch bereinigt (Container + Volumes).

Für den speziellen Fall von Mosquitto gibt es eine interessante Einschränkung: Es benötigt Dateien auf der Festplatte, bevor es gestartet werden kann (insbesondere für Passwörter). Daher können die deklarierten Container erstellt, aber standardmäßig gestoppt werden und dann explizit von der Integration gestartet werden, wenn diese ihre Konfiguration abgeschlossen hat. Eine API /start ist dafür vorgesehen.

Was hältst du davon?

Ich habe Fable 5 auf 2 Baustellen gestartet:

  • Integrationstyp Frigate mit Subcontainern
  • Integrationstyp „Kommunikation“ (z. B. Telegram)
  1. Integration im Store!! :partying_face:

Wenn man es installieren möchte:

Danach:

Ich werde wahrscheinlich heute Nacht und morgen Abend daran arbeiten und das alles herausfinden, ich gebe dir danach Bescheid ^^

Und das ist dann ja super ^^ Ich mache mich da ran, außerdem haben wir die Referenz HA, ideal für die KI :wink:
Ich bin diese Woche für die Pro-Entwicklung zu Max+ gewechselt, und sie haben mir gestern meine Guthaben zurückgesetzt … ich nehme an, als Geschenk ^^ also habe ich bis Montag noch Spielraum :

Unglaublich, nutze es aus, während Fable 5 da ist :smiley:

Wenn du Dutzende von Integrationen erstellen möchtest, lass dich gehen! Gib die Referenzen der Vorlage und des SDK an, und die KI sollte damit ohne größere Probleme zurechtkommen.

Anschließend hast du für den Test einer Integration 2 Optionen, und nichts muss konfiguriert werden, alles ist bereits in der Vorlage vorbereitet, es ist schlüsselfertig :slight_smile:

Option 1: Test über GitHub

Du erstellst mit einem Klick eine Veröffentlichung, und es wird automatisch ein Git-Tag + ein Push des Bildes zum GitHub Container Registry generiert. Super einfach:

Anschließend fügst du in Gladys den Link des Repos ein:

Option 2: Test über Docker-Image

Praktischer, um einen PR zu testen, bevor er für alle Nutzer der Integration in die Produktion veröffentlicht wird.

Du beginnst damit, den zu buildenden Zweig auszuwählen:

Danach wird ein Docker-Image veröffentlicht, das mit dem Namen des Zweigs getaggt ist.

In der Veröffentlichung findest du alle Informationen, die du in Gladys kopieren kannst:

Kopieren in die Oberfläche:

Wenn du einen Fehler oder Feedback hast, lass es mich wissen! Und zögere nicht, für jede Integration einen Beitrag im Forum zu veröffentlichen, ich werde es dieses Wochenende so schnell wie möglich ansehen :muscle: