DOIF Trigger mit Statusabfrage einer Device

Begonnen von twinFHEM, 25 November 2020, 14:50:12

Vorheriges Thema - Nächstes Thema

twinFHEM

Hello again,

DOIF lässt mir einfach keine Ruhe, somit möchte ich das Ganze entsprechend umsetzen. Man möchte ja dazu lernen, doch einige Dinge in der Commandref sind mir nicht ganz klar.
Wäre klasse, wenn ihr mir weiterhelfen könnt. Folgender Code:


defmod gimmeHotWater DOIF ([HotWater:"trigger"] and [Heizung:state] =~ /last/) (set Heizung WW-Solltemperatur 60, set Heizung WW-Haupttemperatur 60, set Heizung WW-einmaliges_Aufladen activate, set BOSE_7C3866CE97B8 on-for-timer 30, set BOSE_7C3866CE97B8 volume 25, set BOSE_7C3866CE97B8 playTrack warmwasser, set Heizung WW-einmaliges_Aufladen deactivate, set Heizung WW-Solltemperatur 50, set Heizung WW-Haupttemperatur 50)
DOELSEIF ([HotWater:"trigger"] and [Heizung:state] =~ /error/) (set BOSE_7C3866CE97B8 on-for-timer 30, set BOSE_7C3866CE97B8 volume 25, set BOSE_7C3866CE97B8 playTrack keineVerbindungHeizung, set Heizung update)
DOELSEIF ([+01:00] and [Heizung:WW-Haupttemperatur > 50]) (set Heizung WW-einmaliges_Aufladen deactivate, set Heizung WW-Solltemperatur 50, set Heizung WW-Haupttemperatur 50, set Heizung update)

attr gimmeHotWater do always
attr gimmeHotWater wait 0,0,0,0,0,2,2400,0,0:0,0,2,0:0,0,0,0


Durch do always wird das DOIF immer ausgeführt. Die ersten beiden Bedingungen allerdings nur, wenn "HotWater" getriggert wird. Die dritte und letzte Bedingung sollte doch somit permanent laufen, oder?
Mit dieser möchte ich erreichen, dass nach einer Stunde geprüft wird, ob die WW-Haupttemperatur immer noch über 50 Grad ist und ggf. wieder auf 50 Grad gesetzt wird.

Zudem möchte ich die zweite und dritte Bedingung mehrmals ausführen.
attr gimmeHotWater repeatcmd 0:30:300

Kann ich die 0 für keine Wiederholung verwenden?

Die zweite Bedingung soll maximal 3x wiederholt werden:
attr gimmeHotWater repeatsame 0:3:0

Die 0 in Verbindung mit do always bewirkt allerdings das Gegenteil.

So?
attr gimmeHotWater repeatsame :3:0

Natürlich habe ich schon ausprobiert, lerne dadurch die komplexen Möglichkeiten von DOIF kennen, aber scheinbar verrenne ich mich momentan. :'(



Damian

Wiederholungen werden zunichte gemacht, sobald ein anderer Zwei zuschlägt.

hier triggert z. B. Heizung:WW-Haupttemperatur

[Heizung:WW-Haupttemperatur > 50]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

#17
Ausserdem macht 0,0,0,0,0,2,2400,0,0 im wait Attribut keinen Sinn und ist wirkungslos, weil
(set ..., set ..., set ..., set... ) nur ein DOIF - Befehl ist, der dann mit 0 Sekunden Verzögerung ausgeführt wird (alles gleichzeitig)

Damit sowas wie dein wait funktionieren kann, muss man eine Befehlssequenz schreiben:
(set ...) (set ...) (set ...)(set ...)

Oder eben, da Du mehrmals 0 hast (heisst, die können gleichzeitig ausgeführt werden:
(5 erste sets die sofort ausgeführt werden sollen) (1 set nach 2 Sekunden)(1 set nach 2400 Sek)(die restiliche 2 sets)
Siehe (wie immer) CommandRef https://fhem.de/commandref_DE.html#DOIF_wait

Das wurde schon hier gesagt: https://forum.fhem.de/index.php/topic,116161.msg1104448.html#msg1104448 ...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

twinFHEM

Hallo amenomade,

IF nicht gleich DOIF! ::)
Habe ich echt übersehen, obwohl ich nun schon eine ganze Weile das CommandRef durchgehe.
Besten Dank für den Hinweis & die ausführliche Darstellung!

Und ich wundere mich, warum es mit den Repeats nicht klappt...
Dann auf zu den Repeats! :)

Per

Wie wäre es mit
defmod gimmeHotWater DOIF ([HotWater:"trigger"]) (set Heizung update)(set $SELF checkall)
DOELSEIF ([$SELF:cmd] == 1) and ...)
DOELSEIF ([$SELF:cmd] == 1) and ...)
attr gimmeHotWater wait 0,2:...

Braucht man kein IF oder sleep mehr und kommt trotzdem mit einem FHEM-DOIF aus.