(Gelöst)Nachhilfe beim Attribut waitdel.

Begonnen von Esjay, 06 Mai 2020, 20:43:55

Vorheriges Thema - Nächstes Thema

Esjay

Guten Abend zusammen.

Ich habe ein Regensensor gebaut.
list:
Internals:
   CFGFN     
   DEF        39
   FUUID      5eaa89bd-f33f-a126-9890-9f40a245d8e28f02
   IODev      JLLaCrosse
   JLLaCrosse_MSGCNT 20603
   JLLaCrosse_RAWMSG OK 9 57 1 2 213 106
   JLLaCrosse_TIME 2020-05-06 20:34:39
   LASTInputDev JLLaCrosse
   LaCrosse_lastRcv 2020-05-06 20:34:39
   MSGCNT     20603
   NAME       LaCrosse_39
   NR         9844
   STATE      kein Regen
   TYPE       LaCrosse
   addr       39
   battery_new 0
   bufferedH 
   bufferedT 
   corr1      0
   corr2      0
   previousH  106
   previousT  -27.4
   sensorType 0=T(H)
   Helper:
     DBLOG:
       is_raining_Indikator:
         DBLogging:
           TIME       1588790079.87532
           VALUE      -0
   READINGS:
     2020-05-06 20:34:39   battery         ok
     2020-05-06 20:34:39   is_raining_Indikator -0
     2020-05-05 20:22:43   needRain        1
     2020-05-06 20:34:39   state           T: -27.5
     2020-05-06 20:34:39   temperature     -27.5
Attributes:
   DbLogExclude .*
   DbLogInclude is_raining_Indikator
   IODev      JLLaCrosse
   alias      Regensensor
   room       Garten
   stateFormat { if(ReadingsVal("$name","is_raining_Indikator",0) > "0") {return "Regen";} else {return "kein Regen";} }

   userReadings is_raining_Indikator { sprintf("%.0f",ReadingsVal($name,"temperature",0)+27.1);;;; }


Sobald es regnet, steigt der Wert auf > 0 an.

Ich wollte nun mit diesem DOIF überprüfen, ob es 3 Tage am Stück nicht regnet. Testweise habe ich erstmal 15 Sekunden eingetragen.

list
Internals:
   CFGFN     
   DEF        ([LaCrosse_39:is_raining_indikator] < 1) (setreading LaCrosse_39 needRain 1 ) DOELSE (setreading LaCrosse_39 needRain 0 )
   FUUID      5eb1aa3c-f33f-a126-6f98-59d436a56732038b
   MODEL      FHEM
   NAME       needRainDoif
   NOTIFYDEV  LaCrosse_39,global
   NR         28408
   NTFY_ORDER 50-needRainDoif
   STATE      initialized
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   Helper:
     DBLOG:
       cmd:
         DBLogging:
           TIME       1588701756.70782
           VALUE      0
       mode:
         DBLogging:
           TIME       1588701756.70782
           VALUE      enabled
       state:
         DBLogging:
           TIME       1588701756.70782
           VALUE      initialized
   READINGS:
     2020-05-06 20:32:37   cmd             0
     2020-05-06 20:32:37   mode            enabled
     2020-05-06 20:32:37   state           initialized
   Regex:
     accu:
     cond:
       LaCrosse_39:
         0:
           is_raining_indikator ^LaCrosse_39$:^is_raining_indikator:
   attr:
     cmdState:
     waitdel:
       0:
         15
   condition:
     0          ::ReadingValDoIf($hash,'LaCrosse_39','is_raining_indikator') < 1
   do:
     0:
       0          setreading LaCrosse_39 needRain 1
     1:
       0          setreading LaCrosse_39 needRain 0
   helper:
     DEVFILTER  ^global$|^LaCrosse_39$
     NOTIFYDEV  global|LaCrosse_39
     globalinit 1
     last_timer 0
     sleeptimer -1
   readings:
     all         LaCrosse_39:is_raining_indikator
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   comment    259200 entspricht 3 Tagen
   waitdel    15


Meinem Verständnis nach, sollte das Reading needRain am Regensensor nach 15 Sekunden auf 0 gesetzt werden. Passiert aber leider nicht.

Kann mir jemand sagen, wo es klemmt?

Gruß Stephan




amenomade

Du brauchst noch ein do always
Wie oft sendet dein Sensor ein Event mit is_raining_Indikator?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Esjay

Danke für die Antwort. Das do always hat auch nichtsverändert. Dachte ich benötige das aufgrund des DOELSE Zweiges nicht.

2020-05-10 19:23:44 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:23:49 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:23:53 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:23:58 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:24:02 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:24:06 LaCrosse LaCrosse_39 is_raining_Indikator: 2
2020-05-10 19:26:46 LaCrosse LaCrosse_39 is_raining_Indikator: 1
2020-05-10 19:26:55 LaCrosse LaCrosse_39 is_raining_Indikator: 1
2020-05-10 19:27:04 LaCrosse LaCrosse_39 is_raining_Indikator: 1
2020-05-10 19:27:09 LaCrosse LaCrosse_39 is_raining_Indikator: 1


Events gibt es eigentlich reichlich.

Ich vermute das es am userreading liegt. Warum auch immer. Ich werde es mal mit nem anderen Reading testen.

Grüße

Damian

Ich weiß nicht, ob du die Funktionsweise von waitdel richtig verstanden hast, zumindest habe ich deine Definition nicht verstanden.

waitdel unterbindet eine verzögerte Ausführung, wenn innerhalb der angegebenen Zeitspanne, das Ereignis wiederholt eintritt - das willst du aber eigentlich nicht.

Umgekehrt bedeutet es, es wird verzögert etwas ausgeführt, wenn sich ein Ereignis (innerhalb der Zeitspanne) nicht wiederholt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Esjay

Zitat von: Damian am 10 Mai 2020, 19:42:40
Ich weiß nicht, ob du die Funktionsweise von waitdel richtig verstanden hast, zumindest habe ich deine Definition nicht verstanden.

waitdel unterbindet eine verzögerte Ausführung, wenn innerhalb der angegebenen Zeitspanne, das Ereignis wiederholt eintritt - das willst du aber eigentlich nicht.

Umgekehrt bedeutet es, es wird verzögert etwas ausgeführt, wenn sich ein Ereignis (innerhalb der Zeitspanne) nicht wiederholt.

Wieso möchte ich das nicht?

([LaCrosse_39:is_raining_indikator] < 1) (setreading LaCrosse_39 needRain 1 ) DOELSE (setreading LaCrosse_39 needRain 0 )

Ich mache doch hier nichts anderes , als folgendes.

Wenn der Wert "is_raining_indikator" kleiner 1 ist, setzte needRain auf 1 ansonsten auf 0
Durch das waitdel muss "is_raining_indikator" meinem Verständnis nach mindestens 15 Sekunden unter 1 sein, damit das Reading "needRain" auf 1 gesetzt wird.
Sollte "is_raining_indikator" in den 15 Sekunden über 1 steigen, wird sobald "is_raining_indikator" wieder unter 1 fällt geprüft werden, ob er wieder mindestens für 15 Sekunden unter 1 ist.

Scheibar macht das Userreading zusätzlich probleme. Mit einem dummy nachgestellt, tut das DOIF zumindest schonmal etwas.

Grüße

Damian

Zitat von: Esjay am 11 Mai 2020, 10:34:49
Wieso möchte ich das nicht?

([LaCrosse_39:is_raining_indikator] < 1) (setreading LaCrosse_39 needRain 1 ) DOELSE (setreading LaCrosse_39 needRain 0 )

Ich mache doch hier nichts anderes , als folgendes.

Wenn der Wert "is_raining_indikator" kleiner 1 ist, setzte needRain auf 1 ansonsten auf 0
Durch das waitdel muss "is_raining_indikator" meinem Verständnis nach mindestens 15 Sekunden unter 1 sein, damit das Reading "needRain" auf 1 gesetzt wird.
Sollte "is_raining_indikator" in den 15 Sekunden über 1 steigen, wird sobald "is_raining_indikator" wieder unter 1 fällt geprüft werden, ob er wieder mindestens für 15 Sekunden unter 1 ist.

Scheibar macht das Userreading zusätzlich probleme. Mit einem dummy nachgestellt, tut das DOIF zumindest schonmal etwas.

Grüße

Das was du vorhast, ist die typische Funktion eines normalen wait-Attributes.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Esjay

Ok, jetzt passt es.. Danke für die Hilfe.


Grüße