Hallo,
habe folgendes Notify im Einsatz:
.*:[Bb]attery:.* { if($EVENT !~ m/ok/) {my $FNAME = (AttrVal($NAME,"alias",$NAME));;
{ system "echo '$EVENT' | mail -s 'FHEM Batteriewarnung $FNAME.' xxxxx\@xxxxx.xxx" };
Log 3, "$NAME: Batteriewarnung $EVENT";}
}
Hat heute wie erwartet Mails abgesetzt allerdings 47 mal bis ich die Batterien gewechselt habe.
Gibt es eine Möglichkeit die Mail nur einmal zu senden.
Gruß
Thomas
So in etwa:
define batterie_once_in_12_h dummy
define batterie_check_n notify .*:[Bb]attery:.* { if($EVENT !~ m/ok/ && ReadingsVal("batterie_once_in_12_h","state","nA") ne "on")
{my $FNAME = (AttrVal($NAME,"alias",$NAME));;
{ system "echo '$EVENT' | mail -s 'FHEM Batteriewarnung $FNAME.' xxxxx\@xxxxx.xxx" };
Log 3, "$NAME: Batteriewarnung $EVENT";
fhem("set batterie_once_in_12_h on;defmod nach12h at +12:00:00 set batterie_once_in_12_h off")}
}
Zitat von: Tommi ratlos am 28 Oktober 2017, 15:34:45
Gibt es eine Möglichkeit die Mail nur einmal zu senden.
bei den einzelnen Geräten das event-on-change-reading (http://commandref.fhem.de/#event-on-change-reading) - Attribut entsprechend setzen, damit nur bei einer Veränderung des Readings auch ein Event erzeugt wird.
"Dein" notify-Code an sich passt schon so!
Bei inomas Lösung werden anschließend alle Batteriewarnungen auch anderer Devices unterdrückt.
Bei Bennis Lösung muss man sehr diszipliniert sein, da das Event insgesamt nur 1x gesendet - weil sich der Status nicht mehr ändert, bevor das Device tot ist.
Ich finde es besser, die Versandinfo am Gerät selbst zu speichern:
.*:[Bb]attery:.* {
if(($EVENT !~ m/ok/) && ($EVENT !~ m/AC/)) {
my $valDateToday = substr(ReadingsTimestamp($NAME,"state",""),0,10);
my $valDateLastAnnouncement = substr(ReadingsTimestamp($NAME,"LastLowBattMailSent",""),0,10);
if ($valDateLastAnnouncement ne $valDateToday) {
my $t = ReadingsTimestamp($NAME,"state","");
SendMessage("Battery Status", "$t: $NAME - $EVENT", "Log,Pushover,Mail", "silent");
fhem("setreading $NAME LastLowBattMailSent 1");
}
}
}
Gruß
Ronny
Hallo Ronny, bei meinem Code bekommt man eine Batteriewarnung alle 12 Stunden, dann vergisst man den Batteriewechsel auch nicht. Aber deine Lösung ist wirklich noch um einiges schicker!!! Danke!
Hallo Ronny,
deine Lösung finde ich gut, allerdings ist mir nicht klar wie ich das entsprechende userreading anlegen muss.
attr HM_RT_Wohnzimmer userReadings LastLowBattMailSent:trigger.*
Oder bin ich da auf dem Holzweg
Gruß
Thomas
Hi Thomas,
du brauchst kein userReadings dafür.
Das setreading im Code des notify setzt das Reading.
Gruß, Joachim
Hi Joachim,
Danke
Gruß
Thomas
Hallo nochmal,
habe es noch etwas geändert, sendet jetzt nur alle x Tage (in meinem Fall 3).
.*:[Bb]attery:.* {
if(($EVENT !~ m/ok/) && ($EVENT !~ m/AC/)) {
my $TAGE = 3;
my $valLowBattDays = ReadingsAge($NAME,"LastLowBattMailSent",(86400*$TAGE));
my $FNAME = (AttrVal($NAME,"alias",$NAME));
if ($valLowBattDays >= (86400*$TAGE)) {
my $t = ReadingsTimestamp($NAME,"state","");
{ system "echo '$t: $NAME - $EVENT' | mail -s 'FHEM Batteriewarnung $FNAME.' xxxxxx\@xxxx.xxxx" };
Log 3, "$NAME: Batteriewarnung $EVENT";
fhem("setreading $NAME LastLowBattMailSent 1");
}
} else {
fhem("deletereading $NAME LastLowBattMailSent");
}
}
Gruß
Thomas
Hallo nochmal,
habe das Ganze nocheinmal etwas geändert. Jetzt wird das Reading "LastLowBattMailSent" auch geändert wenn Batt OK und der Timestamp von "LastLowBattMailSent" älter als 6 Stunden ist. Gibt es eine elegantere Lösung das Reading "LastLowBattMailSent" wenn die Batterie gewechselt wurde.
Hat jemand Erfahrungen ob die Batteriespannung gegen ende auch schon mal zwischen OK und LOW schwankt wenn z.B. die Entkalkungs-Funktion Strom zieht.
.*:[Bb]attery:.* {
if(($EVENT !~ m/ok/) && ($EVENT !~ m/AC/)) {
my $TAGE = 3;
my $valLowBattAge = ReadingsAge($NAME,"LastLowBattMailSent",(86400*$TAGE));
my $FNAME = (AttrVal($NAME,"alias",$NAME));
if (ReadingsVal($NAME,"LastLowBattMailSent",0) eq 0){
my $t = ReadingsTimestamp($NAME,"state","");
{ system "echo '$t: $NAME - $EVENT' | mail -s 'FHEM Batteriewarnung $FNAME.' thomas\@dann.nrw" };
fhem("setreading $NAME LastLowBattMailSent 1");
Log 3, "$NAME: Batteriewarnung $EVENT";
} else {
if ($valLowBattAge >= (86400*$TAGE)) {
fhem("setreading $NAME LastLowBattMailSent 0");
}
}
} else {
#LastLowBattMailSent zurücksetzen
if (ReadingsVal($NAME,"LastLowBattMailSent",1) eq 1 && ReadingsAge($NAME,"LastLowBattMailSent",86400) > 21600){
fhem("setreading $NAME LastLowBattMailSent 0");
}
}
}
Gruß
Thomas
Zitat von: Tommi ratlos am 29 Oktober 2017, 11:07:35
Hallo nochmal,
habe es noch etwas geändert, sendet jetzt nur alle x Tage (in meinem Fall 3).
.*:[Bb]attery:.* {
if(($EVENT !~ m/ok/) && ($EVENT !~ m/AC/)) {
my $TAGE = 3;
my $valLowBattDays = ReadingsAge($NAME,"LastLowBattMailSent",(86400*$TAGE));
my $FNAME = (AttrVal($NAME,"alias",$NAME));
if ($valLowBattDays >= (86400*$TAGE)) {
my $t = ReadingsTimestamp($NAME,"state","");
{ system "echo '$t: $NAME - $EVENT' | mail -s 'FHEM Batteriewarnung $FNAME.' xxxxxx\@xxxx.xxxx" };
Log 3, "$NAME: Batteriewarnung $EVENT";
fhem("setreading $NAME LastLowBattMailSent 1");
}
} else {
fhem("deletereading $NAME LastLowBattMailSent");
}
}
Gruß
Thomas
Hallo, ich stehe etwas auf dem Schlauch. Ich versuche diesen code bei mir einzufügen und es hagelt Syntaxfehler >:(
Hat jemand einen Tipp woran es liegt.
Schon mal vielen Dank.
Unknown command if(($EVENT, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
IF: no left bracket: {
Unknown command my, try help.
Global symbol "$t" requires explicit package name at (eval 188374) line 1, <> line 94.
Global symbol "$NAME" requires explicit package name at (eval 188374) line 1, <> line 94.
Global symbol "$EVENT" requires explicit package name at (eval 188374) line 1, <> line 94.
Global symbol "$FNAME" requires explicit package name at (eval 188374) line 1, <> line 94.
Unknown command Log, try help.
Unknown command fhem("setreading, try help.
Unknown command }, try help.
Unknown command }, try help.
Unknown command fhem("deletereading, try help.
Unknown command }, try help.
Unknown command }, try help.
Hi,
dieser zitierte Codeblock ist für die DEF in einem notify. Also mach
define n_battery notify bla {}
für ein leeres notify
Dann klickst auf die DEF, der Editor geht auf, Du löschst alles was da steht und ersetzt es mit dem Codeblock den Du zitiert hast.
Gruß Otto
Hallo, danke. Manchmal ist es so einfach.
VG
Hallo nochmal, die neue Batteriewarnung funktioniert super. Nochmals Danke für die Hilfe.
VG
Moin Leutz,
sorry, dass ich in diesem "gelöst"-Thema noch einmal etwas poste, aber meine Frage betrifft unmittelbar dieses notify ::)
Bisher lief diese Batterieüberwachung fehlerfrei, aber nun bekomme ich laufend eine falsche Meldung bezüglich einer leeren Batterie.
Mein Problem ist, dass das notify alle Readings mit [Bb]attery abfragt, was ja auch Sinn ergibt. Nun habe ich ein neues Device, ein Nuki-Türschloss, in fhem eingebunden. Dieses Device hat insgesamt drei readings mit battery:
batteryChargeState 86
batteryCharging false
batteryState ok
Man sieht natürlich, warum ich eine falsche Meldung bekomme, nämlich weil die ersten beiden Readings mit [Bb]attery beginnen und nicht ok sind.
Wie kann ich das notify anpassen, so dass diese beiden speziellen readings ausgeschlossen werden? Logisch muss es ein UND NICHT sein, aber wie lautet die richtige Syntax?
Vielen Dank für Eure Hilfe.
LG
Björn
Hi,
naja der Trigger ist normal .*:[Bb]attery:.* da kommt ein Reading was länger ist als battery nicht vor (battery:)
Da muss dein notify anders sein ;)
Gruß Otto
Hallo Otto,
vielen Dank für Deine schnelle Antwort. Ich habe mir das bei mir noch einmal angeschaut und natürlich hats Du Recht: Mein trigger lautet
.*:[Bb]attery.*:.*
Hatte mich nach Deiner Antwort gewundert, dass meine Geräte mit dem reading "batteryState" korrekt behandelt werden. Der (fehlende) Doppelpunkt machts ;-)
Das erklärt aber auch mein geschildertes Problem. Also noch einmal die Frage, wie schließe ich die oben genannten readings aus, während ich (zunächst) alle anderen [Bb]attery.* readings berücksichtige.
Lieben Dank
Björn
ignoreRegexp wäre das Suchwort :)
https://fhem.de/commandref_DE.html#notify
Danke, Otto.
Das war ein sehr hilfreicher Hinweis, damit setze ich mich jetzt mal auseinander.
LG
Björn