- Windows CE Programming - https://www.hjgode.de/wp -

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 [1]

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.