FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: heikoh81 am 20 März 2016, 01:24:48

Titel: DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 20 März 2016, 01:24:48
Hallo zusammen,

ich verwende mit einer Homematic-Fernbedienung folgendes DOIF,
bislang mit den Attributen
do always
waitsame 10:10:10:10
repeatcmd 10:10:10:10


([Fernbedienung01_Btn01:"Short"] or [Fernbedienung01_Btn01:"Long.1_.*"])
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung01", "on", $we)})
DOELSEIF ([Fernbedienung01_Btn02:"Short"] or [Fernbedienung01_Btn02:"Long.1_.*"])
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung01", "off", $we)})
DOELSEIF (([Fernbedienung01_Btn03:"Short"] or [Fernbedienung01_Btn03:"Long.1_.*"]) and [?Fernbedienung01SteuertGarageChkBox] eq "on")
(set Garage_Torschalter Motor_Aktivieren)
DOELSEIF ([Fernbedienung01_Btn04:"Short"] or [Fernbedienung01_Btn04:"Long.1_.*"])
(set PollinKamera01WohnzimmerDauerbetriebChkBox off,set PollinKamera02KuecheDauerbetriebChkBox off,set PollinKamera03StudioDauerbetriebChkBox off,set PollinKamera07EsseckeDauerbetriebChkBox off,set PollinKamera09SchlafDauerbetriebChkBox off)
(set NAME=PollinKamera09Schlaf:FILTER=STATE=on off)
(set NAME=PollinKamera01Wohnzimmer:FILTER=STATE=on off)
(set NAME=PollinKamera07Essecke:FILTER=STATE=on off)
(set NAME=PollinKamera02Kueche:FILTER=STATE=on off)
(set NAME=PollinKamera03Studio:FILTER=STATE=on off)


Nun habe ich waitsame probehalber gelöscht - und das DOIF endet in einer Endlosschleife, d.h. der für die jeweilige Taste hinterlegte Befehl wird unendlich oft bis zum Neustart von fhem durchlaufen.
Lösche ich auch das attr repeatcmd, aber lasse do always stehen, wird der Befehl wieder nur 1x durchlaufen.

Ist das ein Bug, oder eine falsche Kombination der attr durch mich?
Urspürnglich hatte ich sowohl repeatcmd als auch waitsame im Einsatz, weil ich bei versehentlichem Doppel- oder Mehrfachklick auf eine der Fernbedienungs-Tasten die erneute Ausführung des Befehls vermeiden wollte.

Viele Grüße,
Heiko
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: Damian am 20 März 2016, 09:27:39
Zitat von: heikoh81 am 20 März 2016, 01:24:48
Hallo zusammen,

ich verwende mit einer Homematic-Fernbedienung folgendes DOIF,
bislang mit den Attributen
do always
waitsame 10:10:10:10
repeatcmd 10:10:10:10


([Fernbedienung01_Btn01:"Short"] or [Fernbedienung01_Btn01:"Long.1_.*"])
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung01", "on", $we)})
DOELSEIF ([Fernbedienung01_Btn02:"Short"] or [Fernbedienung01_Btn02:"Long.1_.*"])
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung01", "off", $we)})
DOELSEIF (([Fernbedienung01_Btn03:"Short"] or [Fernbedienung01_Btn03:"Long.1_.*"]) and [?Fernbedienung01SteuertGarageChkBox] eq "on")
(set Garage_Torschalter Motor_Aktivieren)
DOELSEIF ([Fernbedienung01_Btn04:"Short"] or [Fernbedienung01_Btn04:"Long.1_.*"])
(set PollinKamera01WohnzimmerDauerbetriebChkBox off,set PollinKamera02KuecheDauerbetriebChkBox off,set PollinKamera03StudioDauerbetriebChkBox off,set PollinKamera07EsseckeDauerbetriebChkBox off,set PollinKamera09SchlafDauerbetriebChkBox off)
(set NAME=PollinKamera09Schlaf:FILTER=STATE=on off)
(set NAME=PollinKamera01Wohnzimmer:FILTER=STATE=on off)
(set NAME=PollinKamera07Essecke:FILTER=STATE=on off)
(set NAME=PollinKamera02Kueche:FILTER=STATE=on off)
(set NAME=PollinKamera03Studio:FILTER=STATE=on off)


Nun habe ich waitsame probehalber gelöscht - und das DOIF endet in einer Endlosschleife, d.h. der für die jeweilige Taste hinterlegte Befehl wird unendlich oft bis zum Neustart von fhem durchlaufen.
Lösche ich auch das attr repeatcmd, aber lasse do always stehen, wird der Befehl wieder nur 1x durchlaufen.

Ist das ein Bug, oder eine falsche Kombination der attr durch mich?
Urspürnglich hatte ich sowohl repeatcmd als auch waitsame im Einsatz, weil ich bei versehentlichem Doppel- oder Mehrfachklick auf eine der Fernbedienungs-Tasten die erneute Ausführung des Befehls vermeiden wollte.

Viele Grüße,
Heiko


repeatcmd wiederholt beliebig oft, es sei denn man hat die Wiederholungen mit repeatsame (nicht waitsame) eingeschränkt. Was du willst, dürfte cmdpause leisten (ohne waitsame und repeatcmd).

Gruß

Damian

Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 20 März 2016, 10:55:51
Hallo damian,

danke für deine schnelle Antwort.

In meinem Start-Post war noch ein Fehler.
Ich hatte in meinem DOIF
attr repeatcmd 1:1:1:1 (nicht 10:10:10:10)
und dachte, dass damit max. 1 Wiederholung zulässig ist?

waitsame 10:10:10:10 mit do always (ohne repeatcmd) müsste doch aber auch das bewerkstelligen, was ich brauche:
Falls aus Versehen die Fernbedienungs-Taste innerhalb von 10 Sekunden nochmals gedrückt wird, soll nichts passieren?

Viele Grüße,
Heiko
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: Damian am 20 März 2016, 12:16:32
Zitat von: heikoh81 am 20 März 2016, 10:55:51
Hallo damian,

danke für deine schnelle Antwort.

In meinem Start-Post war noch ein Fehler.
Ich hatte in meinem DOIF
attr repeatcmd 1:1:1:1 (nicht 10:10:10:10)
und dachte, dass damit max. 1 Wiederholung zulässig ist?

waitsame 10:10:10:10 mit do always (ohne repeatcmd) müsste doch aber auch das bewerkstelligen, was ich brauche:
Falls aus Versehen die Fernbedienungs-Taste innerhalb von 10 Sekunden nochmals gedrückt wird, soll nichts passieren?

Viele Grüße,
Heiko

waitsame bedeutet: warte auf Wiederholung innerhalb der angegebenen Zeitspanne, damit Ausführung stattfindet. Das ist genau das Gegenteil von dem, was du willst.

http://fhem.de/commandref_DE.html#DOIF_waitsame

Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 20 März 2016, 12:32:57
Zitat von: Damian am 20 März 2016, 12:16:32
waitsame bedeutet: warte auf Wiederholung innerhalb der angegebenen Zeitspanne, damit Ausführung stattfindet. Das ist genau das Gegenteil von dem, was du willst.

Ok, das hatte ich alles gelesen, sogar mehrfach.
Aber dann habe ich es erst jetzt endgültig verstanden.

Viele Grüße,
Heiko
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 20 März 2016, 16:05:50
Zu waitsame im aktuellen Beispiel noch eine Verständnisfrage:
Für cmd_3 ("Garagentor-Motor aktivieren") fände ich es ganz praktisch, wenn der nur nach einem "Doppelklick" losläuft.
Wäre die korrekte Sytax des attr dann

attr waitsame 0:0:2:0

d.h. für alle Befehle außer cmd_3 soll ein einfacher Tastendruck genügen, für cmd_3 erwarte ich aber innerhalb von 2 Sekunden einen 2. Tastendruck?

Und könnte man damit auch cmd_4 so erweitern, dass bei einfachem Tastendruck die off-Befehle an die Aktoren gesendet werden,
und bei doppeltem Tastendruck ein neuer cmd_5, der die Aktoren einschaltet?
Oder kollidiert dann cmd_4 mit cmd_5, weil cmd_4 ja schon beim ersten Tastendruck ausgelöst wird, cmd_5 dann beim zweiten?

Viele Grüße,
Heiko
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: Damian am 20 März 2016, 20:09:08
Zitat von: heikoh81 am 20 März 2016, 16:05:50
Zu waitsame im aktuellen Beispiel noch eine Verständnisfrage:
Für cmd_3 ("Garagentor-Motor aktivieren") fände ich es ganz praktisch, wenn der nur nach einem "Doppelklick" losläuft.
Wäre die korrekte Sytax des attr dann

attr waitsame 0:0:2:0

d.h. für alle Befehle außer cmd_3 soll ein einfacher Tastendruck genügen, für cmd_3 erwarte ich aber innerhalb von 2 Sekunden einen 2. Tastendruck?

Und könnte man damit auch cmd_4 so erweitern, dass bei einfachem Tastendruck die off-Befehle an die Aktoren gesendet werden,
und bei doppeltem Tastendruck ein neuer cmd_5, der die Aktoren einschaltet?
Oder kollidiert dann cmd_4 mit cmd_5, weil cmd_4 ja schon beim ersten Tastendruck ausgelöst wird, cmd_5 dann beim zweiten?

Viele Grüße,
Heiko

Das wird wohl nicht funktionieren. So etwas müsste man in zwei DOIF definieren, getrennt nach mit waitsame und ohne.

Gruß

Damian
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 20 März 2016, 21:41:20
Ok.

Aber ist eine Unterscheidung eines einfachen Klicks und eines Doppelklicks mit derselben Taste derselben Fernbedienung überhaupt möglich?
Das DOIF für den einfachen Tastendruck triggert doch auf jeden Fall, auch wenn man einen Doppelklick macht?
Oder müsste ich mir mit einem Dummy helfen, der hochgezählt wird, und erst nach 2 Sekunden ausgewertet wird, ob ein Doppel- oder Einfachklick vorliegt?

Viele Grüße,
Heiko
Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: Damian am 20 März 2016, 21:44:15
Zitat von: heikoh81 am 20 März 2016, 21:41:20
Ok.

Aber ist eine Unterscheidung eines einfachen Klicks und eines Doppelklicks mit derselben Taste derselben Fernbedienung überhaupt möglich?
Das DOIF für den einfachen Tastendruck triggert doch auf jeden Fall, auch wenn man einen Doppelklick macht?
Oder müsste ich mir mit einem Dummy helfen, der hochgezählt wird, und erst nach 2 Sekunden ausgewertet wird, ob ein Doppel- oder Einfachklick vorliegt?

Viele Grüße,
Heiko

Hier steht drin, wie man es lösen kann:

http://fhem.de/commandref_DE.html#DOIF_waitdel


Titel: Antw:DOIF: Endlosschleife bei repeatcmd ohne waitsame, mit do always
Beitrag von: heikoh81 am 21 März 2016, 17:54:34
Also ich habe jetzt 2 DOIFs angelegt:

di_Fernbedienung02_Btn03_Doppelklick

(([Fernbedienung02_Btn03:"Short"] or [Fernbedienung02_Btn03:"Long.1_.*"]) and [?Fernbedienung02SteuertGarageChkBox] eq "on")
()
(set Garage_Torschalter Motor_Aktivieren)


di_Fernbedienung02_Btn03_Einfachklick

(([Fernbedienung02_Btn03:"Short"] or [Fernbedienung02_Btn03:"Long.1_.*"]) and [?Fernbedienung02SteuertGarageChkBox] eq "on")
()


Problem: Der Befehl im Doppelklick-DOIF wird jedes Mal ausgelöst.
Versuche mit einem einfachen {(Log 3, "Einfachklick")} dagegen waren erfolgreich, das verstehe ich nicht, deshalb habe ich im Doppelklick noch einen Platzhalter () eingefügt, weil da vorher der auskommentierte Befehl stand...

Viele Grüße,
Heiko