Hallo,ich habe folgendes Problem: ein DOIF soll einen Sensor auf ausbleibende Werte überwachen (Beispiel aus dem Forum); funktioniert auch :)
Nun möchte ich den jeweils neuesten Timerzustand (timer_01_c01) z.B als stateformat anzeigen lassen. Da das Modul nur beim Fehler (also periodische Abfrage UND Wert älter als ...) triggert habe,habe ich versucht über eine zweite Abfrage ([time]) ein sebsttriggern zu erzwingen. Ich bekomme aber trotzdem nicht das korrekte Reading (checktime).
Als workaround habe ich ein weiteres DOIF, welches durch das erste DOIF getriggert wird und hier das gewünschte Reading erzeugt.
Ist also von hinten durch die Brust ins Auge programiert.
Ich denke das geht auch anders??????
Bin für Hinweise dankbar
PS: ich habe mit den Att. wait,selftrigger keinen Erfolg gehabt
define di_Aussen_monitor DOIF ([+00:00:10] and [?Aussen:temperature:sec]>10*60)(set telebot msg Aussen defekt)\
DOELSEIF ([+00:00:10]) (setreading $SELF checktime [$SELF:timer_01_c01])
attr di_Aussen_monitor do always
attr di_Aussen_monitor room ,1,Watchdogs
attr di_Aussen_monitor selftrigger wait
attr di_Aussen_monitor stateFormat checktime
attr di_Aussen_monitor wait 0:1
# DEF ([+00:00:10] and [?Aussen:temperature:sec]>10*60)(set telebot msg Aussen defekt)
#DOELSEIF ([+00:00:10]) (setreading $SELF checktime [$SELF:timer_01_c01])
# FUUID 6830ac22-f33f-3b2b-0a0d-ee3267878ff99367
# MODEL FHEM
# NAME di_Aussen_monitor
# NOTIFYDEV global
# NR 74
# NTFY_ORDER 50-di_Aussen_monitor
# STATE 25.05.2025 12:47:09
# TYPE DOIF
# VERSION 29460 2024-12-29 20:25:48
# eventCount 300
# OLDREADINGS:
# READINGS:
# 2025-05-25 12:47:09 checktime 25.05.2025 12:47:09
# 2025-05-25 12:47:09 cmd 2
# 2025-05-25 12:47:09 cmd_event timer_2
# 2025-05-25 12:47:09 cmd_nr 2
# 2025-05-25 12:45:29 mode enabled
# 2025-05-25 12:47:09 state cmd_2
# 2025-05-25 12:47:09 timer_01_c01 25.05.2025 12:47:19
# 2025-05-25 12:47:09 timer_02_c02 25.05.2025 12:47:19
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# attr:
# cmdState:
# repeatcmd:
# repeatsame:
# wait:
# 0:
# 0
# 1:
# 1
# waitdel:
# condition:
# 0 ::DOIF_time_once($hash,0,$wday) and ::ReadingSecDoIf('Aussen','temperature')>10*60
# 1 ::DOIF_time_once($hash,1,$wday)
# days:
# do:
# 0:
# 0 set telebot msg Aussen defekt
# 1:
# 0 setreading di_Aussen_monitor checktime [di_Aussen_monitor:timer_01_c01]
# 2:
# helper:
# NOTIFYDEV global
# event timer_2
# globalinit 1
# last_timer 2
# sleeptimer -1
# timerdev
# timerevent timer_2
# triggerDev
# DOIF_eventa:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# cmd_2
# DOIF_eventas:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# state: cmd_2
# timerevents:
# timer_2
# timereventsState:
# timer_2
# triggerEvents:
# timer_2
# triggerEventsState:
# timer_2
# interval:
# intervalfunc:
# localtime:
# 0 1748170039
# 1 1748170039
# realtime:
# 0 12:47:19
# 1 12:47:19
# time:
# 0 +00:00:10
# 1 +00:00:10
# timeCond:
# 0 0
# 1 1
# timer:
# 0 0
# 1 0
# timers:
# 0 0
# 1 1
# triggertime:
# 1748170039:
# localtime 1748170039
# hash:
# uiState:
# uiTable:
#
setstate di_Aussen_monitor 25.05.2025 12:47:09
setstate di_Aussen_monitor 2025-05-25 12:47:09 checktime 25.05.2025 12:47:09
setstate di_Aussen_monitor 2025-05-25 12:47:09 cmd 2
setstate di_Aussen_monitor 2025-05-25 12:47:09 cmd_event timer_2
setstate di_Aussen_monitor 2025-05-25 12:47:09 cmd_nr 2
setstate di_Aussen_monitor 2025-05-25 12:45:29 mode enabled
setstate di_Aussen_monitor 2025-05-25 12:47:09 state cmd_2
setstate di_Aussen_monitor 2025-05-25 12:47:09 timer_01_c01 25.05.2025 12:47:19
setstate di_Aussen_monitor 2025-05-25 12:47:09 timer_02_c02 25.05.2025 12:47:19
Hier das "Helper DOIF":
define di_Aussen_monitor1 DOIF ([di_Aussen_monitor:"^cmd:.2$"])(setreading $SELF checktime [$DEVICE:timer_01_c01])
attr di_Aussen_monitor1 do always
attr di_Aussen_monitor1 stateFormat checktime
attr di_Aussen_monitor1 wait 1
# CFGFN
# DEF ([di_Aussen_monitor:"^cmd:.2$"])(setreading $SELF checktime [$DEVICE:timer_01_c01])
# FUUID 6832e2ad-f33f-3b2b-8dcd-110f4505b87029a9
# MODEL FHEM
# NAME di_Aussen_monitor1
# NOTIFYDEV di_Aussen_monitor,global
# NR 75
# NTFY_ORDER 50-di_aussen_monitor1
# STATE 25.05.2025 13:38:19
# TYPE DOIF
# VERSION 29460 2024-12-29 20:25:48
# eventCount 1716
# READINGS:
# 2025-05-25 13:38:09 Device di_Aussen_monitor
# 2025-05-25 13:38:10 checktime 25.05.2025 13:38:19
# 2025-05-25 13:38:10 cmd 1
# 2025-05-25 13:38:10 cmd_event di_Aussen_monitor
# 2025-05-25 13:38:10 cmd_nr 1
# 2025-05-25 13:38:09 e_di_Aussen_monitor_events cmd_nr: 2,cmd: 2,cmd_event: timer_2,cmd_2
# 2025-05-25 12:44:39 mode enabled
# 2025-05-25 13:38:10 state cmd_1
# 2025-05-25 13:38:10 wait_timer no timer
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# di_Aussen_monitor:
# 0:
# &STATE ^di_Aussen_monitor$
# attr:
# cmdState:
# wait:
# 0:
# 1
# waitdel:
# condition:
# 0 ::EventDoIf('di_Aussen_monitor',$hash,'^cmd:.2$',1)
# do:
# 0:
# 0 setreading di_Aussen_monitor1 checktime [$DEVICE:timer_01_c01]
# 1:
# helper:
# NOTIFYDEV di_Aussen_monitor,global
# event cmd: 2
# globalinit 1
# last_timer 0
# sleepdevice di_Aussen_monitor
# sleepsubtimer -1
# sleeptimer -1
# timerdev di_Aussen_monitor
# timerevent cmd: 2
# triggerDev di_Aussen_monitor
# DOIF_eventa:
# cmd_nr: 1
# cmd: 1
# cmd_event: di_Aussen_monitor
# cmd_1
# DOIF_eventas:
# cmd_nr: 1
# cmd: 1
# cmd_event: di_Aussen_monitor
# state: cmd_1
# timerevents:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# cmd_2
# timereventsState:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# state: cmd_2
# triggerEvents:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# cmd_2
# triggerEventsState:
# cmd_nr: 2
# cmd: 2
# cmd_event: timer_2
# state: cmd_2
# internals:
# readings:
# trigger:
# all di_Aussen_monitor
# uiState:
# uiTable:
#
setstate di_Aussen_monitor1 25.05.2025 13:38:19
setstate di_Aussen_monitor1 2025-05-25 13:38:09 Device di_Aussen_monitor
setstate di_Aussen_monitor1 2025-05-25 13:38:10 checktime 25.05.2025 13:38:19
setstate di_Aussen_monitor1 2025-05-25 13:38:10 cmd 1
setstate di_Aussen_monitor1 2025-05-25 13:38:10 cmd_event di_Aussen_monitor
setstate di_Aussen_monitor1 2025-05-25 13:38:10 cmd_nr 1
setstate di_Aussen_monitor1 2025-05-25 13:38:09 e_di_Aussen_monitor_events cmd_nr: 2,cmd: 2,cmd_event: timer_2,cmd_2
setstate di_Aussen_monitor1 2025-05-25 12:44:39 mode enabled
setstate di_Aussen_monitor1 2025-05-25 13:38:10 state cmd_1
setstate di_Aussen_monitor1 2025-05-25 13:38:10 wait_timer no timer
Ich verstehe die Lösung nicht.
Warum nicht https://wiki.fhem.de/wiki/Watchdog (https://wiki.fhem.de/wiki/Watchdog)
Weil ich noch weitere Befehle zur begrenzten Wiederholung anfügen möchte.
Watchdogs sind mir bekannt 😊
Ich nutze den readingswatcher und auf dessen Änderungen habe ich ein DOIF gesetzt.
Auch eine Idee, cool
Es ging mir um das Prinzip einfach den nächsten Timerzustand darzustellen: der ist ja zumindest dem Modul bekannt und dem User (leider) erst nach Aktualisierung der webseite.
Im Perl-Modus wird der Block mit entsprechendem Trigger glaube ich immer getriggert und mit "set_State(...)" kannst du dir den Status setzen.
Das setzt sowohl state reading als auch das internal STATE und sollte für stateFormat funktionieren.
defmod di_TestTimerState DOIF \
testState\
{\
if([+00:00:10])\
{\
my $tmr01 = ReadingsVal("$SELF", "timer_01_c01", "none");;\
set_State($tmr01);;\
}\
}
Edit: Das funktioniert auch ohne stateFormat, da der state ja direkt gesetzt wird. Aber Achtung: Das aktualisiert den timer, der läuft meines Wissens unabhängig der anderen Bedingung(en).
Der Verdacht lag nahe, dass es im perlmodus funktionieren würde:
Vielen Dank für das Beispiel
Nachtrag: bei mir zeigt das perl-Beispiel auch NUR den vorherigen timer-wert an und NICHT den neuen
Ich möchte also wissen/anzeigen wann die nächste Abfrage des DOIF erfolgen wird. Diese Info bekommt man in der Webansicht, wenn man diese aktualisiert.
Bei meiner Hilfskontruktion mit dem 2. DOIF ist daher auch ein wait (mindestens 1 Sekunde nötig.