FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: uron am 14 November 2013, 09:55:52

Titel: Wiederholungen von Befehlen
Beitrag von: uron am 14 November 2013, 09:55:52
Hallo,
bei meinen ersten Versuchen die Syntax von Befehlen in FHEM zu ergründen, stoße ich leider schon an meine Grenzen:
Ich versuche durch Anwendung von selbst gestellten Fragestellungen mich der Thematik zu nähern und habe folgende Aufgabenstellung erdacht:
In meinem Garten steht zu Dekorationszwecken ein kleiner Leuchtturm den ich alle 5 Minuten 3x blinken lassen möchte. Dies jedoch nur in der Zeit zwischen 6.30 Uhr bis 23.30 Uhr.

Nach einigen Recherchen habe ich folgenden Befehl gefunden und entsprechend verändert:
define blink3x at +*{3}00:00:02 set ug_Licht_Hof on-for-timer 1 Ergebnis: einmalig blinkt die Leuchte 3x

Um dies nun ab 6.30 Uhr 3x blinken zu lassen habe ich den Befehl mit Hilfe der Zeitschaltuhr verändert:
define Blinkerstart at *06:30:00 { { fhem("define blink3x at +*{3}00:00:02 set ug_Licht_Hof on-for-timer 1") } } Ergebnis: einmaliges Blinken der Leuchte (3x) um 6.30 Uhr

Nun fehlt mir noch das permanente Blinken alle 5 Minuten.
Lösungsansätze wären für mich 184 Wiederholung (alle 5 Minuten bis 23.30 Uhr) oder eine Schleife die abfragt, ob die Urzeit 23.30 Uhr erreicht ist.
Denkbar wäre auch, den Schaltzyklus über einen Google-Kalender zu steuern.
Das bekomme ich aber nicht hin! Könnt ihr helfen?

Eine weitere Frage geht in die Richtung der exaten Erläuterung der Syntax von Befehlen im FHEM.
Im Moment reime ich mir beispielhaft die Befehlsbestandteile "*", "{", "}" "fhem" "+" o.ä. zusammen. Bei manchen klappt das mit meinem Horizont, bei anderen nicht.
Wo finde ich exakte Beschreibungen? Die commandref hilft in dieser Tiefe gerade bei verschachtelten Befehlen nicht immer weiter. Gibt es da eine entsprechende Dokumentation?

Edith: Code-Tag eingefügt
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: franky08 am 14 November 2013, 11:56:13
Hallo uron,
nachdem ich mich auch oft genug mit Perl Programmierung verrannt habe, habe ich mir ein Perl Handbuch sowie die Perl Referenz zugelegt. Ist wirklich empfehlenswert, da das absolutes Neuland für mich war.
Hier ist z.B. ein Einstieg: http://de.selfhtml.org/perl/index.htm

VG
Frank
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 14 November 2013, 12:21:39
Na, das sieht ja schon mal gut aus - da habe ich ja etwas vor mir. Danke für den Tipp - vielleicht komme ich ja damit klar.
Ich hoffe nur, dass mein erstes Erfolgserlebnis nicht zu lange auf sich warten lässt  :P
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Jaydee am 14 November 2013, 12:33:03
Hallo Frank,

Gibt es ein Perl-Handbuch, das du empfehlen kannst?

Gruß
Jan
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: franky08 am 14 November 2013, 12:42:24
@Jaydee
Angefangen hab ich mit dem hier (hoffendlich ist der Link OK): http://www.algorilla.de/index.php?page=PLMP.con

VG
Frank
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Jaydee am 14 November 2013, 12:45:35
Vielen Dank, ich werde es mir mal ansehen!
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 14 November 2013, 13:00:33
Hallo,

ZitatIm Moment reime ich mir beispielhaft die Befehlsbestandteile "*", "{", "}" "fhem" "+" o.ä. zusammen.

+ und * sind in der commandref bei at aber recht gut erklärt - auch inkl. Beispielen.

Aber um Perl wirst du dennoch nicht erum kommen  :D

Grüsse
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 09:44:57
Den at-Befehlt hatte ich zunächst nur in der deutschen Fassung gesucht - du hast recht, die Erläuterungen (im Englischen) sind detailliert.

Nun habe ich an meiner Aufgabenstellung weitergearbeitet und durch Verschachteln der define-Befehle die Lösung gesucht (testweise 8x):
define Blinkerstart at *06:30:00 {{fhem("define FuenfMinuten at +*{8}00:05:00 {{fhem("define blink3x at +*{3}00:00:02 set ug_Licht_Hof on-for-timer 1")}}")}}

Da tut sich gar nichts, auch wenn ich eine bevorstehende zeitnahe Uhrzeit statt 06:30:00 wähle! Hab ich da eine Klammer oder Leerzeichen zuviel/zu wenig oder geht das Verschachteln so nicht?

Edith: Code-Tag eingefügt
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 15 November 2013, 12:26:00
Hallo,

Fehler werden gerne im FHEM-Logfile protokolliert.
Was steht den dort?

Grüsse
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 15:34:22
Habe soeben nochmals einen Start gemacht, die Originalbefehlszeile lautete für 8 Wiederholungen jede Minute:
define Blinkerstart at *15:21:00 {{fhem("define EineMinute at +*{8}00:01:00 {{fhem("define blink3x at +*{3}00:00:02 set ug_Licht_Hof on-for-timer 1")}}")}}

Im Logfile kam Folgendes zum Vorschein
2013.11.15 15:20:00 1: Including fhem.cfg
2013.11.15 15:20:01 3: telnetPort: port 7072 opened
2013.11.15 15:20:01 3: WEB: port 8083 opened
2013.11.15 15:20:01 3: WEBphone: port 8084 opened
2013.11.15 15:20:01 3: WEBtablet: port 8085 opened
2013.11.15 15:20:01 3: Opening MyCUL device /dev/ttyACM0
2013.11.15 15:20:01 3: MyCUL device opened
2013.11.15 15:20:01 3: MyCUL: Possible commands: BCFiAZEGMRTVWXefmltux
2013.11.15 15:20:01 2: Setting CUL fhtid from 1034 to 1234
2013.11.15 15:20:01 3: Opening CUL_0 device /dev/ttyACM0
2013.11.15 15:20:01 3: Setting CUL_0 baudrate to 38400
2013.11.15 15:20:01 3: CUL_0 device opened
2013.11.15 15:20:01 3: CUL_0: Possible commands: BCFiAZEGMRTVWXefmltux
2013.11.15 15:20:01 2: Setting CUL fhtid from 1234 to 1034
2013.11.15 15:20:02 1: Including ./log/fhem.save
2013.11.15 15:21:00 3: syntax error at (eval 83) line 1, near ""define EineMinute at +*{8}00:01:00 {{fhem("define blink3x "

Da ist also offenbar etwas nicht o.k., die Interpretation gelingt mir aber nicht! Was bedeutet denn eval83 und worauf weist "near" hin?
Mir scheint die Verschachtelung der define-Befehle entweder von der Syntax nicht richtig oder überhaupt nicht möglich zu sein!
Habe auch mal die doppelte {{ und }} herausgenommen und in einfache {} umgewandelt, Ergebnis ist das gleiche.

Danke für die Bemühungen!

Edith: Code-Tag eingefügt
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 15 November 2013, 17:07:40
Hallo,

so aus der Hüfte geschossen würde ich sagen das fhem(" eigentlich nicht passen dürfte.
Nimm mal die ( und ) raus.

Was sagt das LogFile dann?

Grüße
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 18:17:18
Also ich bekomme schon beim Abspeichern der fhem.cfg die Fehlermeldung "Blinkerstart already defined, delete it first" (auch nach mehrmaligem Speichern) wenn ich die Klammern () entferne.

Lt. commandref sollte hinter dem befehl fhem auch eine göffnete Klammer stehen, gefolgt von ".
Beispiel:  define a12 at +*{sunset_rel()} { fhem("set lamp on-till 23:00") if($we) }
oder bewerte ich das falsch?

Edith: Code-Tag eingefügt
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Jaydee am 15 November 2013, 18:28:02
also daran allein kann es nicht liegen - ich nutze in allen meinen skripten die fhem(" blah ")-Syntax
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 15 November 2013, 18:28:40
Hallo,

sorry. Blödsinn von mir.

Klar sieht der Befehl so aus:
fhem("define ...

Die ( nach fhem ist schon richtig - hab wohl zuviel gearbeitet heute  :-[

Grüße

Edith: Die Fehlermeldung already defined ist logisch weil
Zitat(auch nach mehrmaligem Speichern)
wenn das define einmal angelegt ist  - was diese Meldung ja auch besagt -  und du es immer wieder neu in die FHEM-Befehlszeile eingibst kommt immer wieder auch diese Meldung.
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 19:41:36
Wenn ich meinen Ursprungsbefehl eingebe
define Blinkerstart at *15:21:00 {{fhem("define EineMinute at +*{8}00:01:00 {{fhem("define blink3x at +*{3}00:00:02 set ug_Licht_Hof on-for-timer 1")}}")}}
erhalte ich beim Abspeichern (auch mehrmaligem) keine Fehlermeldung

Entferne ich jedoch das Sternchen "*" vor der Uhrzeit (15:21:00) bekomme ich die Fehlermeldung beim 2. Abspeichern wieder  :-[
Ich unterstelle einmal, dass durch den "Wiederholungsbefehl" * die Variable "Blinkerstart" direkt nach der Definition und dem Abspeichern wieder auf Null gesetzt wird.
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 15 November 2013, 19:54:36
Hallo,

ZitatIch unterstelle einmal, dass durch den "Wiederholungsbefehl" * die Variable "Blinkerstart" direkt nach der Definition und dem Abspeichern wieder auf Null gesetzt wird.

Sorry kann ich nicht nachstellen.
Egal ob ich Blinkerstart mit oder ohne * definiere bekomme ich beim zweiten Definitionsversuch unweigerlich die Meldung das Blinkerstart bereits definiert ist.

Grüße

Edith: Das habe ich eingegeben:
define Blinkerstart at 19:27:00 {} - beim zweiten Versuch erhalte ich already definied.
define Blinkerstart at *19:27:00 {} - dito
define Blinkerstart at 19:27:00 {} und danach mit * - dito
define Blinkerstart at *19:27:00 {} und danach ohne * - dito
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 15 November 2013, 20:55:22
Hallo,

so, nachdem mich solche Fragestellungen eigentlich gerne herausfordern hab ich mal ein bischen gegrübelt und bin zu folgendem Ergebniss gekommen.

Um 06:30:00 soll das Licht 3-mal blinken (1 sec. an/1 sec. aus) und dann alle 5 Minuten genauso.

Also sollte sowas klappen:
define Blinkerstart at *06:30:00 {
  fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");
  fhem("define blink3x_neu at +{204}00:05:00 {
    fhem("define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1");
  }
}

(ich liebe Mehrzeiler  ;D ).

Täglich um 06:30:00 wird das Licht 3-mal für 1 sec. ein- und 1 sec. ausgeschaltet und ein weiteres define erstellt das genau 204-mal das Licht nach 5 Minuten 3-mal 1 sec. ein- und 1 sec. ausschaltet.
23:30:00 - 06:30:00 = 17 Stunden / 5 Minuten = 204 mal.

Ungetestet und klappt vielleicht auch nicht aber ich werd das nicht in meine Versuch-Installation schreiben  8)

Grüße
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 21:51:04
Zitatdefine Blinkerstart at *06:30:00 {
  fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");
  fhem("define blink3x_neu at +{204}00:05:00 {
    fhem("define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1");
  }
}

Danke für den Versuch. Beim Speichern der fhem.cfg kommt die Fehlermeldung
Blinkerstart already defined, delete it first Unknown command fhem("define, try help Unknown command fhem("define, try help Unknown command fhem("define, try help Unknown command }, try help Unknown command }, try help
auch nach mehrmaligem speichern.

Vermutung meinerseits: aus meiner Sicht fehlt mindestens vor dem 2. fhem "{" oder warum ist das beim 1. und 3. mal? Natürlich dann am Ende auch noch eine Klammer
Habe ich einmal eingesetzt, aber das allein ist es nicht, da kommt die Meldung
Blinkerstart already defined, delete it first Unknown command fhem("define, try help Unknown command {, try help Unknown command fhem("define, try help Unknown command fhem("define, try help Unknown command }, try help Unknown command }}, try help

Zitatat +{204}00:05:00
Muss es nicht auch +*{204}00:05:00 heißen
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: hckoe am 15 November 2013, 22:14:06
Hallo,

meiner Meinung nach müssen Kommandos in { ... } mit ;; statt mit ; getrennt werden. Außerdem fehlt vermutlich ein "):

define Blinkerstart at *06:30:00 { \
  fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
  fhem("define blink3x_neu at +{204}00:05:00 { fhem("define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1") }");; \
}


Gruß
Helmut
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 15 November 2013, 22:37:52
Zitatdefine Blinkerstart at *06:30:00 { \
  fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
  fhem("define blink3x_neu at +{204}00:05:00 { fhem("define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1") }");; \
}
Klappt leider auch nicht, jedoch erst einmal wenigstens keine Fehlermeldung mehr beim Abspeichern der fhem.cfg
jedoch Fehlermeldung im logfile:
2013.11.15 22:31:00 3: syntax error at (eval 180) line 1, near ""define blink3x_neu at +{204}00:05:00 { fhem("define blink3x_neu1 "


Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Puschel74 am 16 November 2013, 08:55:14
Hallo,

doppelte Semikolon und \ werdet ihr bei mir nie finden da ich immer das DEF bearbeite und seltenst in der fhem.cfg direkt was mache.
Wer die Untescheide wissen will sollte mal das Forum durchsuchen.

Zu den already defined-Meldungen gebe ich mein letztes Kommentare ab - die Definition existiert bereits.

Klammerfehler können durchaus vorkommen da
ZitatUngetestet und klappt vielleicht auch nicht

Zitataus meiner Sicht fehlt mindestens vor dem 2. fhem "{" oder warum ist das beim 1. und 3. mal?
Dann solltest du dich nochmal mit dem Syntax von FHEM auseinandersetzen bevor du solche Konstrukte in einen Code giessen möchtest.

Zitat Helmut:
Zitatmeiner Meinung nach müssen Kommandos in { ... } mit ;; statt mit ; getrennt werden.
Damit kann ich nichts anfangen da ich nicht weiß was du damit meinst (oder meinen könntest).

Aber nun noch viel Spaß beim tüfteln.

Grüße
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: hckoe am 18 November 2013, 11:39:25
Hallo Uron,

mit folgendem Eintrag in der fhem.cfg funktioniert es bei mir:

define Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}

bzw. mit folgendem Eintrag direkt im DEF-Eintrag:

define Blinkerstart at *06:30:00 {fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1"); fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }") }

Problem war, daß "+{204}" durch "+*{204}" und beim geschachtelten fhem-String die " durch \" ersetzt werden müssen.

Gruß
Helmut
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 18 November 2013, 21:58:23
Also erst einmal recht vielen Dank für die Lösung, sie klappt ausgezeichnet.

Für mich stellt sich natürlich noch eine Erkenntnisfrage; mein Ziel, dieses Forum aufzusuchen ist ja der Erkenntnisgewinn (natürlich nebenbei auch die Lösung).
Ich möchte als Neuling den Befehl am Ende so verstanden haben, dass ich eine solche Syntax in einem ählichen Fall ohne Probleme hinbekomme.

Zitatdefine Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}
Nicht verständlich ist für mich in der Lösung, dass sich mit dem Einfügen des \-Zeichens (steht m.E. doch für das Verbinden mehrerer Zeilen zur Herstellung der Übersichtlichkeit) das additive Semikolon (zum Ausführen zwei aufeinanderfolgender Befehle) gegenüber der DEF-Befehlsvariante verdoppelt werden muss !?  (übrigens irritiert mich auch noch das doppelte Semikolon am Befehlsende!)
Zitatdefine Blinkerstart at *06:30:00 {fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1"); fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }") }
Es ist möglicherweise der Tipp von Puschel74 der mich bat, die Befehlsunterschiede im Forum nachzulesen dem ich folgen sollte. Leider bin ich ich auch nach verschiedenen Suchläufen noch nicht fündig geworden - vielleicht/sicher sind meine Suchbegriffe falsch. Ich unterstelle vorab einmal, dass ich das "\" noch falsch interpetiere - ich arbeite aber am Erkenntnisgewinn.

Am Ende freue ich mich im Moment aber darüber, dass mehrere Forumsteilnehmer an der Lösung mitgearbeitet haben - dafür meinen Dank!
Offenbar ist es aber nicht ganz so eindeutig, die Syntax funtionierend hinzubekommen. Das macht mir Mut, dass ich nicht alleine bin.
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: hckoe am 19 November 2013, 12:37:29
Hallo Uron,

hier noch ein paar kurze Infos:
ZitatIch unterstelle vorab einmal, dass ich das "\" noch falsch interpetiere - ich arbeite aber am Erkenntnisgewinn.
In Perl sind "" die Begrenzer eines Strings. Wenn ein " im String selbst vorkommen soll muss es mit \" maskiert werden, damit es nicht als Stringende interpretiert wird: "Dieses \" ist im String".
So wird auch ein Newline am Zeilenende durch \ maskiert und aufgehoben.

Gruß
Helmut
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Zrrronggg! am 21 November 2013, 22:46:29
Zitat
define Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}

Nicht verständlich ist für mich in der Lösung, dass sich mit dem Einfügen des \-Zeichens (steht m.E. doch für das Verbinden mehrerer Zeilen zur Herstellung der Übersichtlichkeit) das additive Semikolon (zum Ausführen zwei aufeinanderfolgender Befehle) gegenüber der DEF-Befehlsvariante verdoppelt werden muss !?  (übrigens irritiert mich auch noch das doppelte Semikolon am Befehlsende!)

Tja, das kommt daher, dass die obige Notation auch unnötig kompliziert ist.  Es gibt hier im Forum einige Leute die das so übersichtlich finden. Ich bin da anderer Auffassung. Z.B.:

Zitat(übrigens irritiert mich auch noch das doppelte Semikolon am Befehlsende!)

Ja. Verstehe ich, ist nämlich auch überflüssig. Ebenso überflüssig ist es den Fhem Befehlsteil am Ende jeder Zeile "zuzumachen" um dann am Anfang der nächsten Zeile mit
Zitatfhem("
wieder aufzumachen.

Auch überflüssig ist, sich "in der Fhem Ebene befindlich", neue defines nochmal mit { fhem(" zu eröffnen.

Ohne die Lösung ganz genau durchdrungen zu haben, denke ich im übrigen auch, dass sie auch von der Logic her merkwürdig kompliziert ist. Vielleicht ist im Thread irgendwo was versteckt, was ich nicht gelesen habe.

Warum wird insbesondere zuerst EINMAL geblinkt und danach seperat 204x?

Warum nicht:

define Blinkerstart at *06:25:00 {fhem("define blink205x at +*{205}00:05:00 define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1") }

(Gerade aus dem Kopp hingeschrieben, ungetestet, ich habe insbesondere ein paar der überflüssigen Klammerbenen weggelassen.)

Du hast ja inzwischen einen anderen Thread aufgemacht, wo du weitere Anforderungen an diese Schaltung einbringst.
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: uron am 26 November 2013, 17:53:31
sorry Zrrronggg!
ich lese erst jetzt deine Ausführungen in diesem Thread.
Ich hatte mich auf meinen neu aufgemachten Thread konzentriert und die Email-Benachrichtigung bei Antworten nicht eingeschaltet.

Deine Ausführungen zum Thema String, { , / , ´der Maskierung und fhem(" erhellen meinen Blick auf meine Syntax-Fragen doch enorm.

Danke für deine Mühe!
Titel: Antw:Wiederholungen von Befehlen
Beitrag von: Zrrronggg! am 26 November 2013, 18:13:44
 u r fellkamm