DOIF: Timer im DOIF ohne dieses zu blockieren

Begonnen von StephanFHEM, 31 Oktober 2023, 10:23:33

Vorheriges Thema - Nächstes Thema

StephanFHEM

Hallo,

Ich bin dabei FHEM etwas zu optimieren und hab beim Zusammenfassen von DOIFs ein kleines Problem (hier am Beispiel Fenster-offen Alarm):

Ich hab ein DOIF mit zwei Fenstern, wenn die Temperatur unter 15 Grad liegt und ein Fenster >30 Min auf ist, soll eine Warnung kommen. Diese wird dann stündlich 3x wiederholt. Ist bei mir über repeatsame/max gelöst. Wenn ich nun aber beide Fenster auf habe, dann unterbricht ein Zweig das Repeatsame des anderen Zweiges. Ich brauche also ein Trigger, der das CMD in einer Stunde wiederholt und dabei die DOIF nicht blockiert bzw unabhängig von anderen Zweigen ist. Lösung wäre sicher mit FHEM-DOIF/Perl Modus möglich aber das ist mir zu hoch. Gibt es vielleicht noch andere Möglichkeiten? (zB ein at im Ausführungsteil zu definieren, dass das cmd in einer Stunde nochmal Zwangsausführt?)

Das im Prinzip gleiche Problem hab ich im einem Alarm-Modul (hier möchte ich Automatisch den Alarm-Modus nach einer Stunde ändern aber weiterhin die Zweige mit Sensor-Überwachung ausführen).

Wäre echt prima, wenn mir jemand etwas weiterhelfen könnte.

Per

Nimm den Perl Mode, da kannst du "beliebig viele" unabhängige Timer nutzen.

StephanFHEM

#2
ich wollte ja eigentlich nicht in DOIF Perl arbeiten, aber hab es jetzt doch damit versucht. Dazu ein paar Anfänger-Fragen:
1. Wenn eine Bedingungen im DOIF Trigger nicht auslösen sondern nur geprüft werden soll, schreib ich ein ? davor. Geht das in DOIF/Perl auch?
2. die Variable $count: kann ich sie für alle Blöcke in dem DOIF benutzen oder bringt er dann etwas durcheinander wenn zwei Blöcke mit unterschiedlichen counts gleichzeitig laufen?
3. ich möchte vor der ersten Auslösung 240 Sekunden und für die nächsten 2 Auslösungen 600 Sekunden abstand haben. Was muss ich da genau in das zweite Feld von set_Exec(..) schreiben?

so, nach noch mehr testen und nach beheben eines anderen Fehlers hab ich es jetzt. Daher beantworte ich meine Fragen selbst:
1. ? geht. Hier lag auch der Fehler. Die Bedingung ist immer "wahr" geblieben, wurde aber durch aktuellere Temp-Werte neu getriggert. Daher ist count immer wieder auf 0 gegangen
2. kann sie. Klappt prima
3. '$count == 0 ? 240 : 600'

Damian

#3
An der Stelle ein Tipp.

Wenn du das gleiche Verhalten (Steuerung) vervielfältigen willst, aber nicht alles selber programmieren willst, dann bieten sich Templates im Perl-Modus an.

Die Idee dabei ist einmal eine Steuerung zu definieren/programmieren und für die sich ändernden Devices (hier Fenster) Platzhalter vorzusehen. Danach braucht man nur noch für jedes Fenster das Template mit dem spezifischen Fensternamen anzugeben und schon laufen mehrere Steuerungen parallel und zwar alle in einem DOIF.

Das ist natürlich besonders elegant, da man mit einer Definition beliebig viele Fenster abdecken kann. Im FHEM-Modus müsstest du pro Fenster ein DOIF definieren.

Wie man so etwas macht, kannst du dir hier anschauen: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh%C3%A4ngige_Zeitsteuerung_f%C3%BCr_mehrere_Szenarien

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