Hauptmenü

DOIF internen timer abfragen

Begonnen von KlaGho, 25 Mai 2025, 13:42:03

Vorheriges Thema - Nächstes Thema

KlaGho

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


rabehd

Auch funktionierende Lösungen kann man hinterfragen.

KlaGho

Weil ich noch weitere Befehle zur begrenzten Wiederholung anfügen möchte.
Watchdogs sind mir bekannt 😊

rabehd

Ich nutze den readingswatcher und auf dessen Änderungen habe ich ein DOIF gesetzt.
Auch funktionierende Lösungen kann man hinterfragen.

KlaGho


KlaGho

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.

tobi01001

#6
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).
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

KlaGho

#7
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.