Hauptmenü

Sleep im IF ?

Begonnen von heppel, 27 Juni 2016, 14:26:23

Vorheriges Thema - Nächstes Thema

heppel

Moin,

darf man in einem "IF" kein "sleep" aufrufen ?

In diesem Minibeispiel


IF (1) (set SZ1 on,sleep 3,set SZ2 on)


bekomme ich die Meldung


WARNING: sleep without additional commands is deprecated and blocks FHEM


Aber nach dem "sleep" kommt doch noch ein Befehl.

Muss ich da wirklich mit einem "at" arbeiten ?

Danke,
  Heppel

Wernieman

Der Offizielle Trenner ist aber kein "," sondern ein ";" bzw. wegen quoten auch ;;

Damit liest der Parser nur das sleep und anschließend keinen 2. Befehl. Deshalb die Meldung
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

heppel

Danke für den Hinweis.

Die Commandref hatte ich allerdings so gelesen, dass das Komma in den IF-Klammern ein vollwertiger Ersatz für das Semikolon ist. Dass das bei "sleep" nicht so ist, finde ich - gelinde gesagt - überraschend.

Aber ich verstehe da offenbar noch mehr nicht. Ich habe dann folgendes probiert:


IF (1) (set SZ1 on;;sleep 3;;set SZ2 off)


Dabei passiert gar nichts. Keine Fehlermeldung, aber die "set" Befehle werden auch nicht ausgeführt. Was mache ich da falsch ?

Das hier:


IF (1) ({fhem('set SZ1 on;;sleep 3;;set SZ2 off')})


hat dann funktioniert. Aber auf Perl zu wechseln, nur um dann sofort wieder FHEM aufzurufen, scheint mir auch irgendwie suboptimal zu sein.

Ellert

Du führst das IF wahrscheinlich in der Befehlszeile aus, die verhält sich manchmal anders als bei der Ausführung in einer Geräte-Definition.

Probier mal das IF in einem notify oder at auszuführen.

Für eine verzögerte Ausführung bietet sich auch DOIF an, dort wird die Verzögerung über das Attribut wait gesteuert: http://fhem.de/commandref_DE.html#DOIF

Wernieman

#4
Wobei in diesem Falle DOIF mit "Kanonen auf Spatzen schießen" ist.

Ich würde hier eher mich an Problem rantasten:
1. Probieren ob meine Vefehlskette Funktioniert, dazu im Eingabestring:
set SZ1 on;;sleep 3;;set SZ2 off
2. das "IF" Probieren
3. Zusammenbauen

P.S. Habe mir gerade nochmals die Doku vorgenommen und Du hast bezüglich "," im IF recht. Allerdings habe ich es noch nie so probiert. Siehe in der Doku:
ZitatMultiple commands are separated by a comma instead of a semicolon, thus eliminating the doubling, quadrupling, etc. of the semicolon:
d.h. es wurde eingeführt, damit man nicht Quoten muß, aber ;; geht eben auch ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

heppel

Ich bekomme es einfach nicht hin.

Die vorgeschlagene Befehlskette funktioniert im Eingabestring natürlich nicht, weil an der Stelle die Doppelung der Semikolons dazu führt, das die Variable SZ1 den Wert "on;sleep 3;set SZ2 off" bekommt.

Ich habe inzwischen ein frisches FHEM auf einem Raspberry installiert, um besser rumprobieren zu können. Meine komplette eigene Konfiguration sieht so aus:


define t1 dummy
attr t1 verbose 5
define t2 dummy
attr t2 verbose 5
define testn1 notify testn1 IF (1) (set t1 on;;;;set t2 off)
attr testn1 verbose 5


Das "define ... notify" entfernt ein Level von Quoting, so dass danach die vorgeschriebenen zwei Semikolons verbleiben.

"trigger testn1" führt zu:


2016.06.30 17:40:59 5: Triggering testn1
2016.06.30 17:40:59 4: testn1 exec IF (1) (set t1 on;;set t2 off)
2016.06.30 17:40:59 4: dummy set t1 on;set t2 off


Demnach hätte ich zu viel gequotet. Aber wenn ich einen Quoting-Level entferne sieht das Ergebnis so aus:


2016.06.30 17:51:52 5: Triggering testn1
2016.06.30 17:51:52 4: testn1 exec IF (1) (set t1 on;set t2 off)
2016.06.30 17:51:52 4: dummy set t2 off)
2016.06.30 17:51:52 3: testn1 return value: IF: no right bracket: (set t1 on


Hat jemand eine funktionierende Konfiguration eines IF mit Semikolons als Trenner zwischen mehreren Kommandos des Ausführungsteils ?

Wernieman

#6
Gibt Du es direkt in der fhem.cfg oder per Eingabemaske ein?

P.S. probiere mal, den letzten Befehl mit ";;" zu beenden ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

heppel

Ich mache alle Änderungen im Web-Frontend, sichere die Konfiguration mit "save config" und mache dann Copy und Paste aus fhem.cfg.

Zwei Semikolons hinter dem "define testn1 ..." ändern (fast) nichts:

Zitat
2016.06.30 18:54:15 5: Triggering testn1
2016.06.30 18:54:15 4: testn1 exec IF (1) (set t1 on;;set t2 off);
2016.06.30 18:54:15 4: dummy set t1 on;set t2 off

oder was meintest Du ?

Damian

Zitat von: heppel am 30 Juni 2016, 19:04:03
Ich mache alle Änderungen im Web-Frontend, sichere die Konfiguration mit "save config" und mache dann Copy und Paste aus fhem.cfg.

Zwei Semikolons hinter dem "define testn1 ..." ändern (fast) nichts:

oder was meintest Du ?

IF und sleep funktioniert nicht gut. IF arbeitet mit Komma sleep mit Semikolon. Der Umweg über Perl mit {fhem.. ist vermutlich der einzige, der funktioniert. Dann kannst du auch gleich Perl-if nehmen.

Ich würde es ohne Perl-Umweg mit DOIF und wait machen.

Gruß

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

Wernieman

#9
Ich hatte es aber mal am Laufen, nur leider habe ich es abgeändert und deshalb nicht mehr zur Verfügung.

Kann es deshalb auch nicht mehr posten.

Und sorry, aber mir ist DOIF viel zu groß. Habe bisher alles ohne dieses lösen können .......

@heppel
Per DEF-Editor editieren, aber aus der fhem.cfg posten ... warum postest Du nicht die Angaben aus FHEM heraus? d.h. das, was fhem Anzeigt, alternativ ein "list"

Edit:
Hat mich jetzt nicht losgelassen ... ist etwas "trick 17" aber funzt:
define test notify tricker:on IF ([dummy1] eq "on") (sleep 0; set dummy1 off; sleep 3; set dummy2 off;)

Der "Trick" war hier das "sleep 0". Irgendwas hat sich geändert, war früher so nicht nötig ....
BTW: Ist so als Eingabe für die Eingabezeile von FHEM gedacht, nicht für die fhem.cfg!
Kannst Du es so für Dich anpassen?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Damian

Zitat von: Wernieman am 01 Juli 2016, 08:44:04
Ich hatte es aber mal am Laufen, nur leider habe ich es abgeändert und deshalb nicht mehr zur Verfügung.

Kann es deshalb auch nicht mehr posten.

Und sorry, aber mir ist DOIF viel zu groß. Habe bisher alles ohne dieses lösen können .......


In der Definition aber kürzer als vier Befehle: notify, IF, sleep, fhem und man kommt ohne Tricks aus, insb.  sleep 0, die keinen Sinn machen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Wernieman

Wir fangen an von "Geschmack" zu reden. Da ich persönlich mir lieber Statesments einfach aufbaue und immer weiter "verbessere", liegt mir DOIF nicht.

Und "sleep 0" macht hier Sinn, oder nicht verstanden?
(Und rate mal, warum ich "Trick 17" geschrieben habe)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Damian

Zitat von: Wernieman am 01 Juli 2016, 10:02:20
Wir fangen an von "Geschmack" zu reden. Da ich persönlich mir lieber Statesments einfach aufbaue und immer weiter "verbessere", liegt mir DOIF nicht.

Und "sleep 0" macht hier Sinn, oder nicht verstanden?
(Und rate mal, warum ich "Trick 17" geschrieben habe)

Ich würde erst mal die Tricks ausprobieren, bevor ich sie  poste.

Dann schau mal in den Log und dann lasse ich dich raten, warum es nicht funktioniert und keinen Sinn macht, was du da als Trick 17 definierst.

Wenn du nicht weiter kommst, kann ich dir gerne auch verraten, warum es keinen Sinn macht.

Gruß

Damian




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

Wernieman

#13
Edit
Verärgertes Posting Gelöscht um "aroganten Vorposter" nicht zu Ärgern

Und das ein "Hat mich jetzt nicht losgelassen" eventuell bedeuten kann, das ich es getestet habe ...... ????
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

heppel

Bitte keinen Flamewar hier !

Nein, der "Trick 17" funktioniert nicht, weil das einfache Semikolon hinter "sleep 0" das "IF" beendet. Das "IF" schreibt dann eine Warnung über eine fehlende schliessende Klammer in das Log und die restlichen Befehle werden auf jeden Fall ausgeführt, egal ob die Bedingung erfüllt war, oder nicht.

Ein "DOIF" klappt in meiner echten Anwendung nicht. Die ist erheblich komplizierter, als das "eingedampfte" Minibeispiel, das ich hier gepostet habe. Ich habe das Problem jetzt mit dem Umweg über Perl umgangen.

Für mich bleibt der wichtige Punkt, dass die Commandref offensichtlich an zwei Stellen nicht mit der Implementation übereinstimmt.

- Die Syntax mit ";;" funktioniert nicht.
- "sleep" mit Komma tut nicht das Gewünschte.

Möglicherweise hängen die beiden Dinge zusammen.

Hier sollten entweder die Commandref oder das Programm geändert werden.

Wie/wo/wem melde ich das ?

Danke,
  Heppel