FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dadio am 10 Dezember 2013, 23:20:44

Titel: Syntax error
Beitrag von: dadio am 10 Dezember 2013, 23:20:44
Hallo,

bei dem folgenden CMD wird im Log ein Syntax Error angezeigt, jedoch finde ich den Fehler nicht:


define Motion_2_Notify notify Motion_2 {\
    if ("%" eq "motion" && !isday()) { \
        fhem "set Motion_2 off";; \
        fhem "delete Motion_2_NotifyOff ";; \
        define Motion_2_NotifyOff at +00:00:30 { \
            fhem "set Lichterkette_1 off";; \
            system "/usr/local/bin/irsend SEND_ONCE led off &";; \
        } \
        if ("$value{Lichterkette_1}" eq "off")  { \
            fhem "set Lichterkette_1 on";; \
            system("/usr/local/bin/irsend SEND_ONCE led on &");; \
        } \
    }\
}


Wer sieht was, was ich nicht sehe? ;)
Titel: Antw:Syntax error
Beitrag von: hckoe am 11 Dezember 2013, 08:58:23
Die Fehlermeldung aus dem Log wäre hilfreich.

Gruß
Helmut
Titel: Antw:Syntax error
Beitrag von: Rohan am 11 Dezember 2013, 10:48:39
Hi,

Zitat von: dadio am 10 Dezember 2013, 23:20:44


            system "/usr/local/bin/irsend SEND_ONCE led off &";; \


abgetippt oder cut and paste (?), denn ...

Zitat
            system("/usr/local/bin/irsend SEND_ONCE led on &");; \

im ersten Fall fehlen imho die "(" und ")"

Könnte aber auch sein, dass Perl, welches ja durch "system..." aufgerufen wird, nicht mit dem "&" klarkommt. Setze den Befehlsstring doch einfach mal in Ticks (') statt Hochkommatas ("). Habe jetzt gerade keine Perl-Umgebung zum Testen parat und Perl-Guru bin ich auch nicht.

Gruß
Thomas

P.S. Mein Vorposter hat aber recht. Nächstes Mal bitte die Fehlermeldung gleich mitposten.
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 22:01:00
Danke für eure Antworten. Leider helfen die Änderungen nicht:

define Motion_2_Notify notify Motion_2 { \
    if ("%" eq "motion" && !isday()) { \
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        define Motion_2_NotifyOff at +00:00:59 { \
            fhem("set Lichterkette_1 off");;\
            system("/usr/local/bin/irsend SEND_ONCE led off &")\
        };; \
        if ("$value{Lichterkette_1}" eq "off")  { \
            fhem("set Lichterkette_1 on");; \
            system("/usr/local/bin/irsend SEND_ONCE led on &") \
        } \
    }\
}


Fehlermeldung aus dem Log:
2013.12.11 21:57:53 3: Motion_2_Notify return value: syntax error at (eval 253) line 5, near "00:"
syntax error at (eval 253) line 14, near "}
Titel: Antw:Syntax error
Beitrag von: Joachim am 11 Dezember 2013, 22:09:46
Moin,
zähle mal die geschweiften Klammern, ich glaube, da fehlt eine.
{4x auf, 3x zu}

Gruß Joachim
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 22:12:04
Hallo Joachim,

hm. Ich zähle jeweils 4.
Titel: Antw:Syntax error
Beitrag von: Joachim am 11 Dezember 2013, 22:14:40
Ups, hast recht.
Wäre so schön einfach gewesen.
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 22:15:55
Folgende Änderung führt auch zu einem Fehler:

define Motion_2_Notify notify Motion_2 { \
    if ("%" eq "motion" && !isday()) { \
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        fhem("define Motion_2_NotifyOff at +00:00:59 set Lichterkette_1 off;;system('/usr/local/bin/irsend SEND_ONCE led off')");;\
        if ("$value{Lichterkette_1}" eq "off")  { \
            fhem("set Lichterkette_1 on");; \
            system("/usr/local/bin/irsend SEND_ONCE led on &") \
        };; \
    };;\
}


2013.12.11 22:12:54 3: define Motion_2_NotifyOff at +00:00:59 set Lichterkette_1 off;system('/usr/local/bin/irsend SEND_ONCE led off') : Unknown command system('/usr/local/bin/irsend, try help.
2013.12.11 22:12:54 3: Motion_2_Notify return value: -1


Es kann doch nicht so schwer sein, ein paar Ifs und Befehle zu verschachteln :(
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 22:37:35
also beim kurz drüber fliegen und ohne anspruch auf vollständigkeit:

- du bist in perl context. das 'define Motion_2_NotifyOff at +00:00:59' ist fhem code. muss also auch in ein fhem("...")
- die { dahinter ist überflüssig. die zugehörige } natürlich auch
- du solltest dein notify genau auf Motion_2:motion definieren. dann wird es nicht überflüssigerweise aufgerufen.
- wenn die definition eng genug ist kannst du den vergleich auf motion am anfang weg lassen und nur !isday() prüfen
- du solltest nicht mehr % verwenden sondern $EVENT (wenn die definition passt brauchst du aber auch das nicht)
- "$value{Lichterkette_1}" muss Value("Lichterkette_1") heissen
- am ende der system zeile fehlt das ;

- am  besten gibst du den code des notify in den dialog ein der kommt wenn du in der detail ansicht von Motion_2_Notify auf DEF klickst. dann sparst du dir das verdopllent der ; und maskieren der zeilenenden

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 22:44:10
Zitat von: justme1968 am 11 Dezember 2013, 22:37:35
- du bist in perl context. das 'define Motion_2_NotifyOff at +00:00:59' ist fhem code. muss also auch in ein fhem("...")

Hallo Andre,

danke für deine ausführliche Hilfe. Wenn ich wieder die fhem() Funktion aufrufe, wie kann ich darin wieder in den Perl Kontext wechseln?

fhem("[..] {} [..]")

so?
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 22:49:33
das kommt auf einen versuch an. aber selbst wenn es geht brauchst du das doch gar nicht...

du schreibst ja nur den perl code hin der dann im definierten at ausgeführt werden soll. also nicht jetzt aus dem fhem context sondern später. das ist also auf jeden fall ok.

ich sehe gerade du hast eine zweite version gepostet bei der dieser teil schon richtig ist. der kommentar bezog sich auf die version am anfang des thread.

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 22:52:13
Ich frage mich nur gerade, wie ich den Shell Cmd aus einem fhem() heraus aufrufen kann..

fhem("define Motion_2_NotifyOff at +00:00:59 [wie rufe ich hier mein shell cmd auf?]")
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 22:57:32
das musst du doch gar nicht sondern genau umgekehrt. aus perl fhem aufrufen und die lichterkette schalten und dann den system aufruf:
fhem("define Motion_2_NotifyOff at +00:00:59 { fhem('set Lichterkette_1 off'); system('/usr/local/bin/irsend SEND_ONCE led off');}")

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 23:05:11
Ich habe deine Tipps umgesetzt und erhalte nun direkt beim Speichern der Config:

Unknown command system('/usr/local/bin/irsend, try help. Unknown command };, try help.

define Motion_2_Notify notify Motion_2:motion { \
    if (!isday()) { \
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        fhem("define Motion_2_NotifyOff at +00:00:59 { fhem("set Lichterkette_1 off"); system('/usr/local/bin/irsend SEND_ONCE led off')");};; \
        if (Value("Lichterkette_1") eq "off")  { \
            fhem("set Lichterkette_1 on");; \
            system("/usr/local/bin/irsend SEND_ONCE led on &");; \
        };; \
    };; \
}


Wenn ich diese Zeile lösche ist die Syntax ok.

        fhem("define Motion_2_NotifyOff at +00:00:59 { fhem("set Lichterkette_1 off"); system('/usr/local/bin/irsend SEND_ONCE led off')");};; \


Irgendwie scheint das Verschachteln nicht zu funktionieren.
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 23:10:48
- ich hab nicht aufgepasst. system erwartet nicht einen string sondern die einzelnen parameter als array. es ist einfacher wenn du qx() verwendest. einfach dein system durch qx ersetzen.

- beim speichern gibt es eigentlich keine syntax oder sonstige prüfung. wo genau speichster du?

- wie oben gesagt: schreib den ganzen code in der detail ansicht nach dem klick auf DEF. und alle doppelten ; und \ weg lassen.

und noch was: wenn dein aktor on-for-timer kann ist es einfacher einfach on-for-timer zu verwenden. das spart das ganze selber um das ausschalten zu kümmern.

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 23:16:57
Danke für deine Hilfe. Leider ändert das nichts:
Unknown command qx(\"/usr/local/bin/irsend, try help. Unknown command }");, try help.

Der system call weiter unten system("/usr/local/bin/irsend SEND_ONCE led on &");; \ funktioniert auch. Scheint wirklich nur an der Verschachtelung zu liegen,

Ich bearbeite es direkt über die Weboberfläche unter "config file" fhem.cfg.

So sieht es zur Zeit aus:

define Motion_2_Notify notify Motion_2:motion { \
    if (!isday()) { \
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        fhem("define Motion_2_NotifyOff at +00:00:59 { fhem(\"set Lichterkette_1 off\");qx(\"/usr/local/bin/irsend SEND_ONCE led off\");}");; \
        if (Value("Lichterkette_1") eq "off")  { \
            fhem("set Lichterkette_1 on");; \
            system("/usr/local/bin/irsend SEND_ONCE led on &");; \
        };; \
    };; \
}
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 23:18:25
in der qx zeile ist ein \ zu viel glaube ich.

bearbeite es unter DEF. und lass fhem das maskieren machen.

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 23:20:40
hm das scheint der Fehler zu sein. Im DEF steht nur:

Motion_2:motion {
    if (!isday()) {
        fhem("set Motion_2 off");
        fhem("delete Motion_2_NotifyOff");
        fhem("define Motion_2_NotifyOff at +00:00:59 { fhem(\"set Lichterkette_1 off\")
Titel: Antw:Syntax error
Beitrag von: justme1968 am 11 Dezember 2013, 23:22:27
keine \" verwenden. schau dir noch mal meine version an:

fhem("define Motion_2_NotifyOff at +00:00:59 {fhem('set Lichterkette_1 off'); system('/usr/local/bin/irsend SEND_ONCE led off');}")

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 23:42:56
1000 Dank André. Dein Tipp über DEF die Regeln zu bearbeiten ist wirklich Gold wert. Nun funktioniert alles wie es soll :)

define Motion_2_Notify notify Motion_2:motion { \
    if (!isday()) {\
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        fhem("define Motion_2_NotifyOff at +00:00:59 {fhem('set Lichterkette_1 off');; system('/usr/local/bin/irsend SEND_ONCE led off');;}");;\
        if (Value("Lichterkette_1") eq "off")  {\
            fhem("set Lichterkette_1 on");;\
            system("/usr/local/bin/irsend SEND_ONCE led on &");;\
        }\
    }\
}
Titel: Antw:Syntax error
Beitrag von: dadio am 11 Dezember 2013, 23:55:41
hm zu früh gefreut. Jetzt lässt er mich zwar speichern aber dann steht im Log wieder:

2013.12.11 23:49:27 3: define Motion_2_NotifyOff at +00:00:10 {fhem('set Lichterkette_1 off'); system('/usr/local/bin/irsend SEND_ONCE led off');} : Unknown command system('/usr/local/bin/irsend, try help.
Unknown command }, try help.
2013.12.11 23:49:27 3: Motion_2_Notify return value: -1
2013.12.11 23:49:37 3: Motion_2_NotifyOff: Unknown command {fhem('set, try help.


Das ist doch zum Verzweifeln :(
Titel: Antw:Syntax error
Beitrag von: justme1968 am 12 Dezember 2013, 00:16:30
du musst überall einfache ; verwenden ausser im define des at. da müssen es doppelte sein weil dieser teil 1:1 durchgereicht wird und nicht automatisch ergänzt wird.

in dem DEF dialog muss genau das hier stehen:Motion_2:motion {
    if (!isday()) {
        fhem("set Motion_2 off");
        fhem("delete Motion_2_NotifyOff");
        fhem("define Motion_2_NotifyOff at +00:00:59 {fhem('set Lichterkette_1 off');; system('/usr/local/bin/irsend SEND_ONCE led off');;}");
        if (Value("Lichterkette_1") eq "off")  {
            fhem("set Lichterkette_1 on");
            system("/usr/local/bin/irsend SEND_ONCE led on &");
        }
    }
}
ohne irgendwelchen sonstigen Ergänzungen.

ansonsten schau dir noch mal das on-for-timer an. wenn dein aktor das kann ist es die einfachere variante.

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 12 Dezember 2013, 00:24:53
Wow es funktioniert! Noch einmal vielen Dank für all deine Hilfe.

Diese Syntax macht aber überhaupt keinen Sinn. Wer hat sich denn das ausgedacht? Wir haben doch gesagt, dass wir uns mit { } im Perl Kontext befinden. Warum muss man dann trotzdem noch doppelte Semikolon verwenden? Was wäre wenn man wieder eine Bedingung benötigen würde? Dann lässt sich der Code nicht mehr lesen. Wäre es nicht wesentlich einfacher, wenn man alles mit Perl programmieren könnte?

In der Config sieht das ganze jetzt so aus:

define Motion_2_Notify notify Motion_2:motion {\
    if (!isday()) {\
        fhem("set Motion_2 off");;\
        fhem("delete Motion_2_NotifyOff");;\
        fhem("define Motion_2_NotifyOff at +00:00:10 {fhem('set Lichterkette_1 off');;;; system('/usr/local/bin/irsend SEND_ONCE led off');;;;}");;\
        if (Value("Lichterkette_1") eq "off")  {\
            fhem("set Lichterkette_1 on");;\
            system("/usr/local/bin/irsend SEND_ONCE led on &");;\
        }\
    }\
}
Titel: Antw:Syntax error
Beitrag von: justme1968 am 12 Dezember 2013, 00:45:03
das grund problem ist das es keinen wirklichen parser gibt und das pplitten der fhem kommandos jeweils an einem ; beim wechsel zwischen fhem und perl ebene probleme hat.

wenn ein notify oder at komplizierter als ein paar zeilen wird ist es das beste alles in eine perl routine zu stecken und diese in ein 99_myUtils.pm file zu packen. da gibt es diese probleme nicht.

eine andere möglickeit ist dem wechsel vom fhem nach perl für das define zu vermeiden und CommandDefine direkt aufzurufen.

oder wenigstens mal zu schauen ob der aktor on-for-timer kann :)

gruss
  andre
Titel: Antw:Syntax error
Beitrag von: dadio am 12 Dezember 2013, 00:49:07
Zitat von: justme1968 am 12 Dezember 2013, 00:45:03
oder wenigstens mal zu schauen ob der aktor on-for-timer kann :)

Ich weiß nicht genau was du damit meinst. Die Aktoren sind ganz einfache billig Funksteckdosen. Denen kann ich nur ein ON- Und OFF Signal senden. Ein Timer ist nicht verbaut.