FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: dustbln am 03 November 2020, 11:04:38

Titel: [gelöst] DOIF: Regelmäßige Ausführung mit UND ohne Event
Beitrag von: dustbln am 03 November 2020, 11:04:38
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!!
Titel: Antw:DOIF: Regelmäßige Ausführung mit UND ohne Event
Beitrag von: Damian am 03 November 2020, 11:11:44
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
Titel: Antw:DOIF: Regelmäßige Ausführung mit UND ohne Event
Beitrag von: dustbln am 03 November 2020, 11:41:00
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?
Titel: Antw:DOIF: Regelmäßige Ausführung mit UND ohne Event
Beitrag von: dustbln am 03 November 2020, 12:42:29
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!
Titel: Antw:[gelöst] DOIF: Regelmäßige Ausführung mit UND ohne Event
Beitrag von: dustbln am 04 November 2020, 09:52:49
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.