[gelöst] DOIF: Zeitfenster mit indirekten Zeitangaben im Perl-Ausführungsblock

Begonnen von NoKi, 28 März 2021, 17:33:32

Vorheriges Thema - Nächstes Thema

NoKi

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
FHEM auf RasPi, diverse HM-Komponenten

Damian

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.

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

NoKi

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?
FHEM auf RasPi, diverse HM-Komponenten

Damian

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