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é
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?
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é
Wie wäre es mit einem List des DOIF und aller Devices, die beteiligt sind?
Screenshots helfen nicht und werden ungern gesehen.
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.
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é