Hauptmenü

Syntax error

Begonnen von dadio, 10 Dezember 2013, 23:20:44

Vorheriges Thema - Nächstes Thema

dadio

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? ;)

hckoe

Die Fehlermeldung aus dem Log wäre hilfreich.

Gruß
Helmut
# CT mit Debian Buster / FHEM aktuell / EnOcean TCM310 / Eltako FSA12, FUD12NPN, FSB12, FRW, FSRP-230V
# Permundo PCS234, Nodon NO-SIN-2-2-00, GTAGS

Rohan

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.
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

dadio

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 "}

Joachim

Moin,
zähle mal die geschweiften Klammern, ich glaube, da fehlt eine.
{4x auf, 3x zu}

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

dadio

Hallo Joachim,

hm. Ich zähle jeweils 4.

Joachim

Ups, hast recht.
Wäre so schön einfach gewesen.
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

dadio

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 :(

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

dadio

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?

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

dadio

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?]")

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

dadio

#13
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.

justme1968

- 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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968