DOIF mit mehreren Zeitversetzen Befehlen

Begonnen von JMW, 08 Mai 2015, 10:17:43

Vorheriges Thema - Nächstes Thema

JMW

Hallo,
ich würde gerne mit DOIF zwei oder mehrere Aktionen zeitversetzt ausführen. Wie würdet ihr das machen?

Das habe ich bereits:
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) ( set SendePlatineKanal1 on) DOELSE (set SendePlatineKanal1 off)

Und so so stelle ich mir das vor:
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on; sleep 5; set SendePlatineKanal2 on ) DOELSE (set SendePlatineKanal1 off ; sleep 5; set SendePlatineKanal2 off)

Ist das mit sleep sinnvoll?
Wird durch das sleep das ganze Programm unterbrochen oder läuft es im Hintergrund weiter?
Und wird der set Befehl auch dann ausgeführt, wenn das Programm an der sleep-Stelle wartet?

Andernfalls könnte ich auch einen Timer aufziehen, aber mir ist nicht klar, wie ich eine define innerhalb eines DOIF machen kann.
define SetK2Delay1 at +00:00:05 set SendePlatineKanal2 on
bzw.
define SetK2Delay0 at +00:00:05 set SendePlatineKanal2 off

Vielen Dank schonmal.

Damian

Zitat von: JMW am 08 Mai 2015, 10:17:43
Hallo,
ich würde gerne mit DOIF zwei oder mehrere Aktionen zeitversetzt ausführen. Wie würdet ihr das machen?

Das habe ich bereits:
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) ( set SendePlatineKanal1 on) DOELSE (set SendePlatineKanal1 off)

Und so so stelle ich mir das vor:
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on; sleep 5; set SendePlatineKanal2 on ) DOELSE (set SendePlatineKanal1 off ; sleep 5; set SendePlatineKanal2 off)

Ist das mit sleep sinnvoll?
Wird durch das sleep das ganze Programm unterbrochen oder läuft es im Hintergrund weiter?
Und wird der set Befehl auch dann ausgeführt, wenn das Programm an der sleep-Stelle wartet?

Andernfalls könnte ich auch einen Timer aufziehen, aber mir ist nicht klar, wie ich eine define innerhalb eines DOIF machen kann.
define SetK2Delay1 at +00:00:05 set SendePlatineKanal2 on
bzw.
define SetK2Delay0 at +00:00:05 set SendePlatineKanal2 off

Vielen Dank schonmal.

define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on, sleep 5; set SendePlatineKanal2 on ) DOELSE (set SendePlatineKanal1 off, sleep 5; set SendePlatineKanal2 off)

sollte schon funktionieren. Semikolon muss bei sleep bleiben, sonst steht dein System für die angegebene Zeit, hier von 5 Sekunden.

Gruß

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

Pfriemler

#2
Damian war schneller ..

Temporäres Definieren von at funktioniert genauso, macht aber mehr Sinn bei längeren Verzögerungen. Trenne hier den Einschaltbefehl für Kanal und die define - Kiste mit einem Komma, das sind also zwei Befehle innerhalb der Klammer.

geht nich Gips nich ...
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

JMW

Viele Dank an alle.

Heißt das mit dem Komma und at-Timer also, dass man das so machen könnte:

define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on, define SetK2Delay1 at +00:00:05 set SendePlatineKanal2 on ) DOELSE (set SendePlatineKanal1 off, define SetK2Delay0 at +00:00:05 set SendePlatineKanal2 off)

Ich verstehe jetzt nicht den Unterschied zwischen Komma und Semikolon. Ein sleep mit einem Semikolon läßt das System nicht einfrieren? Macht das Semikolon einen Thread auf und schiebt alles was danach kommt in diesen Thread?
Und ein Komma trennt nur die Befehle?
Ist das nur für DOIF spezifisch?

Nochmals Danke vorab.

Damian

Zitat von: JMW am 08 Mai 2015, 12:50:20
Viele Dank an alle.

Heißt das mit dem Komma und at-Timer also, dass man das so machen könnte:

define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on, define SetK2Delay1 at +00:00:05 set SendePlatineKanal2 on ) DOELSE (set SendePlatineKanal1 off, define SetK2Delay0 at +00:00:05 set SendePlatineKanal2 off)

Ich verstehe jetzt nicht den Unterschied zwischen Komma und Semikolon. Ein sleep mit einem Semikolon läßt das System nicht einfrieren? Macht das Semikolon einen Thread auf und schiebt alles was danach kommt in diesen Thread?
Und ein Komma trennt nur die Befehle?
Ist das nur für DOIF spezifisch?

Nochmals Danke vorab.
ja. DOIF arbeitet mit Klammerhierarchien, FHEM mit flacher Struktur mit Maskierung. Da mir das Verdoppeln, Vervierfachen usw. von Semikolons nicht gefallen hat, habe ich bei DOIF und beim IF-Befehl Komma als Trennzeichen definiert. Kommagetrennte Befehle werden einzeln an FHEM übergeben. Bei sleep ist dann das Problem, dass das ein Stillstand des System bedeutet. Damit das nicht passiert sollte man bei DOIF hinter dem Sleep ein Semikolon angeben. Damit wird das folgende Kommando mit dem Sleep zusammen an FHEM übergeben und dann setzt sleep einen Timer für das folgende Kommando - das System läuft weiter.

Zukünftig wird man bei DOIF auch mit wait zwischen den Kommandos arbeiten können.

Gruß

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

JMW

Ah ja, nun weiß ich bescheid!

Super, danke.

JMW

Nun scheint es doch nicht zu funktionieren. Hier der Log:

di_Lueftung DOIF: no right bracket: (set SendePlatineKanal1 on, sleep 5
Please define SendePlatineKanal1 first
Please define SendePlatineKanal1 first

Hier die Code-Zeile
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on, sleep 5; set SendePlatineKanal2 on) DOELSE (set SendePlatineKanal1 off, sleep 5; set SendePlatineKanal2 off)

Fehlen da noch Klammern?

Wenn ich es so mache, funktionierts (aber schaltet nur einen Befehl):
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on) DOELSE (set SendePlatineKanal1 off)

Damian

#7
Zitat von: JMW am 08 Mai 2015, 14:23:44
Nun scheint es doch nicht zu funktionieren. Hier der Log:

di_Lueftung DOIF: no right bracket: (set SendePlatineKanal1 on, sleep 5
Please define SendePlatineKanal1 first
Please define SendePlatineKanal1 first

Hier die Code-Zeile
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on, sleep 5; set SendePlatineKanal2 on) DOELSE (set SendePlatineKanal1 off, sleep 5; set SendePlatineKanal2 off)

Fehlen da noch Klammern?

Wenn ich es so mache, funktionierts (aber schaltet nur einen Befehl):
define di_Lueftung DOIF ([08:00-10:00] or [14:00-16:00]) (set SendePlatineKanal1 on) DOELSE (set SendePlatineKanal1 off)
In der Kommandozeile musst du zwei Semikolons angeben, über DEF nur eins - jetzt weißt du warum ich mich gegen Semikolon entschieden habe ;)

Gruß

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

JMW

Und ich dachte schon ich bin der Einzige, der mit den Semikolons Probleme hat....  :D