Hallo,
ich versuche seit Tagen vergeblich in einem DOIF-Ausführungsteil innerhalb eines Perl-Blocks ein Zeitintervall mit indirekten Zeitangaben abzufragen. Also: Ist die aktuelle Zeit innerhalb des Zeitfensters TestZeit1 bis TestZeit2?
(Hintergrund ist, dass ich mehrere Trigger habe, und nur für einige Bedingungen das Zeitfenster relevant ist.)
Für die normale Trigger-Abfrage im Bedingungsteil ist der Fall klar; nach CommandRef:
- im fhem-Modus: ([[begin]-[end]])
- im Perl-Modus: { if([[begin]-[end]]) }
Danach würde ich erwarten, dass eine vergleichbare Syntax auch für eine if-Abfrage im Perl-Ausführungsteil funktioniert, ohne Triggerung mit zusätzlichem Fragezeichen, also:
{ if( [?[begin]-[end]] ) ....}. Dies scheint aber so nicht richtig. Oder geht das in dem Perl-Ausführungsteil einfach gar nicht? Ich finde auch nach langer Suche keinen Code, der sowohl keine Syntax-Fehler erzeugt, als auch funktioniert.
Hier verallgemeinert für die Kernfrage:
.... DOIF (<Trigger-Bedingung>)
{ if ( [?[TestZeit1]-[TestZeit2]] )
{ <Befehl für true> }
else { <Befehl für false> }
}
Konkret (Raw-Definition):
defmod Test_DummyZeiten_doif DOIF ( ["TestStart:TestRun_Dummies"] ) \
{ if ( ( [?[TestZeit1]-[TestZeit2]] ) )\
{ fhem ("set TestDummy in") } \
else { fhem ("set TestDummy out" ) } \
}
attr Test_DummyZeiten_doif do always
attr Test_DummyZeiten_doif group 000_Allgemein
attr Test_DummyZeiten_doif room Testing_Holger,Testing
setstate Test_DummyZeiten_doif cmd_1
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 Device TestStart
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 cmd 1
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 cmd_event TestStart
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 cmd_nr 1
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 error { if ( ( [[TestZeit1]-[TestZeit2]] ) ) { fhem ("set TestDummy in") } else { fhem ("set TestDummy out" ) } }: Bareword "TestZeit1" not allowed while "strict subs" in use at (eval 341696) line 1.\
Bareword "TestZeit2" not allowed while "strict subs" in use at (eval 341696) line 1.\
setstate Test_DummyZeiten_doif 2021-03-28 17:07:48 mode enabled
setstate Test_DummyZeiten_doif 2021-03-28 17:07:59 state cmd_1
Mangels Verständnis, was hier falsch sein könnte, habe ich gefühlt unendlich viele Varianten mit (, ", [[, ? etc. ausprobiert, aber ohne Erfolg. Ich finde keine funktionierende Variante, weder mit noch ohne Fragezeichen zur Verhinderung des Triggerns; entweder kommen Syntax-Fehler, oder die Bedingung wird immer als true interpretiert.
Kann mir jemand helfen, wie hierzu die richtige Syntax ist?
(Ich weiß, es gibt auch andere Lösungen, z.B. eine separate Perl-Funktion, die das Zeitfenster prüft, aber mir geht es um das grundsätzliche Verständnis der korrekten Syntax.)
Vielen Dank im Voraus für jeden Hinweis.
Norbert
Es ist ganz einfach, die Syntax ist korrekt und funktioniert:
1) in der Bedingung eines DOIFs im FHEM-Modus
3) im Perl-Block eine DOIFs im Perl-Modus.
Es funktioniert nicht im Ausführungsteil eines DOIFs im FHEM-Modus, wie in deinem Beispiel.
Klare Sache. Hätte ich mal früher gefragt - hätte ich mir viel Arbeit sparen können (;-)). Dann müssen doch die Alternativen herhalten.
Danke dir für die prompte Antwort - und viele Grüße
Norbert
PS: Gibt es auch noch einen Punkt 2 in deiner Liste?
Zitat von: NoKi am 28 März 2021, 18:05:17
Klare Sache. Hätte ich mal früher gefragt - hätte ich mir viel Arbeit sparen können (;-)). Dann müssen doch die Alternativen herhalten.
Danke dir für die prompte Antwort - und viele Grüße
Norbert
PS: Gibt es auch noch einen Punkt 2 in deiner Liste?
Wo ist das Problem?
.... DOIF {[<Trigger-Bedingung>];
if ([?[TestZeit1]-[TestZeit2]])
{ <Befehl für true> }
else { <Befehl für false> }
}
Das ist Perl-Modus.