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
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