Magnetventile nach der Rheihe starten.

Hallo,

ich habe folgendes Problem,
Für meine Garten Bewässerung habe ich 4 Magnetventile, die über Zeiten (IPS Time Event) gesteuert werden sollen.
Wenn es jetzt mal dazu kommt das 2 Ventile dieselbe Startzeit haben sollen diese aber nicht zusammen laufen.

Also wenn zB. alle 4 Ventile um 19:00 Uhr starten, soll erst das 1, dann das 2, dann das 2 usw., für die angegeben Zeit laufen, danach immer das nächste, bis alle gelaufen haben.

Wie kann man das am besten Lösen.

Gruß Uwe

Hallo Uwe,

das klingt für mich etwas unlogisch oder widersprüchlich. Ich kann mir aber vorstellen, was Du meinst. Wenn mehr als ein Ventil gleichzeitig offen ist, wird wohl der Wasserdruck nicht ausreichen ?

Ich würde das über ein Token lösen, welches immer nur eindeutig einem Ventil zugeordnet wird. Erst wenn es via Script wieder freigegeben wird, darf der nächste. Also nur der, der das Token hat, kriegt Wasser.

Gruss
Bernd

was löst den die Magnetventile aus? Haben die ne eigene Zeitschaltuhr oder ne Zentrale? wenn ja wirst Du das über IPS kaum lösen können. Hier müssten die Magnetwentile über einen Aktor direkt aus IPS angesteuert werden können. Wäre das bei Dir realistisch umsetzbar?

Hallo,

genau es soll nur ein Ventil offen sein (Wegen dem Wasserdruck), und gesteuert wird es demnächst aus der IPS.

Ich stelle mir das wie ein Speicher (FiFo) vor. Es werden die ID’s und die Laufzeiten für die Ventile reingeschoben, und der Reihe nach abgearbeitet.

Gruß Uwe

Quick&Dirty:
Für jedes Ventil eine Variable welche den Sollzustand (On/OFF) mittels eines „Supervisor“ Scripts beschrieben bekommt.
Dann jeweils ein weiteres „switch Ventil ON/OFF“ pro Ventil. Diese minütlich triggern und mit Semaphoren gegenseitig verriegeln.

Wenn die Variable dann nicht nur „ON/OFF“, sondern auch noch „Pending“ verarbeiten kann kriegst eine schöne Übersicht.

Kleiner Nachteil: Du kannst keine Prioritäten vergeben. Naja, geht auch wird aber bisl aufwändiger.

gruß
bb

Ich würde es so lösen:

<?
$folge = GetValueInteger(12345); // Zählervariable muss vorher angelegt werden

switch($folge) {

case 0: // *** Ventil 1 einschalten ***
Schaltbefehl Ventil 1 ein;  // hier Schaltbefehl einfügen
SetValueInteger(12345 , 1);   // Zählervariable setzen
IPS_SetScriptTimer($IPS_SELF,300);  // Laufzeit (s) für Ventil 1
break;

case 1: // *** Ventil 2 einschalten***
Schaltbefehl Ventil 1 aus;  // hier Schaltbefehl einfügen
IPS_Sleep(10); // Wartezeit zwischen Aus- u. Einschalten in ms anpassen oder weglassen
Schaltbefehl Ventil 2 ein;  // hier Schaltbefehl einfügen
SetValueInteger(12345 , 2);   // Zählervariable setzen
IPS_SetScriptTimer($IPS_SELF,300);  // Laufzeit (s)  für Ventil 2
break;

case 2: // *** Ventil 3 einschalten***
Schaltbefehl Ventil 2 aus;  // hier Schaltbefehl einfügen
IPS_Sleep(10); // Wartezeit zwischen Aus- u. Einschalten in ms anpassen oder weglassen
Schaltbefehl Ventil 3 ein;  // hier Schaltbefehl einfügen
SetValueInteger(12345 , 3);   // Zählervariable setzen
IPS_SetScriptTimer($IPS_SELF,300);  // Laufzeit (s) für Ventil 3
break;

case 3: // *** Ventil 4 einschalten***
Schaltbefehl Ventil 3 aus;  // hier Schaltbefehl einfügen
IPS_Sleep(10); // Wartezeit zwischen Aus- u. Einschalten in ms anpassen oder weglassen
Schaltbefehl Ventil 4 ein;  // hier Schaltbefehl einfügen
SetValueInteger(12345 , 4);   // Zählervariable setzen
IPS_SetScriptTimer($IPS_SELF,300);  // Laufzeit (s) für Ventil 4
break;

case 4: // *** Ventil 4 ausschalten***
Schaltbefehl Ventil 4 aus;  // hier Schaltbefehl einfügen
SetValueInteger(12345 , 0);   // Zählervariable setzen
IPS_SetScriptTimer($IPS_SELF,0);  // Scripttimer stoppen
break;
}
?>

So könnte man auch ein schönes „Wasserspiel“ draus machen, wenn man es erweitert… :smiley:

Warum sollte dieser Zustand entstehen? Wenn du die Ventile über IPS steuerst, solltest du den Zustand doch verhindern können.

Oder hat jedes Ventil eine eigene Automatik (Script)?

Hallo Ralf,

ja jedes Ventil hat ein eigenes Skript.

Ich muß jetzt halt nur noch die Ansteuerung der Ventile realisieren.

gruß Uwe

Welche Verschwendung, wenn man doch alles in eins packen kann:confused:

Aber deshalb kannst du mein Scriptvorschlag genauso anwenden, musst eben die Anordnung der Schaltbefehle ändern und den Scripttimer auf die jeweilige ScriptID ändern.
Ich halts aber für überflüssig und unübersichtlich, wenn sowieso alles immer in der selben Reihenfolge ablaufen soll.

Hallo nancilla,

Wieso überflüssig und unübersichtlich?

Ich finde das nicht, mit diesem Skript wird auch die komplette Steuerung vom Dashboard aus gemacht. Ich hänge das Skript hier mal an. Ist aber noch im Aufbaustatus.

Hier das Skript.


<?

$ID_Evapotranspiration	= 37909 /*[Bewässerung\Verdunstung (Evapotranspiration)\Evapotranspiration (Rasen)]*/;

//---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);

//---Ereignis ZEIT erstellen--------------------------------------
$IDe_zeit1 = @IPS_GetEventIDByName("Startzeit 1", $IPS_SELF); 				//Üperprüfen ob Ereignis gibt
if ($IDe_zeit1 === false){
  	$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); 				//Üperprüfen ob Ereignis gibt
if ($IDe_zeit2 === false){
  	$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
}
//---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);

//---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, +20, 500);
   SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}
If($IPS_COMPONENT == "Faktor -"){   												//Faktor tiefer
   $laufzeit_faktor = WertEdit($ID_laufzeit_faktor, -20, 10);
   SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}

If($IPS_COMPONENT == "Laufzeit MIN +"){      									//Laufzeit Minimum höher
   $laufzeit_MIN = WertEdit($ID_laufzeit_MIN, +1, 60);
   SetValue($ID_laufzeit_MIN, $laufzeit_MIN);
}
If($IPS_COMPONENT == "Laufzeit MIN -"){      									//Laufzeit Minimum tiefer
   $laufzeit_MIN = WertEdit($ID_laufzeit_MIN, -1, 1);
   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, 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);
}

//---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 ZEIT setzten----------------------------------------
If ($zeit1_aktiv == true){                                                          //StartZeit 1
	IPS_SetEventActive($IDe_zeit1, true);
	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
	}
Else{
	IPS_SetEventActive($IDe_zeit1, false);
}

If ($zeit2_aktiv == true){                                                          //StartZeit 2
	IPS_SetEventActive($IDe_zeit2, true);
	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
	}
Else{
	IPS_SetEventActive($IDe_zeit2, false);
}

//---Nächste Startzeit auslesen---------------------------------
$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);
	}

//---Berechung Laufzeit gesamt nach (Evapotranspiration)--------
$laufzeit_ges_SEC = $laufzeit_faktor * $Evapotranspiration;
SetValue($ID_laufzeit_ges_SEC, $laufzeit_ges_SEC);
SetValue($ID_laufzeit_ges_MIN, $laufzeit_ges_SEC / 60);

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

//---Laufzeit ZEIT Steuern über (IPS TIMER EREIGNIS)------------
If($IPS_SENDER == "TimerEvent")
	{
	If ($IPS_EVENT != $IDe_zeit1 and $IPS_EVENT != $IDe_zeit2)                   			// Ausschalten
		{
	   IPS_SetScriptTimer($IPS_SELF, 0);
	   HM_WriteValueBoolean(36897 /*[Bewässerung\Strang 1 (Vorgarten)]*/, "STATE", false);
	}
	If (($IPS_EVENT == $IDe_zeit1 and $zeit1_aktiv == true) or
		 ($IPS_EVENT == $IDe_zeit2 and $zeit2_aktiv == true))                  			// Einschalten
		{
		HM_WriteValueBoolean(36897 /*[Bewässerung\Strang 1 (Vorgarten)]*/, "STATE", true);
   	SetValue($ID_laufzeit_letzte, (date(("d.m.Y  H:i"),Time())));
		IPS_SetScriptTimer($IPS_SELF, $laufzeit_ges_SEC);
	}
}

//================================================================
//---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 > 24){
			$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, füllen
		//IPS_SetScriptTimer($IPS_SELF, 60); 		//Triger anlegen
      }
	return $vid;
}

?>

Das hättest du mal gleich tun soll’n… ich ging von einer einfach gesteuerten Gartenbewässerung aus, oder habe ich einen entscheidenten Hinweis überlesen:o

also ganz ehrlich: bei sowas platzt mir manchmal er Kragen: man denkt da fragt jemand der wirklich Laie ist und Hilfe braucht (weil naive Fragen ohne Rahmenbedingungen zu nennen), man hakt nach und versucht die Rahmenbedingungen einzugrenzen, die darauf folgende Antwort ist irgendwie wenig hilfreich … und nach 5-6 mal hin und her kommt dann der Rest des Universums aus der Versenkung.

Darauf hab ich wirklich Bock!:mad:

Nein ist schon OK, :wink:

Ich versuche die IPS Steuerung der jetztigen RainBird Steuerung nach zu machen, nur noch ein besschen besser.

-> hier noch das Dashboard

Gruß Uwe

Hallo Raketenschnecke,

ich bin fast Lai, ich habe die ganze Woche gebraucht, um mir das so zusammen zu bauen, viel hier gelesen. Aber jetzt komme ich nicht mehr weiter, darum habe ich ja gefragt.

Und wie das Drumherum im Skript aussieht ist doch egal. Das Problem ist dasselbe. 4 Ventile die nicht zusammen laufen sollen.

Gruß Uwe

Danke… jo!
Als Test unserer Hellseherfähigkeit, war das aber nicht gedacht, oder;):mad:
Man, man , man… ist das wirklich war… der 1. April ist doch erst wieder im nächsten Jahr… :kopfschüttel:

Hallo Uwe,

wieso schreibst Du nicht EIN Script , dass je nach der in einem Variablen-Array hinterlegter Zeit-Vorgabe HINTEREINANDER die vier Stränge bewässert ?

So mach ich es zumindest, und wenn ich um 18 Uhr nur Strang eins für 2 Minuten bewässern will, steht in dem Array für den Strang halt 120 (Sekunden), in den anderen eine 0 (für garnicht bewässern).

Gruß Rolf

Hi Rolf,
das hatte ich mir auch schon überlegt, aber ich weiß noch nicht wie. Kann ich in IPS direkt ARRAYs Variable speichern. Ich glaube nicht.
Dann muss ich das wohl über ein String machen oder?

Also wenn ich richtig verstehe, ein Array anlegen, wo jedes Skript (der Ventile), seine Daten rein schreibt, und ein Skript erstellen welches dieses Array abarbeitet?

Was ist wenn 2 Ventile in das Array zur gleichen Zeit schreiben. Geht das in IPS?

Gruß Uwe

Ja, hab das auch schon so ähnlich gemacht, array einfach mit „implode“ auf einen String umwandeln un als String in IPS abspeichern.

Bei jedem Zugriff dann wieder mit „explode“ auf ein Array umwandeln …

lg
Andreas

Ich sehe, dass ihr euch mit dem exorbitant-voluminösen „Ursprungsscript“ beschäftigt und Zeit für einen Ansatz gefunden habt… meine Hochachtung* für eure Ausdauer für dieses anspruchsvolle Projekt der Bewässerung des Biotops.

*ist wirklich ernst gemeint