FHEM spricht jabber: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
K (Aufgehübscht und ein paar Links ergänzt)
Zeile 1: Zeile 1:
'''Ein einfaches Command-Interface mit Jabber'''
==Ein einfaches Command-Interface mit Jabber==
<br>
 
<br>
Mit Hilfe des [[Jabber|Jabber-Moduls 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.


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.
<br>
<br>


So habe ich das realisiert...
So habe ich das realisiert...
<br>
<br>


Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf jabber.de benötigt: <fhem_user> und <my_user>):
 
<pre>
Zunächst die Definitionen im fhem.cfg (es werden zwei Accounts auf [https://www.jabber.de/ jabber.de] benötigt: <fhem_user> und <my_user>):
<source lang="perl">
# Definition Jabber-Account fuer FHEM
# Definition Jabber-Account fuer FHEM
define jabber Jabber jabber.de 5222 <fhem_user> <passwort> 1 0
define jabber Jabber jabber.de 5222 <fhem_user> <passwort> 1 0
Zeile 27: Zeile 23:
# Taegliche Statusmeldung verschicken
# Taegliche Statusmeldung verschicken
define jabberstatus at *05:10:00 {sendMeStatusMsg();;}
define jabberstatus at *05:10:00 {sendMeStatusMsg();;}
</pre>
</source>
<br>


Und dann die Perl-Funktionen (irgendwo in inem Modul, z.B. in 99_myUtils.pm):
 
<pre>
Und dann die Perl-Funktionen (irgendwo in einem Modul, z.B. in 99_myUtils.pm):
<source lang="perl">
######################################################
######################################################
# Meldung per Jabber senden
# Meldung per Jabber senden
Zeile 147: Zeile 143:
   }
   }
}
}
</pre>
</source>
   
   


Zeile 158: Zeile 154:
** fhem <fhem_cmd>: FHEM-Commandos ausführen.
** fhem <fhem_cmd>: FHEM-Commandos ausführen.
** Sprachmeldungen ausgeben
** Sprachmeldungen ausgeben
<br>
 
 


Und es gibt noch jede Menge Platz für Erweiterungen ;)
Und es gibt noch jede Menge Platz für Erweiterungen ;)


== Links ==
== Links ==
[http://www.s6z.de/cms/index.php/homeautomation/fhem/60-ein-einfaches-command-interface-mit-jabber Blog(de)]
*http://www.s6z.de/cms/index.php/homeautomation/fhem/60-ein-einfaches-command-interface-mit-jabber


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]][[Kategorie:HOWTOS]]

Version vom 11. Januar 2017, 11:43 Uhr

Ein einfaches Command-Interface mit Jabber

Mit Hilfe des Jabber-Moduls 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 einem 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 ;)

Links