wait, do resetwait, waitdel oder was?

Begonnen von Per, 13 September 2016, 11:43:54

Vorheriges Thema - Nächstes Thema

Per

In Verbindung mit einer Befehlssequenz
DOIF ([a]) (set x 1) (set y 2) (set z 3)
wait 10:10:10
do always

würde ich gern, wenn der Trigger erneut eintritt, bei der ersten Sequenz Com_1_1 wieder starten. Alle Versuch, die ich bisher gestartet habe, endeten (bestenfalls ;)) damit, dass der Timer der aktuellen Sequenz, in der DOIF sich gerade befand, zurückgesetzt wurde.
Wie komme ich aber ganz an den Anfang? Bzw. würde es (mir) ausreichen, dass der Befehl (hier set y 2) der aktuellen Sequenz erneut aufgerufen wird, aber das wäre bestimmt nur mein Spezialfall.


Ich dachte eigentlich, dass wäre Standard, musste aber feststellen, dass dieser Fall bei mir bisher noch nie aufgetreten ist.

Ellert

Ist die Schleife von x Absicht? Soll sie unterbunden sein?

Per

Zitat von: Ellert am 13 September 2016, 15:53:53
Ist die Schleife von x Absicht?
Nee, keine Absicht :(. Habe es oben mal geändert, danke für den Hinweis!

Ellert

Dann wird der Wait-Timer ohne weitere Attribute nur zurück gesetzt wenn die Bedingung zwischen durch unwahr wird (cmd_2).

Soll Wait-Timer immer zurückgesetzt werden, müsstest Du "do" auf "resetwait" setzen.

Aber, das steht doch alles in der Befehlsreferenz  ;)

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.

Im Gegensatz zu do always wird ein Waittimer mit dem Attribut do resetwait auch dann zurückgesetzt, wenn die gleiche Bedingung wiederholt wahr wird.

Per

Zitat von: Ellert am 13 September 2016, 16:35:46Aber, das steht doch alles in der Befehlsreferenz  ;)
Keine Angst, schon ausprobiert! Nicht umsonst findet sich das auch in der Überschrift.

Zitat von: Per am 13 September 2016, 11:43:54endeten (bestenfalls ;)) damit, dass der Timer der aktuellen Sequenz, in der DOIF sich gerade befand, zurückgesetzt wurde.
Nur der Timer wird zurückgesetzt, die Befehle werden nicht wiederholt.

Ellert

#5
ZitatNur der Timer wird zurückgesetzt
Er müsste auch neu gestartet werden.

Resetwait ist für Sequenzen nicht beschrieben.

Poste mal ein FileLog mit dem Verhalten des DOIF und Schreib mal dabei was Du erwarten würdest.

Damian

Zitat von: Ellert am 13 September 2016, 19:34:05
Er müsste auch neu gestartet werden.

Resetwait ist für Sequenzen nicht beschrieben.

Funktioniert genauso wie bei einfachen Befehlen. Der laufende Timer des nächsten Kommandos der Sequenz wird bei resetwait neugesetzt (verlängert) falls die gleiche Bedingung zutrifft. Ein anderer Zweig (DOELSEIF/DOELSE) unterbricht die nächste Ausführung der Sequenz und damit die Ausführungskette.


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

Per

Zitat von: Ellert am 13 September 2016, 16:35:46Aber, das steht doch alles in der Befehlsreferenz
Zitat von: Ellert am 13 September 2016, 19:34:05Resetwait ist für Sequenzen nicht beschrieben.
Siehst du ;).

Zitat von: Damian am 13 September 2016, 20:31:05Der laufende Timer des nächsten Kommandos der Sequenz wird bei resetwait neugesetzt (verlängert) falls die gleiche Bedingung zutrifft.

Zitat von: Damian am 13 September 2016, 20:31:05Ein anderer Zweig (DOELSEIF/DOELSE) unterbricht die nächste Ausführung der Sequenz und damit die Ausführungskette.
Dann werde ich wohl alternierend arbeiten (gerader und ungerader Zweig).

Zitat von: Ellert am 13 September 2016, 19:34:05Schreib mal dabei was Du erwarten würdest.
"Erwarten" ist ein großer Begriff. Möglich ist vieles, aber von der Philosophie abhängig. Wenn jetzt wg. mir die Arbeitsweise (der ganze Zweig oder die Sequenz wiederholen) geändert würde, kommen vllt. vorhandene DOIF bei anderen ins Straucheln. Und ein neuer Parameter ist auch nicht sooo gut.
Hintergrund (und mit einem neuen Reading vllt. leichter zu erreichen): ich möchte wissen, wie oft die Sequenz hintereinander ausgeführt wurde und wollte dazu einen Zähler hochzählen.

Bartimaus

Guten Morgen,

ich muss den Beitrag nochmal hochholen, denn auch ich verstehe das ganze nicht so richtig.... :-[

Ich habe meine Beschattungssteuerung anhand des Commandref-Beispiels umgesetzt:

Anwendungsbeispiel: Beschattungssteuerung abhängig von der Temperatur. Der Rollladen soll runter von 11:00 Uhr bis Sonnenuntergang, wenn die Temperatur über 26 Grad ist. Temperaturschwankungen um 26 Grad werden mit Hilfe des wait-Attributes durch eine 15 minutige Verzögerung ausgeglichen.

define di_shutters DOIF ([sensor:temperature] > 26 and [11:00-{sunset_abs()}] (set shutters down) DOELSE (set shutters up)
attr di_shutters wait 900:900


Fällt bei "mir" die Temperatur unter 26Grad, so setzt cmd_2 versetzt um 900Sekunden ein, und wird exakt nach 900Sekunden ausgeführt, egal ob die Temperatur innerhalb dieser Zeitspanne wieder über 26Grad gestiegen ist. Dann wird direkt wieder cmd_1 mit 900s Verzögerung ausgeführt.

Ich habe dann mal attr do resetwait hinzugefügt, das hatte aber zur Folge das auch nach {sunset_abs()} cmd_2 nicht ausgeführt wurde, weil IMO der waittimer gelöscht wurde.

Wie wäre es denn richtig ?

attr wait 900:900
attr waitdel 900:900 ?

Bitte um Hilfe....
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

amenomade

Eigentich habe ich dieses Beispiel aus der CommandRef nie richtig vertanden. Das Verhalten, das Du beschreibst, ist genauso, was ich davon erwartet hätte.

Vielleicht kann @Damian mehr erklären, wie es genau läuft bzw. laufen sollte?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

Das Beispiel funktioniert nur mit wait ohne weitere Attribute.

Wenn die erste Bedingung wahr wird, dann wird zeitverzögert 900 Sekunden später cmd_1 ausgeführt, wird cmd_2 wahr wird um 900 Sekunden verzögert cmd_2 ausgeführt.

Wenn innerhalb der Wartezeit jeweils die andere Bedingung wahr wird, so wird der Timer abgebrochen und es bleibt beim ursprünglichen Zustand.

Beispiel:

Zustand: cmd_1 -> Bedingung für cmd_2 wird wahr-> timer für cmd_2 setzen und warten-> cmd_2 nach abgelaufener Zeit ausführen

oder

Zustand: cmd_1 -> Bedingung für cmd_2 wird wahr-> timer für cmd_2 setzen und warten-> während der Wartezeit Bedingung für cmd_1 wird wieder wahr: der Timer wird unterbrochen es passiert nichts und man verbleibt weiter im Zustand cmd_1.


Die beiden Verhaltensweisen gelten genauso im umgekehrten Fall, also wenn man cmd_1 mit cmd_2 vertauscht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Hallo Damian,

danke für Deine Rückmeldung.

Du hast wie immer Recht.  ::)

Ich habe das jetzt mit einem Dummy und einem TEST-DOIF getestet. Und da funktioniert es.

Jetzt muss ich nur herausfinden, warum meine BeschattungsDOIF (mit ein paar mehr Bedingungen) so oft takten.

LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly