Hauptmenü

Syntax error

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

Vorheriges Thema - Nächstes Thema

dadio

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 &");; \
        };; \
    };; \
}

justme1968

in der qx zeile ist ein \ zu viel glaube ich.

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

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

dadio

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\")

justme1968

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

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

dadio

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 &");;\
        }\
    }\
}

dadio

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

justme1968

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

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

dadio

#22
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 &");;\
        }\
    }\
}

justme1968

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

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

dadio

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.