[Gelöst] DOIF: Reading setzen bei Regen und zurücksetzen nach 10min ohne Regen

Begonnen von isy, 28 Juli 2021, 15:24:53

Vorheriges Thema - Nächstes Thema

isy

Hallo Denis, here we are:

defmod RegenerkennungDOIF DOIF ([SD_WS_54_R:"^rawRainCounter:.*$"]) (sleep 0.1;;setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)
attr RegenerkennungDOIF alias Regenerkennung
attr RegenerkennungDOIF cmdState Es regnet,Es regnet nicht
attr RegenerkennungDOIF do resetwait
attr RegenerkennungDOIF group Regensensor
attr RegenerkennungDOIF icon weather_rain
attr RegenerkennungDOIF room Aussen,System,Wetter
attr RegenerkennungDOIF wait 0,300


Ein Weg wird erst zu einem Weg, wenn man ihn geht

Damian

Zitat von: isy am 23 September 2021, 09:10:29
Hallo Denis, here we are:

defmod RegenerkennungDOIF DOIF ([SD_WS_54_R:"^rawRainCounter:.*$"]) (sleep 0.1;;setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)
attr RegenerkennungDOIF alias Regenerkennung
attr RegenerkennungDOIF cmdState Es regnet,Es regnet nicht
attr RegenerkennungDOIF do resetwait
attr RegenerkennungDOIF group Regensensor
attr RegenerkennungDOIF icon weather_rain
attr RegenerkennungDOIF room Aussen,System,Wetter
attr RegenerkennungDOIF wait 0,300

Warum hast du das erste setreading verzögert?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

denis.robel

Also bei mir bleibt alles im Status es regnet stehen ...

Edit: es wurde nur kurz auf Es regnet nicht geschaltet und dann gleich wieder auf Regen. Hier scheint aber gerade die Sonne.

Edit2: hab den timer mal runter gesetzt, jetzt gehts. Wahrscheinlich wurde der Timer durch Browser reload gestört.
VG

Denis

isy

Zitat von: Damian am 23 September 2021, 17:10:13
Warum hast du das erste setreading verzögert?

Gute Frage, habe ich vergessen. Ich denke, es lag daran, dass setreading SD_WS_54_R raining 1 nicht ausgelöst wurde.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

MadMax-FHEM

Zitat von: isy am 24 September 2021, 12:40:45
Gute Frage, habe ich vergessen. Ich denke, es lag daran, dass setreading SD_WS_54_R raining 1 nicht ausgelöst wurde.

Vermutlich weil IN einer Eventbearbeitung eines Devices ein setreading DESSELBEN Devices nicht geht...
...also nur, wenn man es (wie hier) mit einem kurzen sleep (o.ä.) verzögert.

EDIT: allerdings könnte/sollte bei DOIF auch das wait gehen, also statt wait 0,300 eben wait 1,300 (wobei ich jetzt nicht weiß, welche Werte bei wait in DOIF gehen ;)  Also ob auch kürzer [wie beim sleep] geht)

Denke das gilt auch für DOIF?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Damian

0.1 kann man auch in wait angeben.

Beim verzögerten Setzen eines Readings (setreading) wird das eigene Device wieder getriggert, ohne Verzögerung unterbindet DOIF einen selbstausgelösten Trigger, auf den man im Device reagiert.

Die Verzögerung von 0.1 ist hier wahrscheinlich kontraproduktiv.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

isy

Zitat von: MadMax-FHEM am 24 September 2021, 13:01:10
Vermutlich weil IN einer Eventbearbeitung eines Devices ein setreading DESSELBEN Devices nicht geht...
...also nur, wenn man es (wie hier) mit einem kurzen sleep (o.ä.) verzögert.

EDIT: allerdings könnte/sollte bei DOIF auch das wait gehen, also statt wait 0,300 eben wait 1,300 (wobei ich jetzt nicht weiß, welche Werte bei wait in DOIF gehen ;)  Also ob auch kürzer [wie beim sleep] geht)

Denke das gilt auch für DOIF?

Gruß, Joachim

Genau, das war's!
Ein Weg wird erst zu einem Weg, wenn man ihn geht

denis.robel

Hallo,

Ich hab jetzt am reading raining des SD_WS_54_R zwei notifies dran gehängt, die mir eine Nachricht senden, wenn es regnet bzw. wenn es aufhört zu regnen.
Leider wechselt der Status immer periodisch wie im letzten
attr wait 0,180 
(bzw. 0,300 ) gesetzt, unabhängig davon, ob es regnet oder nicht.

Wo kann ich schauen, was verkehrt läuft?
VG

Denis

isy

Habe die Lösung mit DOIF eingerichtet
defmod RegenerkennungDOIF DOIF ([SD_WS_54_R:"^rawRainCounter:.*$"]) (sleep 0.1;;setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)
attr RegenerkennungDOIF alias Regenerkennung
attr RegenerkennungDOIF cmdState Es regnet,Es regnet nicht
attr RegenerkennungDOIF do resetwait
attr RegenerkennungDOIF group Regensensor
attr RegenerkennungDOIF icon weather_rain
attr RegenerkennungDOIF room Aussen,System,Wetter
attr RegenerkennungDOIF wait 0,300
Ein Weg wird erst zu einem Weg, wenn man ihn geht

denis.robel

Ich bekomme jetzt immer einen Fehler:

sleep 0.1;;setreading SD_WS_54_R raining 1: Last parameter must be quiet

was kann das sein? Ich vermute die Semikolons nach dem sleep spielen eine Rolle...
VG

Denis

isy

Ein Weg wird erst zu einem Weg, wenn man ihn geht

denis.robel


Internals:
   DEF        ([SD_WS_54_R:"^rawRainCounter:.*$"]) (sleep 0.1;setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)


   FUUID      614c96c1-f33f-3305-ef9f-2320b4ded54209c2
   MODEL      FHEM
   NAME       RegenerkennungDOIF
   NOTIFYDEV  global,SD_WS_54_R
   NR         615
   NTFY_ORDER 50-RegenerkennungDOIF
   STATE      Es regnet
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2022-01-19 11:55:28   Device          SD_WS_54_R
     2022-01-19 11:55:28   cmd             1.1
     2022-01-19 11:55:28   cmd_event       SD_WS_54_R
     2022-01-19 11:55:28   cmd_nr          1
     2022-01-19 11:55:28   cmd_seqnr       1
     2022-01-19 11:55:28   e_SD_WS_54_R_events rawRainCounter: 672
     2021-12-02 12:13:52   mode            enabled
     2022-01-19 11:55:28   state           Es regnet
     2022-01-19 11:55:28   wait_timer      19.01.2022 12:00:28 cmd_1_2 SD_WS_54_R
   Regex:
     accu:
     collect:
     cond:
       SD_WS_54_R:
         0:
           &STATE     ^SD_WS_54_R$
   attr:
     cmdState:
       0:
         Es regnet
         Es regnet nicht
     wait:
       0:
         0
         300
     waitdel:
   condition:
     0          ::EventDoIf('SD_WS_54_R',$hash,'^rawRainCounter:.*$',1)
   do:
     0:
       0          sleep 0.1;setreading SD_WS_54_R raining 1
       1          setreading SD_WS_54_R raining 0
     1:
   helper:
     DEVFILTER  ^global$|^SD_WS_54_R$
     NOTIFYDEV  global|SD_WS_54_R
     event      rawRainCounter: 672
     globalinit 1
     last_timer 0
     sleepdevice SD_WS_54_R
     sleepsubtimer 1
     sleeptimer 0
     timerdev   SD_WS_54_R
     timerevent rawRainCounter: 672
     triggerDev SD_WS_54_R
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 1
       cmd_event: SD_WS_54_R
       Es regnet
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 1
       cmd_event: SD_WS_54_R
       state: Es regnet
     timerevents:
       rawRainCounter: 672
     timereventsState:
       rawRainCounter: 672
     triggerEvents:
       rawRainCounter: 672
     triggerEventsState:
       rawRainCounter: 672
   internals:
   perlblock:
   readings:
   trigger:
     all         SD_WS_54_R
   uiState:
   uiTable:
Attributes:
   alias      Regenerkennung
   checkReadingEvent 1
   cmdState   Es regnet,Es regnet nicht
   do         resetwait
   group      Regensensor
   icon       weather_rain
   room       Garten,Haus,Wettervorhersage
   wait       0,300
VG

Denis

Damian

Warum wird ein sleep vorangestellt, wenn man beim wait statt 0 auch 0.1 einstellen kann?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

isy

Thema sleep 0.1;; steht weiter oben im Thread.

In der Oberfläche bzw. bei einem "list" wird bei mir nur 1 ";" angezeigt. Im RAW stehen 2 ";"
Die Einarbeitung der RAW Definition kennst du?

RAW Definition:
defmod RegenerkennungDOIF DOIF ([SD_WS_54_R:"^rawRainCounter:.*$"]) (sleep 0.1;;setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)
attr RegenerkennungDOIF alias Regenerkennung
attr RegenerkennungDOIF cmdState Es regnet,Es regnet nicht
attr RegenerkennungDOIF do resetwait
attr RegenerkennungDOIF group Regensensor
attr RegenerkennungDOIF icon weather_rain
attr RegenerkennungDOIF room Aussen,System,Wetter
attr RegenerkennungDOIF wait 0,300


Ein Weg wird erst zu einem Weg, wenn man ihn geht

Damian

Jetzt mal zum dritten Mal, das sleep ist hier komplett überflüssig:

defmod RegenerkennungDOIF DOIF ([SD_WS_54_R:"^rawRainCounter:.*$"]) (setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)
...
attr RegenerkennungDOIF wait 0.1,300
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF