Filterbedingung aus Reading übernehmen - geht und geht nicht

Begonnen von Sirel, 05 Juli 2017, 18:33:41

Vorheriges Thema - Nächstes Thema

Sirel

Hallo zusammen,
ich möchte die Bedinung eines Filters aus einem Reading auslesen. Ich habe ein DOIF mit nachgelagerten IF Bedinungen.
Mein DOIF sieht in etwa so aus:
(Bedingung bla bla bla) (set RL_SZ_Links:FILTER=position_2>{(ReadingsVal('du_Beschattung','Abdunkelung',35))} dim [du_Beschattung:Abdunkelung])
Dieser Code funktioniert.
Weiter geht es mit
DOELSEIF (Bedingung blablalba)
(
IF (Bedingung bla bla bla) (set RL_SZ_Links:FILTER=position_2<={(ReadingsVal('du_Beschattung','Abdunkelung',35))} Hoch),
IF (Bedingung bla bla bla) (set .... ))


Im ersten Teil funktioniert die Abfrage wie gewünscht.
Im unteren Teil (IF...) erhalte ich einen Error und es wird eine fehlende rechte Klammer moniert. Ersetze ich aber :FILTER=position_2<={(ReadingsVal('du_Beschattung','Abdunkelung',35))} durch :FILTER=position_2<=25 funktioniert die Abfrage ohne Probleme. Die Klammern sind also alle richtig gesetzt. 

Wie kann das sein? Ich habe auch geschaut, ob im ersten Fall nur immer der Defaultwert zurückgeliefert wird, dem ist aber nicht so. Es funktioniert so wie es sein gedacht.
Gibt es dafür eine Erklärung?

Vielen Dank und Grüße,
Max

Damian

nimm die doppelten Anführungszeichen, die einfachen braucht IF für sich selbst

set RL_SZ_Links:FILTER=position_2<={(ReadingsVal("du_Beschattung","Abdunkelung",35))}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Hi Damian,

wie immer, besten Dank für die promte Hilfe. Das Ergebnis ist trotz doppelten Anführungszeichen identisch:

IF: no right bracket: {(ReadingsVal("du_Beschattung"

Hier mal der gesamte Code Block:

(
IF ([rgr_Bewohner] =~ /gone|absent/) ((set RL_KZ_Links,RL_WZ_Mitte,RL_GZ_Links,RL_SZ_Mitte,RL_SZ_Rechts dim [du_Beschattung:Abdunkelung]), set RL_WZ_Links position {(100-[du_Beschattung:Abdunkelung])}, set RL_SZ_Links:FILTER=position_2<={(ReadingsVal("du_Beschattung","Abdunkelung",25))} Hoch, set Markise:FILTER=STATE!=closed Rein),
IF ([rgr_Bewohner] =~ /home/ and [RB_Wetter:wind_speed:d] <=30 and [FTK_WZ_Links] eq "open") ((set RL_KZ_Links,RL_WZ_Mitte,RL_GZ_Links,RL_SZ_Mitte,RL_SZ_Rechts dim [du_Beschattung:Abdunkelung]), set Markise:FILTER=STATE!=open Raus, set RL_SZ_Links:FILTER=position_2<={(ReadingsVal("du_Beschattung","Abdunkelung",25))} Hoch),
IF ([rgr_Bewohner] =~ /home/ and [RB_Wetter:wind_speed:d] >30 and [FTK_WZ_Links] eq "closed") ((set RL_KZ_Links,RL_WZ_Mitte,RL_GZ_Links,RL_SZ_Mitte,RL_SZ_Rechts dim [du_Beschattung:Abdunkelung]), set RL_WZ_Links position {(100-[du_Beschattung:Abdunkelung])}, set RL_SZ_Links:FILTER=position_2<={(ReadingsVal("du_Beschattung","Abdunkelung",25))} Hoch, set Markise:FILTER=STATE!=closed Rein),
IF ([rgr_Bewohner] =~ /home/ and [RB_Wetter:wind_speed:d] >30 and [FTK_WZ_Links] eq "open") ((set RL_KZ_Links,RL_WZ_Mitte,RL_GZ_Links,RL_SZ_Mitte,RL_SZ_Rechts dim [du_Beschattung:Abdunkelung]), (set RL_SZ_Links,RL_WZ_Links Hoch), set Markise:FILTER=STATE!=closed Rein)
)


Viele Grüße,
Max

Damian

jetzt noch die set-Anweisung in Klammern setzen, damit Komma nicht als Trennzeichen erkannt wird:


..., (set RL_SZ_Links:FILTER=position_2<={(ReadingsVal("du_Beschattung","Abdunkelung",25))} Hoch),...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Hi Damian,
besten Dank! Jetzt läuft es wieder wie am Schnürrchen.
Ich würde nur gerne verstehen, warum ich diesen Teil noch einmal gesondert klammern muss? Hast Du das beim DOIF oder IF beschrieben und ich habe es übersehen?

Beste Grüße und nochmals vielen Dank,

Max

Damian

Zitat von: Sirel am 05 Juli 2017, 19:30:44
Hi Damian,
besten Dank! Jetzt läuft es wieder wie am Schnürrchen.
Ich würde nur gerne verstehen, warum ich diesen Teil noch einmal gesondert klammern muss? Hast Du das beim DOIF oder IF beschrieben und ich habe es übersehen?

Beste Grüße und nochmals vielen Dank,

Max

Für DOIF und IF ist Komma ein Trennzeichen für die Kommandos. Nun hat aber deine set-Anweisung auch ein Komma, damit dieser Ausdruck an der Komma-Stelle nicht auseinander gerissen wird, muss man es zusätzlich klammern. Das steht aber sowohl in der IF- als auch DOIF-Commandref.

DOIF besitzt inzwischen mehr Intelligenz  als IF, daher wäre dein ursprünglicher set-Ausdruck wenn er nicht in IF, sondern nur in DOIF gewesen wäre, durchgegangen, weil ein Komma innerhalb von Klammern oder Anführungszeichen bei DOIF als geschützt erkannt wird und nicht zum Trennzeichen wird.


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

Sirel

Ah, ok. Das bezieht sich auf die Kommas in der Klammer vom ReadingsVal, richtig? Dann verstehe ich es.
Ist dann die gleiche Logik, als wenn ich eine sage (set aktor1,aktor2,...,aktorN dim bla).

Thx und schönen Abend,

Max