Zum Hauptinhalt springen

XMPP Smart-Home-Integration, kostenlos und Open Source

XMPP-Integration für Gladys Assistant

Sprich mit Gladys über XMPP (Jabber), sende Nachrichten und starte Szenen bei Nachrichten in Räumen.

Sprich mit Gladys über XMPP (Jabber), den offenen und dezentralen Messaging-Standard (Conversations, Monocles, Gajim, Dino, Siskin, Monal, Snikket…), so wie mit dem Telegram-Bot von Gladys: Stell eine Frage, starte eine Szene, empfange die Nachrichten von Gladys. Die Integration schreibt aus deinen Szenen auch an XMPP-Adressen und in Gruppenchats und startet Szenen, wenn in einem beobachteten Gruppenchat eine Nachricht oder ein Befehl wie !licht aus geschrieben wird. Dafür nutzt sie ein eigenes Bot-Konto, auf deinem eigenen Server (Prosody, ejabberd, Snikket, Openfire…) oder einem öffentlichen.

Ohne die Hardware entwickelt: Feedback willkommen. Die Integration wurde gegen einen echten Prosody-13-Server getestet, aber nicht in einem echten Gladys und nicht mit jeder XMPP-App. Sag uns, was funktioniert und was nicht, in den Issues oder im Gladys-Forum.

Was du brauchst​

  • Gladys Assistant 5.1.0 oder neuer.
  • Ein eigenes XMPP-Konto für den Bot (zum Beispiel [email protected]), auf einem Server, den Gladys erreicht: dein eigener Server im lokalen Netz oder ein öffentlicher im Internet. Nimm nicht dein persönliches Konto: Der Bot antwortet in dessen Namen.
  • Einen Server mit Verschlüsselung (STARTTLS auf Port 5222 oder direktes TLS auf Port 5223): Das bieten alle standardmäßig. Das Passwort des Bots wird nie über eine unverschlüsselte Verbindung gesendet.
  • Die XMPP-Adresse jeder Person, die mit dem Bot sprechen darf, etwa [email protected].

Einrichtung​

  1. Leg das Bot-Konto an (auf deinem Server: wie die anderen Konten, zum Beispiel prosodyctl adduser [email protected]; auf einem öffentlichen Server: eine normale Registrierung).
  2. In Gladys Integrationen → XMPP → Konfiguration:
    • Adresse des Bots (JID) und Passwort des Bots: das Konto des Bots.
    • Server (optional): leer wird der Server über die Adresse gefunden (DNS-SRV-Einträge, wie bei jeder XMPP-App). Sonst ein Hostname oder eine IP-Adresse, bei Bedarf mit Port: 192.168.1.20 oder xmpp.example.org:5222 (STARTTLS), 192.168.1.20:5223 oder xmpps://xmpp.example.org (direktes TLS).
    • Selbstsigniertes Zertifikat akzeptieren: nur für deinen eigenen Server im lokalen Netz, dessen Zertifikat nicht von einer Zertifizierungsstelle signiert ist. Die Verbindung bleibt verschlüsselt, aber der Server wird nicht geprüft. Standardmäßig aus.
    • Erlaubte Personen: die XMPP-Adressen, auf die der Bot hört, durch Kommas getrennt. Leer antwortet der Bot niemandem: Er ignoriert die Nachrichten aller, die nicht in der Liste stehen.
    • Beobachtete Räume: die Gruppenchats (MUC), deren Nachrichten Szenen starten, etwa [email protected], durch Kommas getrennt. Die Räume müssen schon existieren: Der Bot tritt ihnen bei (ist der Raum nur für Mitglieder, mach den Bot zuerst zum Mitglied).
    • Spitzname in den Räumen: standardmäßig Gladys.
    • Befehlspräfix: standardmäßig !.
    • Sprache des Bots: die Sprache dessen, was der Bot schreibt, bevor eine Person verknüpft ist.
  3. Klicke auf Verbindung testen: Der Bericht nennt die Adresse des Bots, die beobachteten Räume, die er betreten hat, und die Zahl der erlaubten Personen. Der Verbindungsstatus der Seite sagt es auch.

Deine XMPP-Adresse verknüpfen, um mit Gladys zu sprechen​

Jeder Gladys-Benutzer, der über XMPP mit Gladys sprechen will, macht das einmal:

  1. Füg den Bot in deiner XMPP-App als Kontakt hinzu (seine Adresse), wenn du willst; nötig ist es nicht.
  2. In Gladys Integrationen → XMPP → Konfiguration, Block „Mein Konto verknüpfen“: Klicke auf Verknüpfungscode generieren.
  3. Schick den Code (8 Zeichen) in einem Einzelchat an den Bot. Der Bot bestätigt: Deine XMPP-Adresse ist mit deinem Gladys-Benutzer verknüpft. Du kannst sie im selben Block wieder trennen.

Was der Bot macht​

  • Im Einzelchat: Er gibt deine Nachrichten an Gladys weiter, mit den Rechten des verknüpften Gladys-Benutzers, genau wie der Telegram-Bot: „Wie warm ist es im Wohnzimmer?“, „Schalte das Licht aus“. Die Antworten von Gladys kommen in diesem Chat zurück. Die Nachrichten, die Gladys dir schickt (die Szenenaktion Nachricht senden, die Systemnachrichten), kommen auch dort an.
  • In einem beobachteten Raum: Jede Nachricht einer erlaubten Person startet den Auslöser XMPP-Nachricht empfangen, und eine Nachricht, die mit dem Präfix beginnt, startet zusätzlich XMPP-Befehl empfangen. Der Bot antwortet dort nie von sich aus, wo andere mitlesen: Was passiert, bestimmen deine Szenen.
  • Wer ist wer in einem Raum: Eine Person wird an ihrer XMPP-Adresse erkannt, nie an ihrem Spitznamen. Der Raum muss dem Bot die echten Adressen seiner Mitglieder zeigen: ein „nicht anonymer“ Raum (Prosody, ejabberd: die Raumoption, die allen die Adressen zeigt), oder der Bot ist Moderator des Raums.
  • Was er ignoriert: alle, die keine erlaubten Personen sind, seine eigenen Nachrichten, den Verlauf der Räume, private Nachrichten über einen Raum, Tipp-Benachrichtigungen und Empfangsbestätigungen, und Nachrichten, die beim Empfang älter als 5 Minuten sind (vom Server aufbewahrt, während Gladys gestoppt war: ein „!garage auf“ von vor zwei Stunden läuft jetzt nicht mehr).
  • Verbindung: Der Bot zeigt sich online, beantwortet die Pings des Servers und pingt ihn alle 2 Minuten. Bricht die Verbindung ab, verbindet er sich selbst neu (nach 2, 5, 10, 30, dann 60 Sekunden).

Dashboard​

Das Widget XMPP zeigt, ob der Bot verbunden ist, seine Adresse, die beobachteten Räume, in denen er ist, die letzten 5 Nachrichten aus den beobachteten Räumen (Spitzname, Text, Datum) und einen Knopf Verbindung testen. Die Einzelchats mit Gladys erscheinen dort nie: Alle, die das Dashboard sehen, sehen das Widget.

Szenen​

Auslöser​

  • XMPP-Nachricht empfangen: Eine erlaubte Person hat in einem beobachteten Raum geschrieben. Filter (leer = alle): Raum ([email protected]) und Absender (die Adresse der Person, [email protected]). Variablen: Nachricht, Absender, Spitzname, Raum.
  • XMPP-Befehl empfangen: Eine erlaubte Person hat in einem beobachteten Raum einen Befehl geschrieben: das Präfix, dann ein Wort, dann optionale Argumente, zum Beispiel !licht aus küche. Filter Befehl: das Wort ohne Präfix, kleingeschrieben (licht); dazu Raum, Absender. Variablen: Befehl (licht), Argumente (aus küche), Nachricht, Absender, Spitzname, Raum. Dieselbe Nachricht startet auch XMPP-Nachricht empfangen.
  • XMPP-Verbindung verloren: Der Bot erreicht den Server seit einer Minute nicht mehr, oder sein Passwort oder das Zertifikat des Servers werden abgelehnt. Variable: Fehler. Einmal gestartet, bis die Verbindung zurück ist.
  • XMPP-Verbindung wiederhergestellt: Der Bot erreicht den Server nach einem Verbindungsverlust wieder. Variable: Bot-Konto.

Aktionen​

  • XMPP-Nachricht senden: schreibt eine Nachricht an eine XMPP-Adresse ([email protected], auch an eine nicht erlaubte Person: Der Bot schreibt ihr nur) oder in einen beobachteten Raum ([email protected]). Die Nachricht akzeptiert die Szenenvariablen. Ergebnisse: Gesendet (ja/nein), Fehler. Eine fehlgeschlagene Nachricht stoppt die Szene nicht: Prüfe Gesendet bei Bedarf mit einer Bedingung. Das Echo der Nachricht im Raum startet nie die Auslöser.

Um einem Gladys-Benutzer statt einer Adresse zu schreiben, nimm die Aktion Nachricht senden von Gladys: Die Nachricht kommt an seiner verknüpften XMPP-Adresse an.

Szenenideen​

  • Garage per Befehl: Auslöser XMPP-Befehl empfangen, Befehl garage, Raum [email protected]; dann eine Bedingung auf die Variable Argumente gleich zu, und die Aktion, die das Garagentor schließt.
  • Waschmaschine fertig: Auslöser auf die Leistung der Steckdose, dann XMPP-Nachricht senden an [email protected]: „Die Waschmaschine ist fertig“.
  • Alarm, wenn der Bot getrennt ist: Auslöser XMPP-Verbindung verloren, dann eine Benachrichtigung über einen anderen Kanal (Gotify, ntfy, SMS) mit der Variable Fehler.

Fehlerbehebung​

  • „der XMPP-Server antwortet nicht“: Prüfe Server (optional). Ist das Feld leer, braucht die Domain der Adresse DNS-SRV-Einträge (_xmpp-client._tcp) oder muss auf den Server selbst zeigen; im lokalen Netz gib die IP-Adresse des Servers ein.
  • „Zertifikat des Servers abgelehnt“: Das Zertifikat ist selbstsigniert, abgelaufen oder nennt die Domain der Adresse nicht. Für deinen eigenen Server im lokalen Netz aktiviere Selbstsigniertes Zertifikat akzeptieren.
  • „Adresse oder Passwort des Bots abgelehnt“: Prüfe sie, indem du dich mit dem Bot-Konto in einer XMPP-App anmeldest.
  • „der Server bietet keine Verschlüsselung an“: Aktiviere TLS auf dem Server (Standard bei Prosody und ejabberd).
  • Ein beobachteter Raum wird nicht betreten: Der Status der Seite und der Test nennen ihn. Der Raum muss existieren (der Bot legt keine Räume an: Eine vertippte Adresse wird gemeldet), und der Bot muss hinein dürfen: Mitglied eines Raums nur für Mitglieder, nicht gesperrt. Passwortgeschützte Räume werden nicht unterstützt.
  • Der Bot antwortet mir nicht: Steht deine Adresse genau so in Erlaubte Personen? Ist deine Adresse verknüpft (der Bot schickt dir sonst die Anleitung)? Sendet deine App die Nachricht als Einzelchat (und nicht über einen Raum)?
  • Eine Raumnachricht startet die Szene nicht: Zeigt der Raum dem Bot die echten Adressen (siehe „Wer ist wer in einem Raum“)? Der Filter Befehl ist das Wort ohne Präfix, kleingeschrieben: licht, nicht !Licht.
  • Mehr Details in den Logs der Integration mit LOG_LEVEL=debug.

Grenzen​

  • Keine Ende-zu-Ende-Verschlüsselung (weder OMEMO noch OpenPGP): Der Bot liest und schreibt nur unverschlüsselte Nachrichten. Diese reisen verschlüsselt zwischen deiner App, dem Server und Gladys (TLS), aber der Server kann sie lesen. Verschlüsselt deine App standardmäßig (Conversations, Monocles, Dino), schalte OMEMO im Chat mit dem Bot aus.
  • Eine mit Gladys verknüpfte Person kann über XMPP alles tun, was ihr Gladys-Benutzer darf: Halte die Liste der erlaubten Personen kurz und schütze das Bot-Konto (starkes Passwort, nie wiederverwendet).
  • Bilder von Gladys (Kamerabilder) werden nicht weitergeleitet: Nur der Text geht raus. Bilder, Dateien und Sprachnachrichten an den Bot werden ignoriert.
  • Ein Bot-Konto pro Gladys, mit der Ressource gladys: Eine Anmeldung anderswo mit derselben Ressource trennt den Bot für eine Minute.
  • Passwortgeschützte Räume und Räume, in denen der Bot die echten Adressen nicht sieht, werden für die Auslöser nicht unterstützt.
  • Nicht verbunden mit der XMPP Standards Foundation.

Konfigurationseinstellungen​

Diese Einstellungen fragt XMPP in seinem Konfigurationsbildschirm in Gladys ab.

EinstellungTypPflichtfeldBeschreibung
Erste SchrittesectionNeinLeg ein eigenes XMPP-Konto für den Bot an, auf deinem Server (Prosody, ejabberd, Snikket…) oder einem öffentlichen. Die Nachrichten sind nicht Ende-zu-Ende-verschlüsselt (kein OMEMO).
Adresse des Bots (JID)stringJaDie XMPP-Adresse des Bot-Kontos.
Passwort des BotssecretNeinWird nur über eine verschlüsselte Verbindung an den Server gesendet.
Server (optional)stringNeinLeer: wird über die Adresse gefunden (DNS). Sonst Host oder Host:Port; Port 5223 oder xmpps:// für direktes TLS.
Selbstsigniertes Zertifikat akzeptierenbooleanNeinNur für deinen eigenen Server im lokalen Netz: Die Verbindung bleibt verschlüsselt, aber der Server wird nicht geprüft.
Erlaubte PersonenstringNeinXMPP-Adressen, auf die der Bot hört, durch Kommas getrennt. Leer: Der Bot antwortet niemandem.
Beobachtete RäumestringNeinGruppenchats (MUC), deren Nachrichten Szenen auslösen, durch Kommas getrennt. Die Räume müssen existieren: Der Bot tritt ihnen bei.
Spitzname in den RäumenstringNein
BefehlspräfixstringNeinEine Nachricht, die damit beginnt, ist ein Befehl, z. B. !licht aus. Ein bis drei Zeichen.
Sprache des BotsselectNeinSprache dessen, was der Bot schreibt, bevor eine Person verknüpft ist, und der Berichte.

So installierst du XMPP in Gladys​

  1. Öffne in Gladys Integrationen: XMPP erscheint im Katalog neben den nativen Integrationen, mit einem Community-Badge.
  2. Klicke auf Installieren. Gladys lädt das Docker-Image (ghcr.io/guim31/gladys-xmpp:1.0.1) herunter, startet es in einer vom Kern isolierten Sandbox und erzeugt die Oberfläche der Integration (Geräte, Erkennung und Konfiguration).
  3. Öffne den Bildschirm Konfiguration der Integration, fülle die Einstellungen aus und speichere.
  4. Du kannst sie auch direkt über die URL ihres Repositorys installieren: https://github.com/guim31/gladys-xmpp.

XMPP benötigt Gladys >=5.1.0. Der Katalog in Gladys wird stündlich aktualisiert, eine neue Version ist also spätestens eine Stunde nach ihrer Veröffentlichung verfügbar.

Du nutzt Gladys noch nicht? Es ist kostenlos und Open Source: folge der Installationsanleitung, um loszulegen.

Über externe Integrationen​

XMPP ist eine externe Integration: eine Community-Integration, die als Docker-Container verpackt und auf GitHub veröffentlicht wird. Gladys installiert sie mit einem Klick und führt sie in einer vom Kern isolierten Sandbox aus. Sie wird von guim31 veröffentlicht und gepflegt, nicht vom Gladys-Kernteam.

Abonniere den Newsletter von Gladys Assistant

Ein paar E-Mails im Monat zu neuen Releases und Neuigkeiten aus dem Projekt. Verschickt von Pierre-Gilles Leymarie, dem Gründer des Projekts. Jederzeit abbestellbar 🙂