IPS_SetEventCyclic fehlerhaft ?!

Hallo,

ich stehe wieder mal so richtig am Schlauch oder es ist ein BUG:

Ich möchte einen bestehenden TimerEvent verändern. Der Timer wird nicht gestoppt, sondern es soll einfach ein neuer Zykluswert eingetragen werden. Dadurch sollte der Timer hoffentlich auch neu aufgezogen werden?! Realisiert habe ich es mit IPS_SetEventCyclic. Nur es funkt nicht :mad:.

Egal was ich mache, der Timer verhält sich sehr merkwürdig. Kann es sein, dass ein laufender Timer nicht astrein neu gesetzt werden kann?

Hier ein kleines Testskript, welches einfach nur bei jedem Timeraufruf den Timerwert um 10s verlängert und die aktuellen Timerwerte ins Log schreibt.

<?
	$timer_id = 15193 /*[Test1\Unbenanntes Objekt (ID: 15193)]*/;

	//Timerevent?
	if ($IPS_SENDER == "TimerEvent")
	{

	   IPS_Logmessage("Test","Timer abgelaufen");

		//aktuelle Parameter holen
		$info = IPS_GetEvent($timer_id);
		//Zykluszeit auswerten
		$zyklus = $info["CyclicTimeValue"];
		//Zykluszeit um 10s erhöhen
		$zyklus += 10 ;
		//Timer neu laden
	   if (!IPS_SetEventCyclic($timer_id,0,0,0,0,1,$zyklus)) IPS_LogMessage("Test","Fehler Timer Set");

		//aktuelle Parameter holen
		$info = IPS_GetEvent($timer_id);
		$delta_last_next = (INT) $info["NextRun"]-$info["LastRun"];
		$delta_now_next = (INT) $info["NextRun"]- time();
		IPS_LogMessage("Test","Geschriebener Wert:".$zyklus."     Gesetzer Wert:".$info["CyclicTimeValue"]."         Letzte Ausführung: ".date("H:i:s",$info["LastRun"])."      ->      Nächste Ausführung: ".date("H:i:s",$info["NextRun"])." -> in ". $delta_now_next."s");

	}
?>

und anbei die zugehörige Ausgabe im Log.

Was mache ich falsch? Oder kann man einen laufenden Timer nicht neu aufziehen und setzen?

Timer aktiv setzen.

Verstehe ich nicht - was meinst du damit? Der Timer ist ja schon aktiv. Soll ich ihn nochmal aktiv setzen nachdem ich den neuen Wert geschrieben habe?

[edit] Habe den Timer nach dem neuen Setzen mit IPS_SetEventActive… neu gesetzt. Leider keine Änderung!

Danke das Du hier nachfragst. Ich habe auch gerade ein Script geschrieben mit Timer und setze auch die Zeiten jeweils neu und ich finde der Timer verhält sich genauso wie bei dir. Ich will bei einem Licht Türgetriggert einfach nur eine Minute nachleuchten. Mal geht das Licht aber schon nach 10 Sek aus, als ob der Timer nicht neu gesetzt wird.

Hab aber eher gedacht ich bin zu blö… :wink:

Habe gerade festgestellt, dass wenn ich mit IPS_SetScriptTimer() arbeite, funktioniert es. Mit IPS_SetEventCyclic macht es Probleme. Nur mit IPS_SetScriptTimer() kann ich halt nur auf einen Event/Skript zugreifen! Hoffe, paresy oder ein anderer „Guru“ hat eine Idee dazu was da faul ist!

So, habe das jetzt eingehend untersucht:

IPS_SetScriptTimer()

[ul]
[li]setzt den neuen Wert
[/li][li]zieht den Timer sofort auch auf diesen Wert auf
[/li][/ul]

IPS_SetEventCyclic()

[ul]
[li]setzt auch den neuen Wert
[/li][li]Aber der aktuelle Timerstand wird auf einen nicht nachvollziehbaren Wert gesetzt.
[/li][li]Läuft der Timer dann ab, wird er aber mit dem richtigen Wert neu aufgezogen.
[/li][li]Ist der alte Wert gleich dem neu gesetzten, wird die Aktion scheinbar intern verworfen.
[/li][/ul]

–> Es ist scheinbar nicht möglich, mit IPS_SetEventCyclic() den Timer neu aufzuziehen.
–> Leider kann bei Skripten mit mehr als einem Timer nicht mit IPS_SetScriptTimer() ein Workaround realisiert werden.

Ein Deaktivieren / Aktivieren mit IPS_SetEventActive() brachte auch keinen Erfolg.

@paresy: Kannst du bitte kurz mal schreiben, ob ich das so richtig wiedergegeben habe und ob das so gewünscht ist oder ein Fehler vorliegt.

Gruß
Rubberduck

Der Scripttimer hat doch auch eine ID und einen Namen kann man ihm auch geben, andere Scripts kann er auch starten.

Hat jetzt aber mit deinem Problem nichts zutun.

@Rainer:

Ja, schon. Ich liebe auch den Scripttimer! Aber wenn ich IPS_SetScriptTimer() verwende, kann ich nicht angeben, welchen Timer er nehmen soll. Ich habe einige Scripte mit mehr als einem Timer darunter.

Vielleicht verstehe ich dich jetzt nicht ganz. Über den Namen und die ID kannst Du doch den Timer zuordnen welcher eine Zeit ändern soll.

Ich habe 1 Script und darunter 2 Timer. Baim Aufruf von IPS_SetScriptTimer() gebe ich ja die ID des Scriptes an und nicht die des Timer! Wie spreche ich dann meinen zweiten Timer an (wenn der erste der Scripttimer ist).

2011-01-08_232024.png

$events = IPS_GetScriptEventList($IPS_SELF);
print_r($events);

$EreignisID = $events[1];
$EreignisInfo = IPS_GetEvent($EreignisID);
print_r($EreignisInfo);

Ist alles klar. Mir ist auch klar, wie ich die einzelnen Timer anspreche, aber:

Nur der IPS_SetScriptTimer() Befehl zieht den Timer neu auf und bei diesem Befehl kann ich keine Timer-ID sondern nur die Script-ID angeben!

Wie soll ich diesen Code mit IPS_SetScriptTimer() machen:

	$timer1_id = 12345;
	$timer2_id = 67890;

	IPS_SetEventCyclic($timer1_id,0,0,0,0,1,123);
	IPS_SetEventCyclic($timer2_id,0,0,0,0,1,456);

IPS_SetEventCyclic($EreignisInfo['EventID'], 2, 1, 0, 0, 3, 6);

Rainer, ich denke wir schreiben aneinander vorbei! Ich kann den Befehl IPS_SetEventCyclic(…) nicht verwenden, weil er (meiner bescheidenen Meinung nach) nicht richtig funktioniert!

Also, ich hab das jetzt mal probiert, bei mir funktioniert es. Ich kann die Zeit ändern wie ich will, es wird übernommen und auch ausgeführt.

Hier noch mal der Code, probier es doch mal aus.

$events = IPS_GetScriptEventList($IPS_SELF);
print_r($events);

$EreignisID = $events[1];
$EreignisInfo = IPS_GetEvent($EreignisID);
print_r($EreignisInfo);
IPS_SetEventCyclic($EreignisInfo['EventID'], 0,0,0,0,1,9);

Wird auch ein bereits gestarteter,laufender Timer auf den neuen Wert hochgezogen. Ich meine nicht erst beim nächsten Event, sondern er beginnt sofort vom neuen Wert herunterzuzählen?

Beispiel:
13
12
11
10
9 --> Timer wird neu gesetzt auf 50
50
49
48

Bei mir sieht es so aus:
13
12
11
10
9 --> Timer wird neu gesetzt auf 50
31
30
29

Habe ich ausprobiert. Ja, es wird auch übernommen. Und auch schön bei den Scriptereignissen der neue Wert angezeigt. Aber der neue Wert wird trotzdem erst nach Ablauf der aktuellen Periode als neuer Sollwert übernommen. Sieh dir mal $EreignisInfo[‚NextRun‘] an.

Ich habe dein Script um 3 Zeilen erweitert. Dort siehst du bei der Ausgabe dann, in wie viel Sekunden das Script das nächste mal gestartet wird. Sollte iegentlich immer der oben geschriebene Wert sein. Ist es aber nicht.



		$events = IPS_GetScriptEventList($IPS_SELF);
		print_r($events);

		$EreignisID = $events[1];
		$EreignisInfo = IPS_GetEvent($EreignisID);
		print_r($EreignisInfo);
		IPS_SetEventCyclic($EreignisInfo['EventID'], 0,0,0,0,1,30);

		$EreignisInfo = IPS_GetEvent($EreignisID);
		$Ereignis_in_sec = $EreignisInfo['NextRun'] - time();
		print_r((int) $Ereignis_in_sec);


ich lese und bastel hier mal mit, habe aber auch keine lösung.
kann rubberduck nur zustimmen, das timer neu aufziehen mit IPS_SetEventCyclic funktioniert nicht.

habe dazu auch probiert den timer vorher zu deaktivieren, aktivieren usw. es kommen einfach irgendwelche zeiten bei mir raus. es sieht so aus als ob der timer ablaufen muss nur dann hat man nochmal seine zeit.

Ja, ihr habt Recht, das Eieruhr Prinzip funktioniert nicht.

Puhhh - zumindest weiß ich jetzt, dass ich nicht zu blöd bin:) Soll ich das jetzt zusammenfassen und als Fehlermeldung einbringen oder reicht dieser Thread aus?