Wie Notify nur täglich ausführen und nicht bei jedem Trigger?

Begonnen von Grinsekatze, 02 September 2017, 11:26:10

Vorheriges Thema - Nächstes Thema

CoolTux

Hier mal Vorab eine ganz einfache Lösung für das immer Melden. Das nur einmal täglich mache ich nachher


define Notify_FlowerSensor notify Pflanzensensor.*:(min.*|max.*) {DebianMail('<E-Mail>', 'Smarthome: Pflanzenstand', $NAME meldet $EVTPART0 ist $EVTPART1, '')}


Wie gesagt das ist die gaaaanz einfache Variante. Das mit dem nur einmal täglich kommt später
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

CoolTux


define Notify_FlowerSensor notify Pflanzensensor.*:(min.*|max.*) {
                              DebianMail('<E-Mail>', 'Smarthome: Pflanzenstand', $NAME meldet $EVTPART0 ist $EVTPART1, '') if( ReadingsAge("Notify_FlowerSensor","$EVTPART0",90000) > 86400 );
                              fhem("setreading Notify_FlowerSensor $EVTPART0 $EVTPART1");
}


Das wäre nun mit Meldung nur einmal am Tag. Ich gebe zu es ist nicht das was Du hast mit Deiner ganz genauen Meldung. Aber sowas würde ich dann wenn wirklich nur in einer 99_myUtils machen.
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

betateilchen

Das funktioniert so aber nicht, weil das nicht "einmal pro Tag" bedeutet, sondern "mindestens im Abstand von 86400 Sekunden".

Angenommen, am Montagabend um 23:50 wäre der erste Event des Tages, am Dienstag um 00:05 wäre der erste Event des Folgetages. Dann würde aus Deinem notify heraus KEINE Benachrichtigung verschickt werden, obwohl die Anforderung "einmal pro Tag" zu 100% erfüllt wäre.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

So gesehen gebe ich Dir Recht. Ich habe mich da an den Code gehalten der bereits von Grinsekatze vorgegeben war.
Wenn man sich Wort wörtlich an das einmal täglich hält dann muss man es noch etwas erweitern.
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

betateilchen

Ich würde nicht mit ReadingsAge() arbeiten, sondern per regexp prüfen, ob im ReadingsTimestamp() das heutige Datum steht.


define test_notify notify notifyRegexp { todayTest($year,$month,$mday) }


in der 99_myUtils:


sub todayTest {
   my ($year,$month,$mday) = @_;
   my $today = sprintf('%04d-%02d-%02d', $year,$month,$mday);
   unless(ReadingsTimestamp('device','reading','') =~ $today) {
      # macheIrgendwas, wenn das notify heute noch nicht ausgeführt wurde
      # mache es in purem perl!
   }
   return;
}



An die Funktion todayTest können natürlich noch weitere Parameter ($EVENT usw) im Aufruf übergeben werden, die man dann innerhalb der Funktion verwenden kann.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

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

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

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

Grinsekatze

#38
@Damian: Nein, es klappt noch nicht richtig. Die Readings werden angelegt (nachdem ich den Code angepasst hatte) - der Notify erkennt $SELF:
{fhem "setreading $SELF $NAME$reading $EVTPART1"};;\

Aber mit der Timestamp-Bedingung klappt's noch nicht:
Sie wird ignoriert und zzt. bekomme ich wieder alle 2 Stunden alle Meldungen. Ebenfalls erhalte ich regelmäßig ein Fehler imLog:
Zitat2017.09.10 08:45:20 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 504251) line 12.
2017.09.10 08:45:20 3: eval: my $EVTPART1='low';my $SELF='Notify_FlowerSensor';my $EVTPART0='minLux';my $NAME='Pflanzensensor03Wohnzimmer';my $EVENT='minLux low';my $TYPE='XiaomiFlowerSens';{
   my $alert;
   my $device;
   my $reading;
   $device = AttrVal("$NAME","alias","$NAME");
   $reading = "Fertility" if ($EVTPART0 =~ /Fertility$/);
   $reading = "Lux" if ($EVTPART0 =~ /Lux$/);
   $reading = "Moisture" if ($EVTPART0 =~ /Moisture$/);
   $reading = "Temperature" if ($EVTPART0 =~ /Temperature$/);
#   my $tmpfx = $NAME.$reading;
#   if ({ReadingsAge($SELF,$tmpfx,0)} gt 86400) {
   my $tmpfx2 = {ReadingsAge("Notify_FlowerSensor","Pflanzensensor01WohnzimmerLux",0)};
   if ( $tmpfx2 >= 86400) {
      if ($EVTPART1 eq "low") {
         $alert = "Die Pflanze (".$device.") hat zu wenig Fruchtbarkeit! Gebe etwas Dünger zum Wasser!" if ($EVTPART0 eq "minFertility");
         $alert = "Die Pflanze (".$device.") hat zu wenig Sonneneinstrahlung! Stelle sie ins Licht!" if ($EVTPART0 eq "minLux");
         $alert = "Die Pflanze (".$device.") hat zu wenig Wasser! Gieße die Pflanze!" if ($EVTPART0 eq "minMoisture");
         $alert = "Die Pflanze (".$device.") ist zu kalt! Stelle sie an einen wärmeren Ort!" if ($EVTPART0 eq "minTemperature");
      } elsif ($EVTPART1 eq "high") {
         $alert = "Die Pflanze (".$device.") hat zu viel Fruchtbarkeit! Der Boden ist zu stark gedüngt!" if ($EVTPART0 eq "maxFertility");
         $alert = "Die Pflanze (".$device.") hat zu viel Sonneneinstrahlung! Stelle sie in den Schatten!" if ($EVTPART0 eq "maxLux");
         $alert = "Die Pflanze (".$device.") hat zu viel Wasser! Entferne etwas Wasser!" if ($EVTPART0 eq "maxMoisture");
         $alert = "Die Pflanze (".$device.") ist zu warm! Stelle sie an einen kälteren Ort!" if ($EVTPART0 eq "maxTemperature");
      }
      {fhem "setreading $SELF $NAME$reading $EVTPART1"};
      if ($alert) {DebianMail('<E-Mail>', 'Smarthome: Pflanzenwarnung '.$device, $alert, '')};
      Log 3, "Pflanzenwarnung: $device: $alert" if ($alert);
   }
}

$tmpfx2 ist zum testen drin.


@CoolTux: Erweitere die Bedingung mal um ".(low|high)"
Denn das Modul löst auch Events aus mit "ok". Bei deiner einfachen Lösung bekommt Man sonst auch regelmäßige Infos, dass alles ok ist.
Auch würde ich bei der erweiterten Version dem setreading noch einen $NAME für das Reading spendieren. Sonst überschreiben sich ggf. Werte, wenn mehr als 1 Sensor im Einsatz ist.

Danke

Grinsekatze

#39
So, ich habe meinen Versuch noch einmal überarbeitet:
define Notify_FlowerSensor notify Pflanzensensor.*:(min.*|max.*).(low|high) {\
my $message;;\
my $device = AttrVal("$NAME","alias","$NAME");;\
my $reading;;\
$reading = "Fertility" if ($EVTPART0 =~ /Fertility$/);;\
$reading = "Lux" if ($EVTPART0 =~ /Lux$/);;\
$reading = "Moisture" if ($EVTPART0 =~ /Moisture$/);;\
$reading = "Temperature" if ($EVTPART0 =~ /Temperature$/);;\
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);;\
my $today = sprintf('%04d-%02d-%02d', $year,$month,$mday);;\
unless(ReadingsTimestamp($SELF,$NAME.$reading,'') =~ $today) {\
if ($EVTPART1 eq "low") {\
$message = "Die Pflanze (".$device.") hat zu wenig Fruchtbarkeit! Gebe etwas Dünger zum Wasser!" if ($EVTPART0 eq "minFertility");;\
$message = "Die Pflanze (".$device.") hat zu wenig Sonneneinstrahlung! Stelle sie ins Licht!" if ($EVTPART0 eq "minLux");;\
$message = "Die Pflanze (".$device.") hat zu wenig Wasser! Gieße die Pflanze!" if ($EVTPART0 eq "minMoisture");;\
$message = "Die Pflanze (".$device.") ist zu kalt! Stelle sie an einen wärmeren Ort!" if ($EVTPART0 eq "minTemperature");;\
} elsif ($EVTPART1 eq "high") {\
$message = "Die Pflanze (".$device.") hat zu viel Fruchtbarkeit! Der Boden ist zu stark gedüngt!" if ($EVTPART0 eq "maxFertility");;\
$message = "Die Pflanze (".$device.") hat zu viel Sonneneinstrahlung! Stelle sie in den Schatten!" if ($EVTPART0 eq "maxLux");;\
$message = "Die Pflanze (".$device.") hat zu viel Wasser! Entferne etwas Wasser!" if ($EVTPART0 eq "maxMoisture");;\
$message = "Die Pflanze (".$device.") ist zu warm! Stelle sie an einen kälteren Ort!" if ($EVTPART0 eq "maxTemperature");;\
}\
{fhem "setreading $SELF $NAME$reading $EVTPART1"};;\
if ($message) {DebianMail('<E-Mail>', 'Smarthome: Pflanzenwarnung '.$device, $message, '')};;\
Log 3, "Pflanzenwarnung: $device: $message" if ($message);;\
}\
}
attr Notify_FlowerSensor comment Notify zum Überwachen der Pflanzensensoren.


Wobei ich mir bei der unless-Schleife noch unsicher bin: Denn jedes Mal, wenn ich die Config speichere, erhalte ich auch die Emails - was ja erst morgen der Fall sein sollte. Vermutlich habe dort noch einen Fehler:
ReadingsTimestamp($SELF,$NAME.$reading,'')
$NAME$reading (ohne Punkt) funktioniert auch nicht. Da bekomme ich einen Fehler im Log.

Ich werde jetzt mal im Abgleich mit euren Entwürfen gucken, wo ich meinen kürzen kann und ggf. in die myUtils auslagern kann.

Vielen Dank.

CoolTux

Stimmt das mit dem Name wollte ich noch einbauen.
Versuche mal
$NAME${reading}


Grüße
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

Grinsekatze

Zitat von: CoolTux am 10 September 2017, 13:06:46
Stimmt das mit dem Name wollte ich noch einbauen.
Versuche mal
$NAME${reading}


Grüße

Nö, klappt nicht:
Zitatsyntax error at (eval 518036) line 11, near "$NAME${reading}"
Hab dann mal ein $NAME{$reading} probiert. Aber dann meckerts wieder:
ZitatGlobal symbol "%NAME" requires explicit package name

Jetzt versuche ich mal
unless(ReadingsTimestamp($SELF,"$NAME$reading",'') =~ /^$today/) {\
Aber momentan bekomme ich noch einen Fehler:
Zitat2017.09.10 13:18:01 1: Timeout for XiaomiFlowerSens_BlockingRun reached, terminated process 21087
2017.09.10 13:18:01 3: (Pflanzensensor01Wohnzimmer) Sub XiaomiFlowerSens_BlockingAborted - The BlockingCall Process terminated unexpectedly. Timedout

CoolTux

${NAME}${reading}

Aber so sollte es gehen. Dachte eines reicht
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

Grinsekatze


CoolTux

Ja habe ich bei mir auch kurz getestet. Ich muss das mal auf meinem Testsystem sauber anschauen. Da habe ich ja noch das was ich oben geschrieben habe.
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