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

rudolfkoenig

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

Damian

Zitat von: rudolfkoenig am 16 September 2020, 15:32:35
Die old-school Variante:
define a1 at +*02:00 define a2 at +*{3}00:05 set pump on-for-timer {(Each("pump","60,80,100"))}
attr a1 disabledForIntervals 00:00-07:00 21:00-23:59
attr a1 alignTime 00:00


@Rudi
Vielleicht solltest du die Each-Funktion in die Commandref aufnehmen, sonst kennen die Nerds sie nur aus solchen Posts :)

@awex102

und so würde es als Perl-Version mit einem Array mit set_Exec aussehen:

defmod intervall DOIF {[08:00-20:00,+[2]:00];;@{$_a}=(60,80,100);;set_Exec("timer",300,'fhem_set"pump on-for-timer  ".$_a[$count]','$count <4')}

dabei muss man wissen, dass $_a  auf $hash->{var}{a} abgebildet wird und damit als eine Instanzvariable innerhalb des Devices zu jedem Zeitpunkt verfügbar ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 16 September 2020, 14:57:50
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.

Ab heute kannst du es auch ausprobieren, siehe: https://forum.fhem.de/index.php/topic,114252.msg1085850.html#msg1085850

PS. Das Beispiel habe ich sogar in die Commandref übernommen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Klasse, vielen Dank!

Am Wochenende hat es mich gepackt und ich habe auf einzelne Ventile umgebaut. Diese werden über ein Relais gesteuert.
Relais etc funktioniert und stehen jeweils als einzelne devices zur Verfügung.

Hat jemand einen Tip, wie ich den Code so umbauen kann, dass  einzelne Devices (Relais) mit vorher bestimmen Laufzeiten nacheinander in der Schleife angesprochen werden können? Optimal mit etwas Zeit zwischen den Vorgängen.


Damian

Zitat von: awex102 am 29 September 2020, 19:22:04
Klasse, vielen Dank!

Am Wochenende hat es mich gepackt und ich habe auf einzelne Ventile umgebaut. Diese werden über ein Relais gesteuert.
Relais etc funktioniert und stehen jeweils als einzelne devices zur Verfügung.

Hat jemand einen Tip, wie ich den Code so umbauen kann, dass  einzelne Devices (Relais) mit vorher bestimmen Laufzeiten nacheinander in der Schleife angesprochen werden können? Optimal mit etwas Zeit zwischen den Vorgängen.

Welche Version hast du jetzt genommen?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Beide ausprobiert, aber die set_Exec finde ich noch etwas smarter

Damian

Zitat von: awex102 am 29 September 2020, 20:52:10
Beide ausprobiert, aber die set_Exec finde ich noch etwas smarter

Du könntest zwei set_Exec-Aufrufe kombinieren. Den einen für das sequentielle Schalten der einzelnen Ventile packst du in eine Funktion und rufst diese dann im ursprünglichen set_Exec auf, z. B.:

DOIF {
  subs {
    sub ventile {set_Exec (....) }
  }
  {[08:00-20:00,+[2]:00];set_Exec("timer",300,'ventile()','$count<4')}
}

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

awex102

Woher weiß dann sub ventile() welches der 4 devices (mit unterschiedlichen Namen) angesprochen werden soll?
Wenn ich es richtig verstehe, ruft die Hauptfunktion dann 4 mal die Unterfunktion auf, kann ich da einen Parameter mitgeben?
Wenn ich alle 4 Devices nacheinander in der Unterfunktion aufführe bzw. 4 set_Exec in der Unterfunktion erstellen würde, würden diese doch bei jedem Durchlauf komplett durchlaufen werden, oder?


Damian

Zitat von: awex102 am 29 September 2020, 21:27:37
Woher weiß dann sub ventile() welches der 4 devices (mit unterschiedlichen Namen) angesprochen werden soll?
Wenn ich es richtig verstehe, ruft die Hauptfunktion dann 4 mal die Unterfunktion auf, kann ich da einen Parameter mitgeben?
Wenn ich alle 4 Devices nacheinander in der Unterfunktion aufführe bzw. 4 set_Exec in der Unterfunktion erstellen würde, würden diese doch bei jedem Durchlauf komplett durchlaufen werden, oder?

naja, wie man Dinge in einem Array ablegt und darauf in set_Exec zugreift, habe ich bereits gepostet:

hier dann z. B.


subs {
    @{$_ventil}=("ventil1","ventil2","ventil3","ventil4");
    sub ventile {set_Exec("timer_ventile",60,'fhem_set("$_ventil[$count] on-for-timer 60")','$count <4')}
  }


Die Aktion sollte natürlich beendet sein 4*60, bevor die Funktion ventile ein erneutes Mal durch die andere set_Exec-Funkton aufgerufen wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

awex102

Nochmal danke, so langsam blicke ich durch ;-)

Jetzt  habe ich noch den Fall, dass ich die Bewässerung nicht x mal am Tag starten möchte, sondern nur einmal.

Dazu habe ich mir folgendes gebaut:

{if ([08:05] and [Beregnungsautomatik:state] eq "An"){
@{$_ventil}=("HM_6F1C24_Sw_01","HM_6F1C24_Sw_02","HM_6F1C24_Sw_03");
set_Exec("timer",70,'fhem_set("$_ventil[$count] on-for-timer ".ReadingsVal("Dauer_Kreis".$count + 1,"state")*10)','$count < 3')}}

Ziel ist es, für die einzelnen Ventile noch eine Laufzeit aus einem dummy zu holen. Daher habe ich versucht, den on-for-timer Wert aus dem Dummy zu lesen (Dauer_Kreis1 bis Dauer_Kreis3).
Das zusammensetzen mit ReadingsVal und $count  funktioniert allerdings nicht. Vermutlich nur ein Anfängerfehler, aber wie setze ich das "richtig" zusammen, den aktuell kommt 0 zurück?

Und noch eine Frage: Im Beispiel soll die Bewässerung um 08:05 starten. Der Timer startet auch, allerdings wird das eigentliche anschalten der Bewässerung erst im "zweiten" Durchlauf um 08:06:10 (08:05 plus die 70 Sekunden wait) gestartet. Ist das by design so gedacht?

Danke!

Damian

Versuche mal mit:

ReadingsVal("Dauer_Kreis".($count + 1),"state")

Solche Dinge würde ich allerdings nicht in verschiedenen Devices verstreut speichern, sondern direkt in Readings des DOIF selbst oder sogar in einem Array.

Ob er auch beim ersten Durchlauf verzögert anfängt, hängt von der Definition ab. Willst du beim ersten Durchlauf keine Verzögerung haben, dann kannst du das selbstverständlich definieren:

{[08:00-20:00,+[2]:00];set_Exec("timer",'$count ==0 ? 0 : 300','ventile()','$count<4')}

Da alle Parameter, wie in der Commandref steht, per eval ausgewertet werden, kannst du dich in Perl beliebig austoben ;)




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