Nachrichten von FHEM zu Matrix Synapse senden

Begonnen von DecaTec, 03 Mai 2021, 12:42:21

Vorheriges Thema - Nächstes Thema

DecaTec

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.

BOFH

ZitatDie 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)

DecaTec

Zitat von: BOFH am 03 Mai 2021, 13:58:08
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.

CoolTux

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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DecaTec

#4
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.  ;)

Carsten K.

Gibt es auch einen Weg, um matrix-Nachrichten in FHEM zu empfangen/verarbeiten?
NUC FHEM on Debian, CC1101-USB-Lite 868MHz;
HM_HM_CC_RT_DN, HM-LC-SW1-PL2, HM_HM_TC_IT_WM_W_EU, HM-SEC-SC-2, HM-ES-TX-WM
FRITZ!DECT 200
Philips TV (Android), VuDuo2, VU Ultimo4k

DecaTec

Zitat von: Carsten K. am 08 Oktober 2023, 17:57:17Gibt es auch einen Weg, um matrix-Nachrichten in FHEM zu empfangen/verarbeiten?

Das wäre technisch sicherlich auch möglich, aber dazu müsste man wohl ein komplettes Modul basteln (wie es dies z.B. für Telegram gibt), dann könnte man sicherlich die Kommunikation in "beide Richtungen" abbilden.

Das Code-Snippet von oben ist aber wirklich nur dazu da, um schnell eine Nachricht FHEM -> Matrix zu senden.

CoolTux

Es gibt da ein inoffiziell Modul von jemandem aus dem Forum.
Ich hatte daran auch noch etwas gearbeitet und die Änderungen dem jenigen zukommen lassen. Das Modul mit meinen Änderungen verrichtet hier seine Arbeit. Und ich glaube es kann sogar Nachrichten empfangen. Nutze ich nur nicht.
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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Carsten K.

Vielen Dank für Eure Antworten...
Ich hatte gehofft, hier kurzfristig eine Alternative zu Signal zu finden, da die Signal-Installation (zumindest bei mir) nicht immer reibungslos läuft.
Ich kann mir die erforderlichen Schritte für eine Matrix-Integration grob vorstellen und halte den benötigten Zeitaufwand (Bauchgefühl) für recht hoch.

Schönen Tag noch  :)
NUC FHEM on Debian, CC1101-USB-Lite 868MHz;
HM_HM_CC_RT_DN, HM-LC-SW1-PL2, HM_HM_TC_IT_WM_W_EU, HM-SEC-SC-2, HM-ES-TX-WM
FRITZ!DECT 200
Philips TV (Android), VuDuo2, VU Ultimo4k