DOIF befehlsabfolge ohne timer

Begonnen von kschi, 28 Juni 2020, 08:14:33

Vorheriges Thema - Nächstes Thema

kschi

Hallo,
ich hab da ne Gartenbewässerung mit 4 Magnetventilen. Diese werden per Zeitschaltuhr im Fhem angesteuert und laufen nach aktivierung eine bestimmte Zeit, die in einem DOIF für jedes Magnetventil angepasst werden kann.

Nun möchte ich die Gartenbewässerung nicht nur per Zeitsteuerung anschalten, sondern auch mal manuell. Ich habe also einen Dummyschalter, den ich aktiviere. Dann soll ein DOIF merken, wenn der dummy an ist und nacheinander erst das erste Magnetventil anschalten -  nach ablauf seines eigenen timers dann den zweiten usw.
Also wahrscheinlich so ein verschachteltes doif oder so.

Schalte ventil 1 , wenn manuelles dummy aktiv,
Warte bis ventil 1 aus geht (anhand des state)
Schalte dann ventil 2
Warte bis ventil 2 aus geht ... usw

Ich habe leider keine hilfreichen tipps über google gefunden, nur welche, die einen eigenen timer mit integriert haben.

Kennt jemand eine ähniche Beispielschaltung?

Vielen Dank für Eure Tipps,

Karsten

feger

#1
Hallo!

Ich habe das mit einem at realisiert und läuft seit ein paar Jahren perfekt.

Vielleicht hilft dir meine DEF für das at.


*20:00 {
  if ( Value("dum_Bewaesserung_Abends") eq "Ja") {  //Dummy mit State Ja, Nein
    fhem ("set Bewaesserung_Kreis_1 off");;                  //zur Sicherheit mal alle Kreise abschalten
    fhem ("set Bewaesserung_Kreis_2 off");;
    fhem ("set Bewaesserung_Kreis_3 off");;
    fhem ("set Bewaesserung_Kreis_4 off");;
    fhem ("delete Bewaesserungsautomatik2");;           //sollte diese noch existieren, löschen
    fhem ("delete Bewaesserungsautomatik3");;
    my $bd1m = ReadingsVal("dum_Bewaesserung_Dauer_Kreis_1", "state", "0");  //Dummy Bewässerungsdauer auslesen
    my $bd2m = ReadingsVal("dum_Bewaesserung_Dauer_Kreis_2", "state", "0");
    my $bd3m = ReadingsVal("dum_Bewaesserung_Dauer_Kreis_3", "state", "0");
    my $bi = ReadingsVal("dum_Bewaesserung_Intervall", "state", "1");  //Dummy ob er jeden Tag oder jeden 2.,3. ...Tag bewässern soll
    my $bd1 = $bd1m * 60; //Zeit berechnen
    my $bd2 = $bd2m * 60;
    my $bd3 = $bd3m * 60;
    my $bd4 = $bd1 + $bd2 + $bd3;
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    my $m2 = (int $bd1) / 60;
    my $m3 = (int $bd1 + $bd2) / 60;
    my $s2 = ($bd1) - ($m2 * 60);
    my $s3 = ($bd1 + $bd2) - ($m3 * 60);
    my $h2 = int $m2 / 60;
    my $h3 = int $m3 / 60;
    $m2 = $m2 - ($h2 * 60);
    $m3 = $m3 - ($h3 * 60);
    my $timestring2 = sprintf("%02d:%02d:%02d",$h2,$m2,$s2);
    my $timestring3 = sprintf("%02d:%02d:%02d",$h3,$m3,$s3);
    if(($yday % $bi) == 0) {
      if ( Value("dum_Bewaesserung_Aktiv") eq "Auto" && Value("Bewaesserung_Regensensor") eq "trocken") {
        if ( $bd1m > 0 ) {
          fhem ("set Bewaesserung_Kreis_1 on-for-timer $bd1");;  //Kreis 1 einschalten für die Dauer $bd1
        }
        fhem ("set Bewaesserung_Kreis_4 on-for-timer $bd4");;  //Kreis 4 einschalten
        fhem ("define Bewaesserungsautomatik2 at +$timestring2 set Bewaesserung_Kreis_2 on-for-timer $bd2");; //erst wenn Kreis 1 fertig ist schalte Kreis 2 ein, Kreis 4 läuft noch
        fhem ("define Bewaesserungsautomatik3 at +$timestring3 set Bewaesserung_Kreis_3 on-for-timer $bd3");;  //erst wenn Kreis 2 fertig ist schalte Kreis 3 ein, Kreis 4 läuft noch
      } else {
        Log 3, ("Bewaesserung: Status: " . Value("dum_Bewaesserung_Aktiv") .  //Log Eintrag erstellen
                ", Regensensor: " . Value("Bewaesserung_Regensensor") .
                ", Kreis 1:" . Value("Bewaesserung_Kreis_1") .
                ", Kreis 2: " . Value("Bewaesserung_Kreis_2") .
                ", Kreis 3: " . Value("Bewaesserung_Kreis_3") .
                ", Kreis 4: " . Value("Bewaesserung_Kreis_4"));
      }
    }
  }
}


Ich hoffe es hilft dir ein wenig!
Wenn du den Code in deine DEF kopierst dann die Zeilen mit den //Beschreibungen vorher löschen.
mfg Feger
CUL433MHz für Intertechno & Somfy
CUL868MHz für Homematic
RFXTRX433E für Oregon & KeeLoq