Hallo zusammen,
ich habe mir folgendes Perl-DOIF zusammengebaut.
< Fenster wird geöffnet >
{
if (["^FTK_:open|255"] and AttrVal("$DEVICE","room","") !~ /Garage|Garten/)
{
set_Exec("$DEVICE_timer",'$count == 0 ? 10 : (10/$count)','fhem_set ("xxxx msg {(AttrVal("$DEVICE" ,"alias",""))} ist noch offen")','$count < 9')
}
}
Sobald ich im fhem_set Block den Alias-Namen des Gerätes ermitteln lassen möchte, fliegt das DOIF aus der Bahn.
error: in fhem_set ("xxx msg {(AttrVal("FTK_WZ_old" ,"alias",""))} ist noch offen")): syntax error at (eval 789468) line 1, near ""xxxx msg {(AttrVal("FTK_WZ_old"
Das Device "FTK_WZ_old" wird noch korrekt ermittelt.
Kann es sein, dass die Kommas innerhalb der Klammer noch escaped werden müssen? Ich habe schon probiert, den gesamten in fhem_set Block mit (( )) auszuführen, kein Unterscheid (Kommas nicht als Trennzeichen etc.).
Im FHEM-DOIF funktioniert die Abfrage mit dem Alias in der o.g. Form problemlos. Auch im Bedingungsteil dieses Perl-DOIFs funktioniert die Abfrage ebenfalls ohne Probleme.
Hat jemand ein Tipp?
Vielen Dank vorab,
Max
Das Problem ist eher bei den Anführungszeichen:
fhem_set ("xxxx msg {(AttrVal("$DEVICE" ,"alias",""))} ist noch offen")
Wenn man das zerlegt, sind das 6 Strings ohne irgendeiner Verknüpfung dazwischen:
"xxxx msg {(AttrVal("
$DEVICE
" ,"
alias
","
"))} ist noch offen"
Hi amenomade,
wenn ich ' statt " benutzte, ändert das aber leider auch nichts...
Die Anführungszeichen sind für die Syntax ja notwendig...
Hast Du noch eine Idee?
Max
Klar, es wird mit ' nicht besser als mit "
Du hast ein String in einem String in einem String. In Tags Syntax würdest Du es so haben wollen:
Zitat<stringlevel1>fhem_set (<stringlevel2>xxxx msg {(AttrVal(<stringlevel3>$DEVICE</stringlevel3> ,<stringlevel3>alias</stringlevel3>,<stringlevel3></stringlevel3>))} ist noch offen</stringlevel2>)</stringlevel1>
Das kannst Du nicht so einfach immer mit den gleichen Quotes machen. Versuch mal das 3. Level zu escapen:
fhem_set ("xxxx msg {(AttrVal(\"$DEVICE\" ,\"alias\",\"\"))} ist noch offen")
Das hat funktioniert. Jetzt wird der Alias korrekt ausgelesen.
Durch das escaped werden die "" dann wieder wie ein Level 2 String interpretiert, verstehe ich das richtig?
Vielen Dank amenomade!
Max
Ich würde nicht so tief schachteln, sondern mit Punkt in Perl den String zusammensetzen:
'fhem_set ("xxxx msg ".AttrVal("$DEVICE" ,"alias","")." ist noch offen")'
@Damian: Bei Deinem Vorschlag bekomme ich den Text > HASH(0x718b308) ist noch offen < als Nachricht geschickt ;-)
Ich habe noch eine Frage:
Das DOIF funktioniert jetzt mit den Alias Abfragen wie gewünscht. Auch bekomme ich die Nachrichten, wenn ein fenster offen ist.
Öffne ich ein weiteres Fenster, dann sehe ich im DOIF auch einen zweiten "wait timer", allerdings wird dieser gelöscht, wenn der "wait timer" vom ersten Fenster ausgeführt wird.
Ich hätte es so verstanden, dass diverse "wait timer" parallel verarbeitet werden können? Mache ich noch etwas falsch?
Vielen Dank vorab und schönen Abend,
Max
Wenn die Timer-Namen unterschiedlich sind, dann sollten sie unabhängig voneinander existieren. Evtl. mit F5 den Browser aktualisieren, um den aktuellen Stand im Fenster zu überprüfen.