Funktionsaufrufe im Ausführungsteil von DOIF

Begonnen von mikezulugolf, 16 Dezember 2016, 22:57:14

Vorheriges Thema - Nächstes Thema

mikezulugolf

Was hat mich das für Zeit gekostet......  Die Syntax im Ausführungsteil eines DOIFs kann ziemlich restriktiv sein und darüber bin ich so was von gestolpert.....

Was wollte ich eigentlich? Ganz einfach: Wenn ein HM Türkontakt Event "open" meldet, soll die dazugehörige Zeit in ein Dummy geschrieben werden, damit ich diesen Timestamp z.B. leicht in einem Floorplan anzeigen kann.

Angefangen habe ich mit
    define di_TK_Haustuer_open DOIF ([Tuerkontakt_Haustuer] eq "open") ( set Haustuer_lastOpened TimeNow() )
was natürlich schon im Bedingungsteil problematisch ist, weil da es da mehrere Events gibt, deren Inhalt nicht nur "open" ist. Da musste also deutlicher gefiltert werden. Mit
    define di_TK_Haustuer_open DOIF ([Tuerkontakt_Haustuer:state] eq "open") ( set Haustuer_lastOpened TimeNow() )
wurde dann zwar das dummy schön gesetzt, aber nicht mit dem gewünschten Inhalt, sondern mit dem String "TimeNow()".
OK, dann kam die Erinnerung, dass Perl-Ausdrücke in geschweifte Klammern gesetzt werden müssen, also
    define di_TK_Haustuer_open DOIF ([Tuerkontakt_Haustuer:state] eq "open") ( set Haustuer_lastOpened { TimeNow() } )
Ergebnis - wie vorher, das dummy erhielt den Wert "{ TimeNow() }".
Nun gibt es da noch die Bemerkung in der DOIF Doku, dass "Berechnungen können in geschweiften Klammern erfolgen. Aus Kompatibilitätsgründen, muss die Berechnung mit einer runden Klammer beginnen.". Klar - mach ich. Gesagt getan versuche ich ein
      define di_TK_Haustuer_open DOIF ([Tuerkontakt_Haustuer:state] eq "open") ( set Haustuer_lastOpened { ( TimeNow() ) } )
Die Berechnung beginnt mit einer runden Klammer, oder etwa nicht?  Perl-Scripts schreibe ich schon seit über 20 Jahren, so dachte ich, daran kann doch nichts falsch sein. Weit gefehlt, denn das Dummy wurde auf den Wert "{ ( TimeNow() ) }" gesetzt. Hätte ich etwa irgendwo Semikola (einfach oder doppelt) oder irgendwelche doppelten Klammern nehmen sollen?  Die möglichen Varianten überstiegen meine Geduld.

Bis ich dann einige Schritte zurückgetreten bin und versucht habe, zu verstehen, was an den in der Doku angegebenen funktionierenden Beispielen mit meinen Versuchen nicht zusammenpasst.  Es hat gedauert, aber dann hatte ich es.
Der Lesbarkeit halber hatte ich zu viele Blanks eingestreut.  Was endlich dann mal funktioniert hat, war
    define di_TK_Haustuer_open DOIF ([Tuerkontakt_Haustuer:state] eq "open") ( set Haustuer_lastOpened {(TimeNow())} )
Haste Töne?   Ist Perl wirklich so "blank-empfindlich"? Nee eigentlich nicht.

Verehrte DOIF Maintainer/Entwickler, dieses DOIF Modul ist wirklich eine schöne Sache.  Wäre es möglich die entsprechende für das Parsing zuständige Verarbeitung so zu erweitern, dass was immer auch einem "eval" vorgesetzt wird, unempfindlicher gegenüber "eingestreuten" Leerzeichen wird?  Ich weiss, einfach ist das nicht, da beispielsweise Blanks innerhalb von Literalen gerade eben nicht unbedeutend sind. Aber wenn Ihr mal einen ruhigen Moment und einen dazu passenden Geistesblitz habt, könnte man das vielleicht implementieren?

Anderenfalls zumindest bitte in der Doku (commandref_DE.html#DOIF_Berechnungen_im_Ausfuehrungsteil) erwähnen, dass in der Syntax dieser Berechnungen keine Leerzeichen erlaubt sind.

Vielen Dank.

Richard.