[gelöst] DOIF: Regelmäßige Ausführung mit UND ohne Event

Begonnen von dustbln, 03 November 2020, 11:04:38

Vorheriges Thema - Nächstes Thema

dustbln

Hi zusammen!

Ich habe einen Ventilator, der alle 2 Stunden für 30 Minuten angehen soll, wenn die Automatisierung aktiviert ist und die Umweltbedingungen das Lüften erfordern. Dazu habe ich folgendes DOIF definiert:

defmod di_Automatik_Ventilator DOIF (\
  [HUEDevice20:target] eq "on" and\
  [d_Automatik_Aktiv:state] == 1\
)\
(set HUEDevice20 on-for-timer 1800)\
\
DOELSEIF\
(\
  [HUEDevice20:target] eq "off" and\
  [d_Automatik_Aktiv:state] == 1\
)\
(set HUEDevice20 off)

attr di_Automatik_Ventilator cmdpause 5400
attr di_Automatik_Ventilator do always
attr di_Automatik_Ventilator repeatcmd 5400


Die Idee ist, dass ein anderes Modul das Reading HUEDevice20:target je nach Umweltbedingung auf "on" oder "off" setzt (das läuft) und DOIF bei aktivierter Automatik (d_Automatik_Aktiv:state == 1) den Lüfter einschaltet. In jedem Fall soll der Lüfter nur einmal in zwei Stunden laufen.

Meine Erfahrung damit:
- Wenn "target" auf "on" wechselt und die Automatik aktiv ist, dann wird der Ventilator eingeschaltet -> Gut!
- Nach Ablauf von repeatcmd wird der Ventilator erneut eingeschaltet -> Gut!
- Wechseln "target" und/oder "state" und das letzte Lüften ist noch nicht so lange her (innerhalb von cmdpause), dann passiert nichts -> Gut
ABER
- Wenn cmdpause abgelaufen ist und weder "target" noch "state" sich ändert (kein Event, etwa weil die Automatik bereits innerhalb von cmdpause eingeschaltet wurde), dann passiert nichts -> Schlecht. Nach Ablauf von cmdpause sollte dann wieder mit dem Lüftungsrhythmus angefangen werden.

Ich hoffe das war soweit verständlich. Sicherlich habe ich hier ein Brett vorm Kopf. Ich sehe Möglichkeiten wie das regelmäßige Triggern von "d_Automatik_Aktiv" durch ein Timer-Device oder das Hinzufügen von "and [+:01]" oder so ähnlich zum DOIF, aber das scheint mir alles sehr dreckig und ich finde dazu nichts passendes. Was ist die saubere Lösung?

Danke!!

Damian

cmdpause hat immer den Nachteil, dass man Events verpassen kann.

Ich habe neuerdings die set_Exec-Funktion erweitert, die sich für solche Aufgabenstellungen (Wiederholung mit Abbruchbedingung) besonders eignet. Es gibt einige Beispiele dazu: https://fhem.de/commandref_DE.html#DOIF_set_Exec
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dustbln

Danke dir, da muss ich mich erst mal einlesen. Ich wollte aber eigentlich den Perl-Modus vermeiden und nur mit FHEM-Mechanik arbeiten. Hast du da einen Tipp, welchen Weg ich gehen sollte?

dustbln

#3
Habe das jetzt erst einmal mit einem Dummy "trigger_5min" gelöst, der alle 5 Minuten mittels AT getriggert wird. Im DOIF steht jetzt einfach zusätzlich:

... and [trigger_5min:state] == 1

Das hat den Vorteil, dass sowohl ein Event bei "HUEDevice20:target" bzw. "d_Automatik_Aktiv:state" eine sofortige Aktion auslöst, als auch der Trigger alle 5 Minuten, falls das Event durch cmdsleep verpasst wurde (als Backup).

Zwei zusätzliche Devices scheint mir dafür viel Overhead, aber besser fällt mir ohne Perl nix ein.

Lerne gerne dazu, falls wer Ideen hat. Ansonsten setze ich das hier auf gelöst, danke nochmal @Damian!

dustbln

Nachdem ich noch mal einer Nacht darüber geschlafen habe bin ich dann zu der meiner Meinung nach saubersten Lösung gekommen:


DOELSEIF ([+:05])


am Ende sorgt dafür, dass ein Timer alle 5 Minuten triggert und


attr di_Automatik_Ventilator checkall timer


sorgt dafür, dass dann auch die davor stehenden Bedingungen geprüft und ggf. die zugehörigen Befehle ausgeführt werden.