Laufzeit / Dauer / Timer

Hallo zusammen,

ich würde gerne einen Timer programmieren, welcher mir die Zeit bzw. Dauer angibt, wie lang z.B. eine Variable auf „true“ gesetzt ist. Bei „false“ soll der Timer dann Stoppen.

Wollte es mit einem while Befehl versuchen aber da komme ich nach 30 Sekunden zu einem Fehler: (wobei mir gerade auffällt, dass ich in der Bedingung noch einmal den Status der Variable abrufen müsste. Ändert aber nichts daran das diese Idee nicht funktioniert)

<?
$status=GetValue(44071);
$dauer=0;
while ($status == 1)
{
sleep (1);
$dauer=$dauer + 1;
SetValue(28401,$dauer);
}
?>

Habt ihr evtl. eine elegante Lösung bzw. Idee, wie ich die genaue Dauer ermitteln kann und in anderen Skripten weiter verwenden könnte?

LG
Snook

Was willst du denn genau machen, bin mir nicht ganz sicher was du suchst.

IPS_GetVariable — IP-Symcon :: Automatisierungssoftware


IPS_GetVariable($varId)['VariableChanged'];

Evenutell im Zusammenhang mit einem Skript welches ein Ereignis Variablenänderung der Variable hat.

Gruß Basti

Hi Basti,

erstmal Danke für deine Antwort. Ich suche eine Möglichkeit einen Timer zu erstellen der hochzählt.

z.B.: Wenn ich eine Boole-Variable auf true setzte soll irgendwie gezählt werden wie lange diese auf true gewesen ist. So dass ich u.a. die Nutzungsdauer von bestimmten Sachen erhalten kann.

Lieben Gruß
Snook

Und wo soll die Zeit gespeichert werden? In einer Hilfsvariable?

Die Zeit wielange eine Variable true ist kannste z.B. so herausfinden.


if ($varId === true) {
   $trueSince = time() - IPS_GetVariable($varId)['VariableChanged'];
}

//EDIT Und wie genau soll das sein? Ansonsten einfach mit nem Skripttimer lösen, das Skript ruft sich solange selber auf bis die Variable false ist. Gibt da viele Möglichkeiten…

Du brauchst nur mit „IPS_GetVariable“ schauen, wann jeweils die Variable zuletzt geändert wurde. Dann diesen Unix-Timestamp von „time()“ abziehen und du hast die Differenz. Das kannst du dann direkt verarbeiten oder in einer Hilfsvariable zwischenspeichern und weiter addieren…

Hier gibt’s es viele Skript-Beispiele, da kannst du dir alles mögliche zusammen suchen. Auch die Geschichte mit „time()“.
IP-Symcon - Wie kann ich… 2.0

Grüße,
Chris

Danke euch beiden. Auf die Idee mit Unix-Time wäre ich nicht gekommen. Habe es ausprobiert und soweit funktioniert es auch. Nur leider bekomme ich den Wert nicht gespeichert wie ich es gerne hätte. Mein Versuch:


<?

	if (GetValue(44071) == true)
	{
	$trueSince =GetValue (28401) + time() - IPS_GetVariable(44071)['VariableChanged'];
	echo "$trueSince
";
	SetValue (28401,$trueSince - GetValue(28401));
	}
?>

Das Skript wird im Moment jedes Sekunde zyklisch ausgeführt. Das muss ich noch ändern das der Zyklus nur dann stattfindet wenn der Boolwert auf true ist.
Aber was ich nicht hin bekomme ist, dass wenn der Zustand von der Bool Variablen (44071) von fals auf true geht die Variable (28401) wieder auf Null gesetzt wird. Ich möchte natürlich das der Wert sich immer weiter aufaddiert. Was genau setzt meine Zeit beim erneuten Auslösen auf 0? Und wie könnte ich das verhindern?

Lieben Gruß
Snook

PS: Aus Neugier, was ist der unterschied zwischen IF ($1 == 1) und IF ($1 === 1)?

//Edit: habe den Fehler gefunden… Ich ziehe im letzten Schritt ja wieder den gesamten Wert ab und somit beginnt es natürlich von neu an zu Zählen. Aber eine Lösung habe ich leider für das Problem nicht. Wenn ich es nicht abziehe wird nicht mehr in Sekunden rauf gezählt, sondern gesprungen da er immer die Unix Differens auf den aktuellen Wert addiert.

Kannst du das nicht über ein Trigger-Event lösen? Wenn nicht, dann direkt als 1. im Skript fragen:

if (GetValue($Var) === false)
{
    return;  // Beendet das Skript leise und schmerzlos
}
.............

== und === … wozu Google fragen, wenn es im Forum länger dauert :smiley: :stuck_out_tongue:

== >> Prüft z.B., ob 1 = 1 ist
=== >> Prüft z.B., ob 1 = 1 ist und auch der „Typ“ identisch ist (also beide Integer und nicht eins Bool oder sonstiges)

Grüße,
Chris