FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: fireball am 09 Juni 2026, 15:48:01

Titel: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 09 Juni 2026, 15:48:01
Hi Freunde,

ich habe ne kurze Frage, ich hab eine Bewässerungssteuerung mit DOIF implementiert und die läuft seit Jahren gut.
Ich habe ne klein Verbesserung, aber weiß nicht genau wie ich das abfrage.

Wenn es genug geregnet hat oder es gerade regnet, dann setze ich einen Dummy auf "off-for-timer xxxx"

Ich würde jetzt gern in einer DOIF Bedingung noch abfragen ob der Timer läuft und dann eine Bedingung nicht ausführen:

Ich hatte erst:
DOELSEIF([Wetterstation:israining:d] == 1 && [Gartenbewaesserung] ne "off-for-timer")

das funzt aber nicht, weil ja auch noch ne Zahl hinter off-for-timer ist
Viell. geht das ja mit nem regulären Ausdruck wie off-for-timer.*

oder die KI hat mir grad folgendes vorgeschlagen?! Geht das?

DOELSEIF([Wetterstation:israining:d] == 1 && [Gartenbewaesserung:wait_timer] > 0)

Also ich will einfach verhindern, wenn der off-for-timer läuft, dass die Bedingung nochmal ausgeführt wird.

VG+Danke
René

Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Guybrush am 09 Juni 2026, 16:46:06
wenn Gartenbewaesserung dein dummy device ist und off-for-timer immer eine Zahl, würde doch [Gartenbewaesserung:off-for-timer:d] > 0 doch passen? ansonsten kannst du im doif auch per regex vergleichen. da dann zb mit [Gartenbewaesserung] =~ /off-for-timer\s\d+/ . Ich denke aber mal, dass off-for-timer ein reading in deinem dummy device ist?
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 09 Juni 2026, 16:57:30
Hi,

ja Gartenbewässerung ist mein Dummy und mit useSetExtensions=1 erweitert, sodass man die erweiterten on/off-for-timer Funktionen hat. siehe Bild.
off-for-timer steht im state... dann müsste der Regex den du vorgeschlagen hast ja auf [Gartenbewaesserung:state] oder sogar rein auf [Gartenbewaesserung] funktionieren.
Ein spezielles Reading gibts dafür nicht.

Hatte nur dieses [Gartenbewaesserung:wait_timer] gefunden, was wohl intern genutzt wird, aber nicht als Reading sichtbar ist.


VG
René

Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 09 Juni 2026, 19:26:27
Wie wäre es mit einem List des DOIF und aller Devices, die beteiligt sind?
Screenshots helfen nicht und werden ungern gesehen.
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Damian am 09 Juni 2026, 20:07:07
Ich würde den off-for-timer über einen Zweig im DOIF-Device mit wait realisieren, wenn eine andere Bedingung des DOIF-Devices zuschlägt, wird der wartende Zweig automatisch abgebrochen.
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 09 Juni 2026, 21:40:44
Hi,

gern hier ein list des DOIFs, wobei ich denke, dass das nicht hilfreich ist... das DOIF funzt ja.

Internals:
   DEF        ([04:45] && ([Wetterstation:rain_yesterday:d] + [Wetterstation:rain_day:d]) > 20) (
    set Gartenbewaesserung off-for-timer 172750,
    set Meine_TGBot message "Es hat die letzten 24h genug geregnet, ich stelle die Gartenbewässerung für 2 Tage aus."
)
DOELSEIF([04:45] && ([Wetterstation:rain_yesterday:d] + [Wetterstation:rain_day:d]) >= 10) (
    set Gartenbewaesserung off,
    set Meine_TGBot message "Es hat die letzten 24h genug geregnet, ich stelle die Gartenbewässerung für 1 Tag aus."
)
DOELSEIF([04:45] && [Gartenbewaesserung] eq "off-for-timer" ) (
    set Gartenbewaesserung off,
    set Meine_TGBot message "Die Gartenbewässerung ist noch für einen Tag deaktiviert."
)
DOELSEIF([04:45] && ([Wetterstation:rain_yesterday:d] + [Wetterstation:rain_day:d]) < 10)
(
    set Gartenbewaesserung on
)
DOELSEIF([Wetterstation:israining:d] == 1 && [Gartenbewaesserung:wait_timer] > 0)
(
    set Gartenbewaesserung off-for-timer 10800,
    set Meine_TGBot message "Es regnet, ich stelle die Bewässerung für 3 Stunden aus."
)
   FUUID      64a18203-f33f-0804-0228-9ed30d9ef74133a1
   MODEL      FHEM
   NAME       Bewaesserung_Steuerung
   NOTIFYDEV  Gartenbewaesserung,Wetterstation,global
   NR         637
   NTFY_ORDER 50-Bewaesserung_Steuerung
   STATE      initialized
   TYPE       DOIF
   VERSION    30659 2025-12-25 12:37:16
   eventCount 56
   READINGS:
     2026-06-09 17:22:41   Device          Gartenbewaesserung
     2026-06-09 14:44:01   cmd             0
     2026-06-09 17:22:41   e_Gartenbewaesserung_STATE on
     2026-06-09 14:44:01   mode            enabled
     2026-06-09 14:44:01   state           initialized
     2026-06-09 14:44:01   timer_01_c01    10.06.2026 04:45:00
     2026-06-09 14:44:01   timer_02_c02    10.06.2026 04:45:00
     2026-06-09 14:44:01   timer_03_c03    10.06.2026 04:45:00
     2026-06-09 14:44:01   timer_04_c04    10.06.2026 04:45:00
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Gartenbewaesserung:
         0:
         1:
         2:
           &STATE     ^Gartenbewaesserung$
         3:
         4:
           wait_timer ^Gartenbewaesserung$:^wait_timer:
       Wetterstation:
         0:
           rain_day   ^Wetterstation$:^rain_day:
           rain_yesterday ^Wetterstation$:^rain_yesterday:
         1:
           rain_day   ^Wetterstation$:^rain_day:
           rain_yesterday ^Wetterstation$:^rain_yesterday:
         3:
           rain_day   ^Wetterstation$:^rain_day:
           rain_yesterday ^Wetterstation$:^rain_yesterday:
         4:
           israining  ^Wetterstation$:^israining:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) && (::ReadingValDoIf($hash,'Wetterstation','rain_yesterday','','d') + ::ReadingValDoIf($hash,'Wetterstation','rain_day','','d')) > 20
     1          ::DOIF_time_once($hash,1,$wday) && (::ReadingValDoIf($hash,'Wetterstation','rain_yesterday','','d') + ::ReadingValDoIf($hash,'Wetterstation','rain_day','','d')) >= 10
     2          ::DOIF_time_once($hash,2,$wday) && ::InternalDoIf($hash,'Gartenbewaesserung','STATE') eq "off-for-timer"
     3          ::DOIF_time_once($hash,3,$wday) && (::ReadingValDoIf($hash,'Wetterstation','rain_yesterday','','d') + ::ReadingValDoIf($hash,'Wetterstation','rain_day','','d')) < 10
     4          ::ReadingValDoIf($hash,'Wetterstation','israining','','d') == 1 && ::ReadingValDoIf($hash,'Gartenbewaesserung','wait_timer') > 0
   days:
   do:
     0:
       0               set Gartenbewaesserung off-for-timer 172750,     set Meine_TGBot message "Es hat die letzten 24h genug geregnet, ich stelle die Gartenbewässerung für 2 Tage aus."
     1:
       0               set Gartenbewaesserung off,     set Meine_TGBot message "Es hat die letzten 24h genug geregnet, ich stelle die Gartenbewässerung für 1 Tag aus."
     2:
       0               set Gartenbewaesserung off,     set Meine_TGBot message "Die Gartenbewässerung ist noch für einen Tag deaktiviert."
     3:
       0               set Gartenbewaesserung on
     4:
       0               set Gartenbewaesserung off-for-timer 10800,     set Meine_TGBot message "Es regnet, ich stelle die Bewässerung für 3 Stunden aus."
     5:
   helper:
     NOTIFYDEV  Gartenbewaesserung,Wetterstation,global
     event      on
     globalinit 1
     last_timer 4
     sleeptimer -1
     triggerDev Gartenbewaesserung
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     all         Gartenbewaesserung:STATE
   intervalfunc:
   localtime:
     0          1781059500
     1          1781059500
     2          1781059500
     3          1781059500
   readings:
     all         Wetterstation:rain_yesterday Wetterstation:rain_day Wetterstation:israining Gartenbewaesserung:wait_timer
   realtime:
     0          04:45:00
     1          04:45:00
     2          04:45:00
     3          04:45:00
   time:
     0          04:45:00
     1          04:45:00
     2          04:45:00
     3          04:45:00
   timeCond:
     0          0
     1          1
     2          2
     3          3
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     0           0
     1           1
     2           2
     3           3
   trigger:
   triggertime:
     1781059500:
       localtime  1781059500
       hash:
   uiState:
   uiTable:
Attributes:
   icon       helper_doif
   room       GARTEN
   verbose    0

Aber dann kurz zur Erklärung... das DOIF entscheidet, die ersten beiden Bedingungen, wieviel es am Vortag geregnet hat und setzt die Bewässerung aus, in dem es dem Dummy Gartenbewaesserung verschieden lange off-for-timer setzt.

Wenn jetzt zwischendurch aber ein Regenschauer kommt, dann sprang bisher die letzte Bedingung an, die nur geprüft hat [Wetterstation:israining:d] == 1.
Dadurch wird aber der Abschaltvorgang für 1 oder 2 Tage unterbrochen und auf 3h reduziert.

Jetzt möchte ich die letzte Bedingung um den 2. Wert erweitern, der fragt, ob schon ein off-for-timer aktiv ist, also && [Gartenbewaesserung] ne "off-for-timer"

Aber nur "off-for-timer" reich nicht, da hinter dem ja noch die Anzahl der Sekunden kommt.
Jetzt wäre ein RegEx sicherlich möglich, aber meine Frage ging ja auch dahin, ob es die Überprüfung auf wait_timer gibt.

Die KI sagte mir
Die richtige Lösung: Prüfen über wait_timer oder next_timer
Wenn du im DOIF einen off-for-timer benutzt, setzt DOIF intern ein Reading:

wait_timer
→ enthält die Restzeit in Sekunden
→ ist > 0, solange der Timer läuft

Wobei es hier ja nicht um das DOIF geht, sondern um ein Dummy-Device, welches als set ein off-for-timer hat"

VG+Danke
René
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 09 Juni 2026, 21:58:19
Macht das alles Sinn?

Du fragst jeden Morgen ab ob es geregnet hat und wenn ja pausierst Du auf komischem Weg.

Warum fragst Du nicht jeden Morgen ob es in letzter Zeit NICHT geregnet hat (ich frage noch ob es heute regnen soll) und starte dann die Bewässerung.
Da brauchst Du keinen Dummy und keine KI.
Natürlich kann man das Grenzwerte einbauen.
Zitat von: fireball am 09 Juni 2026, 21:40:44Dadurch wird aber der Abschaltvorgang für 1 oder 2 Tage unterbrochen und auf 3h reduziert.
Verstehe ich nicht. Das Abschalten wird nicht durchgeführt und auf nur 3 Stunden reduziert?
(Arbeiten wir im gleichen Konzern, da kommt mir sowas oft unter?)
Bei mir läuft das ohne Probleme.
([04:21] and [TTN_Wetterstation_Klima:temperature] > 13 and [Bodenfeuchtesensor_01:soil_moisture] < 80 and [TTN_Wetterstation_Regenmesser:regen_lasttime] < 0.4 and [Regenradar:Prognose] < 0.8 ) (set Gartenbewaesserung_3 on-for-timer 500,setreading $SELF count {([$SELF:count]+1)})
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Guybrush am 09 Juni 2026, 23:46:22
Das sind alles falsche Ansätze aus meiner Sicht. Entscheidend ist doch nicht der Regen, sondern wie lange die Feuchtigkeit unter dem jeweiligen Schwellwert ist. Das ist bei jeder Pflanze anders. Deswegen hab ich das je Pflanze definiert was der Schwellwert ist und wie lange diese trocknen soll.

Z.b ist seit 5 Tagen unter 15%, dann bewässern.. Egal ob es regnen wird oder nicht. Wichtig ist nur genug Wasser und dass die Erde danach immer trocknen kann damit die Pflanze nicht erstickt oder zu faulen beginnt.. die trockenzeit kann man gut über ein userreadings realisieren. dann brauchts nur noch ein soif was die trockenzeit abfragt und mehr nicht..
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 10 Juni 2026, 07:16:53
Zitat von: Guybrush am 09 Juni 2026, 23:46:22Das sind alles falsche Ansätze aus meiner Sicht. Entscheidend ist doch nicht der Regen, sondern wie lange die Feuchtigkeit unter dem jeweiligen Schwellwert ist. Das ist bei jeder Pflanze anders. Deswegen hab ich das je Pflanze definiert was der Schwellwert ist und wie lange diese trocknen soll.
Da widerspreche ich mal, auch wenn wir hiermit eine fachliche Diskussion beginnen und nicht das eigentliche Problem des Themas klären.

Sicherlich kann man in einem Garten jede Pflanze separat bewässern. Ob sich der technische Aufwand dafür lohnt, da zweifle ich mal.
Es ist schon ein besonderer Garten, wenn dort permanent Wasser nicht abfliest.
Der durchschnittliche Mensch giesst seinen Garten, wenn er aus Erfahrung weiß, es ist notwendig und kein Regen angesagt ist. Was anderes wird hier gar nicht nachgebildet.
Bewässern, wenn es regnen soll, dass ist für mich Verschwendung.
Letztendlich passt Deine Darlegung für mich nur für Zimmerpflanzen.

Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 10 Juni 2026, 07:49:39
Hi Freunde,

danke für eure Ansichten und andere Ansätze der Gartenbewässerung, manchmal lohnt es sich ja zu wissen, wie andere es machen oder wenn man einfach zu kompliziert gedacht hat.

Doch hier gehts jetzt am Thema vorbei.

Ich halte meinen Ansatz für den richtigen und werde es auch so lassen... mich interessiert nicht ob es regnen wird, dass sind alles Prognosen und wenn der Regen 3m am Haus vorbeizieht nützt mir das auch nichts.

Ich messe mit der Wetterstation wieviel Regen ist gestern gefallen. Wenn es mega viel war, stelle ich die Bewässerung 2 Tage aus, wenns es die Hälfte war, was mein Garten braucht, dann nur für einen Tag.
Wenn es zu regnen beginnt, wird die Bewässerung (letzte Bedingung) einfach abgeschaltet und am dann wieder geschaut, wieviel es war und dann geht das wieder von vorne los.
So läuft das jetzt seit Jahren gut und jeder muss für sich die beste Lösung finden.

Ich wollte jetzt eigentlich nur wissen, wie ich im DOIF ein Dummy abfragen kann, welches einen off-for-timer gesetzt hat, mehr nicht. Das RegEx ist ok, aber ich finde es einfach einfacher, ein True/False oder eine Zahl abzufragen, als RegEx zu implementieren.

Danke
VG
René
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Damian am 10 Juni 2026, 07:54:16
Wie sieht der Status vom Dummy, wenn der Timer nicht läuft?
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 10 Juni 2026, 07:57:30
Hi,

der Status ist nur on oder off, der hat nur die beiden Werte + die Extentions für *-for-timer.

VG
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 10 Juni 2026, 08:10:59
Zitat von: fireball am 10 Juni 2026, 07:49:39Ich messe mit der Wetterstation wieviel Regen ist gestern gefallen. Wenn es mega viel war, stelle ich die Bewässerung 2 Tage aus, wenns es die Hälfte war, was mein Garten braucht, dann nur für einen Tag.
Wenn es zu regnen beginnt, wird die Bewässerung (letzte Bedingung) einfach abgeschaltet und am dann wieder geschaut, wieviel es war und dann geht das wieder von vorne los.
Bleibt die Frage nach dem Sinn des Dummy. Das geht alles nur mit dem DOIF. Alternativ über (user)-Readings der Wetterstation.
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 10 Juni 2026, 08:15:12
Das will ich dir jetzt nicht erklären, nimms einfach als Platzhalter für Aktivierung/Deaktivierung der Bewässerung...
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 10 Juni 2026, 08:22:47
Zitat von: fireball am 10 Juni 2026, 08:15:12Das will ich dir jetzt nicht erklären, nimms einfach als Platzhalter für Aktivierung/Deaktivierung der Bewässerung...
:o
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Damian am 10 Juni 2026, 08:23:27
Zitat von: fireball am 10 Juni 2026, 07:57:30Hi,

der Status ist nur on oder off, der hat nur die beiden Werte + die Extentions für *-for-timer.

VG

Dann sollte schon [Gartenbewaesserung:"off-for-timer"] ausreichen, um festzustellen ob der Timer aktiv ist, siehe: https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Damian am 10 Juni 2026, 08:32:41
Mein vorheriger Vorschlag reagiert aber nur auf Events, für Abfragen eines Zustands musst du vielmehr nehmen:

[Gartenbewaesserung:state] =~ "off-for-timer"
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: Per am 10 Juni 2026, 18:13:08
Zitat von: fireball am 10 Juni 2026, 07:49:39Wenn es mega viel war, stelle ich die Bewässerung 2 Tage aus, wenns es die Hälfte war, was mein Garten braucht, dann nur für einen Tag.
Teste doch einfach jeden Tag und teile die Menge durch den zeitlichen Abstand. Bist du unter einem passenden Wert, dann Regner an.
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: rabehd am 10 Juni 2026, 18:15:55
Zitat von: Per am 10 Juni 2026, 18:13:08Teste doch einfach jeden Tag und teile die Menge durch den zeitlichen Abstand. Bist du unter einem passenden Wert, dann Regner an.
Zitat von: fireball am 10 Juni 2026, 07:49:39Ich halte meinen Ansatz für den richtigen und werde es auch so lassen...
Titel: Aw: Im DOIF einen *-for-timer abfragen
Beitrag von: fireball am 10 Juni 2026, 20:14:15
Zitat von: Per am 10 Juni 2026, 18:13:08
Zitat von: fireball am 10 Juni 2026, 07:49:39Wenn es mega viel war, stelle ich die Bewässerung 2 Tage aus, wenns es die Hälfte war, was mein Garten braucht, dann nur für einen Tag.
Teste doch einfach jeden Tag und teile die Menge durch den zeitlichen Abstand. Bist du unter einem passenden Wert, dann Regner an.

Hi, wenn du dir mein DOIF anschaust, dann siehst du, dass jeden Tag gecheckt wird, wieviel Niederschlag am Vortag gefallen ist und dann wird der Timer neu gesetzt.
Einzige Ausnahme ist die letzte Bedingung, die dafür sorgt, dass wenn es nur kurzzeitig regnet, der Timer nicht überschrieben werden soll.

VG
René