Aktion x mal hinterheinander ausführen alle zwei stunden mit x minuten pause

Begonnen von awex102, 12 September 2020, 19:53:21

Vorheriges Thema - Nächstes Thema

awex102

Hallo, hat jemand einen Tip wie ich folgende Steuerung elegant umsetzen kann:

Führe on-for-timer zwischen 08 und 20 Uhr alle zwei Stunden 3 mal hintereinander mit jeweils 5 Minuten Pause aus.

Danke und Gruß

xerion

Wechsel jetzt zu Octopus Energy und bekomme 150,00 € Bonus auf deine Rechnung. Die Anmeldung geht super leicht und schnell, klicke dafür einfach meinen persönlichen Empfehlungslink:
 https://share.octopusenergy.de/loved-heron-220.

awex102


xerion

Schaue dir mail in der DOIF Commandref die Atribute repeatcmd, wait und repeatsame an. Das sollte dort mit umsetzbar sein. In der commandref gibt es auch Beispiele die deiner Anforderung sehr nahe kommen.
Wechsel jetzt zu Octopus Energy und bekomme 150,00 € Bonus auf deine Rechnung. Die Anmeldung geht super leicht und schnell, klicke dafür einfach meinen persönlichen Empfehlungslink:
 https://share.octopusenergy.de/loved-heron-220.

Damian

Zitat von: awex102 am 12 September 2020, 20:10:56
Kenne mich noch überhaupt nicht mit DOIF aus, hast du einen Tip?


z. B.

defmod di_intervall DOIF ([08:00-20:00,+[2]:00])(set pump on-for-timer 60)
attr di_intervall repeatcmd 300
attr di_intervall repeatsame 3
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Klasse, danke... Einwandfrei und was gelernt. Gesteuert wird in der Tat ein Magnetventil, das dann einen 6 fach manuellen Gardena Wasserverteiler steuert.

Damian

Zitat von: awex102 am 13 September 2020, 10:29:06
Klasse, danke... Einwandfrei und was gelernt. Gesteuert wird in der Tat ein Magnetventil, das dann einen 6 fach manuellen Gardena Wasserverteiler steuert.

Du musst wohl noch das Attribut do always setzen, damit es nicht nur einmal, sondern auch nach zwei Stunden wieder funktioniert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Hatte ich gemacht, danke nochmal für den Hinweis falls jemand ähnliches vorhat... DOIF ist echt cool

rudolfkoenig

Die "old-school" Variante:
define a1 at +*02:00 define a2 at +*{3}00:05 set pump on-for-timer 60
attr a1 disabledForIntervals 00:00-07:00 21:00-23:59
attr a1 alignTime 00:00

Damian

Und hier mal eine "programmierte" Lösung in (ereignisgesteuertem) Perl:

defmod di_intervall2 DOIF subs {\
$_count=0;;\
sub pump\
{\
  fhem_set("pump on-for-timer 60");;\
  if ($_count++<3) {\
    set_Exec("timer",300,'pump()');;\
  } else {\
    $_count=0;;\
  }\
}\
}\
\
{[08:00-20:00,+[2]:00];; pump()}

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

Damian

Weil mir alle Lösungen zu umständlich erschienen, habe ich kurzerhand eine etwas einfachere Möglichkeit für bedingte Wiederholungen programmiert, siehe: https://forum.fhem.de/index.php/topic,114252.0.html

Hier konkret z. B.:

DOIF {[08:00-20:00,+[2]:00];set_Exec("timer",300,'fhem_set("pump on-for-timer 60")',undef,'$count<4')}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Eine Frage noch: Wie stelle ich es an, dass z. B. die erste Ausführung kürzer oder länger läuft als die anderen?

Danke!

Damian

Zitat von: awex102 am 16 September 2020, 13:37:25
Eine Frage noch: Wie stelle ich es an, dass z. B. die erste Ausführung kürzer oder länger läuft als die anderen?

Danke!

Gute Frage, dafür habe ich mir z. B. für die set_Exec-Funktion auch etwas überlegt. Man wird die Zeitdauer abhängig vom Durchlauf bestimmen können:

DOIF {[08:00-20:00,+[2]:00];set_Exec("timer",'$count==0?0:300','fhem_set("pump on-for-timer 60")','$count<4')}

Würde bedeuten: Die erste Ausführung sofort, die folgenden mit 300 Sekunden:

oder

DOIF {[08:00-20:00,+[2]:00];set_Exec("timer",'$count*120','fhem_set("pump on-for-timer 60")','$count<4')}

Die erste sofort, die zweite nach 120 Sekunden, die dritte nach 240 Sekunden usw.

Man kann für die Zeit beliebige Perlfunktionen nutzen, damit sind für die Bestimmung der Verzögerung abhängig vom Durchlauf keine Grenzen gesetzt, vom logarithmischen bis zum exponentiellem Anstieg oder Fall ist alles drin.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Auch super!

Glaube ich hatte mich falsch ausgedrückt:

Mein eigentliches Ziel ist es, pump on-for-timer 60 separat pro Durchlauf der Wiederholungen setzen können, also z.B. beim ersten Durchlauf 60, beim zweiten Durchlauf 80 und dritten 100 Sekunden on-for-timer.

Damian

Zitat von: awex102 am 16 September 2020, 14:53:01
Auch super!

Glaube ich hatte mich falsch ausgedrückt:

Mein eigentliches Ziel ist es, pump on-for-timer 60 separat pro Durchlauf der Wiederholungen setzen können, also z.B. beim ersten Durchlauf 60, beim zweiten Durchlauf 80 und dritten 100 Sekunden on-for-timer.

Im Prinzip genauso:

DOIF {[08:00-20:00,+[2]:00];set_Exec("timer",300,'fhem_set("pump on-for-timer ".60+$count*20)','$count<4')}

Man könnte auch ein Array  mit beliebigen Zahlen drin definieren.

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