[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

Moin zusammen,
ich versuche mich jetzt schon seit ein paar Tagen an der DOIF Lösung, es will aber nicht klappen. Zum Glück regnet es alle Nase lang, damit geht die Testerei recht gut (hi).
Das Reading "raining" wird per setreading sauber gesetzt, aber nach den gewünschten 10min ohne Regen wird es nicht zurückgesetzt.
Dazu bräuchte ich euren Tipp!

VG Helmut

Szenario:
Ich habe einen TFA-Drop, der Regen meldet, aber kein Reading "raining" hat. Das soll also durch ein DOIF erzeugt werden.
List vom Sensor, nur Readings und Attribute:
Internals:
     2021-06-03 19:24:22   batteryChanged  1
     2021-07-28 15:08:07   batteryState    ok
     2021-07-28 15:08:07   rain_total      218.44
     2021-07-28 15:03:38   raining         1
     2021-07-28 15:08:07   rawRainCounter  860
     2021-07-28 15:08:07   sendCounter     4
     2021-07-28 15:03:37   statRain_total  Hour: 0.762 Day: 1.524 Month: 133.858 Year: 218.440 (since: 2021-06-04 )
     2021-07-28 14:59:55   statRain_totalLast Hour: 0.508 Day: 5.842 Month: 84.582 Year: 17.526 (since: 2021-06-04 )
     2021-07-28 15:03:37   statRain_totalMonth 133.858
     2021-06-30 23:59:55   statRain_totalMonthLast 84.582
     2021-07-28 15:08:07   state           R: 218.44
     2021-07-28 15:08:07   type            TFA 30.3233.01
   helper:
     _98_statistics Statistik
Attributes:
   alias      Regensensor
   event-on-change-reading batteryChanged,batteryState,rain_total,raining,rawRainCounter,state
   group      Regensensor
   icon       weather_rain
   room       Aussen,Wetter
   stateFormat statRain_total


Hier das zugehörige DOIF. Die Def wurde über den Eventmonitor angelegt. Der Trigger ist der rawRainCounter, der vom TFA Drop jeweils um 1 hochgezählt wird. Die Idee ist, der Trigger wird gesetzt  und DOIF führt cmd1 aus. Das funktioniert. Wenn der Trigger 10min (attr repeatcmd) nicht geändert wurde (der bleibt wirklich auf dem Wert 860), dann soll cmd2 ausgeführt werden.
Irgendwo muss also ein Denkfehler sein, den ich nicht finde.

Internals:
   DEF        ([SD_WS_54_R:"^rawRainCounter:.*$"]) (setreading SD_WS_54_R raining 1) DOELSE (setreading SD_WS_54_R raining 0)
   FUUID      60f01bfc-f33f-27cb-8024-58b0a31505fef514
   MODEL      FHEM
   NAME       Regenerkennung
   NOTIFYDEV  global,SD_WS_54_R
   NR         1069
   NTFY_ORDER 50-Regenerkennung
   STATE      Es regnet
   TYPE       DOIF
   VERSION    24755 2021-07-15 16:40:59
   READINGS:
     2021-07-28 15:03:37   Device          SD_WS_54_R
     2021-07-28 15:03:38   cmd             1
     2021-07-28 15:03:38   cmd_event       SD_WS_54_R
     2021-07-28 15:03:38   cmd_nr          1
     2021-07-28 15:03:37   e_SD_WS_54_R_events R: 218.44,rawRainCounter: 860,rain_total: 218.44
     2021-07-15 13:33:56   mode            enabled
     2021-07-28 15:03:38   state           Es regnet
     2021-07-28 15:03:38   wait_timer      28.07.2021 15:13:38 cmd_1 SD_WS_54_R
   Regex:
     accu:
     collect:
     cond:
       SD_WS_54_R:
         0:
           &STATE     ^SD_WS_54_R$
   attr:
     cmdState:
       0:
         Es regnet
       1:
         Es regnet nicht
     repeatcmd:
       600
     wait:
       0:
         1
     waitdel:
   condition:
     0          ::EventDoIf('SD_WS_54_R',$hash,'^rawRainCounter:.*$',1)
   do:
     0:
       0          setreading SD_WS_54_R raining 1
     1:
       0          setreading SD_WS_54_R raining 0
   helper:
     DEVFILTER  ^global$|^SD_WS_54_R$
     NOTIFYDEV  global|SD_WS_54_R
     event      rawRainCounter: 860
     globalinit 1
     last_timer 0
     sleepdevice SD_WS_54_R
     sleepsubtimer 0
     sleeptimer 0
     timerdev   SD_WS_54_R
     timerevent rawRainCounter: 860
     triggerDev SD_WS_54_R
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: SD_WS_54_R
       Es regnet
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: SD_WS_54_R
       state: Es regnet
     timerevents:
       R: 218.44
       rawRainCounter: 860
       rain_total: 218.44
     timereventsState:
       state: R: 218.44
       rawRainCounter: 860
       rain_total: 218.44
     triggerEvents:
       R: 218.44
       rawRainCounter: 860
       rain_total: 218.44
     triggerEventsState:
       state: R: 218.44
       rawRainCounter: 860
       rain_total: 218.44
   internals:
   perlblock:
   readings:
   trigger:
     all         SD_WS_54_R
   uiState:
   uiTable:
Attributes:
   cmdState   Es regnet|Es regnet nicht
   do         resetwait
   repeatcmd  600
   room       System
   wait       1
Ein Weg wird erst zu einem Weg, wenn man ihn geht

MadMax-FHEM

Warum nicht "einfach" ein notify wie das hier (RAWDEF) ;)  :


defmod nRegenerkennung notify SD_WS_54_R:rawRainCounter:.* setreading SD_WS_54_R raining 1 ;;defmod atRain at +00:10:00 setreading SD_WS_54_R raining 0


RegEx des notify kannst du ja noch anpassen, sollte aber ja bei jedem Event/Änderung des rawRainCounter das Reading raining setzen und wenn eben kein Event/Änderung mehr kommt durch das at zurückgesetzt werden... Ansonsten wird (doch neuer Event) das at eben wieder auf 10min "modifiziert"... Wenn man möchte kann man auch noch einbauen, dass nur gesetzt wird, wenn nicht schon gesetzt etc.

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)

isy

Hi Joachim,
Danke sehr!

Mit notify probiere ich aus, die RegExp hatte ich schon für eine Regen-Email eingerichtet.

VG Helmut

P.S: Die DOIF Lösung interessiert mich dennoch.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

MadMax-FHEM

Zitat von: isy am 28 Juli 2021, 17:18:11
Hi Joachim,
Danke sehr!

VG Helmut

Hallo Helmut,

gerne, viel Erfolg!


Zitat von: isy am 28 Juli 2021, 17:18:11
P.S: Die DOIF Lösung interessiert mich dennoch.

Da musst du dann abwarten...
...ich nutze DOIF nicht...

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

z.B.

([SD_WS_54_R:"^rawRainCounter:.*$"]) (setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0)

Attribute:
   cmdState   Es regnet|Es regnet nicht
   do resetwait
   wait  0,600


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

isy

Aha, ich denke, verstehe die Logik, Damian.
Danke ebenso!

Teste ich morgen
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Damian

Zitat von: isy am 28 Juli 2021, 23:12:26
Aha, ich denke, verstehe die Logik, Damian.
Danke ebenso!

Teste ich morgen

Der Vorteil dieser Lösung ist, dass "setreading SD_WS_54_R raining 1" nur beim Einsetzen des Regens ausgeführt wird und nicht wiederholt wird, wenn es regnet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

isy

Also das DOIF funktioniert.

@Joachim: Wenn es noch mal passt, ich hätte eine Frage zum Syntax.
defmod nRegenerkennung notify SD_WS_54_R:rawRainCounter:.* setreading SD_WS_54_R raining 1 ;;defmod atRain at +00:10:00 setreading SD_WS_54_R raining 0

Das 1. setreading wird genau so , also alles ab der "1", in das Reading eingetragen, quasi als Text.
Was mache ich falsch?

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

MadMax-FHEM

Wo/wie hast du es denn eingegeben?

Es ist als RAWDEF gepostet worden und muss daher auch als solches eingegeben werden.

Wenn du es per DEF eingibst, dann einen Strichpunkt weglassen...

Bzw. sehe ich gerade, dass ich das notify mit on/off bei mir getestet hatte.
Ich probiere das noch mal mit 1/0 aus (nicht, dass das was ausmacht) EDIT: nö, geht auch mit 1/0...

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)

isy

Das wird es sein, denn das Notify war ja schon da.
Ich habe den Rest nach rawRainCounter:.* einfach kopiert.

Also dann nur ein Semikolon.
Vielen Dank, probiere ich aus.

Viele Grüße, Helmut

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

isy

Zitat von: Damian am 28 Juli 2021, 23:19:00
Der Vorteil dieser Lösung ist, dass "setreading SD_WS_54_R raining 1" nur beim Einsetzen des Regens ausgeführt wird und nicht wiederholt wird, wenn es regnet.

Hallo Damian,
das Reading im TFA Drop "Es regnet" bzw. "Es regnet nicht" wird sauber gesetzt.
Nur der Status des DOIF bleibt auf state "Es regnet". Das ist nicht schlimm, nur etwas unsauber.

Ich habe jetzt die Definition mit meinen Kenntnissen geändert, geht leider auch nicht.
- set Regenerkennung cmd_2 hinzugefügt
- DOELSE Zweig eingeführt, damit es den cmd_2 Status gibt.
Alles Murks, Kenntnisse reichen nicht aus.

Siehe List. Kann man da noch was verbessern?

Internals:
   DEF        ([SD_WS_54_R:"^rawRainCounter:.*$"]) (setreading SD_WS_54_R raining 1) (setreading SD_WS_54_R raining 0, set Regenerkennung cmd_2) DOELSE (setreading SD_WS_54_R raining 0)
   FUUID      60f01bfc-f33f-27cb-8024-58b0a31505fef514
   MODEL      FHEM
   NAME       Regenerkennung
   NOTIFYDEV  SD_WS_54_R,global
   NR         1072
   NTFY_ORDER 50-Regenerkennung
   STATE      Es regnet
   TYPE       DOIF
   VERSION    24755 2021-07-15 16:40:59
   READINGS:
     2021-08-02 12:17:08   Device          SD_WS_54_R
     2021-08-02 12:27:08   cmd             1.2
     2021-08-02 12:27:08   cmd_event       set_cmd_1
     2021-08-02 12:27:08   cmd_nr          1
     2021-08-02 12:27:08   cmd_seqnr       2
     2021-08-02 12:17:08   e_SD_WS_54_R_events raining: 1
     2021-08-02 12:16:39   mode            enabled
     2021-08-02 12:27:08   state           Es regnet
     2021-08-02 12:27:08   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       SD_WS_54_R:
         0:
           &STATE     ^SD_WS_54_R$
   attr:
     cmdState:
       0:
         Es regnet
       1:
         Es regnet nicht
     wait:
       0:
         0
         600
     waitdel:
   condition:
     0          ::EventDoIf('SD_WS_54_R',$hash,'^rawRainCounter:.*$',1)
   do:
     0:
       0          setreading SD_WS_54_R raining 1
       1          setreading SD_WS_54_R raining 0, set Regenerkennung cmd_2
     1:
       0          setreading SD_WS_54_R raining 0
   helper:
     DEVFILTER  ^global$|^SD_WS_54_R$
     NOTIFYDEV  global|SD_WS_54_R
     event      raining: 1
     globalinit 1
     last_timer 0
     sleepdevice set_cmd_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   SD_WS_54_R
     timerevent raining: 1
     triggerDev SD_WS_54_R
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 2
       cmd_event: set_cmd_1
       Es regnet
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 2
       cmd_event: set_cmd_1
       state: Es regnet
     timerevents:
       raining: 1
       raining: 0
     timereventsState:
       raining: 1
       raining: 0
     triggerEvents:
       raining: 1
       raining: 0
     triggerEventsState:
       raining: 1
       raining: 0
   internals:
   readings:
   trigger:
     all         SD_WS_54_R
   uiState:
   uiTable:
Attributes:
   cmdState   Es regnet|Es regnet nicht
   do         resetwait
   room       System
   wait       0,600

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

isy

Zitat von: isy am 02 August 2021, 11:04:12
Das wird es sein, denn das Notify war ja schon da.
Ich habe den Rest nach rawRainCounter:.* einfach kopiert.

Also dann nur ein Semikolon.
Vielen Dank, probiere ich aus.

Viele Grüße, Helmut

Funktion per notify lauft!
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Damian

Zitat von: isy am 02 August 2021, 12:41:45
Hallo Damian,
das Reading im TFA Drop "Es regnet" bzw. "Es regnet nicht" wird sauber gesetzt.
Nur der Status des DOIF bleibt auf state "Es regnet". Das ist nicht schlimm, nur etwas unsauber.

Ich habe jetzt die Definition mit meinen Kenntnissen geändert, geht leider auch nicht.
- set Regenerkennung cmd_2 hinzugefügt
- DOELSE Zweig eingeführt, damit es den cmd_2 Status gibt.
Alles Murks, Kenntnisse reichen nicht aus.

Siehe List. Kann man da noch was verbessern?

Mit Komma sollte mein ursprünglicher Vorschlag korrekt funktionieren:

cmdState  Es regnet, Es regnet nicht
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

isy

Funktioniert jetzt auch mit dem DOIF
Ich habe allerdings keine Ahnung, warum/wann man beim cmdState mal ein "|" oder ein eben "," einsetzen muss.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

denis.robel

VG

Denis