Perl innerhalb define at: Syntaxfehler?

Begonnen von heikoh81, 05 Mai 2015, 21:45:07

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich stehe auf dem Schlauch, vermutlich ist es nur ein winziger Syntax-Fehler.
Ich möchte folgendes:

  • fährt ein bestimmter Rollo runter, wird zunächst geprüft, ob Markise 1 noch ausgefahren ist, wenn ja, fährt sie ein
  • 40 Sekunden später soll geprüft werden, ob Markise 2 noch ausgefahren ist, und wenn ja, ebenfalls eingefahren werden

Der erste Teil klappt, d.h. der Rollo triggert ein Notify und fährt Markise 1 nach Prüfung, ob sie "nicht eingefahren" ist, rein.
Aber der zweite Teil reproduziert Syntaxfehler im Log, vermutlich wg. des eingeschachtelten if.

Nachfolgender Code ist aus dem Webeditor von FHEM kopiert.

define RWohnGrossSteuertMarkise_notify

0_RWohnGross:off {
  if ( Value("RWohnGrossUntenFaehrtMarkiseEinChkBox") eq "on" ) {
    if ( Value("Markise_Pergola_Rechts") ne "einfahren" ) {
      fhem("set Markise_Pergola_Rechts einfahren");
    }
    if ( Value("Markise_Pergola_Links_Einfahren_Temp") ne "" ) {
  fhem("delete Markise_Pergola_Links_Einfahren_Temp");
}
    fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          }
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;
    ");
  }
}


Dieses define at wird im 2. Teil noch angelegt, allerdings im Raum "unsorted" und nicht wie per attr gefordert im Raum "Garten":
define Markise_Pergola_Links_Einfahren_Temp at

+00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');
            }
          }
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;

Bei den doppelten ; habe ich schon alle Varianten ohne Erfolg probiert, d.h. auch nur einfaches;, das ; hinter "Markisenautomatik" weggelassen etc.

Vielen Dank für eure Hilfe,
viele Grüße,
Heiko

Icinger

Du trennst ja auch das define nicht von dem ersten Attr, da fehlt dir ein ;;

fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          };;
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;


Ausserdem würd ichs so machen:
fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          }");
          fhem("attr Markise_Pergola_Links_Einfahren_Temp room Garten");
          fhem("attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik");


Ist imho übersichtlicher und du ersparst die die Frickelei mit ; oder ;; oder sonstigen Späßen :)

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Bennemannc

Hallo,

wenn es im ersten Teil mit - ne "einfahren" funktioniert, warum steht dann im zweiten Teil - ne 'einfahren' ?
Genauer im zweiten Teil ist in der Abfrage der Valuewert mit einfachen Hochkomma, im ersten Teil mit doppelten

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

heikoh81

#3
Danke für eure Antworten.

@Icinger
Ich packe die Attr in den eigentlichen fhem-Befehl mit rein, da ich teilweise recht umfangreiche Zeitberechnungen in den defines hatte.
Das hat den alten Raspi1 bei deiner vorgeschlagenen Variante wohl so zu schaffen gemacht, dass die attr teilweise gesetzt wurden, als das Objekt noch gar nicht erstellt war.
Demzufolge lief es auf Fehler.
Ich bin mir aber nicht sicher, ob FHEM und/oder Raspbian eine solche Parallelisierung von Prozessen überhaupt unterstützt oder ob das Zufall war.
Mit erscheinen des Raspi2, den ich mir sofort nach Erscheinen bestellt hatte, war das natürlich kein Problem mehr, aber ich habe mir die Angewohnheit beibehalten.
Was den Code natürlich komplizierter macht - aber das ist dann die Herausforderung :-)


0_RWohnGross:off {
  if ( Value("RWohnGrossUntenFaehrtMarkiseEinChkBox") eq "on" ) {
    if ( Value("Markise_Pergola_Rechts") ne "einfahren" ) {
      fhem("set Markise_Pergola_Rechts einfahren");
    }
    if ( Value("Markise_Pergola_Links_Einfahren_Temp") ne "" ) {
  fhem("delete Markise_Pergola_Links_Einfahren_Temp");
}
    fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          };;
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;
    ");
  }
}


erstellt folgendes zeitverzögerte define:



+00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');
            }
          };
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;



und liefert im Log:

2015.05.05 22:07:21 3: Markise_Pergola_Links_Einfahren_Temp: Unknown command {
, try help.
Unknown command }
, try help.




@Bennemannc

Verwende ich für den Value ""

0_RWohnGross:off {
  if ( Value("RWohnGrossUntenFaehrtMarkiseEinChkBox") eq "on" ) {
    if ( Value("Markise_Pergola_Rechts") ne "einfahren" ) {
      fhem("set Markise_Pergola_Rechts einfahren");
    }
    if ( Value("Markise_Pergola_Links_Einfahren_Temp") ne "" ) {
  fhem("delete Markise_Pergola_Links_Einfahren_Temp");
}
    fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne "einfahren" ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          };;
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;
    ");
  }
}


erhalte ich im Log:

2015.05.05 22:11:43 1: PERL WARNING: Bareword found where operator expected at (eval 53206) line 10, near ""define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne "einfahren"
  (Might be a runaway multi-line "" string starting on line 9)
2015.05.05 22:11:43 3: eval: {
  if ( Value("RWohnGrossUntenFaehrtMarkiseEinChkBox") eq "on" ) {
    if ( Value("Markise_Pergola_Rechts") ne "einfahren" ) {
      fhem("set Markise_Pergola_Rechts einfahren");
    }
    if ( Value("Markise_Pergola_Links_Einfahren_Temp") ne "" ) {
  fhem("delete Markise_Pergola_Links_Einfahren_Temp");
}
    fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne "einfahren" ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          };;
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;
    ");
  }
}
2015.05.05 22:11:43 1: PERL WARNING: String found where operator expected at (eval 53206) line 16, at end of line
  (Might be a runaway multi-line "" string starting on line 10)
2015.05.05 22:11:43 3: eval: {
  if ( Value("RWohnGrossUntenFaehrtMarkiseEinChkBox") eq "on" ) {
    if ( Value("Markise_Pergola_Rechts") ne "einfahren" ) {
      fhem("set Markise_Pergola_Rechts einfahren");
    }
    if ( Value("Markise_Pergola_Links_Einfahren_Temp") ne "" ) {
  fhem("delete Markise_Pergola_Links_Einfahren_Temp");
}
    fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne "einfahren" ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          };;
          attr Markise_Pergola_Links_Einfahren_Temp room Garten;;
          attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik;;
    ");
  }
}
2015.05.05 22:11:43 3: RWohnGrossSteuertMarkise_notify return value: syntax error at (eval 53206) line 10, near ""define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne "einfahren"



Deshalb verwende ich einfache Hochkomma.

Viele Grüße,
Heiko

heikoh81

Update:
Der Alternativ-Vorschlag von @Icinger funktioniert:

fhem("define Markise_Pergola_Links_Einfahren_Temp at +00:00:40 {
            if ( Value('Markise_Pergola_Links') ne 'einfahren' ) {
              fhem('set Markise_Pergola_Links einfahren');;
            }
          }");
          fhem("attr Markise_Pergola_Links_Einfahren_Temp room Garten");
          fhem("attr Markise_Pergola_Links_Einfahren_Temp group Markisenautomatik");


Damit bleibt die Frage:
Wie bekomme ich die attr in den ersten fhem-Aufruf?

Bennemannc

Hallo,

das Value('Markise_Pergola_Links') ne "einfahren" )  - Markise_Pergola_x hast Du oben auch in doppelten Hochkomma stehen.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF