FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: WotSefak am 20 März 2013, 14:59:10

Titel: $we - Syntaxfehler ?
Beitrag von: WotSefak am 20 März 2013, 14:59:10
Ich fahre mit fhem (auf FB7390) seit einigen Monaten auf niedrigstem Niveau: Rollladen, ein wenig Licht, sonstiges. Zeitsteuerung, auch mit sunset etc, klappt soweit. Jetzt will ich mich endlich mal um etwas mehr Komfort bemühen, und scheitere an der Wochenend-Steuerung: zwar werden die zukünftigen Events korrekt angekündigt, aber das Ereignis findet dann nicht statt; der Aktor wird nicht geschaltet. Hier die Schreibweise (Ausschnitt in Sachen Zirk-Pumpe):

define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_ANwe at *07:00:00 {if($we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}
define A_WW_AUS at *22:00:45 set FS20_Warmwasser off

Auf einen Hinweis hin hatte ich es auch schon mit zwei Semikola versucht (... {if(!$we) {fhem("set FS20_Warmwasser off");;}} aber auch das hat nicht zum Erfolg geführt.

Was ist falsch ? Für Hinweise dankbar:
Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 20 März 2013, 15:08:28
Hi,

M.E. fehlt Dir das Semikolon am Ende jeder Zeile:


define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}};


Gruss Groby
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 20 März 2013, 15:22:04
Danke Groby,

aber: in meiner fhem.cfg wird keine einzige Zeile mit Semikolon abgeschlossen; sollte ich das besser tun, bzw. muss ich es tun, sobald ich Perl in geschweiften Klammern verwende ?

Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: MisterEltako am 20 März 2013, 15:29:37
Hi!


Am Semikolon dahinter kann es doch nicht liegen, das wir doch da gar nicht gebraucht...

Ich habe momentan allerdings ein ähnliches Problem, jedoch nur wenn ich 2 Schaltbefehle in eine Anweisung bringe:

z.B.
in FHEM.cfg:
eine if-Schleife ruft bei mir eines der nachfolgendes define auf:
if (!$we) {\
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}\
}

....
oder auch schon getestet:
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;; set Rollladen_Flur 100)}}
oder ebenfalls getestet:
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100, set Rollladen_Flur 100)}}

Alle 3 führen nur dazu, dass Rollladen_EG im at als Event angekündigt werden. Der Befehl Rollladen_Flur 100 fehlt und wird stattdessen beim Abspeichern der Fhem.cfg sofort ausgeführt!

Im Log steht dann: "Rollladen_Flur 100)}" Arument isnt numeric .... (oder so ähnlich)

Eigentlich müsste das 1. genannte doch wenigstens funktionieren wie gewünscht....????

MfG, MisterEltako.
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Reinerlein am 20 März 2013, 15:34:41
Hi MisterEltako,

ist dir das Anführungszeichen am Ende der Fhem-Anweisung beim Kopieren hierher abhanden gekommen, oder fehlt es in deinem Original auch?

Grüße Reinerlein
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 20 März 2013, 15:56:01
mmhhhh in der Tat. Das liegt wohl daran, wie die cfg editiert wurde (per GUI oder zu Fuss)...

Dann versuche es mal so:


define M_WW_AN at *05:00:00 {fhem("set FS20_Warmwasser on") if(!$we)}


Titel: Aw: $we - Syntaxfehler ?
Beitrag von: MisterEltako am 20 März 2013, 18:31:25
@Reinerlein

Nein, die Anf
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Reinerlein am 20 März 2013, 18:45:51
Hi MisterEltako,

dann fällt mir nur auf, dass du wohl auf "Perl-Ebene" bist (erkennbar an "if (!$we)"), und dann aber direkt Fhem-Kommandos hinschreibst (define...).

Um diese Defines musst du noch ein "fhem()" drumschreiben, und dann noch mit den Klammern Spaß haben :-)

Grüße Reinerlein
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Zrrronggg! am 20 März 2013, 18:54:55


Zitatdefine M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}


Das muss so heissen:


define M_WW_AN at *05:00:00 {if (!($we)) {fhem ("set FS20_Warmwasser on")}}


Zitatif (!$we) {\
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}\
}

1. meine ich dass das

if (!($we)) {define Sonnenaufgang at 07:00:00...

heissen muss.

2. meine ich das hier
{fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}
zu viele Semikolons sind, 2 reichen, es muss nur 1x escaped werden:
{fhem("set Rollladen_EG 100 ;; set Rollladen_Flur 100)}
und es fehlen die Anführungstriche am Ende.
{fhem("set Rollladen_EG 100 ;; set Rollladen_Flur 100")}

Und dann: ich kenne mich mit Rolladen nicht aus, aber reicht "100" oder muss das nicht "100%" heissen?


Titel: Aw: $we - Syntaxfehler ?
Beitrag von: MisterEltako am 20 März 2013, 22:58:31
@Zrrronggg!

Ich möchte nicht vom eigentlichen Problem des Threadbesitzers abweichen, nur zum Verständnis für für deinen vorherigen Tip.

Eigentlich lautet die Routine bei mir so (o.g. war nur zur Vereinfachung des Problems gedacht":

define Rollladen_Yahoo notify Local_Wetter:(sunset*.|sunrise*.) {\
   if (defined($defs{Sonnenaufgang})) {fhem('delete Sonnenaufgang')}\
   if (defined($defs{Sonnenuntergang})) {fhem('delete Sonnenuntergang')}\
   if (defined($defs{Aussenlicht_Yahoo})) {fhem('delete Aussenlicht_Yahoo')}\
  my $SA = Offset('sunrise','00:00:00','07:00:00','10:00:00');;\    
  my $SU = Offset('sunset','00:00:00','17:00:00','20:00:00');;\
  my $AL = Offset('sunset','00:30:00','17:00:00','20:00:00');;\
  fhem("define Sonnenaufgang at $SA {fhem(' set Rollladen_EG 100;;;; set Rollladen_Flur 100;;;;' )}");;\
  fhem("define Sonnenuntergang at $SU {fhem(' set Rollladen_EG 1;;;; set Rollladen_Flur 1;;;; ')}");;\
  fhem("define Aussenlicht_Yahoo at $AL {fhem('set Licht_all on')}");;\
}

Wobei die Funktion Offset eine Subroutine aufruft, die mir von YahooWetter den Sonnenaufgang und Untergang liefert und dabei den 2. übergebenen Parameter addiert oder subtrahiert. Diese Subroutine funktioniert auch Dank Unterstützung aus dem Forum nun Fehlerfrei.
Aber wie bei WotSefak stimmt das define nicht.

";;;;" funktioniert noch am ehesten. ";;" lässt im angelegten at den 2. set-Befehl weg.
Der Befehl "set Rollladen_EG 100" funktioniert bei Homematic ohne "%"-Zeichen.
Wo ist nur der Denkfehler????  *grübel*
MfG, MisterEltako.
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 21 März 2013, 06:43:28
Hi,

ich habe es in der Sub so gelöst:


sub MyTimer
{
my $cmd ="set lampe_1 on;;;;set Lampe_2 off";

{fhem("define MyTimer at +00:15:00 {fhem(".$cmd.")}")};
}


Je nachdem wieviele Semikolon gebraucht werden entweder ";;" oder ";;;;"...

Gruss, Groby
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: MisterEltako am 21 März 2013, 08:34:54
Hi!

Daran hatte ich auch schon gedacht, aber noch nicht ausprobiert. Jedoch müsste doch das die von genannten einfachen Varianten auch gehen....

define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_ANwe at *07:00:00 {if($we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}
define A_WW_AUS at *22:00:45 set FS20_Warmwasser off


Aber auch dort gibt es wohl Probleme.

Zudem finde ich das nicht gut, wenn es nur über Definition mit $cmd eine Aneinanderreihung mehrerer Befehle gäbe.
Ist das einfach noch nicht vorgekommen oder einfach nicht implementiert?

MfG, MisterEltako
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Reinerlein am 21 März 2013, 10:34:45
Hi,

das mit den Semikolons ist im Prinzip einfach:
Jedesmal, wenn der Befehl "fhem" (bzw. eine fhem-Anweisung) verwendet wird, muss ein Semikolon verdoppelt werden.
Wenn der Code in einer 99_MyUtils.pm ausgelagert ist, dann steht dort nur noch "echter" Perl-Code, der natürlich diese Verdoppelung erstmal nicht braucht (es sei denn, man schreibt eine Anweisung in der Form "fhem()"). Desweiteren werden dort die Zeilenende-Maskierungen (\) nicht benötigt.

Wenn man also in einer cfg-Datei eine Perl-Anweisung (mit {} eingeschlossen) schreibt, dann muss dort jedes Semikolon verdoppelt werden, damit der fhem-Parser diese nicht "verschluckt". Wenn man dort eine verschachtelte Anweisung schreibt, dann muss dort das Semikolon entsprechend vervierfacht werden, da es von der ersten Stufe auf eine Verdoppelung "runtergeparst" wird. Es stehen dort also nur noch zwei Semikolons, die dann später wieder korrekt geparst werden können.
Spätestens an dieser Stelle wird es dann interessant, den Code in eine MyUtils auszulagern, und nur die "echten" fhem Anweisungen (z.B. "set Licht on") mittels fhem() auszuführen.

Grüße Reinerlein

P.S.: Perl hat natürlich kein Problem mit zuvielen Semikolons, sondern nur mit zuwenig. Der Sequenzoperator ";" trennt Befehlsequenzen. Eine Befehlssequenz darf in Perl aber auch leer sein...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 21 März 2013, 11:51:08
Hi Groby,

nein, die Umstellung hat's nicht gebracht:

define M_WW_AN at *05:00:00 {fhem("set FS20_Warmwasser on") if(!$we)}
ergibt den gleichen Misserfolg wie das ursprüngliche
define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}

Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 21 März 2013, 11:57:10
Hi Zrrronggg!,

define M_WW_AN at *05:00:00 {if (!($we)) {fhem ("set FS20_Warmwasser on")}} ist's auch nicht; das Abklammern des ($we) von der Umkehrung (!)
entspricht auch nicht Ulrich Maaß's Einsteiger-Einweisung define WeckenMitLicht at *08:00 { if (!$we) { fhem("set sz_Lampe on") } }

Ich bin weiter ratlos.

Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 21 März 2013, 13:25:05
Hast Du evtl. Holiday2WE aktiviert und Urlaub eingetragen?
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 21 März 2013, 14:06:55
Ich habe holiday2we aktiviert, allerdings im holiday-file die fraglichen Tage nicht als Urlaub eingetragen.
Das Problem (Events werden im at angekündigt, aber nicht ausgeführt) tritt unabhängig vom we-Status auf:
keine Schalte, egal ob if(!$we) oder if($we).
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 21 März 2013, 16:03:41
Was passiert wenn Du u.g. Zeile über die cmdline eingibst?


define Test at +00:00:10 {fhem("set FS20_Warmwasser on") if(!$we)};


Poste doch mal ein Log-Auszug...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Michael am 21 März 2013, 17:28:56
Moin

Bei mir läuft es so:
define Licht_Morgens at *05:14 { if (!$we) {fhem("set Licht on")}}

Gruß, Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 21 März 2013, 18:26:38
Martin, das hatten wir schon: Vorwärts, Rückwärts, mit Semikolon & mit oder ohne Klammern...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: MisterEltako am 21 März 2013, 23:00:30
Hi!

Also definitiv sind die im 1.Post von dir aufgeführten Definitionen richtig
define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_ANwe at *07:00:00 {if($we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}
define A_WW_AUS at *22:00:45 set FS20_Warmwasser off


Ich habe es so bei mir getestet und der Dimmer wurde exakt zur eingestellten Zeit abgeschalten:
define M_WW_AN at *22:59:00 {if(!$we) {fhem("set Dimmer_Wozi off")}}

D.h. das Problem liegt bei dir eher am an FS20 direkt.

Hast du FS20_Warmwasser richtig definiert?
Hast du eventuell das on / off Kommando gemappt auf An / Aus?
Passiert etwas wenn du "set FS20_Warmwasser on" in die Kommandozeile eingibst und mit der Entertaste bestätigst???

MfG, MisterEltako.
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 12:10:02
MisterEltako & Groby,

Ich habe das mal (modifiziert) über die Kommandozeile eingegeben, und siehe: abhängig vom $we-Status wird geschaltet bzw. korrekt nicht geschaltet.
Beispiel 1: define TEST1 at +00:00:05 {if (!$we) {fhem {"set FS20_Warmwasser on")}} = Zirk-Pumpe springt an (ist Freitag)
Beispiel 2: define TEST2 at +00:00:05 {if ($we) {fhem {"set FS20_Warmwasser off")}} = Zirk-Pumpe geht nicht aus (ist Freitag)

Aber:
Beispiel 3: define TEST3 at *05:55:00 {if (!$we) {fhem {"set FS20_Warmwasser on")}} = heute früh um 10 vor 6 über die Kommandozeile gegeben bewirkte keine Schaltung, obwohl der Befehl selbst sofort im at auftauchte.

FS20_Warmwasser ist richtig definiert; es gibt auch kein eventMap, sondern schlichtes on/off (Zeitsteuerung klappt ja auch ganz normal, solange ich nicht an's $we rangehe).
Irgendwas an der Sache ist und bleibt faul. Hoffentlich nicht ich.

Michael



Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 22 März 2013, 13:44:54
Ich hoffe die geschweifte Klammer vor dem "set in Bsp 3 ist ein Typo und war rund...

Steht irgendetwas im log-file?

Adhoc fällt mir nichts ein, ausser die Uhrzeit zu überprüfen:


{FmtDateTime(time())}


Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 17:36:43
Ja, die geschweifte Klammer war ein typo (kam aus dem Kopf, nicht aus copy&paste)

Datum und Uhrzeit in fhem überprüft: korrekt (alle anderen Events laufen auch korrekt).

Logfile meldet
Can't find string terminator '"' anywhere before EOF at (eval 862) line 1.
Diese Meldung erscheint zu jeder Zeile zum jeweils richtigen Termin (ich hab aktuell 3 lines mit $we in der .cfg).

Welcher string terminator wird hier erwartet ? Noch ein " und wenn ja, wohin damit ?

Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 22 März 2013, 17:54:09
ok.

Leg bitte nochmal den Timer für *05:55:00 über die cmd line an

poste die Deine Eingabe mit copy  & paste!!!

Modifiziere den so angelegten Timer über DEF im GUI und poste den "übersetzten" String (copy  & paste)
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 18:12:15
Über die Kommandozeile habe ich abgesetzt
define M_WW_AUS_TEST at *18:07:00 {if(!($we)) {fhem("set FS20_Warmwasser off")}}
und Logfile meldet
2013.03.22 18:07:00 3: Can't find string terminator '"' anywhere before EOF at (eval 971) line 1.
und dann gleich nochmal hinterher
define M_WW_AUS_TEST2 at *18:10:00 {if(!($we)) {fhem("set FS20_Warmwasser off");;}}
worauf Logfile sagt
2013.03.22 18:10:00 3: Can't find string terminator '"' anywhere before EOF at (eval 972) line 1.
(Letzteres nur, um die Sache mit den Semikola abzuprüfen)
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 22 März 2013, 18:27:07
Kopiere mal diesen code in die cmd line


define M_WW_AUS_TEST at *18:30:00 {fhem("set FS20_Warmwasser off") if(!$we)}


Kopiere in jedem Fall den konvertierten String über die GUI mit DEF - für den Fall das wieder nicht geschaltet wird...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 18:47:38
Zu "Kopiere in jedem Fall den konvertierten String über die GUI mit DEF"
Nicht schlagen : ich weiss nicht, wie...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 18:53:09
Das Ding hat geschaltet ! Ich fass es nicht...
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: Groby am 22 März 2013, 18:56:57
na also ;)

Fazit: too many {()} verderben den Brei ;)
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 22 März 2013, 19:38:01
Brei ist gut ;-)
Ich setze jetzt bei allen relevanten Zeilen in der .cfg die Reihenfolge analog zum erfolgreichen Beispiel um; da das Wochenende vor der Tür steht, kann ich morgen berichten, ob ich 'ne Eintagsfliege gelandet hab, oder ob's jetzt läuft. Erstmal DANKE für geduldige Unterstützung !

Michael
Titel: Aw: $we - Syntaxfehler ?
Beitrag von: WotSefak am 23 März 2013, 07:56:54
Ich entschuldige mich hiermit in aller Form bei allen Helfern:

Es hat heute morgen erneut nicht funktioniert. Da habe ich in aller Stille die Lesebrille meiner Liebsten geklaut, und alles nochmal genau durchgelesen. Und siehe: der Grund für die Nicht-Funktion war tatsächlich das fehlende " am Ende, denn ich Tünnes hatte dieses $we-Kommando ursprünglich mal reinkopiert, und dann modifiziert. Was mir nicht auffiel: beim Transfer wurde das "-Zeichen verändert (anderer Zeichensatz). Ich kann's hier nicht zeigen, denn: beim Reinkopieren ist der Fehler noch sichtbar, beim Hochladen wird's konvertiert zu einem echten " ...

Wie auch immer:
Für so etwas habe ich in anderen Bereichen schon Leuten die Ohren langgezogen (bildlich; ist klar...), also bin ich jetzt erstmal ganz still ... ;-)

Michael