Hauptmenü

[geklärt] - Frage zu cmdpause

Begonnen von Frank_Huber, 03 April 2018, 09:49:44

Vorheriges Thema - Nächstes Thema

Frank_Huber

Morgähn,

Hab da mal ne Frage zum Arttribut cmdpause.
aus der commandref geht das nicht so ganz hervor. https://fhem.de/commandref_DE.html#DOIF_cmdpause

Und zwar: gilt die Zwangspause für das ganze DOIF oder nur für den Zweig der ausgeführt wurde?

Mir kommt es hin und wieder vor dass ein Taster prellt. Dabei wird dann trotz cmdpause innerhalb 1/4 oder 1/2 Sekunde Licht an und wieder aus geschalten.
Ich dachte immer das Attribut gilt für das gesamt-DOIF.

defmod Licht_Flur_OG DOIF ([GPIO_IN_20:"^on$"] and [OUT_2:PortA0] eq "off") (set OUT_2 PortA0 on)\
DOELSEIF ([GPIO_IN_20:"^on$"] and [OUT_2:PortA0] eq "on") (set OUT_2 PortA0 off)
attr Licht_Flur_OG cmdState on|off
attr Licht_Flur_OG cmdpause 1:1
attr Licht_Flur_OG devStateIcon on:on:cmd_2 initialize|initialized|off:off:cmd_1
attr Licht_Flur_OG do always


Damian

Zitat von: Frank_Huber am 03 April 2018, 09:49:44
Morgähn,

Hab da mal ne Frage zum Arttribut cmdpause.
aus der commandref geht das nicht so ganz hervor. https://fhem.de/commandref_DE.html#DOIF_cmdpause

Und zwar: gilt die Zwangspause für das ganze DOIF oder nur für den Zweig der ausgeführt wurde?

Mir kommt es hin und wieder vor dass ein Taster prellt. Dabei wird dann trotz cmdpause innerhalb 1/4 oder 1/2 Sekunde Licht an und wieder aus geschalten.
Ich dachte immer das Attribut gilt für das gesamt-DOIF.

defmod Licht_Flur_OG DOIF ([GPIO_IN_20:"^on$"] and [OUT_2:PortA0] eq "off") (set OUT_2 PortA0 on)\
DOELSEIF ([GPIO_IN_20:"^on$"] and [OUT_2:PortA0] eq "on") (set OUT_2 PortA0 off)
attr Licht_Flur_OG cmdState on|off
attr Licht_Flur_OG cmdpause 1:1
attr Licht_Flur_OG devStateIcon on:on:cmd_2 initialize|initialized|off:off:cmd_1
attr Licht_Flur_OG do always


cmdpause wird pro Zweig definiert. Es wird vor dem Schalten geschaut, ob die letzte Ausführung des DOIF (Reading cmd) mindestens x-Sekunden alt ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

Danke!
Das erklärt warum es nicht tut was ich will.

Gibt es einen Weg ein DOIF generell nach einer Ausführung zu pausieren?
d.h. cmd2 kann frühestens 1 sek nach cmd1 ausgeführt werden.

Damian

#3
Zitat von: Frank_Huber am 03 April 2018, 09:58:40
Danke!
Das erklärt warum es nicht tut was ich will.

Gibt es einen Weg ein DOIF generell nach einer Ausführung zu pausieren?
d.h. cmd2 kann frühestens 1 sek nach cmd1 ausgeführt werden.

wenn du 1:1 setzt, dann wird in beiden Fällen eine Sekunde gewartet, egal wer zuletzt geschaltet hat. Eine Sekunde ist schon recht wenig. Du kannst ja mal 2 Sekunden setzen.

Zum Entprellen kann man auch wait gut nutzen.

Wenn man a la sequence, spezielle Wartezeiten einbauen will, dann bietet sich der Perl-Modus an, z. B.:

DOIF { #Diese set-Anweisung wird nicht ausgeführt, wenn ereignis2 in der letzten Sekunde stattgefunden hat
  if ([ereignis1] and get_Timer("ereignis2")==0) {fhem"set ...";set_Timer("ereignis1",1)}
}
{ #Diese set-Anweisung wird nicht ausgeführt, wenn ereignis1 in der letzten Sekunde stattgefunden hat
  if ([ereignis2] and get_Timer("ereignis1")==0) {fhem"set ...";set_Timer("ereignis2",1)}
}


Wiederholung des gleichen Befehls wird dagegen hier nicht unterbunden.

Edit: oder zum Entprellen nur des gleichen Befehls:

DOIF { #Diese set-Anweisung wird nicht ausgeführt, wenn ereignis1 in der letzten Sekunde stattgefunden hat
  if ([ereignis1] and get_Timer("ereignis1")==0) {fhem"set ...";set_Timer("ereignis1",1)}
}
{ #Diese set-Anweisung wird nicht ausgeführt, wenn ereignis2 in der letzten Sekunde stattgefunden hat
  if ([ereignis2] and get_Timer("ereignis2")==0) {fhem"set ...";set_Timer("ereignis2",1)}
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

#4
also 1:1 ist gesetzt, funktioniert aber nicht. daher dachte ich ja dass das jeweils nur den eigenen Zweig betrifft.

prüfst Du das genaue Alter inkl mSec? oder nur hh:mm:ss?

wenn 00:00:01:999 cmd1 ausgeführt wurde kann ja 00:00:02:01 schon cmd2 ausgeführt werden je nach Berechnung.
Das könnte meine Beobachtung auch erklären.

Es würde dann wie von Dir vorgeschlagen ausreichen auf 2 Sek umzustellen, dann hab ich mindestens 1 Sek und 1 Milli Pause.

Ich bau mal auf 2:2 um und beobachte ne Weile.

Danke!

Damian

Zitat von: Frank_Huber am 03 April 2018, 10:41:08
also 1:1 ist gesetzt, funktioniert aber nicht. daher dachte ich ja dass das jeweils nur den eigenen Zweig betrifft.

prüfst Du das genaue Alter inkl mSec? oder nur hh:mm:ss?

wenn 00:00:01:999 cmd1 ausgeführt wurde kann ja 00:00:02:01 schon cmd2 ausgeführt werden je nach Berechnung.
Das könnte meine Beobachtung auch erklären.

Es würde dann wie von Dir vorgeschlagen ausreichen auf 2 Sek umzustellen, dann hab ich mindestens 1 Sek und 1 Milli Pause.

Ich bau mal auf 2:2 um und beobachte ne Weile.

Danke!

Es wird der Zeitstempel des Status des DOIF-Moduls ausgewertet und der ist ja nur auf eine Sekunde genau. Daher der Vorschlag mit 2 Sekunden, damit du mindestens 1 Sekunde Differenz hast.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber