Ersetzt DOIF Operanden [$SELF:P_test] durch einen Funktionsaufruf oder Wert?

Begonnen von _Markus_, 03 März 2018, 19:02:34

Vorheriges Thema - Nächstes Thema

_Markus_

Guten Abend,

eine Sache über die ich immer wieder stolpere und bzgl. der ich immer noch nicht ganz sicher bin:

Wenn ich in einem DOIF ein [$SELF:P_test] verwende, wird es dann

  • durch einen Funktionsaufruf Readingsval($SELF, ,,P_test")
  • durch einen Wert ohne Anführungszeichen
ersetzt?

In dem Post https://forum.fhem.de/index.php/topic,74026.msg657298.html#msg657298 wird darauf hingewiesen, dass der Aufruf durch den Wert des Readings ersetzt wird und der Aufruf des Operands [$SELF:...] daher in Anführungszeichen gesetzt werden muss. An anderer Stelle, die ich leider nicht mehr finde, meine ich gelesen zu haben, dass in einem Preprocessing ein Funktionsaufruf eingesetzt wird.

Wenn ich tatsächlich Anführungsstriche benötige:
DOIF (,,[$SELF:P_test]" eq ,,on") (...)
wie kann ich dann trotzdem Default-Values angeben? Muss ich dann den Funktionsaufruf nutzen?

Verhält sich das Preprocession überall im DOIF Modul gleich, oder gibt es Unterschiede? Bedingungsteil vs. Ausführungsteil? Perl?

Falls es irgendwo steht, bitte ich um Entschuldigung und um den Link - ich habe es nicht finden können.

Besten Dank im Voraus!
Markus

Damian

Zitat von: _Markus_ am 03 März 2018, 19:02:34
Guten Abend,

eine Sache über die ich immer wieder stolpere und bzgl. der ich immer noch nicht ganz sicher bin:

Wenn ich in einem DOIF ein [$SELF:P_test] verwende, wird es dann

  • durch einen Funktionsaufruf Readingsval($SELF, ,,P_test")
  • durch einen Wert ohne Anführungszeichen
ersetzt?

In dem Post https://forum.fhem.de/index.php/topic,74026.msg657298.html#msg657298 wird darauf hingewiesen, dass der Aufruf durch den Wert des Readings ersetzt wird und der Aufruf des Operands [$SELF:...] daher in Anführungszeichen gesetzt werden muss. An anderer Stelle, die ich leider nicht mehr finde, meine ich gelesen zu haben, dass in einem Preprocessing ein Funktionsaufruf eingesetzt wird.

Wenn ich tatsächlich Anführungsstriche benötige:
DOIF (,,[$SELF:P_test]" eq ,,on") (...)
wie kann ich dann trotzdem Default-Values angeben? Muss ich dann den Funktionsaufruf nutzen?

Verhält sich das Preprocession überall im DOIF Modul gleich, oder gibt es Unterschiede? Bedingungsteil vs. Ausführungsteil? Perl?

Falls es irgendwo steht, bitte ich um Entschuldigung und um den Link - ich habe es nicht finden können.

Besten Dank im Voraus!
Markus

[:]-Syntax wird im DOIF-Bedingungsteil durch Perl-Funktionsaufrufe ersetzt (siehe list des DOIF-Moduls). Im Ausführungsteil wird zusätzlich der Funktionsaufruf ausgeführt, und durch dessen Ergebnis ersetzt, also durch eine Zahl oder Text.

Problem sind FHEM-IF-Aufrufe, die werden von DOIF nicht angepackt, sondern dem IF-Befehl überlassen. Der IF-Befehl, der inzwischen in die Jahre gekommen ist, hat aber nicht den gleichen Funktionsumfang, wie DOIF, daher funktionieren manche Dinge, die später im DOIF eingebaut wurden, nicht, z. B. Defaultwerte, Outputfilter oder Aggregationsaufrufe.

Die Lösung ist die neue DOIF-Perl-Syntax, dort wird alles einheitlich behandelt, denn es gibt keinen Bedingungsteil und keinen Ausführungsteil. Jede Stelle wird durch Perl-Funktionsaufruf ersetzt.

Defaultwerte werden durch ein Komma angegeben:

DOIF ([$SELF:P_test,"blabla"]...




Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

_Markus_

Hi Damian,

Danke für die Klärung!
In Perlaufrufen einer Bedingung wird aber auch nur der Wert eingesetzt?
Und wenn der Wert ein Text ist, dann wird er trotzdem nicht in Anführungszeichen ausgegeben, also nur der reine Text, richtig?

Erlaube mir ein paar detailliertere Fragen:
DOELSEIF ([{sunset(0,"[$SELF:P_end_holiday_min]","[$SELF:P_end_holiday_max]")}|Fr Sa]
or ([{sunset(0,"[$SELF:P_end_holiday_min]","[$SELF:P_end_holiday_max]")}] and Value("NRW_Ferientag"))
and Value([$SELF:P_master_device]) eq "on"
and Value([$SELF:P_device]) ne "[$SELF:P_cmd_off]"
and ([$SELF:P_enabled_holiday,"off"] eq "on" or [$SELF:P_enabled_holiday,"off"] eq "sunset")
and ([$SELF:P_presence,"no presence"] eq "no presence"
or [$SELF:P_presence,"no presence"] eq "sunrise"
or Value([$SELF:P_presence_group]) eq "home"))
   (set [$SELF:P_device] [$SELF:P_cmd_off,"off"])


In den sunset Definitionen benötige ich trotzdem die Anführungszeichen, wenn ich das richtig sehe. Dann kann ich aber (mit dieser Syntax) keine Default-Werte mehr angeben, richtig?

Im Vergleich Value([$SELF:P_device]) ne "[$SELF:P_cmd_off]" brauche ich hinten die Anführungszeichen nicht, da durch einen Funktionsaufruf ersetzt wird, korrekt?

Mein Problem: Der DOIF-Zweig schaltet, obwohl P_enabled_holiday weder ,,on" noch ,,sunset" ist.

Freue mich auf Euer Feedback!

Grüße
Markus

Damian

Zitat von: _Markus_ am 03 März 2018, 20:56:22
Hi Damian,

Danke für die Klärung!
In Perlaufrufen einer Bedingung wird aber auch nur der Wert eingesetzt?
Und wenn der Wert ein Text ist, dann wird er trotzdem nicht in Anführungszeichen ausgegeben, also nur der reine Text, richtig?

Erlaube mir ein paar detailliertere Fragen:
DOELSEIF ([{sunset(0,"[$SELF:P_end_holiday_min]","[$SELF:P_end_holiday_max]")}|Fr Sa]
or ([{sunset(0,"[$SELF:P_end_holiday_min]","[$SELF:P_end_holiday_max]")}] and Value("NRW_Ferientag"))
and Value([$SELF:P_master_device]) eq "on"
and Value([$SELF:P_device]) ne "[$SELF:P_cmd_off]"
and ([$SELF:P_enabled_holiday,"off"] eq "on" or [$SELF:P_enabled_holiday,"off"] eq "sunset")
and ([$SELF:P_presence,"no presence"] eq "no presence"
or [$SELF:P_presence,"no presence"] eq "sunrise"
or Value([$SELF:P_presence_group]) eq "home"))
   (set [$SELF:P_device] [$SELF:P_cmd_off,"off"])


In den sunset Definitionen benötige ich trotzdem die Anführungszeichen, wenn ich das richtig sehe. Dann kann ich aber (mit dieser Syntax) keine Default-Werte mehr angeben, richtig?

Im Vergleich Value([$SELF:P_device]) ne "[$SELF:P_cmd_off]" brauche ich hinten die Anführungszeichen nicht, da durch einen Funktionsaufruf ersetzt wird, korrekt?

Mein Problem: Der DOIF-Zweig schaltet, obwohl P_enabled_holiday weder ,,on" noch ,,sunset" ist.

Freue mich auf Euer Feedback!

Grüße
Markus

Normalerweise brauchst keine Anführungszeichen.

sunset(0,[$SELF:P_end_holiday_min],[$SELF:P_end_holiday_max])

entspricht in der DOIF-Bedingung:

sunset(0,Perlfunktion(),Perlfunktion())

das ist in Perl kein Problem.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

_Markus_

Das hatte ich auch erwartet. Leider funktioniert es nicht. Zudem steht es in der Doku mit Anführungszeichen:

ZitatIndirekte Zeitangaben können auch als Übergabeparameter für Zeitfunktionen, wie z. B. sunset oder sunrise übergeben werden:

define di_time DOIF ([{sunrise(0,"[begin]","09:00")-{sunset(0,"18:00","[end]")]) (set lamp off) DOELSE (set lamp on)

Bei einer Änderung des angebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.

Nach meinem Verständnis müsste ein ,,[...]" hier dann mit den Aussagen von oben in ,,ReadingsVal(...)" münden, wobei Perl das als String deuten würde wegen der Anführungszeichen. Also scheine ich hier noch nicht ganz richtig zu liegen.

Daher (und weil mein DOIF sich unerwartet verhält) bin ich auf der Suche nach dem Verhalten des Präprozessors.

Siehe auch https://forum.fhem.de/index.php?topic=58191.0.

Damian

Zitat von: _Markus_ am 03 März 2018, 23:21:34
Das hatte ich auch erwartet. Leider funktioniert es nicht. Zudem steht es in der Doku mit Anführungszeichen:

Nach meinem Verständnis müsste ein ,,[...]" hier dann mit den Aussagen von oben in ,,ReadingsVal(...)" münden, wobei Perl das als String deuten würde wegen der Anführungszeichen. Also scheine ich hier noch nicht ganz richtig zu liegen.

Daher (und weil mein DOIF sich unerwartet verhält) bin ich auf der Suche nach dem Verhalten des Präprozessors.

Siehe auch https://forum.fhem.de/index.php?topic=58191.0.

ja, du hast Recht

Wenn für Zeitangaben Funktionen in geschweiften Klammern angegeben werden, dann wird der Wert ersetzt und nicht die Funktion.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF