Alias im "fhem_set" Block ermitteln führt zu Fehler

Begonnen von Sirel, 15 Oktober 2020, 22:32:11

Vorheriges Thema - Nächstes Thema

Sirel

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


amenomade

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"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Sirel

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

amenomade

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")
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Sirel

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

Damian

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")'
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

@Damian: Bei Deinem Vorschlag bekomme ich den Text > HASH(0x718b308) ist noch offen < als Nachricht geschickt ;-)

Sirel

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF