Autor Thema: Nachrichten von FHEM zu Matrix Synapse senden  (Gelesen 214 mal)

Offline DecaTec

  • Full Member
  • ***
  • Beiträge: 103
    • DecaTec
Nachrichten von FHEM zu Matrix Synapse senden
« am: 03 Mai 2021, 12:42:21 »
Hi,

vielleicht kennt jemand ja schon Matrix als Chat-System. Dies arbeitet dezentral mittels "Federation". D.h. jeder kann einen Server betreiben oder sich auf einem beliebigen Server anmelden und dann nicht nur mit Usern dieses Servers chatten, sondern auch mit Usern, die ihre Accounts auf anderen Servern haben.
Als kleiner Tipp: CoolTux hat hier schon mal einen Server aufgesetzt und hier tummeln sich bereits einige "FHEMler".

Ich betreibe nun seit einiger Zeit meinen eigenen Server und wollte nun mal eine Verbindung mit FHEM herstellen. Bisher habe ich dazu immer Telegram (mit dem dazugehörigen FHEM-Modul) genutzt, aber eigentlich ist Telegram ja aus Sicht von Privatsphäre und Datenschutz (meiner Meinung nach) eher bedenklich. Dazu wollte ich mal sehen, was mit Matrix so geht.

Ziel war es zunächst einmal nur, eine Nachricht aus FHEM heraus an einen Matrix-Raum zu schicken. Das ganze funktioniert mit der API von Matrix, die durch ein Stückchen Perl-Code angesprochen wird.

Voraussetzungen:
Zunächst braucht ihr natürlich einen Matrix-Account (entweder bei Matrix.org selbst, oder auf einem beliebigen anderen Server). Als Domain habe ich hier beispielhaft "matrix.meinedomain.de" verwendet.
Zusätzlich einen zweiten Account exklusiv für FHEM (optional, aber sicher empfehlenswert).
Die Authentifizierung geschieht hier mittels Token. Dieses Token (vom Matrix-FHEM-Account) bekommt ihr direkt im Client (Browser, Desktop, etc.) unter "Alle Einstellungen" > "Hilfe und Über" > ganz runter scrollen und hier auf "Zugangstoken" klicken. Diesen langen String schon mal kopieren. Siehe erstes Bild im Anhang.

Anschließend erstellt ihr euch einen Raum mit eurem persönlichen User und ladet den Matrix-FHEM-User in diesen Raum ein. Von diesem Raum braucht ihr noch die Raum-ID (Raumeinstellungen > "Erweitert" > "Interne Raum-ID". In diesem Beispiel "!abcxyz:matrix.meinedomain.de". Siehe zweites Bild im Anhang.

Bitte denkt daran, diesen Raum möglichst privat zu halten, also z.B. nicht öffentlich verfügbar zu machen (besser ist das).

Dann kommt ein bisschen Code (ich habe das in meiner 99_myUtils.pm als Funktion eingefügt). Bitte "token-hier-einfügen" und Domain bzw. Raum-ID anpassen (das "!" ist hier URL-encoded):
######################################################
# Sendet eine Matrix Message
# Aufruf: "{SendMatrixMessage($txt)}"
# Parameter: $txt: Die zu sendende Meldung
######################################################
sub SendMatrixMessage($)
 {   
    my ($txt) = @_;
    my $token = "token-hier-einfügen";
    my $url = "https://matrix.meinedomain.de/_matrix/client/r0/rooms/%21abcxyz:matrix.meinedomain.de/send/m.room.message?access_token=" . $token;
    my $msg = '{"msgtype":"m.text", "body":"' . $txt . '"}';
    my $header = "Content-Type: application/json; charset=UTF-8";

my $param = {
url => $url,
method => "POST",
header => $header,
data => $msg,
noshutdown => 0,
callback => sub($$$)
{
my ($param, $err, $data) = @_;
Log(1, 'SendMatrixMessage ' . ($err ne '' ? 'Error: Could not send message: ' . $err : (index($data, "event_id") == -1 ? 'Error: Could not send message: ' . $data : 'successfully')));
},
    };

    HttpUtils_NonblockingGet($param);
    return 0;
 }
# End SendMatrixMessage

Aufgerufen wird das ganze nun z.B. über die FHEM-Eingabemaske (kann dann aber auch in Notifies, o.ä. genutzt werden):
{SendMatrixMessage("test")}
Nun sollte im entsprechenden Raum eine Meldung ankommen.

Einschränkung ist hier, dass die Meldungen unverschlüsselt versendet werden (auch wenn der Raum eigentlich mit Verschlüsselung arbeitet). Mit der Verschlüsselung sind hier wohl noch ein paar mehr Schritte notwendig, wo ich noch nicht ganz durchgestiegen bin.

Ja, ich weiß: Die Sache ist äußerst "hemdsärmelig". Trotzdem könnte das Code-Schnipsel vielleicht auch für andere interessant sein.
Fragen oder Anmerkungen? Immer her damit!  ;)

Edit: Umgebaut auf "HttpUtils_NonblockingGet", ansonsten war der HTTP-Request blocking. Danke an CoolTux für den Hinweis.
« Letzte Änderung: 03 Mai 2021, 14:34:12 von DecaTec »
Gefällt mir Gefällt mir x 3 Informativ Informativ x 1 Liste anzeigen

Offline BOFH

  • Full Member
  • ***
  • Beiträge: 108
Antw:Nachrichten von FHEM zu Matrix Synapse senden
« Antwort #1 am: 03 Mai 2021, 13:58:08 »
Zitat
Die Authentifizierung geschieht hier mittels Token. Dieses Token (vom Matrix-FHEM-Account) bekommt ihr direkt im Client (Browser, Desktop, etc.) unter "Alle Einstellungen" > "Hilfe und Über" > ganz runter scrollen und hier auf "Zugangstoken" klicken.

Ich finde das leider unter iOS nicht. „Hilfe und über“ sehe ich nicht.
Nutze Element als client

Danke für info

P.s. Tolle idee
RasPi 4
ZWave.me ZME_UZB (Fibaro Auge Gen.2)/ HM-USB2 (Thermostat | Hutschienen Relais | 1-/2fach Schalter) / Enigma2 / PhilipsTV / Philips HUE (GO|Bulb|Stripe (plus)) / Somfy IO Rollos / BOSCH HSG636XS6 / SONOS (P1, P3, P5 2.Gen, SUB, Bar)

Offline DecaTec

  • Full Member
  • ***
  • Beiträge: 103
    • DecaTec
Antw:Nachrichten von FHEM zu Matrix Synapse senden
« Antwort #2 am: 03 Mai 2021, 14:04:09 »
Ich finde das leider unter iOS nicht. „Hilfe und über“ sehe ich nicht.

Stimmt, da scheint es das nicht zu geben. Hier einfach einmal per Element/Web einloggen (entweder über den offiziellen Client, oder eine beliebige anderen Element/Web-Instanz).

Ansonsten tut es auch so etwas:
curl -XPOST -d '{"type":"m.login.password", "user":"USER", "password":"PASSWORT"}' "https://matrix.meinedomain.de/_matrix/client/r0/login"Das spuckt dir dann auch das Token aus.
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 26785
Antw:Nachrichten von FHEM zu Matrix Synapse senden
« Antwort #3 am: 03 Mai 2021, 14:16:01 »
Schau mal bitte ob der Code geht.
Dann sparst die "HandleMatrixResponse" Funktion

my $param = {
        url => $url,
        method => "POST",
        header => $header,
        data => $msg,
        noshutdown => 0,
        callback => \&sub() { my (undef, $err, $data) = @_; Log(1, 'SendMatrixMessage  ' . ($err ne '' ? 'Error: Could not send message: ' . $err : (index($data, "event_id") == -1 ? 'Error: Could not send message: ' . $data : 'successfully') ); },
    };
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://paypal.me/pools/c/8gULisr9BT
My FHEM Git: https://git.cooltux.net/FHEM/
Mein Dokuwiki:
https://www.cooltux.net

Offline DecaTec

  • Full Member
  • ***
  • Beiträge: 103
    • DecaTec
Antw:Nachrichten von FHEM zu Matrix Synapse senden
« Antwort #4 am: 03 Mai 2021, 14:19:24 »
Ja, das ginge sicher auch, aber wie sieht das denn aus?  :P

Da hab ich dann lieber eine Callback-Funktion.
Sorry, bin kein Fan von solchen Inline-Definitionen.

Edit: Wenn man es ein wenig formatiert, dann isses kein One-Liner mehr und etwas übersichtlicher. Änderungsvorschlag akzeptiert.  ;)
« Letzte Änderung: 03 Mai 2021, 14:35:03 von DecaTec »
Informativ Informativ x 1 Liste anzeigen

 

decade-submarginal