FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: hexenmeister am 11 November 2014, 21:08:46

Titel: Ein einfaches Command-Interface mit Jabber
Beitrag von: hexenmeister am 11 November 2014, 21:08:46
Da ich gestern schon angefangen habe, mein alte Codeschnipsel aus den Tiefen von alten Threads auszugraben, mache ich heute damit gleich weiter ;)



Mit Hilfe von Jabber-Modul für FHEM (http://forum.fhem.de/index.php/topic,18967.0.html) 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 :)

Und bevor jemand nach WIKI ruft... ;)
http://www.fhemwiki.de/wiki/FHEM_spricht_jabber

und auch noch http://www.s6z.de/cms/index.php/homeautomation/fhem/60-ein-einfaches-command-interface-mit-jabber
(tut mir leid wegen dieser Crossposting  ;D )
Titel: Antw:Ein einfaches Command-Interface mit Jabber
Beitrag von: Ralf W. am 22 Dezember 2014, 18:58:57
Hallo,

nach
define jabber Jabber jabber.de 5222 mein_user mein_kennwort 1 0
wird nach einigen Sekunden FHEM beendet
There was an error in the last call to Process that you did not check for and
handle.  You should always check the output of the Process call.  If it was
undef then there was a fatal error that you need to check.  There is an error
in your program at ./FHEM/70_Jabber.pm line 287


Die Module Net::Jabber, Net::XMPP, Authen::SASL, XML::Stream und Net::SSLeay sind installiert. Keine Einträge im Log. Auch nicht mit verbose 5. Wo hakt es hier?

MfG

Titel: Antw:Ein einfaches Command-Interface mit Jabber
Beitrag von: hexenmeister am 22 Dezember 2014, 20:00:10
Hallo Ralf,

in diesem Thread findet Deine Frage womöglich nicht den richtigen Empfänger. Frage am besten noch mal in dem Thread von dem Entwicklr des Jabber-Moduls:
http://forum.fhem.de/index.php/topic,18967.0.html

Ich selbst kenne mich in dem Modul leider nicht aus.

Grüße,

Alexander
Titel: Antw:Ein einfaches Command-Interface mit Jabber
Beitrag von: Ralf W. am 22 Dezember 2014, 20:04:38
Danke für den Hinweis. Den Thread hatte ich bei meiner Suche nicht gefunden. Gerade mal reingesehen. Mein Problem wird dort behandelt. Mal einlesen ...

MfG