FHEM Batteriewarnung per eMail
Nach langem hin und her und dem Lesen von vielen unvollständigen und falschen Posts (manche User können noch nicht mal richtig Texte in Posts kopieren oder schreiben irgendwas aus dem Kopf) habe ich meine eMail Warnungen für Batterien jetzt fertig. Ach ja, an alle fhem Forum Poster die Variablen benutzen: wenn es denn keine global definierten Variablen sind muss IMMER ein ‘my’ davor! Wenn Du als User also irgenwo fhem Perl Code mit einer Funktion siehst und die Variablen haben kein my davor, dann wird der wahrscheinlich so nicht funktionieren.
Im Grunde ist es ganz einfach. Man darf halt nur nicht alles ungeprüft übernehmen. Antworten zu Hilferufen (von Anfängern) im FHEM Forum sollten auch nicht mit “Lern erst mal Perl” benatwortet werden. Zudem kommt, dass die Syntax der Anweisungen mal FHEM und mal Perl ist. Dann noch der Unterschied, ob man direkt in die fhem.cfg schreibt oder über die Web Oberfläche Kommandos absetzt oder DEF Eingaben vornimmt.
Lange Rede kurzer Sinn. Hier die entsprechenden fhem.cfg Zeilen Original aus meinem laufenden fhem Server:
define n_batt_chk notify .*:[Bb]attery:.* {if($EVENT !~ m/ok/i) {\ my $AttComment=AttrVal($NAME,"comment",0);;\ #Log 3, "comment ist $AttComment";;\ if ($AttComment ne 1) {\ my $DNAME = AttrVal($NAME,"alias",$NAME);;\ Log 3, 'about to use DebianMail';;\ { DebianMailNoAttach('receiver@gmail.com','FHEM Batteriewarnung', "$DNAME -> $EVENT") };;\ Log 3,"Bat $DNAME $EVENT";;\ fhem "attr $NAME comment 1";;\ }\ }elsif($EVENT =~ m/ok/i) {\ if (AttrVal("$NAME","comment",0) eq 1){\ fhem("setreading $NAME lastBatChange ".localtime);;\ fhem("deleteattr $NAME comment")\ }\ }\ } attr n_batt_chk room Hideki
und hier wie es in der Weboberfläche aussieht:
.*:[Bb]attery:.* {if($EVENT !~ m/ok/i) { my $AttComment=AttrVal($NAME,"comment",0); #Log 3, "comment ist $AttComment"; if ($AttComment ne 1) { my $DNAME = AttrVal($NAME,"alias",$NAME); Log 3, 'about to use DebianMail'; { DebianMailNoAttach('receiver@gmail.com','FHEM Batteriewarnung', "$DNAME -> $EVENT") }; Log 3,"Bat $DNAME $EVENT"; fhem "attr $NAME comment 1"; } }elsif($EVENT =~ m/ok/i) { if (AttrVal("$NAME","comment",0) eq 1){ fhem("setreading $NAME lastBatChange ".localtime); fhem("deleteattr $NAME comment") } } }
Anmerkungen: Das @ in der eMail Adresse muss nicht escaped oder sonst was werden, wenn es in EINFACHEN Anführungszeichen steht. Dafür muss aber der Verweis auf fhem Variablen (hier $DNAME und $EVENT) in doppelten Anführunszeichen stehen, damit fhem diese auswertet.
Und als Bild:
Dazu gehört dann noch der Inhalt der /opt/fhem/FHEM/99_myUtils.pm bezgl DebianMail und DebianMailNoAttach:
######## DebianMail Mail auf dem RPi versenden ############ sub DebianMail { my $rcpt = shift; my $subject = shift; my $text = shift; my $attach = shift; my $ret = ""; my $sender = "sender\@gmail.com"; my $konto = "sender\@gmail.com"; my $passwrd = "PASSWORD"; my $provider = "smtp.gmail.com:587"; Log 1, "sendEmail RCP: $rcpt"; Log 1, "sendEmail Subject: $subject"; Log 1, "sendEmail Text: $text"; Log 1, "sendEmail Anhang: $attach";; $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8); $ret =~ s,[\r\n]*,,g; # remove CR from return-string Log 1, "sendEmail returned: $ret"; } sub DebianMailNoAttach { my $rcpt = shift; my $subject = shift; my $text = shift; my $ret = ""; my $sender = "sender\@gmail.com"; my $konto = "sender\@gmail.com"; my $passwrd = "PASSWORD"; my $provider = "smtp.gmail.com:587"; Log 1, "sendEmail RCP: $rcpt"; Log 1, "sendEmail Subject: $subject"; Log 1, "sendEmail Text: $text"; $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8); $ret =~ s,[\r\n]*,,g; # remove CR from return-string Log 1, "sendEmail returned: $ret"; }
In der Weboberfläche in der Input Box kann man den Trigger und den Mailversand prüfen:
trigger th_3 battery:low
und
{DebianMail ('sender@gmail.com','receiver@gmail.com','FHEM Battery','Batterie xy ist schwach','');;}
oder besser, da wir eh kein Attachement schicken wollen:
{DebianMailNoAttach ('sender@gmail.com','receiver@gmail.com','FHEM Battery','Batterie xy ist schwach');;}
sollte beides nicht funktionieren, sendemail setze ich als Installiert voraus, kann man auf der Linux Kommandzeile testen:
sendEmail -f 'sender@gmail.com' -t 'receiver@gmail.com' -u '$FHEM Battery' -m 'Batterie xy ist schwach' -s 'smtp.gmail.com:587' -xu 'sender@gmail.com' -xp 'PASSWORD' -o tls=auto -o message-charset=utf-8
Ich hoffe Copy/Paste funktioniert für euch mit diesen Vorlagen.
Danke für den sehr guten Beitrag.
Die einleitenden Worte waren für mich interessant zu lesen. Ich hatte schon lange den selben Eindruck. Als nicht vollständig ausgebildeter Programmierer lesen sich einige Posts in genanntem Forum recht eigenwillig. Es fällt auch auf, dass (subjektiv betrachtet) viele Anfängerbeiträge unbeantwortet bleiben. Vielleicht möchten einige der FHEM/Perl Programmierer eher unter sich bleiben. Dein Beitrag ist gut beschrieben und war schnell an meine Gegebenheiten angepasst.
Vielen Dank!
Hallo,
wollte nun auch mal eine funktionierende Batteriewarnung in mein kleines System einbauen und habe nach der vorbildlichen Beschreibung das so übernehmen. Allerdings kann ich keine email absetzen.
mit diesem Kommando kommt die email an :
{ DebianMail (‘hp.xxx@t-online.de’,’FHEM Battery’)}
aber so nicht :
{ DebianMail (‘hp.xxx@t-online.de’,’FHEM Battery’,’xxx’)}
wenn weiterer Text gesendet werden soll, wird die mail nicht abgesetzt.
Wo mache ich da was falsch ?
Beste Grüße Peter
Hallo Peter
Überprüfe deine 99_myUtils.pm. Meine sieht so aus:
sub
DebianMail
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $attach = shift;
my $ret = "";
my $sender = "hjxxx\@gxxmail.com";
my $konto = "hjxxx\@gxxmail.com";
my $passwrd = "MeinPasswort";
my $provider = "smtp.gxxxmail.com:587";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";
Log 1, "sendEmail Anhang: $attach";;
$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto'
-xp '$passwrd' -o tls=auto -o message-charset=utf-8);
$ret =~ s,[\r\n]*,,g; # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}
sub
DebianMailNoAttach
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "hjxxx\@gxxxmail.com";
my $konto = "hjxxxxgode\@gxxxmail.com";
my $passwrd = "MeinPasswort";
my $provider = "smtp.gxxxmail.com:587";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";
$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);
$ret =~ s,[\r\n]*,,g; # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}
Ich verwende immer nur die Funktion DebianMailNoAttach().
Wenn’s immer noch nicht klappt, versuche mal manuell eine Mail mit dem o.g. sendEmail Aufruf in einem Linux Terminal-Fenster:
sendEmail -f ‘$sender’ -t ‘$rcpt’ -u ‘$subject’ -m ‘$text’ -s ‘$provider’ -xu ‘$konto’ -xp ‘$passwrd’ -o tls=auto -o message-charset=utf-8
Die $-Variablen ersetzt Du mit deinen Daten. Wenn das funktioniert, sieh Dir dein fhem log an. Vielleicht stimmt was mit dem qx nicht.
~Josef
Hallo,
ich wende mich mal an Dich, denn im Forum gibts nur seltsame Antworten:
Ich habe diese Emailwarnung umgesetzt.
Wenn ich z.B. trigger BAD_DG battery:low eingebe, kriege ich ne mail. Ist aber der Batteriestand tatsächlich low, kommt keine Mail und ich kann auch mit dem Trigger keine Mail mehr auslösen. Das habe ich nun auch mit einem anderen Regler versucht, also die Batterien in den Heizungsregler vom Arbeitszimmer eingebaut – genau das Selbe:
Das Device zeigt Battery “low” – keine automatische Email, kein Trigger möglich.
Was genau bedeutet if ($AttComment ne 1), denn nur dann schickt er ja ein Mail,oder?
Weiterhin ist mir unklar, warum z.B. bei einer Spannung von 2,3V der eine Regler “low” ausgibt, ein anderer aber “ok”… aber das ist ein anderes Thema.
Kannst Du mir einen Tipp geben, wo mein Fehler liegt? DANKE
Hallo Andreas
ich kann Dir auch nicht sagen, was bei Dir falsch läuft.
Nochmal der Code:
define n_batt_chk notify .*:[Bb]attery:.* {\
if($EVENT !~ m/ok/i) {\
my $AttComment=AttrVal($NAME,"comment",0);;\
#Log 3, "comment ist $AttComment";;\
if ($AttComment ne 1) {\
my $DNAME = AttrVal($NAME,"alias",$NAME);;\
Log 3, 'about to use DebianMail';;\
{ DebianMailNoAttach('receiver@gmail.com','FHEM Batteriewarnung', "$DNAME -> $EVENT") };;\
Log 3,"Bat $DNAME $EVENT";;\
fhem "attr $NAME comment 1";;\
}\
}elsif($EVENT =~ m/ok/i) {\
if (AttrVal("$NAME","comment",0) eq 1){\
fhem("setreading $NAME lastBatChange ".localtime);;\
fhem("deleteattr $NAME comment")\
}\
}\
}
attr n_batt_chk room Hideki
Das
if($AttComment ne 1)
prüft ob im comment Attribut eine 1 steht. Wenn man das nicht macht, wird bei jedem Update des Sensors eine weitere eMail versendet. Die 1 wird nach dem Senden der eMail gesetzt:
fhem “attr $NAME comment 1″;;
Diese Attribut wird dann erst gelöscht, wenn ein Sensor Update mit Battery=”OK” empfangen wird:
fhem(“deleteattr $NAME comment”)\
Wenn Du nur mit ‘leeren’ Batterien testest und das comment Attribut immer 1 bleibt, wirst Du keine eMail bekommen. Mach lieber immer:
trigger th_3 battery:ok
und dann
trigger th_3 battery:low
Sieh Dir dann auch die Sensor Details in der Web Oberfläche an. Dort solltest comment und Battery prüfen können.
~josef
Hmm.. ich dachte eigentlich, ich hätte meine Lösung hier gepostet, aber irgenwie …. ist meine Antwort gelöscht, oder habe ich beim posten nen Fehler gemacht. Auf jeden Fall geht es jetzt…
Soo, ich poste nochmal
… ich habe nun mal den Code noch mal komplett reinkopiert und das mit dem trigger Arbeitszimmer_1 battery:ok gemacht, alte Batterien eingesetzt, clear Readings und getConfig an dem Regler gemacht und siehe da – es funktioniert.
Was war der Fehler?
Ich habe in der ersten Zeile des Codes das drin gehabt:
define n_batt_chk notify .*:[Bb]attery:.* {if($EVENT !~ m/ok/) {\
dann habe ich Zeichen für Zeichen mit Deiner perfekten Vorlage verglichen und den \ als fehlend nach dem if erkannt.
Das einfügen des \ reichte aber auch nicht, ich habe dann die ganze erste Zeile ersetzt. Keine Ahnung was da noch falsch war, ich konnte echt nix entdecken.
Manchmal sind es Kleinigkeiten, die zeigen, FHEM ist nix für Schwächlinge.
Ich habe das Alarm-Mail so geändert, das im Betreff gleich das Device erscheint.
Für alle copy&paste-fans meine nun auch funktionierende Batteeriewarnung:
define n_batt_chk notify .*:[Bb]attery:.* {\
if($EVENT !~ m/ok/i) {\
my $AttComment=AttrVal($NAME,”comment”,0);;\
#Log 3, “comment ist $AttComment”;;\
if ($AttComment ne 1) {\
my $DNAME = AttrVal($NAME,”alias”,$NAME);;\
Log 3, ‘about to use DebianMail’;;\
{ DebianMailNoAttach(‘meineMail@xxx.de’, “$DNAME -> $EVENT”, “$DNAME -> $EVENT”) };;\
Log 3,”Bat $DNAME $EVENT”;;\
fhem “attr $NAME comment 1”;;\
}\
}elsif($EVENT =~ m/ok/) {\
if (AttrVal(“$NAME”,”comment”,0) eq 1){\
fhem(“setreading $NAME lastBatChange “.localtime);;\
fhem(“deleteattr $NAME comment”)\
}\
}\
}
attr n_batt_chk room Batterie
Ich danke Dir wirklich sehr für Deine Geduld und Hilfe. Ich hätte diesen Fehler niemals alleine gefunden. D A N K E ! ! ! ! !
LG Andreas
Hallo Andreas
Danke für den code und Deinen Post.
Bei mir hat so’n PEARL Sensor letztens rumgesponnen und ich habe alle 5 Minuten eine Mail bekommen :-(. Weiss noch ncht woran das liegt… Der Sensor meldet ‘low’, was baer nicht das Problem sein kann, da nur auf OK oder nicht OK geprüft wird. Mal sehen, wenn ich Zeit habe…
~Josef