FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: heppel am 27 Juni 2016, 14:26:23

Titel: Sleep im IF ?
Beitrag von: heppel am 27 Juni 2016, 14:26:23
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
Titel: Antw:Sleep im IF ?
Beitrag von: Wernieman am 27 Juni 2016, 15:35:15
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
Titel: Antw:Sleep im IF ?
Beitrag von: heppel am 28 Juni 2016, 18:05:54
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.
Titel: Antw:Sleep im IF ?
Beitrag von: Ellert am 28 Juni 2016, 21:07:45
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
Titel: Antw:Sleep im IF ?
Beitrag von: Wernieman am 29 Juni 2016, 09:11:21
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 ...
Titel: Antw:Sleep im IF ?
Beitrag von: heppel am 30 Juni 2016, 17:57:24
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 ?
Titel: Antw:Sleep im IF ?
Beitrag von: Wernieman am 30 Juni 2016, 18:33:38
Gibt Du es direkt in der fhem.cfg oder per Eingabemaske ein?

P.S. probiere mal, den letzten Befehl mit ";;" zu beenden ...
Titel: Antw:Sleep im IF ?
Beitrag 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:

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 ?
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 30 Juni 2016, 19:29:28
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
Titel: Antw:Sleep im IF ?
Beitrag 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 .......

@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?
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 01 Juli 2016, 09:59:03
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.
Titel: Antw:Sleep im IF ?
Beitrag 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)
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 01 Juli 2016, 10:39:51
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




Titel: Antw:Sleep im IF ?
Beitrag von: Wernieman am 01 Juli 2016, 10:55:34
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 ...... ????
Titel: Antw:Sleep im IF ?
Beitrag von: heppel am 01 Juli 2016, 11:45:02
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
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 01 Juli 2016, 13:37:38
Zitat von: heppel am 01 Juli 2016, 11:45:02

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
Es funktioniert alles wie beschrieben.

Was nicht funktioniert, ist die Kombination aus sleep und IF, wie ich bereits geschrieben habe.

1. Ein Semikolon im DEF-Editior entspricht zwei Semikolons in der cfg-Datei

2. Ein Semikolon trennt FHEM-Befehle und funktioniert nicht in Kombination  IF, weil es die Definition von IF zerstückelt. Daher habe ich als Trennzeichen bei IF das Komma definiert

3. Damit Sleep das ganze System nicht blockiert, muss hinter Sleep ein Semikolon folgen und kein Komma

Diese drei Eigenschaften führen zu dieser Problematik.

Wenn du mit if glücklich bist, dann ist ja alles in bester Ordnung.

Gruß

Damian
Titel: Antw:Sleep im IF ?
Beitrag von: heppel am 01 Juli 2016, 15:13:06
Zitat von: Damian am 01 Juli 2016, 13:37:38
Es funktioniert alles wie beschrieben.

Was nicht funktioniert, ist die Kombination aus sleep und IF, wie ich bereits geschrieben habe.

Das ist nicht schlimm, wenn man es weiß. Aber damit andere es auch wissen können, sollte es in der Commandref erwähnt werden.

Zitat
1. Ein Semikolon im DEF-Editior entspricht zwei Semikolons in der cfg-Datei

Ja, das hatte ich verstanden.

Zitat
2. Ein Semikolon trennt FHEM-Befehle und funktioniert nicht in Kombination  IF, weil es die Definition von IF zerstückelt. Daher habe ich als Trennzeichen bei IF das Komma definiert

Prima. Danke.

Zitat
3. Damit Sleep das ganze System nicht blockiert, muss hinter Sleep ein Semikolon folgen und kein Komma

Diese drei Eigenschaften führen zu dieser Problematik.

Wenn du mit if glücklich bist, dann ist ja alles in bester Ordnung.

Ich bin immer noch der Meinung, dass laut Commandref mein Notify:


define testn1 notify testn1 IF (1) (set t1 on;;;;set t2 off)

bzw.:

DEF        testn1 IF (1) (set t1 on;;set t2 off)


beim Triggern das Device t1 auf "on" und das Device t2 auf "off" setzen sollte. Tatsächlich setzt es aber das Device t1 auf "on;set t2 off". Ich weiß, dass das mit einem Komma funktionieren würde, ich versuche nur mitzuhelfen, FHEM und seine Doku so gut wie möglich zu machen, indem ich auf diese Diskrepanz hinweise.

Viele Grüße,
  Heppel

P.S.: Vielen Dank an Dich und all die anderen, die FHEM möglich gemacht haben.
Titel: Antw:Sleep im IF ?
Beitrag von: willybauss am 01 Januar 2017, 18:00:29
So, ich bin jetzt auch über dieses Problem gestolpert. Obwohl heppel eindringlich darauf hingewiesen hatte, dass das ziemlich missverständlich ist und um Ergänzung der Commandref gebeten hatte, finde ich auch heute noch kein Sterbenswörtchen dazu in der Commandref.

Es ist schon ärgerlich und unverständlich dass man bekannte Probleme dem Anwender wissentlich verschweigt. Wenn die Commandref darauf hinweisen würde, würde man sich gleich einer anderen Lösung zuwenden, statt mühevoll nach Fehlern im eigenen Code zu suchen.
Titel: Antw:Sleep im IF ?
Beitrag von: alias2006 am 03 Januar 2017, 08:57:49
Hatte dasselbe Problem. Ich hatte es mit perl {fhem ....} gelöst. Sieht natürlich blöd aus. Die Command ref sollte man dabei weglassen. Nur ausprobieren hilft weiter, leider. :). Bei Problemen hat mir die Command ref selten weitergeholfen. Ich bin sicher, dass darüber noch einige stolpern werden und Zeit verdaddeln.
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 03 Januar 2017, 09:39:46
Ab morgen wird sleep mit Komma nicht blockierend funktionieren:

Bsp:

IF (...)(set bla1 on,sleep 5, set bla1 off)

Gruß

Damian
Titel: Antw:Sleep im IF ?
Beitrag von: Damian am 03 Januar 2017, 13:59:21
Zitat aus der Commandref:

  sleep kann mit Komma verwendet werden, dabei wirkt das sleep nicht blockierend:
define check at *10:00 IF ([indoor] eq "on") (sleep 2,set lampe1 on,sleep 3,set lampe2 on)
Titel: Antw:Sleep im IF ?
Beitrag von: juemuc am 03 Januar 2017, 17:24:33
Zitat von: Damian am 03 Januar 2017, 13:59:21
Zitat aus der Commandref:

  sleep kann mit Komma verwendet werden, dabei wirkt das sleep nicht blockierend:
define check at *10:00 IF ([indoor] eq "on") (sleep 2,set lampe1 on,sleep 3,set lampe2 on)

Und ich habe mir am Wochenende so viel Mühe mit dem "fhem-Workaround" gegeben :-)

Vielen Dank für die Erweiterung. Das erleichtert den Ablauf.
Titel: Antw:Sleep im IF ?
Beitrag von: Ma_Bo am 03 Januar 2017, 18:53:52
@Damian: Das heisst, in einem DOIF kann ich dann auch sleep verwenden?