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

Also jetzt bin ich sprachlos


Internals:
   CFGFN
   DEF        Pflanze.*:(min.*|max.*) {
            fhem("set dummy1 $NAME meldet $EVTPART0 ist $EVTPART1") if( ReadingsAge("notifyTestDummy","$EVTPART0",90000) > 86400 );
            fhem("setreading notifyTestDummy $NAME$EVTPART0 $EVTPART1");
}
   NAME       notifyTestDummy
   NR         15
   NTFY_ORDER 50-notifyTestDummy
   REGEXP     Pflanze.*:(min.*|max.*)
   STATE      2017-09-09 18:52:53
   TYPE       notify
   READINGS:
     2017-09-09 18:52:53   PflanzeWohnzimmermaxTemp high
     2017-09-09 18:45:00   maxTemp         high
     2017-09-09 18:46:00   minHum          low
     2017-09-09 18:52:36   state           active
Attributes:
   room       Test


$NAME$EVTPART0 klappt super
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

#46
So geht's mir zzt auch.

Denn selbst ein ReadingsTimestamp($SELF,$NAME.$reading,'') klappt. Um zu prüfen, ob die Bedingung stimmt habe ich zzt. eine Log 3 Ausgabe mit genau dieser Angabe. Und das klappt auch.

Weiter unten in meinem Code (beim setreading) klappt das ja auch schon länger. Nu bei der unless-Schleife klappt es nicht als Bedingung. :(
Diese wird entweder im Log mit einem Fehler ausgegeben (wenn ich falschen Code verwende beim testen) oder der unless-Teil wird ausgeführt, obwohl die zu prüfenden Readings von heute sind und auf heute geprüft werden.

CoolTux

Und du solltest es wirklich auslagern in meine myUtils. Ist 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

Grinsekatze

Zitat von: CoolTux am 10 September 2017, 14:10:11
Und du solltest es wirklich auslagern in meine myUtils. Ist besser.
Werde ich, doch vorher möchte ich es zum Laufen bekommen.

betateilchen

Zitat von: CoolTux am 10 September 2017, 13:51:45
Also jetzt bin ich sprachlos

$NAME$EVTPART0 klappt super

Ich wäre sprachlos, wenn das NICHT funktionieren würde. Das ist doch allersimpelstes perl, das man sich vorstellen kann. Vielleicht mal ein perl Grundlagenbuch lesen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Zitat von: betateilchen am 10 September 2017, 14:30:30
Ich wäre sprachlos, wenn das NICHT funktionieren würde. Das ist doch allersimpelstes perl, das man sich vorstellen kann. Vielleicht mal ein perl Grundlagenbuch lesen?
Das bezog sich auf die Aussage von Grinsekatze das er Probleme damit hatte. Und da ich vor Monaten ähnliche Probleme hatte aber nicht mit zwei Variablen sondern mit einer String Variablen Kombination mein schneller Schuss zu ${var} das kannte ich noch von Andre.
Daher also meine Verblüffung das es nun doch einfach so geht wie ich es auch gedacht hätte.
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

#51
Zitat von: betateilchen am 10 September 2017, 14:30:30
Ich wäre sprachlos, wenn das NICHT funktionieren würde. Das ist doch allersimpelstes perl, das man sich vorstellen kann. Vielleicht mal ein perl Grundlagenbuch lesen?
Das dachte ich auch. Darum habe ich es ja so gemacht. Aber dennoch, ich bekomme dann eine Fehlermeldung im Log:

unless(ReadingsTimestamp($SELF,$NAME$reading,'') =~ $today) {\
Produziert einen Fehler im Log:
Zitat2017.09.10 14:44:38 1: PERL WARNING: Scalar found where operator expected at (eval 1775) line 11, near "$NAME$reading"
2017.09.10 14:44:38 3: eval: my $SELF='Notify_FlowerSensor';my $EVTPART1='low';my $NAME='Pflanzensensor02Wohnzimmer';my $EVENT='minTemperature low';my $EVTPART0='minTemperature';my $TYPE='XiaomiFlowerSens';{
   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('<EMAIL>', 'Smarthome: Pflanzenwarnung '.$device, $message, '')};
      Log 3, "Pflanzenwarnung: $device: $message" if ($message);
   }
}
2017.09.10 14:44:38 1: ERROR evaluating my $SELF='Notify_FlowerSensor';my $EVTPART1='low';my $NAME='Pflanzensensor02Wohnzimmer';my $EVENT='minTemperature low';my $EVTPART0='minTemperature';my $TYPE='XiaomiFlowerSens';{
   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('<EMAIL>', 'Smarthome: Pflanzenwarnung '.$device, $message, '')};
      Log 3, "Pflanzenwarnung: $device: $message" if ($message);
   }
}: syntax error at (eval 1775) line 11, near "$NAME$reading"
syntax error at (eval 1775) line 17, near "} elsif"
Global symbol "$message" requires explicit package name at (eval 1775) line 18.
Global symbol "$device" requires explicit package name at (eval 1775) line 18.
Global symbol "$message" requires explicit package name at (eval 1775) line 19.
Global symbol "$device" requires explicit package name at (eval 1775) line 19.
Global symbol "$message" requires explicit package name at (eval 1775) line 20.
Global symbol "$device" requires explicit package name at (eval 1775) line 20.
Global symbol "$message" requires explicit package name at (eval 1775) line 21.
Global symbol "$device" requires explicit package name at (eval 1775) line 21.
syntax error at (eval 1775) line 22, near ";
      }"
(eval 1775) has too many errors.

2017.09.10 14:44:38 3: Notify_FlowerSensor return value: syntax error at (eval 1775) line 11, near "$NAME$reading"
syntax error at (eval 1775) line 17, near "} elsif"
Global symbol "$message" requires explicit package name at (eval 1775) line 18.
Global symbol "$device" requires explicit package name at (eval 1775) line 18.
Global symbol "$message" requires explicit package name at (eval 1775) line 19.
Global symbol "$device" requires explicit package name at (eval 1775) line 19.
Global symbol "$message" requires explicit package name at (eval 1775) line 20.
Global symbol "$device" requires explicit package name at (eval 1775) line 20.
Global symbol "$message" requires explicit package name at (eval 1775) line 21.
Global symbol "$device" requires explicit package name at (eval 1775) line 21.
syntax error at (eval 1775) line 22, near ";
      }"
(eval 1775) has too many errors.


Grinsekatze

Hm, ich glaub ich habe meinen Fehler gefunden: $today enthält nicht das tatsächliche heutige Datum. Also ist die Bedingung ja immer wahr und es werden immer mails geschickt.

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!

Grinsekatze

So, nun scheint es endlich zu funktionieren. Ich habe in all dem hin und her total übersehen den Monat und das Jahr anzugleichen. Nun sollte es aber funktionieren - ich kann also ans Auslagern gehen  :)

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+=1900,$month+=1,$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('<EMAIL>', 'Smarthome: Pflanzenwarnung '.$device, $message, '')};;\
Log 3, "Pflanzenwarnung: $device: $message" if ($message);;\
}\
}
attr Notify_FlowerSensor comment Notify zum Überwachen der Pflanzensensoren.


Vielen Dank noch mal an eure aktive Unterstützung.

Grinsekatze

Wobei, eine Frage habe ich nun noch:

Mir ist im Log aufgefgallen, dass jedes Mal, wenn der Notify nichts macht, nachdem er getriggert wurde (also etwa immer, wenn der unless-Teil false ist) bekomme ich diese Einräge:
2017.09.10 19:21:20 3: Notify_FlowerSensor return value: 1
Kann ich das irgendwie unterdrücken, sodass es mir nicht das Log voll spamt?

betateilchen

Zitat von: Grinsekatze am 10 September 2017, 19:51:08
Kann ich das irgendwie unterdrücken, sodass es mir nicht das Log voll spamt?

ja, mit einem return am Ende.

Wie ich schon sagte: simpelste perl Grundlagen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!