Mit Hilfe von Jabber-Modul für FHEM kann man nicht nur von FHEM Nachrichten auf sein Handy senden lassen, sondern auch die Gegenrichtung benutzen, um Befehle und Anweisungen an den Server zu schicken.
So habe ich das realisiert...
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: <fhem_user> und <my_user>):
# Definition Jabber-Account fuer FHEM
define jabber Jabber jabber.de 5222 <fhem_user> <passwort> 1 0 attr jabber OnlineStatus available attr jabber PollTimer 2
# Nachrichten nur von einem bestimmten Account akzeptieren attr jabber RecvWhitelist <my_user>@jabber.de
# Account-Nickname attr jabber ResourceName FHEM
# Eine Methode beim Nachrichtenempfang aufrufen define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}
# Taegliche Statusmeldung verschicken define jabberstatus at *05:10:00 {sendMeStatusMsg();;}
Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):
###################################################### # Meldung per Jabber senden ###################################################### sub sendJabberMessage($$) { my($rcp, $msg) = @_; fhem("set jabber msg $rcp $msg"); }
###################################################### # Meldung an mich per Jabber senden ###################################################### sub sendMeJabberMessage($) { my($msg) = @_; sendJabberMessage('<my_user>@jabber.de', $msg); }
###################################################### # Statusdaten an mein Handy per Jabber senden ###################################################### sub sendMeStatusMsg() {
# Hier ist der Text fuer die Statusmeldung. Z.B. Werte von Sensoren. my $msg = "Status: Umwelt"; $msg=$msg."\n Vorgarten: "; $msg=$msg."T: ".ReadingsVal("Sensor1", "temperature", "---")." C"; $msg=$msg."\n Garten: "; $msg=$msg."T: ".ReadingsVal("Sensor2", "temperature", "---")." C,"; $msg=$msg." H: ".ReadingsVal("Sensor2", "humidity", "---")." %,"; $msg=$msg." Bat: ".ReadingsVal("Sensor2", "battery", "---")." V"; sendMeJabberMessage($msg); }
###################################################### # Kleines Jabber-Cmd-Interface ###################################################### sub sendJabberAnswer() { my $lastsender=ReadingsVal("jabber","LastSenderJID","0"); my $lastmsg=ReadingsVal("jabber","LastMessage","0"); my @cmd_list = split(/\s+/, trim($lastmsg)); my $cmd = lc($cmd_list[0]); # erstes Element entfernen shift(@cmd_list); my $newmsg;
# Hier den Status ausgeben: Z.B. Anwesenheit, Fenster, Telefonanrufe, Tuerklingel oder Briefkasten... if($cmd eq "status") { $newmsg.= "Status: (noch) nicht implementiert"; }
# Ausssentemperatur etc. melden if($cmd eq "umwelt") { $newmsg.= "Umwelt"; $newmsg.="\n Vorgarten: "; $newmsg.="T: ".ReadingsVal("Sensor3", "temperature", "---")." C, "; $newmsg.="B: ".ReadingsVal("Sensor3", "brightness", "---").", "; $newmsg.="Bat: ".ReadingsVal("Sensor3", "battery", "---")." "; $newmsg.="\n Garten: "; $newmsg.="T: ".ReadingsVal("Sensor2", "temperature", "---")." C,"; $newmsg.=" H: ".ReadingsVal("Sensor2", "humidity", "---")." %,"; $newmsg.=" Bat: ".ReadingsVal("Sensor2", "battery", "---")." V"; }
# Systemueberwachung durch SYSMON if($cmd eq "system") { $newmsg.= "CPU Temp: ".ReadingsVal("sysmon", "cpu_temp_avg", "---")." C\n"; $newmsg.= "loadavg: ".ReadingsVal("sysmon", "loadavg", "---")."\n"; $newmsg.= "Auslastung: ".ReadingsVal("sysmon", "stat_cpu_text", "---")."\n"; $newmsg.= "RAM: ".ReadingsVal("sysmon", "ram", "---")."\n"; $newmsg.= "Uptime: ".ReadingsVal("sysmon", "uptime_text", "---")."\n"; $newmsg.= "Idle: ".ReadingsVal("sysmon", "idletime_text", "---")."\n"; $newmsg.= "FHEM uptime: ".ReadingsVal("sysmon", "fhemuptime_text", "---")."\n"; $newmsg.= "FS Root: ".ReadingsVal("sysmon", "fs_root", "---")."\n"; $newmsg.= "FS USB: ".ReadingsVal("sysmon", "fs_usb1", "---")."\n"; $newmsg.= "Updates: ".ReadingsVal("sysmon", "sys_updates", "---")."\n"; } # ggf. weitere Befehle
# kleine Hilfe zu den verfuegbaren Anweisungen if($cmd eq "help" || $cmd eq "hilfe" || $cmd eq "?") { $newmsg.= "Befehle: Help (Hilfe), Status, System, Umwelt"; }
# FHEM-Anweisungen ausfuehren (als ob diese auf der Console eingegben wurden) if($cmd eq "fhem") { my $cmd_tail = join(" ",@cmd_list); $newmsg.=fhem($cmd_tail); }
# Perl-Befehle ausfuehren if($cmd eq "perl") { my $cmd_tail = join(" ",@cmd_list); $newmsg.=eval($cmd_tail); }
# Sprachmeldung ausgeben (ueber TTS Modul)
if($cmd eq "say" || $cmd eq "sprich") {
my $cmd_tail = join(" ",@cmd_list);
speak($cmd_tail,0);
$newmsg.="ok";
} if(defined($newmsg)) { fhem("set jabber msg ". $lastsender . " ".$newmsg); } else { fhem("set jabber msg ". $lastsender . " Unbekanter Befehl: ".$lastmsg); } }
Was das ganze tut:
- Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren senden
- Mehrere Befehle per Jabber-Chat akzeptieren und beantworten:
-- System: ausgewählte System Informationen
-- Umwelt: Wetterdaten
-- perl <perl_cmd>: Perl-Befehle ausführen
-- fhem <fhem_cmd>: FHEM-Commandos ausführen.
-- Sprachmeldungen ausgeben
Und es gibt noch jede Menge Platz für Erweiterungen ;)
Kommentare (2)
Hi Olaf,
die Idee ist nicht vom mir, daher reiche ich die Blumen weiter ;)
Zu der Meldung kann ich so nichts sagen, evtl. passen Versionen von den verwendeten Perl-Bibliotheken nicht zusammen.
Am besten, Du fragst direkt den Entwickler. Er liest regelmäsig im FHEM-Forum mit: http://forum.fhem.de/index.php/topic,18967.0.html
jabber Message is empty after OTR decrypt.
Soll das so sein?