DoIF mehrere Trigger gleichzeitig "beobachten"

Begonnen von DAU, 17 August 2021, 08:08:04

Vorheriges Thema - Nächstes Thema

DAU

Hallo ins Forum,

ich habe auf meinem Raspi und FHEM folgenden DoIf Befehl:

DOELSEIF\
    (( [BewMelder1:brightness] < [Grenzwert_Licht_zu_Innenlicht:state]\
and\
[16:00-21:30])\
   or\
[21:30]\
)\
({Licht_Innenlicht_an})\
DOELSEIF\
    (( [BewMelder1:brightness] < [Grenzwert_Licht_zu_Gartenlicht:state]\
and\
[16:10-21:40])\
   or\
[21:40]\
)\
({Licht_Garten_an})\
DOELSEIF\
    (( [BewMelder1:brightness] < [Grenzwert_Licht_zu_Rolladen:state]\
and\
[16:30-22:00])\
   or\
[22:00]\
)\
({Rolladen_abends})\

Die Grenzwerte sind alle in absteigender Reihenfolge also Innenlicht: 150; Gartenlicht: 120 und Rolladen: 100

Ich hatte gehofft, dass ich damit folgendes realiseren kann:
1. Innenlicht geht irgendwann zwischen 16:00 Uhr und 21:30 Uhr an, sofern die Lichtmenge des Bewegungsmelders unter dem Grenzwert (150) ist. Spätestens um 21:30 Uhr soll das Innenlicht auf jeden Fall angehen
2. GartenLicht soll nach obigem Muster irgendwann zwischen 16:10 und 21:40, je nach Grenzwert (120) ausgelöst werden
usw.

Leider funktioniert nur der erste Teil richtig. Das GartenLicht wird frühestens "getriggert", wenn 21:30 Uhr vorbei ist und das erste "Reading" vom Bewegungsmelder kommt. Dieses kann dann auch schon eine Stunde unter dem definierten Grezwert sein Gleiches gilt für den Rolladen. Frühester Trigger ist erstes Reding nach 21:40 Uhr, egal wie tief das Reading der Helligkeit vorher war.


Habe ich das DoIf nicht richtig verstanden, da ich dachte, alle Bedingungen werden "überwacht" und bei einem "Trigger" (z.B. Grenzwert wird unterschritten) werden die anderen Bedingungen geprüft. Bei mir muss alerrdings erst die Zeitspanne "abgelaufen" sein, damit die Überprüfung wieder startet.


Ich kann jetzt natürlich zwei weitere DoIf deklarieren, aber das ist ja eigentlich nicht der Sinn der Sache, oder doch (und ich habe das Ganze falsch verstanden)?



Gruss
Andreas

antonwinden

Wenn 1. Zweig erfüllt ist wird der nächste nicht mehr überprüft...
also 2 DOIF's statt einem
so hab ich DOIF zumindestens verstanden
gruß anton
KNX, Raspberry, Denon 3313, Philips TV, Xtrend9X00 und viel Optimismus...

Damian

Mehrere unabhängige Triggerabfragen kann man im DOIF-Perlmodus definieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DAU

Zitat von: antonwinden am 17 August 2021, 08:19:52
Wenn 1. Zweig erfüllt ist wird der nächste nicht mehr überprüft...
also 2 DOIF's statt einem
so hab ich DOIF zumindestens verstanden
gruß anton

Hallo Anton,

Das hatte ich befürchtet.
Ich hatte gehofft, dass der derzeit aktuelle Status (also z.B. cmd_3 ) bei der Überprüfung "übersprungen" wird, da er ja schon ausgelöst hat.

Da werde ich wohl zwei neue DoIf machen und gut ist.

@Damian
Ich glaube jetzt mein ganzes DoIf in perl-Modus umzustricken, ist mir zu kompliziert. Da werde ich vermutlich den einfachen Weg (zwei neue DoIf) nehmen.


Gruss
Andreas

rabehd

DOELSEIF  ([BewMelder1:brightness] < [Grenzwert_Licht_zu_Innenlicht:state] and [16:00-21:30] and [Licht_Innen] ne "an" )
({Licht_Innenlicht_an})\


und so weiter könnte für ein DOIF vieleicht reichen.
Auch funktionierende Lösungen kann man hinterfragen.

DAU

Zitat von: rabehd am 17 August 2021, 16:50:31
DOELSEIF  ([BewMelder1:brightness] < [Grenzwert_Licht_zu_Innenlicht:state] and [16:00-21:30] and [Licht_Innen] ne "an" )
({Licht_Innenlicht_an})\


und so weiter könnte für ein DOIF vieleicht reichen.
Hallo rabehd,

hatte ich auch darüber nachgedacht, scheitert aber daran, dass das Licht tatsächlich nur eingeschaltet wird, wenn ein vorher Dummy gesetzt ist. Damit kann ich die Automatik ein- und ausschalten. Das wird mit der Perl-Routine über Ifs geprüft.

Aber vielleicht funktioniert ja eine zusätzlich Bedingung, dass das DoIf nicht im cmd_3, bzw. cmd_3 und cmd_4 steht. Dann müsste entsprechend das nächste Command aufgerufen werden. Dann muss ich nur noch abfangen, dass das ganze von vorne losgeht.

Oder ich setze einen Dummy, nach dem Motto cmd_3_ausgelöst, den ich dann jeden Tag um Miternacht zurücksetze.

Mal sehen was einfacher ist.

Gruss Andreas

rabehd

Würdest Du noch die erste Zeile Deines DOIF verraten?
Dein Codeauszug beginnt mit DOELSEIF, dass sit nicht der Anfang eines DOIF.
Auch funktionierende Lösungen kann man hinterfragen.