Neues Modul: 70_Jabber.pm

Begonnen von BioS, 18 Januar 2014, 11:51:20

Vorheriges Thema - Nächstes Thema

BioS

Hi Gemeinde,

kürzlich, so vor ca. einem halben Jahr, hat mich mein Kollege und FHEM'ler Predictor auf die Idee gebracht ein Jabber bzw. XMPP Modul für FHEM zu entwickeln, also hab ich die letzten eineinhalb Tage meines Urlaubs geopfert ;)

Grund ist dass wir im Jabber recht aktiv sind und es ganz nett ist wenn FHEM an unsre Chat-Accounts Infos schreiben kann - ähnlich wie z.B. mit Pushover.

Per Jabber hat man allerdings nicht nur einen Vorwärts-, sondern auch einen Rückwärtskanal - d.h. ich kann FHEM eine Message schicken und FHEM kann das als notify empfangen und reagieren.


Ihr braucht 2 Jabber Accounts um das zu testen, einen für euch, einen für FHEM.
Wer nicht bei einem offiziellen Jabber Server (siehe jabber.org) suchen möchte darf mir gerne eine PM schreiben, ich hab noch ein paar Testaccounts auf einem privaten Server.

Benötigt wird das perl Modul Net::Jabber damit es funktioniert. Wie man das auf einer FritzBox installiert oder ob das vielleicht schon drauf ist weis ich leider nicht. Da könnte ich die Infos von ein paar Fritz'lern gut gebrauchen.


Ansonsten hier eine kurze Beschreibung:

Define:
define <name> Jabber <server> <port> <username> <password> <tls> <ssl>

Beispiel:
define JabberClient1 Jabber jabber.org 5222 myusername mypassword 1 0

Damit verbindet sich FHEM schon mit dem Server und setzt sich selbst online.

dann kann man dem User schon Nachrichten schicken und diese sollten im Event-Monitor mit auftauchen.

Selbst kann man Nachrichten, geklaut von Pushover, in dieser Form senden:
set JabberClient1 msg user@jabber.org meine Nachricht ohne Anführungszeichen

Über Notify's kann man auf eingehende Nachrichten reagieren.
Weitere Infos über die Attribs und ein Notify Beispiel stehen im Modul als englische Doku zur Verfügung.

Ich stelle euch das Modul hier jetzt mal zum Testen und Spielen zur Verfügung - Ideen, Vorschläge, Verbesserungsvorschläge natürlich erwünscht!
Viel Spaß damit ;)

Update 2014-04-10:
ich hab die File, die im Forum angehängt war gelöscht.
Das Modul lebt ab jetzt im SVN weiter und kommt mit den FHEM Updates entsprechend ;)


Grüße,
BioS
FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

Predictor

Dauerte etwas, aber hab den Post entdeckt.
Da ich leider gerade etwas unter Wasser bin (wie schon im Multimedia Bereich offenbart) konnte ich bisher nicht schauen wie ich Module auf eine Fritz bekomme.

Ich denke ein kurzer Post im Dev Bereich bringt da viele Antworten.

Ansonsten schon mal THX für die Mühe
FHEM auf Fritz!Box 7390
FS20 per CUL

mrmarbury

Hey,

sehr feines Plugin. Leider schmiert fhem immer ab, wenn ich tls durch eine 1 ersetze.
Aktueller workaround: ich habe einen, nicht von außen erreichbaren, unverschlüsselten Port auf dem jabber server angelegt. Nun verbindet er sich und sendet Nachrichten.

Aber auf gesendete Nachrichten antwortet das plugin nicht. Auch nicht mit whitelist auf '.*' gesetzt.
Ich würde gerne z.B. Werte abfragen, z.B. würde ich gerne eine Nachricht ala "set HeizungWz getConfig" absetzen und er soll mir die gesamte config per jabber senden. Geht sowas?
Wenn ja, wie?

Generell aber mal fetten Dank für das Plugin!! So gehen Notifications auch ohne google als man in the middle ;)

Cheers,
Stefan

BioS

#3
Hi Stefan,

freut mich, dass das Plugin nicht umsonst war :)

zu deinem TLS Problem: Was für einen Jabber Server hast du? Ich benutze bei mir ejabberd und da geht die TLS funktion ohne Probleme.
Vielleicht kannst du mir per PM die Fehlermeldung schicken, wenn das Plugin bei dir abstürzt. Ist bestimmt nur eine SSL/TLS Sache.

Zu deiner anderen Frage mit dem Antworten:
Das Plugin schickt quasi Events die man per notify abfangen kann.
Wenn du ein notify wie folgt definierst, nimmt das Plugin deine Message als FHEM Kommando an und schickt dir den Output:
(Achtung, wenn du RecvWhitelist auf .* hast, kann jeder Jabber User dein FHEM steuern! ;) )

Wenn dein JabberClient "JabberClient" heißt:

define jabber_test_notify notify JabberClient:Message.* {
  my $lastsender=ReadingsVal("JabberClient","LastSenderJID","0");
  my $lastmsg=ReadingsVal("JabberClient","LastMessage","0");
  my $fhem_output=fhem(ReadingsVal("JabberClient","LastMessage","0"));
  fhem("set JabberClient msg ". $lastsender . " FHEM: ".$fhem_output) ;
}


Ich habs eben noch getestet, damit kann man dann alles mögliche machen:
list WohnzimmerLicht
set WohnzimmerLicht off
{ Value('WohnzimmerLicht') }


Wenn du denkst, dass die Nachrichten nicht ankommen kannst du das im Normalen Event Monitor prüfen, da sollte wie beim Licht schalten auch eine Zeile kommen in der deine Nachricht steht.


Have Phun :)
FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

mrmarbury

Hi,

cool, dass probiere ich heute oder morgen Abend mal aus.  Das mit der Whitelist ist mir klar.  Wollte nur verdeutlichen, dass es nicht daran liegt, dass meine regex falsch definiert ist ;)

Auf meinem Server läuft auch ejabberd. MIt self signed cert. Wenn ich mir die perl libraries aber so anschaue, dann sollten self signed certs eh automatisch akzeptiert werden. Ich muss wohl noch etwas rumspielen.
Aber da ejabberd und fhem auf dem gleichen BSD laufen, nur in unterschiedlichen jails, habe ich das routing so gebaut, dass nur fhem  über den nicht verschlüsselten port gehen kann. In sofern sollte es so auch erstmal passen.

Umsonst war es definitiv nicht. Da jabber mein Hauptkommunikationsmedium ist, ist eine Integration davon perfekt.

Cheers,
Stefan

BioS

Hi,

ich hab den Fehler mit SSL gefunden.
Im ejabberd gibt es 4 verschiedene Möglichkeiten SSL bzw. TLS zu aktivieren ;)

Du hast in deiner config vermutlich "tls" drin, ich arbeite mit "starttls", da die "tls" Option anscheinend im xmpp deprecated ist.
Nun ist wohl unter dem ejabberd tls == ssl und starttls == tls, sehr witzig..

Egal wie es nun geconft ist, ich habe das Modul im 1. Post aktualisiert, jetzt hat man hinten 2 Optionen, einmal <tls> und <ssl>

Du kannst dann ja mal probieren ob es besser geht wenn du die tls option auf 0 setzt und die ssl option auf 1
So sieht das neue define aus:
define <name> Jabber <server> <port> <username> <password> <tls> <ssl>

Grüße,
BioS
FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

mrmarbury

Hi,

ja, habe tls in der config. aber auch starttls. Ich supporte sowieso Beides - auf unterschiedlichen Ports. Es gibt doch tatsächlich Clients, die noch nie TLS gehört haben. Aber ich habe auch beide Ports ausprobiert. Ich werde aber bei nächster Gelegenheit mal Dein aktualisiertes Modul ausprobieren und berichten.

Der Server läuft schon seit Jahren und ist auch schon mehrfach umgezogen ( was mit ejabberd absolut keinen Spaß macht. Dafür ist er sehr stabil und läuft und läuft) und recht gut besucht.  Aber vll hilft es ja Abschätzungen für das Modul zu machen, wenn Du auch andere Configs gesehen hast? Ist aber recht Standard und übersichtlich.

Die Config, nur zur info und nicht relevante Teile durch Platzhalter ersetzt oder weggelassen (ja, auch der cert-path ;) ):



...

{listen,
[
  %%
  %% TLS
  %%
  {5222, ejabberd_c2s, [

                        {certfile, "/path/to/my/cert"}, starttls,
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536}
                       ]},

  %%
  %% Legacy SSL
  %%
  {5223, ejabberd_c2s, [

                        {access, c2s},
                        {shaper, c2s_shaper},
                        {certfile, "/path/to/cert"}, tls,
                        {max_stanza_size, 65536}
                       ]},

  %%
  %% MEH - Never route this to the outside world!
  %%
  {5224, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536}
                       ]},

... weitere ports, aber für Interconnectivity zu anderen Servern ...
]}


Cheers,
Stefan

martinschm

Hi BioS,

hört sich sehr interessant an.

Ich brauche dafür nicht zwangsläufig einen eigenen Jabber Server, oder?

Wie kann man gewährleisten, dass der FHEM Jabber-Account keinen Input von anderen annimmt?
Wenn der Useraccount nicht bekannt ist, hilft das etwas aber ein wirklicher Schutz ist es ja auch nicht.

ciao
Martin

BioS

Hi Martin,

Du brauchst nicht zwangsläufig einen eigenen jabber Server.
Es reicht wenn du einen Account bei irgendeinem free Anbieter erstellst.

Eine Liste mit free Anbietern findest du auf http://jabber.org

Das Plugin hat eine Option in der man einstellen kann von wem der FHEM Server Nachrichten akzeptiert.

D.h. dort kannst du deine jabber Adresse eintragen und dann kannst nur du deinem Server was schreiben :)

Soweit ich weis sind diese Adressen auch nicht fake-bar, da ein jabber Server immer nur mit seinen eigenen usern arbeitet und sich gegenüber anderen Servern authentifiziert im dns wie auch mit einem ssl Zertifikat.

Also nicht so wie bei EMails bei denen ein Server Mails von anderen Accounts weiterleiten kann..

Grüße,
BioS

Gesendet von meinem XT910 mit Tapatalk
FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

martinschm

Ok cool. Danke für die schnelle Antwort.

BioS

Kein ding :)
Denk nur dran dass du 2 Accounts brauchst - einen für dich und einen für deinen FHEM Server.

Gesendet von meinem XT910 mit Tapatalk

FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

thermo

Hi,

das klingt nach einer   tollen Sache! So kann ich bequem mein fhem von auswärts bedienen, ohne mir mit dem webinterface am smartphone einen abzubrechen!
Senden klappt auf Anhieb schon einmal super. Wenn ich antworte kommt aber nichts im event an.

Sollte doch oder?

Gruß, George

BioS

Hi George,

deine Antwort sollte im Eventmonitor als auch in den readings erscheinen.
Versuche mal das Attribut " RecvWhitelist" auf    .*    zu setzen.

Grüße,
BioS

Gesendet von meinem XT910 mit Tapatalk

FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

thermo

das Problem liegt woanders,  das ganze hat genau einmal funktioniert. Jetzt kann ich auch nicht mehr senden. In pidgin erscheint der user auch als offline.
Wie kann man das debuggen?

Gruß

BioS

Ich habe in dem Modul noch einen Haufen debug zeilen drin, die müsstest du auskommentieren.

Fangen mit "Log 0," an. Du musst das # entfernen.

Gesendet von meinem XT910 mit Tapatalk

FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung