Beregnungsanlage Timer Script

Hallo zusammen,

ich habe nach einiger Zeit nun endlich meine Beregnungsanlage fertigstellen können.
Kurz zur Infos dazu:
Ich habe insgesamt 4 Beregnungskreise > schaltbar via Magnetventile über Homematic Schaltaktoren
Derzeit schalte ich je einen Kreis ein und stelle mir einen Timer am Handy. Wenn die Zeit abgelaufen ist, schalte ich denen einen Kreis aus und den nächsten Kreis ein.

Also insgesamt kein komplexer Aufbau.
Ich würde das ganze nun gerne automatisieren, Ich stelle mir vor, dass ich in der App ein Feld habe, in dem ich die Zeit einstelle, die jeder Kreis aktiv sein soll (die Zeiten sind aktuell für alle Kreise gleich).
Danach soll Kreis 1 angeschaltet werden > wenn die Zeit abgelaufen ist, soll Kreis 2 eingeschaltet werden usw.
Ich hatte da an IPS_SetScriptTimer gedacht, jedoch bin ich was die Erstellung eines Scriptes, welches dann auch noch einen Wert ausliest und verwendet (hier: die von mir eingestellte Zeit über die App) absolut undfähig.
Kann mir da einer weiterhelfen oder passende Codezeilen liefern, die ich dann anpasse?

Das wäre dann doch eigentlich der klassiche Fall einer Ablaufsteuerung.
Hier mal ein Beispiel von Steiner

Ablaufsteuerung [Exercise]

Ok danke, das ist ein anfang, aber ich verstehe nicht, wie ich z.B. ein Feld aus dem Webfront bzw. Mobile habe, welches ich a) mit einem Wert (Minuten bzw. Stunden) fülle und dann b) in ein Script bringe.
Ich glaube ich gebe es auf, da ich für die Art von Programmieren nicht geschaffen bin :banghead:

ich denke da kann ich helfen, genau das habe ich im Einsatz.
Vielleicht ist mein Skript-Syntax nicht der Beste (habs auch nur durch Zusammenbasteln was ich hier so finde) aber es geht :slight_smile:

  1. Ich habe 2 Variablen, ein Boolean und ein Integer
    1.a. Boolean - Name: Automatic mit An/Aus Profil
    1.b. Integer - Name: Duration mit Werten und einem Profil mit " Min", eine Eintelung von 0-60 in 5-er Schritten
    1.c. Diese beiden Variablen habe ich für jeden Kreis (also je Magnetventil das einen Kreis steuert)

  2. 3 weitere Variablen
    2.a. Boolean - Name: Automatik Status mit An/Aus Profil
    2.b. Integer - Name: Bewässerung: Eigenes Profil mit zB. „Kreis1“,„Kreis2“,„Kreis3“ … Nutze ich im Wesentlichen zur Anzeige
    2.c. Integer - Name: Bewässerung_Step ohne Profil, ist nur eine Zahl (ganzzahlig)

  3. je Bewässerungskreis ein Skript das z.B. folgendermaßen aussieht (Ich habe das ganze hauptsächlich in KNX)

<?

$id = 50820;  // siehe 2.b.

$SwitchTrafo = 39483;   //Trafo der Magnetventile

$SwitchRasenVorgarten = 31143;  //Magenetventil 1 
$SwitchRasenNord = 28279;         // Magnetventil 2 usw, für die nächsten Einträge
$SwitchRasenHaupt1 = 20440;
$SwitchRasenHaupt2 = 43457;
$SwitchRasenSued = 27586;
$SwitchPflanzenSpirale = 26233;
$SwitchPflanzenTerasse = 37762;
$SwitchVentilkasten2 = 23893;
$SwitchFassSchlauchhalter = 14158;
$SwitchFass1 = 55367;
$SwitchSchlauchhalter2 = 45115;


       EIB_Switch($SwitchTrafo, true);
	   
	   SetValue($id, 0);    // siehe 2.b. ist natürlich in jedem Ventilskript eine andere Zahl

//Bewässerung Rasen Giebelseite Ost (Ventilkasten 1; Ventil 1 öffnen)
       EIB_Switch($SwitchRasenVorgarten, true);
       EIB_Switch($SwitchPflanzenSpirale, false);
       EIB_Switch($SwitchRasenNord, false);
       EIB_Switch($SwitchVentilkasten2, false);
       EIB_Switch($SwitchPflanzenTerasse, false);
       EIB_Switch($SwitchRasenSued, false);
       EIB_Switch($SwitchRasenHaupt1, false);
       EIB_Switch($SwitchRasenHaupt2, false);
       EIB_Switch($SwitchFassSchlauchhalter, false);
       EIB_Switch($SwitchFass1, false);
       EIB_Switch($SwitchSchlauchhalter2, false);

?>
  1. Ein Automatikskript, das die einzelnen Ventilskripte nacheinander ansteuert entsprechend ob die Kreise als „zu bewässern“ (siehe boolean 2.a.) eingeschaltet sind und dann welche Zeit für die jeweiligen Kreise eingestellt ist.
<?

$id = 50820;  // siehe 2.b.
$AutomatikStatus = 30573;  // siehe 2.a.

$SwitchTrafo = 39483;  

$ScriptVentil1 = 19770;
$ScriptVentil2 = 36231;
$ScriptVentil3 = 37934;
$ScriptVentil5 = 57378;
$ScriptVentil6 = 25431;
$ScriptVentil7 = 26833;
$ScriptVentil8 = 28864;
$ScriptVentil9 = 55747;
$ScriptVentil9b = 41429;
$ScriptVentilAus = 26357;


$stepread =  GetValue(59549);  // siehe 2.c.
$step =  59549;                       // siehe 2.c.

$AutomatikRasenVorgarten = GetValueBoolean(15449);    // Abfrage Automatik Status ein/aus
$AutomatikRasenNord = GetValueBoolean(37541);
$AutomatikRasenHaupt = GetValueBoolean(49132);
$AutomatikRasenSued = GetValueBoolean(10403);
$AutomatikPflanzenSpirale = GetValueBoolean(37204);
$AutomatikPflanzenTerrasse = GetValueBoolean(47180);

$timeRasenVorgarten = GetValue(39693);           // Abfrage der Zeiten je Kreis in min
$timeRasenNord = GetValue(59372);
$timeRasenHaupt = GetValue(50460);
$timeRasenSued = GetValue(38956);
$timePflanzenSpirale = GetValue(32880);
$timePflanzenTerrasse = GetValue(17938);

$timeRasenVorgartenSek = $timeRasenVorgarten * 60;     // Umrechnung in sek
$timeRasenNordSek = $timeRasenNord * 60;
$timeRasenHauptSek = $timeRasenHaupt * 60;
$timeRasenSuedSek = $timeRasenSued * 60;
$timePflanzenSpiraleSek = $timePflanzenSpirale * 60;
$timePflanzenTerrasseSek = $timePflanzenTerrasse * 60;

// - - Bewässerung Gesamt-Laufzeitermittlung - -        // Ich lasse mir noch die Gesamtlaufzeit errechnen der Übersicht wegen

$GesamtLaufzeit = 59688;

if($AutomatikRasenVorgarten == true){$timevalue_timeRasenVorgarten = $timeRasenVorgarten;} else{$timevalue_timeRasenVorgarten = 0;};
if($AutomatikRasenNord == true){$timevalue_timeRasenNord = $timeRasenNord;} else{$timevalue_timeRasenNord = 0;};
if($AutomatikRasenHaupt == true){$timevalue_timeRasenHaupt = $timeRasenHaupt;} else{$timevalue_timeRasenHaupt = 0;};
if($AutomatikRasenSued == true){$timevalue_timeRasenSued = $timeRasenSued;} else{$timevalue_timeRasenSued = 0;};
if($AutomatikPflanzenSpirale == true){$timevalue_timePflanzenSpirale = $timePflanzenSpirale;} else{$timevalue_timePflanzenSpirale = 0;};
if($AutomatikPflanzenTerrasse == true){$timevalue_timePflanzenTerrasse = $timePflanzenTerrasse;} else{$timevalue_timePflanzenTerrasse = 0;};

$timevalue_Summe_min = $timevalue_timeRasenVorgarten + $timevalue_timeRasenNord + (2 * $timevalue_timeRasenHaupt) + $timevalue_timeRasenSued + $timevalue_timePflanzenSpirale + $timevalue_timePflanzenTerrasse;

SetValue($GesamtLaufzeit, $timevalue_Summe_min);
IPS_RunScript(49549);

// - - Skriptstart - - 

if(($IPS_SENDER <> "TimerEvent")and($stepread == 0)){
    SetValue($id, 8);
    SetValue($step, 1);
    IPS_SetScriptTimer($IPS_SELF, 5);
	EIB_Switch($SwitchTrafo, true);
	SetValueBoolean($AutomatikStatus, true);
	HM_WriteValueBoolean(36876, "STATE", true);  //Pumpe einschalten
    SetValue(58575, time());     // zusätzliche Variable, die eine Startzeit angibt, wird hier auf "jetzt" gesetzt
    IPS_SetEventActive(10149,true);       //Ereignis, das an einem weiteren Skript hängt zur Ermittlung der Restlaufzeit, wird während das Programm läuft jede Minute ausgeführt, nicht zwingend erforderlich
    return;
}
if($IPS_SENDER == "TimerEvent"){
    switch($stepread) {     // hier wird der jeweilige "step" ausgelesen
   case 1:
	   if($AutomatikRasenVorgarten == true){            //wenn die Variable Automatic für diesen Kreis auf "true/an" steht wird dder Teil ausgeführt...
       SetValue($step, 2);    // dies ist step 1, der unter case 1 abläuft, damit bei der nächsten Ausführung dieses Skriptes der nächste "case" läuft, wird "step" hier um +1 erhöht
        IPS_SetScriptTimer($IPS_SELF, $timeRasenVorgartenSek);   //An diesem Skript hängt ein ScriptTimer, der dann nach der eingestellten Zeit dieses Script wieder ausführt und dann zum nächsten "Step" geht.
        SetValue($id, 0);
	    IPS_RunScript($ScriptVentil1);    // hier wird der das Skript wie unter 3. beschrieben gestartet
		}
	   else{                                                          //falls die Variable Automatic für diesen Kreis "false/nein" ist, wird der "step" um +1 erhöht, der eigene Skripttimer auf 1 sek gestellt, worduch das Skript nach 1 sek wieder startet und dann zu "case 2" springt, so geht das dann hier immer weiter bis man am Ende ankommt
	   	SetValue($step, 2);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
       break;
   case 2:
	   if($AutomatikRasenNord == true){
        SetValue($step, 3);
        IPS_SetScriptTimer($IPS_SELF, $timeRasenNordSek);
        SetValue($id, 1);
	    IPS_RunScript($ScriptVentil3);
 		}
	   else{
	   	SetValue($step, 3);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
       break;
   case 3:
	   if($AutomatikRasenHaupt == true){
        SetValue($step, 4);
        IPS_SetScriptTimer($IPS_SELF, $timeRasenHauptSek);
        SetValue($id, 2);
	    IPS_RunScript($ScriptVentil7);
		}
	   else{
	   	SetValue($step, 4);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
       break;
   case 4:
	   if($AutomatikRasenHaupt == true){
        SetValue($step, 5);
        IPS_SetScriptTimer($IPS_SELF, $timeRasenHauptSek);
        SetValue($id, 3);
	    IPS_RunScript($ScriptVentil8);
		}
	   else{
	   	SetValue($step, 5);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
       break;
   case 5:
	   if($AutomatikRasenSued == true){
        SetValue($step, 6);
        IPS_SetScriptTimer($IPS_SELF, $timeRasenSuedSek);
	    SetValue($id, 4);	
		IPS_RunScript($ScriptVentil6);
		}
	   else{
	   	SetValue($step, 6);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
        break;
   case 6:
	   if($AutomatikPflanzenSpirale == true){
        SetValue($step, 7);
        IPS_SetScriptTimer($IPS_SELF, $timePflanzenSpiraleSek);
        SetValue($id, 5);		
		IPS_RunScript($ScriptVentil2);
		}
	   else{
	   	SetValue($step, 7);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
        break;
   case 7:
	   if($AutomatikPflanzenTerrasse == true){
        SetValue($step, 8);
        IPS_SetScriptTimer($IPS_SELF, $timePflanzenTerrasseSek);
        SetValue($id, 6);
		IPS_RunScript($ScriptVentil5);		
		}
	   else{
	   	SetValue($step, 8);
		IPS_SetScriptTimer($IPS_SELF, 1);
		};
        break;

   case 8:
        // Ablauf  fertig
		SetValue($step, 0);
        IPS_SetScriptTimer($IPS_SELF, 0);
		HM_WriteValueBoolean(36876, "STATE", false);
		SetValue($id, 8);
		SetValueBoolean($AutomatikStatus, false);
		IPS_RunScript($ScriptVentilAus);
		SetValueBoolean(15449, false);
		SetValueBoolean(37541, false);
		SetValueBoolean(49132, false);
		SetValueBoolean(10403, false);
		SetValueBoolean(37204, false);
		SetValueBoolean(47180, false);
		EIB_Switch(39503, false);
		EIB_Switch(22778, false);

        IPS_SetEventActive(10149,false);
    }
}  
?>

Hallo Marco,

Vielen Dank für Dein Skript. Habe es ausprobiert und macht genau was es soll!

Kurze Frage. Bei mir berechnet es die Gesamtzeit nicht. Ich glaube das hat etwas mit dem Teil:

IPS_RunScript(49549);

zutun. Welches Skript Startest Du da?

Danke Dir nochmals für die super Arbeit!

Gruss, Philipp