Magnetventile nach der Rheihe starten.

Mein Biotop steht im Wohnzimmer und ist mit 2000L Wasser gefühlt.

Gruß Uwe

Respekt!!!

Sieht geil aus… aber teil uns doch gleich deine Absichten wider.

Ich zitiere mal aus deinem Threadstart:

Für meine Garten Bewässerung

Was offenbarst du noch… mein Interesse:D

So. Fertig, zumindestens das Grobe.

Das Hauptskript schreibt die Laufzeit in ein FIFO (ARRAY).


<?

$ID_HMInstanz 					= 36897 /*[Bewässerung\Strang 1 (Vorgarten)]*/;
$ID_Evapotranspiration		= 37909 /*[Bewässerung\Verdunstung (Evapotranspiration)\Evapotranspiration (Rasen)]*/;
$ID_FIFO_Speicher 			= 41577 /*[Bewässerung\Ventilsteuerung (mit FIFO Speicher)\FIFO Speicher]*/;

//---Variable erstellen-------------------------------------------
$ID_zeit1_aktiv 		= CreateVariableByName($IPS_SELF, "Zeit 1 aktiv", 0, "", "false");
$ID_zeit2_aktiv 		= CreateVariableByName($IPS_SELF, "Zeit 2 aktiv", 0, "", "true");
$ID_zeit1 				= CreateVariableByName($IPS_SELF, "Zeit 1", 3, "", "07:00");
$ID_zeit2 				= CreateVariableByName($IPS_SELF, "Zeit 2", 3, "", "19:00");
$ID_laufzeit_MIN     = CreateVariableByName($IPS_SELF, "Laufzeit Minimum", 1, "Zeit_MIN", 1);
$ID_laufzeit_MAX     = CreateVariableByName($IPS_SELF, "Laufzeit Maximum", 1, "Zeit_MIN", 15);
$ID_laufzeit_tage    = CreateVariableByName($IPS_SELF, "Laufzeit Wiederholung Tage", 1, "", 1);
$ID_laufzeit_ges_SEC = CreateVariableByName($IPS_SELF, "Laufzeit Dauer gesamt (sec)", 1, "Zeit_SEC", 0);
$ID_laufzeit_ges_MIN = CreateVariableByName($IPS_SELF, "Laufzeit Dauer gesamt (min)", 1, "Zeit_MIN", 0);
$ID_laufzeit_aktuel  = CreateVariableByName($IPS_SELF, "Laufzeit Dauer aktuel", 1, "Zeit_SEC", 0);
$ID_laufzeit_faktor 	= CreateVariableByName($IPS_SELF, "Laufzeit Faktor", 1, "", 150);
$ID_laufzeit_letzte 	= CreateVariableByName($IPS_SELF, "Laufzeit Letzte", 3, "", "");
$ID_laufzeit_next 	= CreateVariableByName($IPS_SELF, "Laufzeit Nächste", 3, "", "");
$ID_status_reglung	= CreateVariableByName($IPS_SELF, "Status Reglung", 1, "Status_Reglung", 0);

//---Variable einlesen---------------------------------------------
$zeit1_aktiv 				= GetValue($ID_zeit1_aktiv);
$zeit2_aktiv 				= GetValue($ID_zeit2_aktiv);
$laufzeit_MIN        	= GetValue($ID_laufzeit_MIN);
$laufzeit_MAX        	= GetValue($ID_laufzeit_MAX);
$laufzeit_tage       	= GetValue($ID_laufzeit_tage);
$Evapotranspiration 		= GetValue($ID_Evapotranspiration);
$laufzeit_faktor     	= GetValue($ID_laufzeit_faktor);
$laufzeit_ges_SEC    	= GetValue($ID_laufzeit_ges_SEC);

//---Ereignis ZEIT erstellen--------------------------------------
$IDe_zeit1 = @IPS_GetEventIDByName("Startzeit 1", $IPS_SELF); 				
If ($IDe_zeit1 === false){                                              //Üperprüfen ob Ereignis gibt
  	$IDe_zeit1 = IPS_CreateEvent(1);           		 							//Ausgelöstes Ereignis
  	IPS_SetName($IDe_zeit1, "Startzeit 1");       								//Namen zuordenen
	IPS_SetParent($IDe_zeit1, $IPS_SELF);   										//Eregnis zuordnen
	IPS_SetEventActive($IDe_zeit1, true);       									//Ereignis aktivieren
}
$IDe_zeit2 = @IPS_GetEventIDByName("Startzeit 2", $IPS_SELF); 				
If ($IDe_zeit2 === false){                                              //Üperprüfen ob Ereignis gibt
  	$IDe_zeit2 = IPS_CreateEvent(1);           		 							//Ausgelöstes Ereignis
  	IPS_SetName($IDe_zeit2, "Startzeit 2");       								//Namen zuordenen
	IPS_SetParent($IDe_zeit2, $IPS_SELF);   										//Eregnis zuordnen
	IPS_SetEventActive($IDe_zeit2, true);       									//Ereignis aktivieren
}
$IDe = @IPS_GetEventIDByName("Überwachung EVA Wert", $IPS_SELF);        //Üperprüfen ob Ereignis gibt
If ($IDe === false){
	$IDe = IPS_CreateEvent(0);        												//Ausgelöstes Ereignis
	IPS_SetName($IDe, "Überwachung EVA Wert");       							//Namen zuordenen
	IPS_SetEventTrigger($IDe, 1, $ID_Evapotranspiration); 					//Bei Änderung von Variable
	IPS_SetParent($IDe, $IPS_SELF); 													//Ereignis zuordnen
	IPS_SetEventActive($IDe, true);    												//Ereignis aktivieren
}

//---Tastatur / Bottom abfrage-------------------------------------
If (!isset($IPS_COMPONENT)) $IPS_COMPONENT ="";       						
//---Zeiten ändern-------------------------------------------------
If($IPS_COMPONENT == "Zeit1 AUS"){
	If ($zeit1_aktiv == true){                   								//Zeit 1 AUS
      $zeit1_aktiv = false;
	}
	ElseIf ($zeit1_aktiv == false){            									//Zeit 1 EIN
      $zeit1_aktiv = true;
	}
	SetValue($ID_zeit1_aktiv,$zeit1_aktiv);
}
If($IPS_COMPONENT == "Zeit2 AUS"){
	If ($zeit2_aktiv == true){                   								//Zeit 2 AUS
      $zeit2_aktiv = false;
	}
	ElseIf ($zeit2_aktiv == false){           									//Zeit 2 EIN
      $zeit2_aktiv = true;
	}
	SetValue($ID_zeit2_aktiv,$zeit2_aktiv);
}

If($IPS_COMPONENT == "Zeit1 +" and $zeit1_aktiv == true){      			//Zeit 1 höher
   $zeit1 = ZeitEdit($ID_zeit1, +15);
   SetValue($ID_zeit1, $zeit1);
}
If($IPS_COMPONENT == "Zeit1 -" and $zeit1_aktiv == true){   				//Zeit 1 tiefer
   $zeit1 = ZeitEdit($ID_zeit1, -15);
   SetValue($ID_zeit1, $zeit1);
}
If($IPS_COMPONENT == "Zeit2 +" and $zeit2_aktiv == true){      			//Zeit 2 höher
   $zeit2 = ZeitEdit($ID_zeit2, +15);
   SetValue($ID_zeit2, $zeit2);
}
If($IPS_COMPONENT == "Zeit2 -" and $zeit2_aktiv == true){   				//Zeit 2 tiefer
   $zeit2 = ZeitEdit($ID_zeit2, -15);
   SetValue($ID_zeit2, $zeit2);
}

If($IPS_COMPONENT == "Faktor +"){      											//Faktor höher
   $laufzeit_faktor = WertEdit($ID_laufzeit_faktor, +10, 700);
   SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}
If($IPS_COMPONENT == "Faktor -"){   												//Faktor tiefer
   $laufzeit_faktor = WertEdit($ID_laufzeit_faktor, -10, 10);
   SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}

If($IPS_COMPONENT == "Laufzeit MIN +"){      									//Laufzeit Minimum höher
   $laufzeit_MIN = WertEdit($ID_laufzeit_MIN, +1, $laufzeit_MAX - 1);
   SetValue($ID_laufzeit_MIN, $laufzeit_MIN);
}
If($IPS_COMPONENT == "Laufzeit MIN -"){      									//Laufzeit Minimum tiefer
   $laufzeit_MIN = WertEdit($ID_laufzeit_MIN, -1, 0);
   SetValue($ID_laufzeit_MIN, $laufzeit_MIN);
}
If($IPS_COMPONENT == "Laufzeit MAX +"){      									//Laufzeit Maximum höher
   $laufzeit_MAX = WertEdit($ID_laufzeit_MAX, +1, 60);
   SetValue($ID_laufzeit_MAX, $laufzeit_MAX);
}
If($IPS_COMPONENT == "Laufzeit MAX -"){      									//Laufzeit Maximum tiefer
   $laufzeit_MAX = WertEdit($ID_laufzeit_MAX, -1, $laufzeit_MIN + 1);
   SetValue($ID_laufzeit_MAX, $laufzeit_MAX);
}

If($IPS_COMPONENT == "Laufzeit Tage +"){      									//Laufzeit Wiederholong Tage höher
   $laufzeit_tage = WertEdit($ID_laufzeit_tage, +1,14);
   SetValue($ID_laufzeit_tage, $laufzeit_tage);
}
If($IPS_COMPONENT == "Laufzeit Tage -"){      									//Laufzeit Wiederholong Tage tiefer
   $laufzeit_tage = WertEdit($ID_laufzeit_tage, -1, 1);
   SetValue($ID_laufzeit_tage, $laufzeit_tage);
}

If($IPS_COMPONENT == "Start"){      												//Manueller Start
   $start_manuell = true;}
Else {$start_manuell = false;}

//---Variable einlesen--------------------------------------------
$zeit1_STD 	= (INT) SubStr(GetValue($ID_zeit1),0,2);
$zeit1_MIN 	= (INT) SubStr(GetValue($ID_zeit1),3,2);
$zeit2_STD  = (INT) SubStr(GetValue($ID_zeit2),0,2);
$zeit2_MIN  = (INT) SubStr(GetValue($ID_zeit2),3,2);

//---Ereignis setzten---------------------------------------------
If ($zeit1_aktiv == true){                                                          //StartZeit 1
	IPS_SetEventCyclic($IDe_zeit1, 2, $laufzeit_tage, 0, 0, 0, 0);   						//Zeittyp einstellen
	IPS_SetEventCyclicTimeBounds($IDe_zeit1, mktime($zeit1_STD, $zeit1_MIN, 0),0);  	//Startzeit
	IPS_SetEventActive($IDe_zeit1, true);
	}
Else{
	IPS_SetEventActive($IDe_zeit1, false);
}

If ($zeit2_aktiv == true){                                                         	//StartZeit 2
	IPS_SetEventCyclic($IDe_zeit2, 2, $laufzeit_tage, 0, 0, 0, 0);   						//Zeittyp einstellen
	IPS_SetEventCyclicTimeBounds($IDe_zeit2, mktime($zeit2_STD, $zeit2_MIN, 0),0);  	//Startzeit
	IPS_SetEventActive($IDe_zeit2, true);
	}
Else{
	IPS_SetEventActive($IDe_zeit2, false);
}

//---Berechung Laufzeit gesamt----------------------------------
$laufzeit_ges_SEC = $laufzeit_faktor * $Evapotranspiration;                      // Berechung Laufzeit gesamt nach (Evapotranspiration)

If ($zeit1_aktiv == true and $zeit2_aktiv == true)                               // Berechung Laufzeit bei 2mal Täglich
	{
	$laufzeit_ges_SEC = $laufzeit_ges_SEC / 2;
	}

If ($laufzeit_ges_SEC < $laufzeit_MIN * 60)                                      //Berechnung Laufzeit MIN / MAX überwachen
	{
   $laufzeit_ges_SEC = $laufzeit_MIN * 60;
}
If ($laufzeit_ges_SEC > $laufzeit_MAX * 60)
	{
   $laufzeit_ges_SEC = $laufzeit_MAX * 60;
}

SetValue($ID_laufzeit_ges_SEC, $laufzeit_ges_SEC);                               // Laufzeit speichern
SetValue($ID_laufzeit_ges_MIN, $laufzeit_ges_SEC / 60);

	
//---Laufzeit ZEIT Steuern über (IPS TIMER EREIGNIS)------------
If($IPS_SENDER == "TimerEvent")
	{
	If (($IPS_EVENT == $IDe_zeit1 and $zeit1_aktiv == true) or                    // Daten in FIFO schreiben
		 ($IPS_EVENT == $IDe_zeit2 and $zeit2_aktiv == true))
		{
		$FIFO_String = getValue($ID_FIFO_Speicher)."
".(STRING)$IPS_SELF.",".(STRING)$ID_HMInstanz.",".(STRING)$laufzeit_ges_SEC;
		setValue($ID_FIFO_Speicher, $FIFO_String);
		setValue($ID_laufzeit_letzte,(date(("d.m.Y  H:i"),time())));
	}
}
//---Manueller Start---------------------------------------------
If($start_manuell == true)
	{
	$FIFO_String = getValue($ID_FIFO_Speicher)."
".(STRING)$IPS_SELF.",".(STRING)$ID_HMInstanz.",".(STRING)$laufzeit_ges_SEC;
	setValue($ID_FIFO_Speicher, $FIFO_String);
	setValue($ID_laufzeit_letzte,(date(("d.m.Y  H:i"),time())));
}

//---Nächste Startzeit (INFO)------------------------------------
$EreignisZeitInfo1 = IPS_GetEvent($IDe_zeit1);                                  		//Ereignis Zeit1(Nächste Startzeit) auslesen
$EreignisZeitInfo2 = IPS_GetEvent($IDe_zeit2);                                   	//Ereignis Zeit2(Nächste Startzeit) auslesen
If (($EreignisZeitInfo1['NextRun']-time()) > ($EreignisZeitInfo2['NextRun']-time()))
	{
	$laufzeit_next = (date(("d.m.Y  H:i"),$EreignisZeitInfo1['NextRun']+1));
	SetValue($ID_laufzeit_next, $laufzeit_next);
	}
Else
	{
	$laufzeit_next = (date(("d.m.Y  H:i"),$EreignisZeitInfo2['NextRun']+1));
	SetValue($ID_laufzeit_next, $laufzeit_next);
	}

If ($zeit1_aktiv == false and $zeit2_aktiv == false)
	{
	SetValue($ID_laufzeit_next, "AUS");
	}

//================================================================
//---Zahlen Wert ändern +/- --------------------------------------
function WertEdit($ID, $wert, $endwert){           // ID=ZeitString Wert(INT) , Wert(INT)= Änderungs Wert "+1" oder "-1" , Endwert(INT)
	$zahl = GetValue($ID);

	If ($wert > 0){                              												// Wert änder (höher)
		$zahl = $zahl + $wert;
		If ($zahl > $endwert) {
		   $zahl = $endwert;
		}
	}

	If ($wert < 0){                                 											// Wert änder (tiefer)
		$zahl = $zahl + $wert;
		If ($zahl < $endwert) {
		   $zahl = $endwert;
		}
	}

  	return $zahl;
}

//---Zeitwert ändern +/- -----------------------------------------
function ZeitEdit($ID, $wert){                     // ID=ZeitString "14:00" , Wert(INT)= Änderungs Wert "+1" oder "-1"
	$zeit_STD  = (INT) SubStr(GetValue($ID),0,2);
	$zeit_MIN  = (INT) SubStr(GetValue($ID),3,2);

	If ($wert > 0){                              												// Zeit änder (höher)
		$zeit_MIN = $zeit_MIN + $wert;
		If ($zeit_MIN > 59){
			$zeit_MIN 	= $zeit_MIN - 60;
			$zeit_STD	= $zeit_STD + 1;
		}
		If ($zeit_STD > 23){
			$zeit_MIN 	= 0;
			$zeit_STD 	= 0;
		}
	}
	If ($wert < 0){                                 											// Zeit änder (tiefer)
		$zeit_MIN = $zeit_MIN + $wert;
		If ($zeit_MIN < 0){
			$zeit_MIN 	= 60 + $zeit_MIN;
			$zeit_STD 	= $zeit_STD - 1;
		}
		If ($zeit_STD < 0){
			$zeit_MIN 	= 60 + $wert;
			$zeit_STD 	= 23;
		}
	}

   $zeit = STR_PAD($zeit_STD,2,"0",STR_PAD_LEFT).":".STR_PAD($zeit_MIN,2,"0",STR_PAD_LEFT);
	return $zeit;
}


//---Funktion Variablen anlegen ----------------------------------
function CreateVariableByName($id, $name, $type, $profile = "", $wert){
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   If($vid === false)
   	{
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
      If($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
		
      SetValue($vid, $wert);  																		//Variabel, mit WERT füllen
      }
	return $vid;
}

?>

Und das neben Skript, arbeitet die daten im ARRAY ab, und schaltet die Ventile.

<?
/* Es wird eine Variable angelegt die vom (Ventil Haupt Skript) beschrieben wird.
** Werte => $ID_Aufruf_Skript, $ID_HMInstanz, $Ventil_Laufzeit
*/

//---Variable erstellen-------------------------------------
$ID_FIFO_String = CreateVariableByName($IPS_SELF, "FIFO Speicher", 3, "", "");

//---Variable einlesen--------------------------------------
$FIFO_String = getValue($ID_FIFO_String);											// FIFO einlesen

//---Ereignis erstellen-------------------------------------
$IDe = @IPS_GetEventIDByName("Bei Änderung FIFO Speicher", $IPS_SELF);	//Üperprüfen ob Ereignis gibt
If ($IDe === false){
	$IDe = IPS_CreateEvent(0);        												//Ausgelöstes Ereignis
	IPS_SetName($IDe, "Bei Änderung FIFO Speicher");       					//Namen zuordenen
	IPS_SetEventTrigger($IDe, 1, $ID_FIFO_String); 								//Bei Änderung von Variable
	IPS_SetParent($IDe, $IPS_SELF); 													//Ereignis zuordnen
	IPS_SetEventActive($IDe, true);    												//Ereignis aktivieren
}

IF($FIFO_String !="")
	{
	//---Daten in den FIFO-String in FIFO-ARRAY wandeln---------
	$FIFO_Array = explode("
", $FIFO_String);     		  					// Daten aus FIFO nach 'Zeilenumbruch' trennen und in Array schreiben
	$FIFO_Array = array_values(array_filter($FIFO_Array));   				// Falsche und Leere Einträge löschen
	$FIFO_Array = array_values(array_unique($FIFO_Array));  					// Doppelte Einträge löschen

	//---Daten aus ARRAY lesen------------------------------------
	$FIFO_Daten 		= explode(",", $FIFO_Array[0]);              		// Daten aus FIFO nach ',' trennen und in Array schreiben
	$ID_Aufruf_Skript = (INT)$FIFO_Daten[0];
	$ID_HMInstanz     = (INT)$FIFO_Daten[1];
	$Ventil_Laufzeit  = (INT)$FIFO_Daten[2];


	//------------------------------------------------------------
	If($IPS_SENDER == "TimerEvent")
		{
		HM_WriteValueBoolean($ID_HMInstanz, "STATE", false);           	// Ventil AUS
		IPS_SetScriptTimer($IPS_SELF, 0);

		unset($FIFO_Array[0]);                                      		// Ersten Datensatz löschen
	   $FIFO_String 	= "";
		foreach($FIFO_Array as $key => $value)     								// alle Einträge durchlaufen
			{
			$FIFO_String = $FIFO_String."
".$value;
		}
		setValue($ID_FIFO_String, $FIFO_String);                       	// Neuen FIFO String speichern
	}
	Else
		{
		HM_WriteValueBoolean($ID_HMInstanz, "STATE", true);   				// Ventil EIN
		IPS_SetScriptTimer($IPS_SELF, $Ventil_Laufzeit);         			//Dieses Skript nach abluf der Zeit neu starten
	}
}

//---Funktion Variablen anlegen ----------------------------------
function CreateVariableByName($id, $name, $type, $profile = "", $wert){
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   If($vid === false)
   	{
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
      If($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }

      SetValue($vid, $wert);  														//Variabel, mit Wert füllen
      }
	return $vid;
}

?>

Und gesteuert wird es vom Dashboard.

Gruß Uwe