IPS_Watering / FS20_SwitchDuration ($id, $dauer);

Ich war an dem Thema mit Brownson schon mal dran, aber bei Ihm ist es an der Zeit gescheitert, und bei mir am können, deswegen stelle ich das Problem(chen) mal ins Forum.

Meine Bewässerungssteuerung, bzw. die Ansteuerung der Ventile erfolgt durch FS20. Genauer durch das 4-Kanal Schaltmodul. Bei diesem Modul, und das ist für die Bewässerung sehr wichtig (Stichwort - Überflutung weil Befehl „aus“ nicht ankommt), kann die Funktion FS20_SwitchDuration ($trafo_id, true, $dauer); genutzt werden. D.h. mit jedem Befehl zum einschalten, wird auch gleich die Dauer bis zum, auf dem Aktor eigenständigen, Ausschalten, mitgeliefert.

D.h. es kann nie der „zu“ Befehl wegen Funkproblemen verloren gehen.

Leider ist diese Funktion in IPS_Watering nicht integriert. Könnte das jemand machen?

Hi Wupperi,

ich nutze zwar nicht das Watering-Modul sondern habe mir was eigenes geschrieben, finde (und nutze) die $dauer-Funktion aber auch für meine Pumpe - somit könnte auch bei IPS-Totalabsturz nie „unendlich“ viel Wasser in den Keller gepumpt werden (sondern nur 6 Minuten (ich sende alle 5)).
Gibt es denn von Z-Wave oder Homematic auch solche Zwischenstecker oder ähnliches wo diese Zeitfunktion enthalten ist?

herbertf

Bisschen OT, aber ich glaube von HM gibst das.

Hi,

die notwendigen Änderungen im IPSComponent Layer hatte ich bereits vor einigen Wochen integriert, heute habe ich auch die Änderungen in IPSWatering in en Development Branch integriert -

Es sollte jetzt also für HM und FS20 automatisch die ensprechende maximale OnTime + 5 Minuten gesetzt werden.
Für andere Systeme ist mir keine Möglichkeit bekannt.

bitte auch mal für FS20 Testen …

Scheint zu gehen.

26.07.2013 08:15:31.00 | SendCommand | DeviceOn:True Duration:605 Intensity:-1

Beregnung war auf 10mins eingestellt, 10mins = 600sek +5 Sek (Nicht Minuten wie von Dir beschrieben) = 605.

EDIT: Ich habe noch eine kleine Aufgabe, mit jeweils zwei Kanälen meiner 4-fach Schalter schalte ich die Ventilsteuerspannungstrafo’s an und aus. D.h. vor jedem beregnen müsste jeweils der dem gerade anzusteuernden Kanal zugehörige Trafo angeschaltet und danach wieder ausgeschaltet werden.

Wie kann ich sowas machen?

Hallo wupperi,

ich mache genau das mit den Callback Methoden. Funktioniert einwandfrei.

Ich zitiere aus dem Wiki:

Es gibt derzeit 2 Callback Methoden, diese ermöglichen es eigene Hardware einzubinden und bevor bzw. nach der Aktivierung einer Bewässerung zB. die Wasserzufuhr zu steuern.

Die Prozeduren befinden sich in der Datei IPSWatering_Custom.inc.php und beinhalten im Header jeweils eine detailierte Beschreibung der Parameter.

Funktionen:

function IPSWatering_BeforeActivateWatering($CycleId ,$Value, $Mode) {
function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) { 

Gruß
Ralla

So ganz klar ist es mir noch nicht.
Mein Skript sieht so aus, wie hier eingefügt, und im Moment schaltet es die Trafos an und sofort wieder aus.

Wenn ich jetzt die Funktion IPSWatering_AfterActivateWatering nicht konfiguriere, dann bleiben aber meine Trafo’s nach Ende der Bewässerung an :confused:


// ----------------------------------------------------------------------------------------------------------------------------
	//
	// Function will be called before a Watering Cycle is switched (means activated and also deactivated)
	//
	// Watering of current Cycle can be prevented by returning Value false.
	//
	// Parameters:
	//   $CycleId    - ID of current Watering Device (means Program.IPSWatering.WaterCircles.MyCurrentCycle)
	//   $Value      - true for "Switch On", false for "Switch Off"
	//   $Mode       - Mode for Activation, possible Values: "Automatik Start" or "Manueller Start"
	//
	// ----------------------------------------------------------------------------------------------------------------------------

	function IPSWatering_BeforeActivateWatering($CycleId ,$Value, $Mode) {
		$CircleName = IPS_GetName($CycleId);
		IPSLogger_Inf(__file__, 'Einschalten der Ventiltrafos für Bewässerung');
      IPSWatering_Log('Einschalten der Ventiltrafos für Bewässerung');
      FS20_SwitchMode(34596,true);
      FS20_SwitchMode(41731,true);
		//if ($Mode==c_Mode_StartAutomatic and $Value and $GroundHumidity) {
		//   return false;
		//}

		return true; // Return false to prevent Watering
	}

	// ----------------------------------------------------------------------------------------------------------------------------
	//
	// Function will be called after a Watering Cycle is switched (means activated and also deactivated)
	//
	// Parameters:
	//   $CycleId    - ID of current Watering Device (means Program.IPSWatering.WaterCircles.MyCurrentCycle)
	//   $Value      - true for "Switch On", false for "Switch Off"
	//   $Mode       - Mode for Activation, possible Values: "Automatik Start" or "Manueller Start"
	//
	// ----------------------------------------------------------------------------------------------------------------------------

	function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) {
		$CircleName = IPS_GetName($CycleId);
		IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos für Bewässerung');
      IPSWatering_Log('Ausschalten der Ventiltrafos für Bewässerung');
      FS20_SwitchMode(34596,false);
      FS20_SwitchMode(41731,false);
	}

	/** @}*/

Hallo wupperi,

über das Problem bin ich zunächst auch gestolpert. Ich hatte überlesen, dass beide Funktionen sowohl bei der Aktivierung als auch der Deaktivierung der Bewässerung ausgeführt werden. Man muss daher innerhalb der Funktionen Bedingungen definieren, mit denen festgelegt wird, wann die jeweiligen Aktionen ausgeführt werden.

Bei mir sieht das so aus:

function IPSWatering_BeforeActivateWatering($CycleId ,$Value, $Mode) {
		$CircleName = IPS_GetName($CycleId);
		$NetzteilID = 31205 /*[Hardware\Beleuchtung\Schuppen\HM-LC-Sw4-SM\Kanal 3: Steckdose 3]*/;
		$BodenTrocken = GetValueBoolean(57916 /*[Hardware\Außenbereich\Garten\Schließerkontakt 1\Bodenfeuchtigkeit]*/ );
		$RegenErwartungID = 51176 /*[Scripte\RegenErwartung]*/ ;
		$RegenErwartung = GetValueFloat($RegenErwartungID);
		$WaterConfig      = get_WateringConfiguration();
      $CycleIdent       = IPS_GetName($CycleId);
      $ComponentParams  = $WaterConfig[$CycleIdent][c_Property_Component];
      $ComponentParams  = explode(',',$ComponentParams);
      $DeviceId         = (int)$ComponentParams[1];
      $DurationMin      = GetValue(get_ControlId(c_Control_Duration, $CycleId));
      $DurationSec      = 60*$DurationMin+60;

		//if ($Mode==c_Mode_StartAutomatic and $Value and $GroundHumidity) {
		//   return false;
		//}
		$answer = false;
		if ( $Value==true
			& (($Mode == "Automatik Start"
			& $BodenTrocken==true
			& $RegenErwartung < 4.5  )
			|| ($Mode == "Manueller Start"))){
				HM_WriteValueFloat($DeviceId, "ON_TIME",  $DurationSec);
				HM_WriteValueFloat($NetzteilID, "ON_TIME",  $DurationSec);
				HM_WriteValueBoolean($NetzteilID, "STATE", TRUE);
				$answer = true;
		}
	 	if ( $Value==false ){
 			$answer = true;
		}
		return $answer; // Return false to prevent Watering
	}

	// ----------------------------------------------------------------------------------------------------------------------------
	//
	// Function will be called after a Watering Cycle is switched (means activated and also deactivated)
	//
	// Parameters:
	//   $CycleId    - ID of current Watering Device (means Program.IPSWatering.WaterCircles.MyCurrentCycle)
	//   $Value      - true for "Switch On", false for "Switch Off"
	//   $Mode       - Mode for Activation, possible Values: "Automatik Start" or "Manueller Start"
	//
	// ----------------------------------------------------------------------------------------------------------------------------

	function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) {
		$CircleName = IPS_GetName($CycleId);
		$NetzteilID = 31205 /*[Hardware\Beleuchtung\Schuppen\HM-LC-Sw4-SM\Kanal 3: Steckdose 3]*/;

		if ($Value==false){
			HM_WriteValueBoolean($NetzteilID, "STATE", False);
		}
	}

Gruß
Ralla

Prima, vielen Dank. So klappt es auch bei mir:
Und: Eine Frage noch, womit machst Du die Regenerwartung für den Tag?


$RegenErwartung = GetValueFloat($RegenErwartungID);

Mein Skript:


// ----------------------------------------------------------------------------------------------------------------------------
	//
	// Function will be called before a Watering Cycle is switched (means activated and also deactivated)
	//
	// Watering of current Cycle can be prevented by returning Value false.
	//
	// Parameters:
	//   $CycleId    - ID of current Watering Device (means Program.IPSWatering.WaterCircles.MyCurrentCycle)
	//   $Value      - true for "Switch On", false for "Switch Off"
	//   $Mode       - Mode for Activation, possible Values: "Automatik Start" or "Manueller Start"
	//
	// ----------------------------------------------------------------------------------------------------------------------------

	function IPSWatering_BeforeActivateWatering($CycleId ,$Value, $Mode) {
		$netzteil_vorne = 41731;
		$netzteil_hinten = 34596;
		$CircleName = IPS_GetName($CycleId);
		if ($Value == 1){		
			if ($CircleName == 'Circle_1' or $CircleName == "Circle_2" or $CircleName == "Circle_3") {
					IPSLogger_Inf(__file__, 'Einschalten der Ventiltrafos hinten für Bewässerung');
					IPSWatering_Log('Einschalten der Ventiltrafos hinten für Bewässerung');
					FS20_SwitchMode($netzteil_hinten,true);
					}
			if ($CircleName == "Circle_4" or $CircleName == "Circle_5" or $CircleName == "Circle_6") {
					IPSLogger_Inf(__file__, 'Einschalten der Ventiltrafos vorne für Bewässerung');
					IPSWatering_Log('Einschalten der Ventiltrafos vorne für Bewässerung');
					FS20_SwitchMode($netzteil_vorne,true);
					}
	  
	    }
			

		return true; // Return false to prevent Watering
	}

	// ----------------------------------------------------------------------------------------------------------------------------
	//
	// Function will be called after a Watering Cycle is switched (means activated and also deactivated)
	//
	// Parameters:
	//   $CycleId    - ID of current Watering Device (means Program.IPSWatering.WaterCircles.MyCurrentCycle)
	//   $Value      - true for "Switch On", false for "Switch Off"
	//   $Mode       - Mode for Activation, possible Values: "Automatik Start" or "Manueller Start"
	//
	// ----------------------------------------------------------------------------------------------------------------------------

	function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) {
		$netzteil_vorne = 41731;
		$netzteil_hinten = 34596;
		$CircleName = IPS_GetName($CycleId);
		if ($Value == 0){
			if ($CircleName == 'Circle_1' or $CircleName == "Circle_2" or $CircleName == "Circle_3") {
					IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos hinten für Bewässerung');
					IPSWatering_Log('Ausschalten der Ventiltrafos hinten für Bewässerung');
					FS20_SwitchMode($netzteil_hinten,false);
					}
			
			
			
			if ($CircleName == "Circle_4" or $CircleName == "Circle_5" or $CircleName == "Circle_6") {
					IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos vorne für Bewässerung');
					IPSWatering_Log('Ausschalten der Ventiltrafos vorne für Bewässerung');
					FS20_SwitchMode($netzteil_vorne,false);
					}
	  
	    }
			
	}

Schön, dass es jetzt bei dir funktioniert.

Die Geschichte mit der Regenerwartung ist noch etwas roh und in keiner Weise mit den tollen Scripts zu vergleichen, die hier sonst so vorgestellt werden.

Zur Zeit lese ich den Agrarwetterbericht meiner Region von http://www.donnerwetter.de/agrar aus.
Durch Multiplikation der Regenwahrscheinlichkeit eines Tages mit der entsprechenden Regenmenge versuche ich einen „Erwartungswert“ für die Niederschlagsmenge zu ermitteln. Von diesem Wert subtrahiere ich die zu erwartende Verdunstungsmenge und summiere das Ergebnis für die nächsten beiden Tage.

Überschreitet das Ergebnis einen Grenzwert, ist also innerhalb der nächsten beiden Tagen mit nennenswertem Niederschlag zu rechnen, wird halt nicht beregnet.

Ich habe keine Ahnung, ob dieses Vorgehen meteorologisch korrekt ist und übernehme keine Verantwortung für vertrocknete Pflanzen. :wink:

<?
$trans = array(
    'Monday'    => 'Montag',
    'Tuesday'   => 'Dienstag',
    'Wednesday' => 'Mittwoch',
    'Thursday'  => 'Donnerstag',
    'Friday'    => 'Freitag',
    'Saturday'  => 'Samstag',
    'Sunday'    => 'Sonntag',
    'Mon'       => 'Mo',
    'Tue'       => 'Di',
    'Wed'       => 'Mi',
    'Thu'       => 'Do',
    'Fri'       => 'Fr',
    'Sat'       => 'Sa',
    'Sun'       => 'So',
    'January'   => 'Januar',
    'February'  => 'Februar',
    'March'     => 'März',
    'May'       => 'Mai',
    'June'      => 'Juni',
    'July'      => 'Juli',
    'October'   => 'Oktober',
    'December'  => 'Dezember'
);
$wochentag = strtr(date("l", time()), $trans);

$page = file_get_contents("http://www.donnerwetter.de/agrar/region.mv?PLZ=44534");

$posStart = strripos($page, "<table border=\"0\">");
$code = substr($page,$posStart);
$posEnd = strpos($code,"</table>");
$code = explode("
",strip_tags(substr($code,0,$posEnd+8)));

for ($i = 0;$i <= count($code)-1;$i++){
	if(trim($code[$i])<>""){
	   $data = $code[$i];
	   $array[]	= trim($data);
	}
}
$table="<table>";
for ($i = 0; $i <= count($array)-1; $i++){
	if(!($i % 5)){
		$table=$table."<tr><td align=\"left\" width=\"70\" >".$array[$i]."</td>";
	}
	elseif(!(($i-4) % 5)){
		$table=$table."<td align=\"center\" width=\"70\" >".$array[$i]."</td></tr>";
	}
	else{
		$table=$table."<td align=\"center\" width=\"70\" >".$array[$i]."</td>";
	}
}
$table = $table."</table>";

$RegenErwartung = $array[17]/100*($array[22]-$array[27])+$array[18]/100*($array[23]-$array[28]);
setvaluefloat(51176 /*[Scripte\RegenErwartung]*/  ,$RegenErwartung);

setvalue(10066 /*[Scripte\Agrarwetter]*/ ,$table);
?>

Gruß
Ralla

Kannst Du uns diesen Erfahrungswert mitteilen?

Interessanter Ansatz. Könnte aber an einer Stelle haken: Wenn Du bspw. 9mm Regenvorhersage hast, mit einer Wahrscheinlichkeit von 30%, dann heisst das eigentlich, dass es ziemlich wahrscheinlich nicht regnen wird und nicht, dass es wohl nur 3mm werden. (Bei 50% Wahrscheinlichkeit ist ein Ereignis genauso wahrscheinlich wie es nicht wahrscheinlich ist).

Man müsste vielleicht eher die unteren 50% wegkappen, und dann nur die oberen 50% betrachten.

Wenn mein Beispiel 9mm mit 70% hätte, dann könnte man sagen:

70%-50% = 20%
Diese 20% * 2 (Weil ich die unteren 50% weggekappt habe) = 40%
Und dann die 9mm mit 40% multiplizieren.

Somit hast Du den Faktor 0,4 in den oberen (wahrscheinlichen) 50%.

Macht das Sinn?

Ich habe das Skript mal nach meiner Theorie angepasst und kommentiert:


<?
$trans = array(
    'Monday'    => 'Montag',
    'Tuesday'   => 'Dienstag',
    'Wednesday' => 'Mittwoch',
    'Thursday'  => 'Donnerstag',
    'Friday'    => 'Freitag',
    'Saturday'  => 'Samstag',
    'Sunday'    => 'Sonntag',
    'Mon'       => 'Mo',
    'Tue'       => 'Di',
    'Wed'       => 'Mi',
    'Thu'       => 'Do',
    'Fri'       => 'Fr',
    'Sat'       => 'Sa',
    'Sun'       => 'So',
    'January'   => 'Januar',
    'February'  => 'Februar',
    'March'     => 'März',
    'May'       => 'Mai',
    'June'      => 'Juni',
    'July'      => 'Juli',
    'October'   => 'Oktober',
    'December'  => 'Dezember'
);
$wochentag = strtr(date("l", time()), $trans);

$page = file_get_contents("http://www.donnerwetter.de/agrar/region.mv?PLZ=63877");

$posStart = strripos($page, "<table border=\"0\">");
$code = substr($page,$posStart);
$posEnd = strpos($code,"</table>");
$code = explode("
",strip_tags(substr($code,0,$posEnd+8)));

for ($i = 0;$i <= count($code)-1;$i++){
    if(trim($code[$i])<>""){
       $data = $code[$i];
       $array[]    = trim($data);
    }
}
$table="<table>";
for ($i = 0; $i <= count($array)-1; $i++){
    if(!($i % 5)){
        $table=$table."<tr><td align=\"left\" width=\"70\" >".$array[$i]."</td>";
    }
    elseif(!(($i-4) % 5)){
        $table=$table."<td align=\"center\" width=\"70\" >".$array[$i]."</td></tr>";
    }
    else{
        $table=$table."<td align=\"center\" width=\"70\" >".$array[$i]."</td>";
    }
}
$table = $table."</table>";

// ab hier Regenwahrscheinlichkeit

$wahrscheinlichkeit_morgen = ($array[17]-50); // Wahrscheinlichkeit aus array in lesbare Variable und die unteren 50% wegkappen
$wahrscheinlichkeit_uebermorgen = $array[18]-50; // Wahrscheinlichkeit aus array in lesbare Variable und die unteren 50% wegkappen

	if ($wahrscheinlichkeit_morgen < 0) { //potentielle negative Wahrscheinlichkeit auf null setzen
   	$wahrscheinlichkeit_morgen = 0;
   }
  	if ($wahrscheinlichkeit_uebermorgen < 0) { //potentielle negative Wahrscheinlichkeit auf null setzen
   	$wahrscheinlichkeit_uebermorgen = 0;
   }

// Wahrscheinlichkeits-Multiplikator für die Menge bilden
$wahrscheinlichkeit_morgen = $wahrscheinlichkeit_morgen*2/100;
$wahrscheinlichkeit_uebermorgen = $wahrscheinlichkeit_uebermorgen*2/100;


//Verdunstung und Menge aus Array in lesbare Variablen
$verdunstung_morgen = $array [27];
$verdunstung_uebermorgen = $array [28];
$menge_morgen = $array[22];
$menge_uebermorgen = $array[23];


//Tatsächlich wahrscheinliche Mengen berechnen [Menge (in mm) mal dem berechneten Wahrscheinlichkeitsfaktor abzüglich der vorhergesagten Verdunstung]
$Regenerwartung_morgen = ($menge_morgen*$wahrscheinlichkeit_morgen)-$verdunstung_morgen;
$Regenerwartung_uebermorgen = ($menge_uebermorgen*$wahrscheinlichkeit_uebermorgen)-$verdunstung_uebermorgen;

// Wenn mehr verdunstet als es regnet
	if ($Regenerwartung_morgen < 0){
   	$Regenerwartung_morgen = 0;
   }

	if ($Regenerwartung_uebermorgen < 0){
   	$Regenerwartung_uebermorgen = 0;
   }


//Regenerwartung in mm im Schnitt über die nächsten 2 Tage
$RegenErwartung = ($Regenerwartung_morgen+$Regenerwartung_uebermorgen)/2;

//Einzelvariablen setzen
setvaluefloat(30653 /*[Scripte\RegenErwartung]*/  ,$Regenerwartung_morgen);
setvaluefloat(22602 /*[Scripte\RegenErwartung]*/  ,$Regenerwartung_uebermorgen);
setvaluefloat(25315 /*[Scripte\RegenErwartung]*/  ,$RegenErwartung);
setvalue(26089 /*[Scripte\Agrarwetter]*/ ,$table);

?>

In meine IPSWatering_Custom.inc.php habe ich jetzt noch direkt unter function IPSWatering_BeforeActivateWatering folgendes eingefügt:


$regenmenge = getvalue(25315);		
   if ($regenmenge > 2){
	return false;
   }

somit wird nur bei weniger als 2mm zu erwartender Regenmenge in den nächsten 2 Tagen beregnet.

@wupperi
Mein Ansatz kommt aus der Stochastik. Wonach sich der Erwartungswert einer Zufallsvariablen aus der Summe der Produkte der jeweiligen Variablenwerte und deren Wahrscheinlichkeit ergibt. Siehe auch diesen Artikel in der Wikipedia.

@ herbertf
Mein Grenzwert liegt derzeit bei 4,5 mm/m². Ich bin einfach davon ausgegangen, dass man Rasen einmal in der Woche mit 15 l/m² beregnen soll. In zwei Tagen entspricht das einer Wassermenge von 15/7*2=4,29 l/m². Wobei ich dann großzügig auf 4,5 aufgerundet habe.

Allgemein möchte ich darauf hinweisen, dass ich noch über keine Langzeiterfahrungen mit dieser Beregnungslogik verfüge.

Gruß
Ralla

@Ralla

Dann schauen wir mal, was empirisch da rauskommt :smiley:

Jetzt habe ich doch noch ein Skriptproblem.
In meiner custom_inc sieht die Funktion „AfterWatering“ jetzt so aus:


function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) {
		$netzteil_vorne = 41731;
		$netzteil_hinten = 34596;
		$CircleName = IPS_GetName($CycleId);
		if ($Value == 0){
			if ($CircleName == 'Circle_1' or $CircleName == "Circle_2" or $CircleName == "Circle_3") {
					IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos hinten für Bewässerung');
					IPSWatering_Log('Ausschalten der Ventiltrafos hinten für Bewässerung');
					FS20_SwitchMode($netzteil_hinten,false);
					}
			
			
			
			if ($CircleName == "Circle_4" or $CircleName == "Circle_5" or $CircleName == "Circle_6") {
					IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos vorne für Bewässerung');
					IPSWatering_Log('Ausschalten der Ventiltrafos vorne für Bewässerung');
					FS20_SwitchMode($netzteil_vorne,false);
					}
	  
	    }
			
	}

D.h.: bei Ausschalten (value=0) prüfen in welcher circle Gruppe (Vorgarten oder Backyard) das Ventil war und dann den entsprechenden Trafo ausschalten. So far, so good.

Problem ist jetzt aber, wenn ich gleichzeitig zwei Ventile im bspw. Vorgarten laufen habe und eines schliesst früher, dann wird der Trafo mit abgeschaltet, und das andere Ventil, was ja eigentlich noch offen sein sollte, schliesst wegen fehlender Spannung.

Da ich aber nur auf „$value“ prüfen kann, und nicht ob noch irgendein anderes Ventil laufen soll, bin ich jetzt in der Sackgasse, oder?

Es gibt immer einen Weg :slight_smile:

Statt

if ($CircleName == 'Circle_1' or $CircleName == "Circle_2" or $CircleName == "Circle_3") {

prüfe doch einfach, ob alle Ventile geschlossen sind …

Gruß

Burkhard

Hi,

Du musst vor dem Ausschalten überprüfen, ob einer der Bewässerungskreise noch aktiv ist!

Könnte ungefähr so aussehen:


    function IPSWatering_AfterActivateWatering($CycleId ,$Value, $Mode) {
        $netzteil_vorne  = 41731;
        $netzteil_hinten = 34596;
        $countTrafo1     = 0;
        $countTrafo2     = 0;
        foreach(IPS_GetChildrenIds(IPS_GetParent($CycleId)) as $CycleId) {
           $CircleName = IPS_GetName($CycleId);
           if (GetValue(get_ControlId(c_Control_Active, $CycleId))) {
              if ($CircleName == 'Circle_1' or $CircleName == "Circle_2" or $CircleName == "Circle_3") {
                $countTrafo1 = $countTrafo1 + 1;
              }
              if ($CircleName == "Circle_4" or $CircleName == "Circle_5" or $CircleName == "Circle_6") {
                $countTrafo2 = $countTrafo2 + 1;
              }
           }
        }
        if ($countTrafo1==0 and !$Value) {
           IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos hinten für Bewässerung');
           IPSWatering_Log('Ausschalten der Ventiltrafos hinten für Bewässerung');
           FS20_SwitchMode($netzteil_hinten,false);
        }
        if ($countTrafo2==0 and !$Value) {
           IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos vorne für Bewässerung');
           IPSWatering_Log('Ausschalten der Ventiltrafos vorne für Bewässerung');
           FS20_SwitchMode($netzteil_vorne,false);
        }

        return true; // Return false to prevent Watering
    }

Danke Andreas.
Der Trafo bleibt zwar jetzt an, wenn ich ein Ventil auf dem Trafo wegschalte, allerdings auch, wenn ich das letzte Ventil wegschalte, und da sollte der Trafo dann ja mit ausgehen.

Ich habe dann mal testweise nach der foreach Schleife ein


		IPSWatering_Log($value);
		IPSWatering_Log ($countTafo2);

eingefügt.

$counttrafo2 (2 weil ich an diesem Kreis teste) zeigt beim Einschalten des ersten Ventils „0“, beim Einschalten des 2. Ventils „1“ und dann beim Ausschalten des 2. Ventils eine „2“ und dann beim Ausschalten des 1. (und letzten) Ventils eine „1“.
Also eben nicht eine „0“ was zum Ausschalten führen würde.

ah, ok, der aktuelle Kreis hat ja noch immer den Status „On“
–> Abfrage ändern auf Check 1


        if ($countTrafo1==1 and !$Value) {
           IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos hinten für Bewässerung');
           IPSWatering_Log('Ausschalten der Ventiltrafos hinten für Bewässerung');
           FS20_SwitchMode($netzteil_hinten,false);
        }
        if ($countTrafo2==1 and !$Value) {
           IPSLogger_Inf(__file__, 'Ausschalten der Ventiltrafos vorne für Bewässerung');
           IPSWatering_Log('Ausschalten der Ventiltrafos vorne für Bewässerung');
           FS20_SwitchMode($netzteil_vorne,false);
        }