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:

Selection_074

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.

8 Comments

  1. Frank says:

    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!

  2. Peter says:

    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

  3. josef says:

    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

  4. Andreas says:

    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

  5. josef says:

    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

  6. Andreas says:

    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…

  7. Andreas says:

    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

  8. josef says:

    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

Leave a Reply