Neues Modul: 70_Jabber.pm

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

Vorheriges Thema - Nächstes Thema

hexenmeister

Moin,

gerne kann aich meine Konfiguration und die Perl-Methoden (habe ich in 99_myUtils.pm abgelegt) hier posten. Allerdings erst heute abend, wenn ich wieder zuhause bin.

Grüße,

Alexander
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

So, meine Jabber-Definitionen:

in fhem.cfg

define jabber Jabber jabber.de 5222 <fhem_user> <pass> 1 0
attr jabber OnlineStatus available
attr jabber PollTimer 2
attr jabber RecvWhitelist <my_user>@jabber.de
attr jabber ResourceName FHEM

define Jabber_Notify notify jabber:Message.* {sendJabberAnswer();;}

define jabberstatus at *05:10:00 {sendMeStatusMsg();;}


und 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()
{
my $msg = "Status: Umwelt";
$msg=$msg."\n  Vorgarten: ";
$msg=$msg."T: ".ReadingsVal("UM_VH_OWTS01.Luft", "temperature", "---")." C";
$msg=$msg."\n  Garten: ";
$msg=$msg."T: ".ReadingsVal("GSD_1.4", "temperature", "---")." C,";
$msg=$msg." H: ".ReadingsVal("GSD_1.4", "humidity", "---")." %,"; 
$msg=$msg." Bat: ".ReadingsVal("GSD_1.4", "power_main", "---")." 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;
  if($cmd eq "status") {
  $newmsg.= "Status: (noch) nicht implementiert";
  }
 
  if($cmd eq "umwelt") {
    $newmsg.= "Umwelt";
    $newmsg.="\n  Vorgarten: ";
    $newmsg.="T: ".ReadingsVal("UM_VH_OWTS01.Luft", "temperature", "---")." C, ";
    $newmsg.="B: ".ReadingsVal("UM_VH_HMBL01.Eingang", "brightness", "---").", ";
    $newmsg.="Bat: ".ReadingsVal("UM_VH_HMBL01.Eingang", "battery", "---")." ";
    $newmsg.="\n  Garten: ";
    $newmsg.="T: ".ReadingsVal("GSD_1.4", "temperature", "---")." C,";
    $newmsg.=" H: ".ReadingsVal("GSD_1.4", "humidity", "---")." %,"; 
    $newmsg.=" Bat: ".ReadingsVal("GSD_1.4", "power_main", "---")." V";
  }

  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
 
  if($cmd eq "help" || $cmd eq "hilfe" || $cmd eq "?") {
  $newmsg.= "Befehle: Help (Hilfe), Status, System, Umwelt";
  }
 
  if($cmd eq "fhem") {
    my $cmd_tail = join(" ",@cmd_list);
    $newmsg.=fhem($cmd_tail);
  }
 
  if($cmd eq "perl") {
    my $cmd_tail = join(" ",@cmd_list);
    $newmsg.=eval($cmd_tail);
  } 
 
  if(defined($newmsg)) {
    fhem("set jabber msg ". $lastsender . " ".$newmsg);
  } else {
  fhem("set jabber msg ". $lastsender . " Unbekanter Befehl: ".$lastmsg);
  }
}


Es werden zwei Jabber-Accounts benötigt: <fhem_user> und <my_user>
Das ist ein Beispiel und wird nicht ohne Änderungen laufen, passt es ggf. selbt an!

Was das ganze tut:
- Jeden Morgen mir die Wetterdaten von 2 meiner Sensoren zu 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.
etc.

Grüße,

Alexander
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

martinschm

Hi Alex, sehr cool. Eine super Grundlage die man für sich anpassen kann.
Ciao
Martin

BioS

Hi Marinschm,


Zitat von: martinschm am 03 April 2014, 11:41:05
Wie ist die genaue Syntax, wenn ich die Whitelist auf ein oder zwei Accounts einschränken will?
Kommt statt dem * einfach nur der erlaubte Useraccount und wie notiere ich dann den zweiten Account?

Die Whitelist ist wird per Regular Expression ausgewertet, d.h. wenn du nur einen useraccount benutzen willst,
kannst du direkt den jabber Account in dieses Attribut setzen: user@jabberserver.de

Wenn du mehrere Accounts zulassen willst musst du dich an die regex syntax halten: (user1@jabberserver.de|user2@jabberserver.de)

Wenn man es ganz genau machen will muss man den Punkt mit einem Backslash escapen: (user1@jabberserver\.de|user2@jabberserver\.de)

Ich hoffe das hilft weiter.

@hexenmeister: Das ist wirklich sehr cool! Werde ich bei meiner Installation auch mal testen ;)

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

martinschm

Hi,

habs gerade eingebunden und auch gleich meinen ersten eigenen Befehl definiert. Sehr cool.
Danke euch allen.

ciao
Martin

swifty

sehr geil ;-)

ich versuche gerade mein Android, auf dem ich eine App für einen Bewässerungscomputer für meinen Strebergarten schreibe, mit FHEM zu verheiraten. Da gibt es zwei möglichchkeiten, per WBS und/oder http request und OpenVPN (wackelig) oder halt per Google cloud (so ähnlich wie es andFHEM macht).

Für eine Bidirektionale Schnittstelle wäre aber XMPP nötig, was ja Jabber ja ist.
Ich hab mich noch nicht so richtig reingefuchst, aber wäre das Jabber modul in fhem dazu in der Lage?

gruß
swifty

BioS

Zitat von: swifty am 08 April 2014, 19:35:40
sehr geil ;-)

ich versuche gerade mein Android, auf dem ich eine App für einen Bewässerungscomputer für meinen Strebergarten schreibe, mit FHEM zu verheiraten. Da gibt es zwei möglichchkeiten, per WBS und/oder http request und OpenVPN (wackelig) oder halt per Google cloud (so ähnlich wie es andFHEM macht).

Für eine Bidirektionale Schnittstelle wäre aber XMPP nötig, was ja Jabber ja ist.
Ich hab mich noch nicht so richtig reingefuchst, aber wäre das Jabber modul in fhem dazu in der Lage?

gruß
swifty

Bestimmt, mit der ein oder anderen Anpassung.

Ich könnte vielleicht mein Modul zusätzlich als eine Art input Modul funktionieren lassen, dass quasi über xmpp andere module miteinander sprechen können, so als eine art transport layer wie das CUL modul :)

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

swifty

yepp.

das wäre super. Wenn die Android app mal ohne FHEM funzt kann ich hoffentlich mithelfen.

Jan

martinschm

Hi
Ihr müsstet doch eigentlich nur den Code von Hexenmeister nehmen und anpassen. Bei gewissen "Befehlen" in der Jabber Nachrichten löst du dann die für die Bewässerung notwendigen Anweisungen aus. Jabber ist dann nichts anderes als ein Schalter.

BioS

Hi,

so wie ich das verstanden habe will er über eine Android App per XMPP FHEM steuern.
Das würde schon gehen wenn man das über notifys macht, aber wenn's bidirektional werden soll (und in einer Ausbaustufe mal ähnlich wie andFHEM werden soll) wäre es sauberer mann würde das über ein eigenständiges Modul machen.

@swifty: oder hab ich dich falsch verstanden und du willst wirklich nur per Jabber einen Befehl an FHEM senden der dann ein reply gibt?
Dann wäre es tatsächlich einfacher du würdest das über ein notify define machen.

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

swifty

ich denke schon, ev geht es natürlich auch irgendwie auch anders.
Die idee wäre dass die APP letztendlich notifys auslösen kann und bestimmte dummy defines an die App übertragen werden. So können Statusinfos geholt werden und Befehle abgesetzt.

Die Synchronisierung läuft über die Google cloud. Das Timing und asynchrone übertragen managed alles die Cloud, die App kann dadurch sehr einfach Daten empfangen und senden. Dafür wird es halt in FHEM schwieriger.

Beschrieben ist es hier: http://developer.android.com/google/gcm/ccs.html

BioS

Ich hab mir das mal angeschaut, leider bin ich kein Android developer, bzw hab da einfach zu wenig Zeit dazu mich da tiefer reinzugraben :(

Aber das wird wohl mit dem Modul in der jetzigen Form nicht möglich sein, da der GCS ack's erwartet und das ganze über Roh-XMPP läuft. Also ohne die ganzen Subscribe und chat Funktionen.

Das schreit förmlich nach einer Implementation wie ein CUL Connectionmodul.
Ein Modul das die Verbindung aufbaut und sich um die messageID's kümmert, und jeweils ein Modul mit der "Funktionalität" die man haben will passend zu einer deviceID.

Sowas hab ich in z.Zt in mache wegen meinen XBee's. Auf dem könnte ich Logiktechnisch aufsetzen.

Also wenn du irgendwann mal Zeit hast melde dich, da können wir mal zusammen ein wenig basteln ;)

Grüße,
bioS


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

swifty


Gerhard

Hallo BioS,

ich schliesse mich Predictor an, wie kann man dein Modul auf der FB 7390 oder vll alle FBs benutzen?, was muss man installieren oder einstellen? (ist ssl auf der FB ein Problem?).

Danke, Gerhard
FB6890LTE, cubietruck, orangePi, raspberry 2/3/4, HM/HMIP, shelly > 50, etc.

BioS

Zitat von: Gerhard am 10 April 2014, 09:41:42
Hallo BioS,

ich schliesse mich Predictor an, wie kann man dein Modul auf der FB 7390 oder vll alle FBs benutzen?, was muss man installieren oder einstellen? (ist ssl auf der FB ein Problem?).

Danke, Gerhard

Hallo Gerhard,

schade dass sich Predictor nicht mehr gemeldet hat zu dem Thema, da er ja eigentlich der Anstoß zu dem ganzen Modul war.

Ich selbst habe keine Fritzbox, deshalb kann ich deine Fragen auch nicht beantworten.
Aber ich hab mich mal durchs Forum und Google bequemt auf der Suche nach Antworten, da sieht es allerdings nicht allzu rosig aus.

Anscheinend wird von AVM nur ein kleiner Standartsatz an perl Modulen für das FHEM image angeboten, die meinem Modul allerdings nicht sehr viel bringen.

Ich habe nichts gefunden ob und wie man perl Module auf einer FRITZ!Box einfach nachinstallieren kann.

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