DOIF und Wait für Lüftersteuerung und Relais

Begonnen von Ruggy, 29 November 2021, 22:32:39

Vorheriges Thema - Nächstes Thema

Ruggy

#15
Hallo,
evlt. ist dies doch eine Anfängerfrage, weil es eigenlich nur um einen Zeitablauf bei DoIF und wait geht.

Habe jetzt schon herumprobiert aber irgendwie funktioniert es nicht.

In kürze, was eigentlich passieren sollte (vorheriges bräuchte dazu nicht unbedingt gelesen werden):

- 1. Relais (HUEDevice18) sofort  für 17 Sekunden auf ein dann auf aus.
- dann nach 20 Sekunden (also 3 Sekunden nachdem 1.Relais auf aus ist) Lüfter für 900 Sekunden einschalten (HUEDevice9).
- 2. Relais (HUEDevice7) 20 Sekunden nachdem der Lüfter ausgeschalten hat (900 Sekunden Laufzeit) für 17 Sekunden auf ein schalten dann wieder aus

Leider schließt das Relais nach ca. 15 min aber der Lüfter ist nach 17 Minuten immer noch gelaufen.

Was mache ich falsch?


Hier das List (mit dem Wait-Befehl):

Internals:
   DEF        ([16:11])
(set HUEDevice18 on-for-timer 17)
(set HUEDevice9 on-for-timer 900)
(set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1638718000.09559
           VALUE      cmd_1
   READINGS:
     2021-12-05 16:26:40   cmd             1.3
     2021-12-05 16:26:40   cmd_event       timer_1
     2021-12-05 16:26:40   cmd_nr          1
     2021-12-05 16:26:40   cmd_seqnr       3
     2021-12-05 16:10:41   mode            enabled
     2021-12-05 16:26:40   state           cmd_1
     2021-12-05 16:11:00   timer_01_c01    06.12.2021 16:11:00
     2021-12-05 16:26:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1638803460
   realtime:
     0          16:11:00
   time:
     0          16:11:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1638803460:
       localtime  1638803460
       hash:
   uiState:
   uiTable:
Attributes:
   room       Kellerlüftung
   wait       0,20,920:0

Ruggy

#16
Ist es wichtig, dass beim DOIF zwischen (set...) (set...) ein Leerzeichen ist?
Kann das ein Fehler gewesen sein?

Hatte kein Leerzeichen dazwischen und eins eingefügt und gespeichert.
Jetzt funktionierte es.

Ruggy

Hallo,
leider funktioniert es immer noch nicht so wie ich es mir vorstelle und komme nicht auf den Fehler.

Wo liegt der Fehler, dass die "Zwangslüftung" um 4:00 Uhr nicht ausgeführt wird?

Anfangs funktionierte es ein paar Mal aber dann nicht mehr.

Hier ist der List von dem DOIF:

Internals:
   DEF        ([04:00])
(set HUEDevice18 on-for-timer 17) (set HUEDevice9 on-for-timer 900) (set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639278940.07351
           VALUE      cmd_1
   READINGS:
     2021-12-12 04:15:40   cmd             1.3
     2021-12-12 04:15:40   cmd_event       timer_1
     2021-12-12 04:15:40   cmd_nr          1
     2021-12-12 04:15:40   cmd_seqnr       3
     2021-12-11 23:27:57   mode            enabled
     2021-12-12 04:15:40   state           cmd_1
     2021-12-14 04:00:00   timer_01_c01    15.12.2021 04:00:00
     2021-12-12 04:15:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: timer_1
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: timer_1
       state: cmd_1
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1639537200
   realtime:
     0          04:00:00
   time:
     0          04:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1639537200:
       localtime  1639537200
       hash:
   uiState:
   uiTable:
Attributes:
   room       Kellerlüftung
   wait       0,20,920:0

Damian

Du befindest dich im FHEM-Modus, solange cmd_2 nicht kommt, wird cmd_1 nicht wiederholt. Das kannst du mit do always-Attribut ändern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Ich habe jetzt einfach das Attribut do allways gesetzt und das war alles und sollte funktionieren?

Wird das immer benötigt, wenn ich ein DOIF mit einem Attribut wait habe?
Ich dachte, dass das Ereignis ja immer erneut um 4:00 Uhr statt findet und dann das DOIF immer von Beginn abläuft.
Oder ist das wegen dem Attribut "wait" im DOIF immer so, dass ich auch das "do allways" immer benötige?

Hier der aktuelle List mit den "do allways":
Internals:
   DEF        ([04:00])
(set HUEDevice18 on-for-timer 17) (set HUEDevice9 on-for-timer 900) (set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      61a602c2-f33f-f59f-8df0-4d8fb034c4ccbf58
   MODEL      FHEM
   NAME       KELLER_ZWANGSLUEFTUNG
   NOTIFYDEV  global
   NR         146
   NTFY_ORDER 50-KELLER_ZWANGSLUEFTUNG
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639278940.07351
           VALUE      cmd_1
   READINGS:
     2021-12-12 04:15:40   cmd             1.3
     2021-12-12 04:15:40   cmd_event       timer_1
     2021-12-12 04:15:40   cmd_nr          1
     2021-12-12 04:15:40   cmd_seqnr       3
     2021-12-11 23:27:57   mode            enabled
     2021-12-12 04:15:40   state           cmd_1
     2021-12-14 04:00:00   timer_01_c01    15.12.2021 04:00:00
     2021-12-12 04:15:40   wait_timer      no timer
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
         20
         920
       1:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 900
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleepdevice timer_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1639537200
   realtime:
     0          04:00:00
   time:
     0          04:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1639537200:
       localtime  1639537200
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Kellerlüftung
   wait       0,20,920:0

Damian

Das hat mit wait nichts zu tun, sondern mit der Tatsache, dass DOIF im FHEM-Modus zustandsorientiert arbeitet. Ich merke, du hast die Commanderf zum DOIF noch nicht intensiv genug studiert :)

Dieser Absatz steht direkt in der Einleitung in der Commadref zu DOIF:

ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Statuswechsel des DOIF-Moduls stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen. Das Verhalten des Moduls im FHEM-Modus kann durch diverse Attribute verändert werden. Im FHEM-Modus wird maximal nur ein Zweig pro Ereignis- oder Zeit-Trigger ausgeführt, es gibt nur einen Wait-Timer.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Hallo,
sorry konnte gestern nicht mehr antworten. Ist was dazwischen gekommen.

Heute nacht hat es funktioniert und der Lüfter hat sich um 4:00 Uhr eingeschaltet.

Und Du hast recht, ich habe anscheindend das Prinzip noch nicht verstanden (wie auch manch andere FHEM-Steuerungen; bin leider nicht vom Fach und habe das Grundverständnis leider noch nicht erreicht).
Die Commandref habe ich mir zwar angeschaut aber es anscheinden falsch verstanden.

Habe es so verstanden, dass ein Ausführungszweig wie in meinem Beispiel das "([04:00])" ist und der andere "DOELSE (set HUEDevice9 off)".

Dann würde doch immer, wenn es gerade nicht 4:00 Uhr ist, der Ausführungszweig mit DOELSE ausgeführt (weil es nicht 4:00 Uhr ist) und somit ein Statuswechsel stattfinden.
Habe ich das anscheinend nicht richtig verstanden?

Damian

Naja, bei deiner Definition kann der DOELSE-Fall gar nicht auftreten.

Um 4:00 Uhr wird getriggert und da ist die Bedingung immer wahr, also wird immer der erste Zweig ausgeführt. Da es keine weiteren Trigger gibt, kann der DOELSE-Fall nie zuschlagen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Das leuchtet mir jetzt ein.

Dann sollte mein anderer dazugehöriger DOIF demnach ohne "do always" funktionieren?

Der erste Ausführungszweig wäre demnach der Teil mit den Bedingungen für Temperatur und dewpoint und der zweite Ausführungszweig bei DOELSE.
Wenn der erste nicht zutrifft würde der zweite zutreffen und umgekehrt; und somit nach der Zeit von 4800 Sekunden (repeatcmd) erneut von vorne beginnen?

Internals:
   DEF        ([deltadewpoint:state]>2.3 and
[KEL_LUFTFEUCHTIGKEIT:temperature]>8.5 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<12)
(set HUEDevice18 on-for-timer 17)
(set HUEDevice9 on-for-timer 1200)
(set HUEDevice7 on-for-timer 17)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ee07-f33f-f59f-9eb7-12b1002aa68bffa8
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_NORMAL
   NOTIFYDEV  deltadewpoint,global,KEL_LUFTFEUCHTIGKEIT
   NR         111
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_NORMAL
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1639566310.61321
           VALUE      cmd_1
   READINGS:
     2021-12-15 12:56:19   Device          deltadewpoint
     2021-12-15 12:05:10   cmd             1.3
     2021-12-15 12:05:10   cmd_event       deltadewpoint
     2021-12-15 12:05:10   cmd_nr          1
     2021-12-15 12:05:10   cmd_seqnr       3
     2021-12-15 12:14:23   e_KEL_LUFTFEUCHTIGKEIT_temperature 8.61
     2021-12-15 12:56:19   e_deltadewpoint_state 5.1
     2021-12-15 10:50:29   mode            enabled
     2021-12-15 12:05:10   state           cmd_1
     2021-12-15 12:05:10   wait_timer      15.12.2021 13:25:10 cmd_1_1 deltadewpoint
   Regex:
     accu:
     collect:
     cond:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     cmdState:
     repeatcmd:
       4800
     wait:
       0:
         0
         20
         1220
       1:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2.3 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')>8.5 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<12
   do:
     0:
       0          set HUEDevice18 on-for-timer 17
       1          set HUEDevice9 on-for-timer 1200
       2          set HUEDevice7 on-for-timer 17
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^deltadewpoint$|^KEL_LUFTFEUCHTIGKEIT$
     NOTIFYDEV  global|deltadewpoint|KEL_LUFTFEUCHTIGKEIT
     event      5.1
     globalinit 1
     last_timer 0
     sleepdevice deltadewpoint
     sleepsubtimer 0
     sleeptimer 0
     timerdev   deltadewpoint
     timerevent 5.1
     triggerDev deltadewpoint
     timerevents:
       5.1
     timereventsState:
       state: 5.1
     triggerEvents:
       5.1
     triggerEventsState:
       state: 5.1
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  4800
   room       Kellerlüftung
   wait       0,20,1220:0




Damian

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

Ruggy

Dann habe ich es jetzt zumindest grundsätzlich verstanden.

Danke.

satprofi

#26
Hallo.
möchte 2 devices abschalten, aber verzögert. Habe fhem neu auf bullseye aufgesetzt, und bekomme es nicht hin das die verzögerung zutrifft. lampe 2 sollte 20 sekundcen später abschalten



Internals:
   CFGFN     
   DEF        ([dummy1] eq "on") (set Socket_4_bf50219899eabfb485synp on, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 on)
DOELSE (set Socket_4_bf50219899eabfb485synp off, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off)
   FUUID      61fd0d4a-f33f-6462-46e0-8631fa18b68ac9c8
   MODEL      FHEM
   NAME       wait
   NOTIFYDEV  dummy1,global
   NR         9161
   NTFY_ORDER 50-wait
   STATE      cmd_2
   TYPE       DOIF
   VERSION    25386 2021-12-28 22:19:25
   READINGS:
     2022-02-04 12:28:42   Device          dummy1
     2022-02-04 12:28:52   cmd             2
     2022-02-04 12:28:52   cmd_event       dummy1
     2022-02-04 12:28:52   cmd_nr          2
     2022-02-04 12:28:42   e_dummy1_STATE  off
     2022-02-04 12:27:34   mode            enabled
     2022-02-04 12:28:52   state           cmd_2
     2022-02-04 12:28:52   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       dummy1:
         0:
           &STATE     ^dummy1$
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         10
         30
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'dummy1','STATE') eq "on"
   do:
     0:
       0          set Socket_4_bf50219899eabfb485synp on, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 on
     1:
       0          set Socket_4_bf50219899eabfb485synp off, set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off
   helper:
     DEVFILTER  ^global$|^dummy1$
     NOTIFYDEV  global|dummy1
     event      off
     globalinit 1
     last_timer 0
     sleepdevice dummy1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dummy1
     timerevent off
     triggerDev dummy1
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: dummy1
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: dummy1
       state: cmd_2
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     all         dummy1:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   group      test
   room       DOIF
   wait       0:10,30


auf einem älteren system kalppt es aber hervorragend


DOELSEIF ([Ladestrom:state] eq "50" and [Ueberschuss] <1) ("python2 /usr/local/bin/48Amp.py", setreading Wert_I A 48)
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

statt:

wait       0:10,30

eher

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

satprofi

hallo.
ich will ja nur abschalten verzögern, muss es daher nicht 0:0,20 sein?
hab ich aber auch getestet, klappt einfach nicht. beide schalten gleichzeitig.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Dann:

DOELSE (set Socket_4_bf50219899eabfb485synp off) (set Gang_oben_bfb727311ed41a0cc8ycsq switch_usb1 off)

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