ich finde den Fehler nicht in diesem Low Battery Code / kann jemand helfen ?

Begonnen von Sonic, 31 Dezember 2019, 09:25:17

Vorheriges Thema - Nächstes Thema

Sonic

Hallo Zusammen,
ich finde leider den Fehler nicht in folgendem Code, mit dem ich die "Low Battery Meldung" zeitlich versetzt wiederholt erfolgreich bekomme.
Lediglich die Fehlermeldung im Log irritiert mich. Leider finde ich den Fehler nicht. Ich bin zu wenig erfahren in Perl.
Vielleicht findet sich jemand der mit helfen kann ?

Vielen Dank im Voraus.

-----------------------------------------

define n_batt_chk notify .*:[Bb]attery.* { \
if ( ($EVENT !~ m/ok/) && (time > $main::NewMailtime) ) {\
   ssmtpMail('klaus@online.de','FHEM Batteriewarnung', $NAME.': '.$EVENT);; \
   Log 3, "$NAME : Batteriewarnung $EVENT";; \
   $main::NewMailtime = time + 15360;;\
  } \
}

Meldung dazu im Log:
PERL WARNING: Use of uninitialized value $NewMailtime in numeric gt (>) at (eval 223) line 2.
2019.12.31 09:18:13 3: eval: my $TYPE='FHT';my $EVENT='Battery:low';my $EVTPART0='Battery:low';my $NAME='thermostat';my $SELF='n_batt_chk';{
if ( ($EVENT !~ m/ok/) && (time > $main::NewMailtime) ) {
   ssmtpMail('klaus@online.de','FHEM Batteriewarnung', $NAME.': '.$EVENT);
   Log 3, "$NAME : Batteriewarnung $EVENT";
   $main::NewMailtime = time + 15360;
  }
}
2019.12.31 09:18:14 1: sendemail returned: Dec 31 09:18:14 raspberrypi sendemail[4156]: Email was sent successfully!
2019.12.31 09:18:14 3: thermostat : Batteriewarnung Battery:low
2019.12.31 09:18:14 3: n_batt_chk return value: 1577795654

KernSani

Moin,
Zunächst einmal: Bitte codetags verwenden das # im.Editor, oberhalb der Emoticons).

Ungewöhnliche Lösung hast du dir da ausgedacht... Setze doch einfach ein ,,at" für die nächste Mailversendung...

Guten Rutsch!

Oli


Gesendet von iPhone mit Tapatalk
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

Die ungewöhnliche Lösung hat er aus dem Wiki.
Sieht so aus als fehlt da ein Teil.

https://wiki.fhem.de/wiki/E-Mail_per_notify_nach_Zeitablauf_erneut_senden
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Sonic

o.k, ich habe den Code nochmal original aus dem Wiki nachgebaut.
Hier muss also auch schon der Fehler vorhanden sein, da die gleiche Fehlermeldung erneut kommt.

Leider finde ich es nicht.

Würde mich über Eure Hilfe oder Idee freuen..

Ein gutes neues Jahr allen Zusammen

CoolTux

Zeige mal was Du bis jetzt diesbezüglich hast.
Hast Du die globale Variable deklariert in einer myUtils_Initialize() ?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Sonic

Hallo,
ja, ich habe dies in der 99_myUtils.pm angelegt

sub
myUtils_Initialize($$)
{
my ($hash) = @_;
my $NewMailtime = time;
}

der Code löst im Logfile folgende Meldung aus:
(die Mail geht zwar raus, funktioniert also, jedoch würde mich interessieren warum diese Fehlermeldung kommt)


PERL WARNING: Use of uninitialized value $NewMailtime in numeric gt (>) at (eval 222) line 2.
2020.01.01 10:41:45 3: eval: my $SELF='n_batt_chk';my $EVTPART0='Battery:low';my $NAME='thermostat';my $EVENT='Battery:low';my $TYPE='FHT';{
if ( ($EVENT !~ m/ok/) && (time > $main::NewMailtime) ) {
   ssmtpMail('test@online.de','FHEM Batteriewarnung', $NAME.': '.$EVENT);
   Log 3, "$NAME : Batteriewarnung $EVENT";
   $main::NewMailtime = time + 15360;
  }
}
2020.01.01 10:41:46 1: sendemail returned: Jan 01 10:41:46 raspberrypi sendemail[10062]: Email was sent successfully!
2020.01.01 10:41:46 3: thermostat : Batteriewarnung Battery:low
2020.01.01 10:41:46 3: n_batt_chk return value: 1577887066

CoolTux

Ich finde das ganze ziemlich ungünstig.
Wenn Du zwei verschiedene Batteriemeldungen bekommst, also von 2 unterschiedlichen Devices, dann wird nur eine Mail gesendet und zwar nur für das Device was als erstes kommt. Wenn dann nicht mehr das Notify ausgelöst wird bekommst auch keine Meldung mehr.

Daher mein Vorschlag

define n_batt_chk notify .*:[Bb]attery.* { \
if ( $EVENT !~ m/ok/ ) {\
   ssmtpMail('klaus@online.de','FHEM Batteriewarnung', $NAME.': '.$EVENT);; \
   Log 3, "$NAME : Batteriewarnung $EVENT";; \
  } \
}


Und dann mal überlegen wie man es besser machen kann.
So würde ich Battery Readings immer ein event-on-change verpassen und mir eine Readingsgroup bauen welche Dir den Status aller Batteriereadings wieder gibt.
Informieren ist ja gut bei einem Statuswechsel zu low, aber danach ist eine Übersicht immer noch besser.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Sonic

Danke für den Vorschlag.
Ich finde es immer recht nützlich, die Mail nicht permanent zu bekommen, sondern in zeitlichem Abstand von X. ($main::NewMailtime = time + 15360;)

Das mit den Battery Readings ist eine gute Idee und werde ich demnächst einbauen.

Interessant aber, warum ist der Code im Wiki irgendwie nicht korrekt.
Die Mail geht zwar raus, auch zeitlich versetzt, aber die Fehlermeldung würde ich gerne wissen kommt warum so ?

Danke und Gruss
KLAUS

CoolTux

Das WARUM ist weil die Variable $NewMailtime nicht deklariert ist.

Wenn Du eine Zeitliche Verzögerung nach dem ersten auslösen haben willst dann nimm das Attribut disableAfterTrigger im Notify Device und gebe dort 15360 ein.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Zitat von: CoolTux am 01 Januar 2020, 12:13:24
Das WARUM ist weil die Variable $NewMailtime nicht deklariert ist.
Ich habe versucht, das Wiki Beispiel nachzubauen, das funktioniert bei mir auch nicht.
Ich weiß wieder zu wenig von Perl, um auf Anhieb zu sehen ob das so überhaupt gehen kann, oder in einer Perl Version vom Jahre 2013 (so alt ist offenbar der Artikel) so funktioniert hat.
Sollte man den Artikel einfach entsprechend überarbeiten/kennzeichnen/einen Hinweis einbauen? Zeitgemäß scheint die Lösung ja offenbar nicht mehr zu sein ;)

Gesundes Neues Jahr
Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sonic

Inteerssant ist aber,

dieser Befehl funktioniert einwandfrei, ohne Fehlermeldung,
obwohl die Variable $NewMailtime nicht deklariert ist ?
---------------

define Tempalarm_high31WZ notify thermostat:measured-temp.* {\
  if ( (ReadingsVal("thermostat","measured-temp",20) > 32) && (time > $main::NewMailtime) ){\
    Log (3,"Logzeile zum sehen ob was passiert");;\
    ssmtpMail('test@test.de','Alarm TempAlarmHIGH','Temperatur im WZ mehr als 32 Grad');;\
    $main::NewMailtime = time + 7200;;\
  }\
}

Sonic

#12
mit unten stehendem Code und dem nach aus dem Wiki installierten Eintrag in der 99myutils funktioniert die
Benachrichtigung des zeitlich versetzten Mailversand  jetzt fehlerfrei


define n_batt_chk notify .*:[Bb]attery.* { \
if ( ($EVENT !~ m/ok/) && (time > $main::NewMailtime) ) {\
   ssmtpMail('test@online.de','FHEM Batteriewarnung', $NAME.': '.$EVENT);; \
   Log 3, "$NAME : Batteriewarnung $EVENT";; \
   $main::NewMailtime = time + 15360;;\
  } \
}