Timer- Problem

hallo,

ich habe folgendes Script erstellt. Leider macht es nicht ganz was ich will. :frowning:

<?

 if($IPS_SENDER == "TimerEvent")
 { 
	if (GetValueBoolean(39757) /*[Garten\Bewässerung\Status_Terasse]*/ == true){
     // IPS_SetScriptTimer($IPS_SELF, 30);
   
	IPS_RunScriptWait(44625  /*[Bewässerungssteuerung_1\Ventil1-2_Pumpe_Ein]*/);
   
 	}

  if (GetValueBoolean(41771) /*[Garten\Bewässerung\Status_Apfelbäume]*/== true){
    //IPS_SetScriptTimer($IPS_SELF, 20);
  
      IPS_RunScriptWait(43348  /*[Bewässerungssteuerung_1\Ventil1-3_Pumpe_Ein]*/);
	}

	if (GetValueBoolean(45163) /*[Garten\Bewässerung\Status_Rasen1]*/ == true){
      IPS_SetScriptTimer($IPS_SELF, 0);
	
      IPS_RunScriptWait(16920  /*[Bewässerungssteuerung_1\Pumpe_VentileX_X_Aus]*/);

	}

 } else {
  
 	IPS_RunScriptWait(39854  /*[Bewässerungssteuerung_1\Ventil1-1_Pumpe_Ein]*/);
   IPS_SetScriptTimer($IPS_SELF, 20);
 }
?>

Folgende Funktion soll erreicht werden, wie ich sie mir wünsche:
Es sollen vier Scripte jeweils nach Ablauf des Times aufgerufen und abgearbeitet werden.
Das passiert auch, das zweite Script wird nach 20 sec aufgerufen.
Das dritte und vierte Script werden hintereinander abgearbeitet ohne das der Timer zwischendurch läuft.

Was ist hier faul?

Gruß

Wolfi

Übersteigt das Skript vielleicht die maximale Ausführungszeit die in der php.ini angegeben ist? Nur so eine Vermutung… Eigentlich müsste das Ergenis dann anderst aussehen aber wer weis… :smiley:

Vielleicht mal ohne …Wait und statdessen mit RunScript und IPS_Sleep realisieren? Vielleicht hilft das oder grenzt das ganze etwas ein…

Grüße Alex

Grundsätzlich ist der ganze Scriptaufbau etwas seltsam oder unverständlich.
Außerdem kann ich Dir so auch nicht recht helfen, da ich die Scriptlaufzeiten der anderen Scripte nicht kenne. Bitte beschreibe mal etwas besser was Du möchtest.

Hallo Wolfi,

ich versuche das mal aufzudröseln. Es sieht so aus, als wolltest Du der Reihe nach was bewässern ? So wie Du schreibst, willst du wohl vier Scripte nacheinander mit unterschiedlicher Verzögerung und Laufzeit durch ein Script gesteuert laufen lassen ?

Ich habe mal versucht, Dein „Haupt“-Script zu analysieren:

Wenn Du das Script mit der Hand oder per IPS_RunScript aus einem anderen Script heraus aufrufst, wird das Script "Ventil1-1_Pumpe_Ein aufgerufen und Dein TimerScript 20 Sekunden später erneut gestartet - soweit so gut

20 Sekunden später:

($IPS_SENDER == „TimerEvent“) ist True und Dein Script arbeitet die 3 folgenden If-Bedingungen GLEICHZEITIG ab:

Falls die Variable „STATUS_TERASSE“ true ist, wir das Script Ventil1-2_Pumpe_Ein sofort gestartet.
(Hast Du mit „//“ vor dem "IPS_SetScriptTimer($IPS_SELF, 30) absichtlich die Ausführung der Programmzeile in PHP unterbunden ?)

Falls die Variable „Status_Apfelbäume“ true ist, wir das Script „Ventil1-3_Pumpe_Ein“ sofort gestartet.
(Hast Du mit „//“ vor dem "IPS_SetScriptTimer($IPS_SELF, 30) absichtlich die Ausführung der Programmzeile in PHP unterbunden ?)

Falls die Variable „Status_Rasen1“ true ist, wir das Script „Pumpe_VentileX_X_Aus“ sofort gestartet UND Gleichzeitig der Timer mit
„IPS_SetScriptTimer($IPS_SELF, 0);“ auf 0 gesetzt, spricht neimals wieder aufgerufen.

Der Programmabruf hängt wesentlich davon ab, wie Du die Variablen in den aufgerufenen anderen Scripts änderst !

Gruß Rolf

Hallo Rolf,
ja genau so ist es. --In der Theorie–
die Auskommentierung ist Absicht gewesen. Das bedeutet meiner Meinung nach das immer 20s zw. den Scripts sind.

Hat es vielleicht etwas mit meiner IPS-Version zu tun?
Ich arbeite mit V2.1

Gruß
Wolfi

nicht dein Script, aber eins das funktionieren müsste (habs nicht laufen lassen)

<?
if($IPS_SENDER == "TimerEvent") {
$Variable = IPS_GetVariableIDByName("TimerCounter",0);
 $Counter = GetValueInteger($Variable);
 switch ($Counter) {
 case 1:
   	echo 1;

 IPS_SetScriptTimer($IPS_SELF, 2);
 $Counter++;
 SetValueInteger($Variable, $Counter);
 	 	break;
 case 2:
      echo 2;

 IPS_SetScriptTimer($IPS_SELF, 2);
 $Counter++;

 SetValueInteger($Variable, $Counter);
      break;
case 3:
		echo 3;

 IPS_SetScriptTimer($IPS_SELF, 2);
 $Counter++;
 SetValueInteger($Variable, $Counter);
 		break;
case 4:
		echo 4;

 IPS_SetScriptTimer($IPS_SELF, 2);
 $Counter++;
 SetValueInteger($Variable, $Counter);
 		break;
default:
		echo "Ende";
		IPS_DeleteVariable($Variable);
		 IPS_SetScriptTimer($IPS_SELF, 0);

}
}
else
{
 $NeueVariable = IPS_CreateVariable(1);
SetValueInteger($NeueVariable, 1);
IPS_SetName($NeueVariable, "TimerCounter");
 IPS_SetScriptTimer($IPS_SELF, 20);
}

?>

tausche die echo 1 bis echo 4-Einträge gegen die RunScript-Einträge aus, die jeweils in der Reihenfolge passieren sollen (das Wait kannst du dir sparen)

Das bedeutet meiner Meinung nach das immer 20s zw. den Scripts sind.

Nö, da IPS_RunScriptWait die Laufzeit ändern kann.
Auch wenn andere für dich raten, sehe ich immer noch nicht ganz die Logik in der Sache.

Hallo Thomas,

die Laufzeit der einzelnen Scripts ist jeweils zwischen 25 und 35ms angezeigt.
Ja, natürlich ändert sich dann der Abstand zwischen den einzelnenScripten.

Ich kann ehrlich gesagt nichtunlogischen an der Sache sehen, gebe aber zu , daß ein erfahrener Programmierer die Sache sicher anders löst.
Nochmal-- es werden vier Scripts nacheinander mit 20s Abstand ausgelöst.

Rolf hat es genau richtig beschrieben.

Lass doch einfach mal eine Lösung gucken.

Gruß

Wolfi

Hallo,

@ all

Danke für eure Hinweise und Hilfe.
Ich habe jetzt IPS_RunScriptWait gegen IPS_RunScript getauscht und schon funktionierts.
Warum kann ich mir allerdings noch nicht erklären, aber vielleicht finde ich es noch raus.

@Hagbard

ja so sieht alles etwas eleganter aus, aber ich habe es aber noch nicht hinbekommen, muß noch einwenig darüber nachdenken.

Gruß

Wolfi

Hagbard235´s Ansatz war schon ganz gut, so sollte es laufen:

  1. Integer Variable anlegen hier XXXXX.
  2. Script ausführen

if($IPS_SENDER != "TimerEvent")
{
  IPS_RunScript(39854);
  SetValueInteger(XXXXX, 1);
  IPS_SetScriptTimer($IPS_SELF, 20);
}

if($IPS_SENDER == "TimerEvent")
{
	$Ansprungpunkt = GetValueInteger(XXXXX);

	switch($Ansprungpunkt)
	{
 	   case 1:
    	if(GetValueBoolean(39757)) IPS_RunScript(44625);
    	SetValueInteger(XXXXX, 2);
		break;
		
        case 2:
	    if(GetValueBoolean(41771)) IPS_RunScript(43348);
    	SetValueInteger(XXXXX, 3);
		break;
		
		case 3:
	    if(GetValueBoolean(45163)) IPS_RunScript(16920);
		IPS_SetScriptTimer($IPS_SELF, 0);
		break;
    }
}

… da bin ich ja ein bissl „eitel“… , funktioniert tut mein Script (hab es wegen deinem Kommentar extra nochmal laufen lassen), aber zugegeben ist deins ein wenig hübscher, weil Counter-Erhöhung nicht notwendig und fester Wert setzen ein paar Zeilen spart :wink:

So wars auch nicht gemeint.:slight_smile:
Ich wollte es für wolfi56 nur Nörgelfest machen.:smiley: