Ablaufsteuerung Timer usw.. Frage

Hallo zusammen,

ich hab mal wieder ein Problem das ich nicht verstehe bzw. nicht so richtig weiss, wie der richtige Weg ist das umzusetzen.

Aufgabenstellung:
Ein Script wird von einer Variable getriggert. (Ereignis bei Variablenänderung)
Das Script sollte dann folgenden Ablauf haben:

  1. Loop -> 60 Sekunden lang ein Licht Blinken lassen (Licht für 1 Sek ein und dann wieder aus für 1 Sekunde)
    2.) Loop2 -> 60 Sekunden lang eine Sirene aus und einschalten (Ton für 1 Sek ein und dann wieder aus für 1 Sekunde)
  2. Loop3 -> 60 Sekunden lang Licht und Ton einschalten
  3. Nach den letzten 60 Sekunden alles wieder ausschalten

Ich habe das ganze mit mehreren Ereignis Timer versucht zu lösen, was mehr oder wenig gut funktioniert.
Bis ich dann in das Problem gelaufen bin, das das Script mehrfach läuft und die Schaltaktionen sich gegenseitig blockieren. Hat jemand eine bessere Idee sowas umzusetzen?

Mein Script etwas ausgemistet (zum besseren Verständnis):


<?
if ($_IPS['SENDER'] == 'Variable' and and IPS_GetObject($_IPS['VARIABLE'])['ObjectIsDisabled'] != 1)
	{
		IPS_SetEventActive($IntervallTimer1, true);
		IPS_SetEventActive($VerzoegerungsTimer1, true);
	}
if($_IPS['SENDER'] == "TimerEvent" and GetValue($Anlage) == true)
{
	if($_IPS['EVENT'] == $IntervallTimer1)
		{
			ZW_SwitchMode(10882 ,true);
			IPS_Sleep(1000);
			ZW_SwitchMode(10882 ,false);
		}
	elseif ($_IPS['EVENT'] == $IntervallTimer2)
		{ 
			ZW_SwitchMode(10882 ,true);
			IPS_Sleep(1000);
			ZW_SwitchMode(10882 ,false);
		}
	elseif ($_IPS['EVENT'] == $VerzoegerungsTimer1)
		{ 
			IPS_SetEventActive($VerzoegerungsTimer1, false);
			IPS_SetEventActive($IntervallTimer1, false); 				
			//Starte VerzögerungsTimer 2
			IPS_SetEventActive($VerzoegerungsTimer2, true); 
			//Starte IntervallTimer 2
			IPS_SetEventActive($IntervallTimer2, true);
		}
	elseif ($_IPS['EVENT'] == $VerzoegerungsTimer2)
		{ 
			IPS_SetEventActive($VerzoegerungsTimer2, false);
			IPS_SetEventActive($IntervallTimer2, false); 							
			IPS_SetEventActive($AlarmTimer, true); 
			ZW_SwitchMode(10882,true);
		}		
	elseif ($_IPS['EVENT'] == $AlarmTimer)
		{ 
			IPS_SetEventActive($AlarmTimer, false); 
			SetValueBoolean(55035,false);
			ZW_SwitchMode(10882,false);
			IPS_SETSCRIPTTIMER($_IPS['SELF'],GetValue(52014));
		}							
}
?>


Mein Vorschlag: nimm nur einen Timer, der alle zwei Sekunden das Skript startet. In dem Skript zählst du die Aufrufe in einer Variablen mit. Bei den ersten dreißig Aufrufen schaltest du das Licht ein und aus, bei den nächsten dreißig Aufrufen schaltest du Szenario 2, usw. Nach 90 Aufrufen schaltest du den Timer wieder aus und setzt den Zähler wieder auf 0.
Das sollte übersichtlich bleiben.

Viel Erfolg

Burkhard

So in etwa hätte ich mir das auch schon überlegt. Fand das aber etwas zu primitiv. Gibt’s es im IPS keinen einfachen und dennoch vernünftigen Ansatz mehrere Zeitabläufe hintereinander auszuführen?

Gesendet von meinem VTR-L09 mit Tapatalk

… Computer arbeiten nun einmal, indem sie zählen, vergleichen und verzweigen. Wenn du eine Funktion erwartest, die dir abnimmt, das selbst zu programmieren, wird diese es dennoch nur so machen. Dann mach’ es lieber selbst … und sieht zu, dass bei deiner Alarmanlage 4) doppelt gemoppelt ausgeführt wird, damit die Nachbarn während deines Urlaubs nicht die Polizei rufen :wink:

Würde ich anders lösen. Eine Hilfsvariable als Zähler definieren, dann:

im Skript immer den Zähler abfragen, wenn 0, dann
Auslösung: Blinken, etc.(mach ne Schleife dafür!), Script-Timer auf 60 Sek., Zähler auf 1
wenn Zähler = 1
Sirene etc., Script-Timer wieder auf 60, Zähler auf 2
wenn Zähler = 2
LIcht, Ton, etc., Script-Timer wieder auf 60, Zähler auf 3
wenn Zähler = 3
Alles ausschalten. Script-Timer auf 0, Zähler auf 0. Fertig.

Gruß
Walter

Guckst Du:

<?
$zaehler=GetValue(56918);

switch ($zaehler)
{
	case 0:
		/* Hier Aktionen für den ersten Aufruf */
		IPS_SetScriptTimer($_IPS['SELF'],60);
		SetValue(56918,1);
	break;

	case 1:
		/* Hier Aktionen für den zweiten Aufruf */
		IPS_SetScriptTimer($_IPS['SELF'],60);
		SetValue(56918,2);
	break;
	
	case 2:
		/* Hier Aktionen für den dritten Aufruf */
		IPS_SetScriptTimer($_IPS['SELF'],60);
		SetValue(56918,3);
	break;

	case 3:
		/* Hier Aktionen für den letzten Aufruf */
		IPS_SetScriptTimer($_IPS['SELF'],0);
		SetValue(56918,0);
	break;
}


?>

Hier noch was zum „Blinken lassen“. Das kann, ja nach Systemauslastung ungleichmäßig werden:

$anz=10; //Anzahl Wiederholungen 
for ($count=1; $count <=$anz; $count++)
						{
					   	
							HM_WriteValueBoolean(36993 /*[Licht & Steckdosen\Außenbereich\Lampe Garten]*/, "STATE", TRUE);
						  	IPS_SLEEP(800);
						  	HM_WriteValueBoolean(36993 /*[Licht & Steckdosen\Außenbereich\Lampe Garten]*/, "STATE", FALSE);
						}