Problem: es soll verhindert werden, dass ein Skript innerhalb eines Zeitraumes erneut ausgeführt wird Anwendung: wiederholtes triggern z.B. durch einen Bewegungsmelder Lösung: „IPS_SemaphoreEnter“ - leider nein, da dies nur ein erneutes Starten verhindert, bevor das Skript beendet wurde.
Man muss also nur den Zeitpunkt der letzten Ausführung kennen: IPS_GetScript - IP-Symcon :: Automatisierungssoftware
und ihn mit der gewünschten „Totzeit“ vergleichen (hier 60 Sekunden).
// ID von diesem Skript ermitteln
$event = IPS_GetObject($IPS_SELF);
$id = $event['ObjectID'];
echo "Skript-ID: $id
";
$data = IPS_GetScript($id);
// Unix Timestamp des letzten Aufrufs
// siehe auch:http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/skriptverwaltung/ips-getscript/
$last_up = $data[LastExecute];
echo "Letzte Ausführung Unix: $last_up
";
// zur Kontrolle
// siehe auch: http://de.php.net/manual/de/function.date.php
echo "Letzte Ausführung (His): ".date("H:i:s", $last_up)."
";
$deltaT = time() - $last_up;
echo "Letzte Ausführung in sec. : $deltaT
";
if ($deltaT > 60){
// hier folgt ein tolles Skript
// das nur alle 60 Sekunden ausgeführt werden darf
}
dises Skript tut das selbe, benutzt aber einen anderen Ansatz.
define ("SPERRZEIT", 60); // Wartezeit (Sekunden) in der das Skript nicht abgearbeitet werden darf
switch ($IPS_SENDER)
{
case "Variable": // Trigger durch Variable
if (IPS_GetScriptTimer($IPS_SELF) == 0)
{ // Timer läuft nicht, Skript darf ausgeführt werden
IPS_SetScriptTimer($IPS_SELF, SPERRZEIT); // Timer aufziehen und
// weitere Anweisungen // Skript ausführen
}
else // Sperrzeit läuft bereits, daher
return; // Abarbeitung abbrechen
break;
case "TimerEvent": // Trigger durch Timer
IPS_SetScriptTimer($IPS_SELF, 0); // Timer wieder löschen
break;
}
Also irgendwie bekomm ich das nicht hin.
Wo ist hier der Fehler? Muss ich da noch wo eine ID eintragen?
LastExecute habe ich auf ScriptExecuted geändert.
[i]Notice: Undefined variable: IPS_SELF in /var/lib/symcon/scripts/38248.ips.php on line 4
Skript-ID: 0
Warning: Skript #0 exisitert nicht in /var/lib/symcon/scripts/38248.ips.php on line 8
Notice: Use of undefined constant ScriptExecuted - assumed ‚ScriptExecuted‘ in /var/lib/symcon/scripts/38248.ips.php on line 11
Letzte Ausführung Unix:
Letzte Ausführung (His): 01:00:00
Letzte Ausführung in sec. : 1496085229[/i]
Hallo,
was willst du denn genau machen? Also $IPS_SELF würde durch $_IPS[‚SELF‘] ersetzt. $last_up = $data[ScriptExecuted]; sollte $last_up = $data[‚ScriptExecuted‘]; sein
Genau das waren die zwei Fehler! Jetzt funktionert genau das, was ich gebraucht hab:
Der Eaton-Aktor zum Öffnen der Jalousie darf nur nach Ablauf der Zeit wieder ausgeführt werden.
Hallo,
ich benutze IPS5.0 auf einem Razberry.
Habe das Script ergänzt so das es nur alle xx Sekunden ausgeführt werden darf. Erhalte da folgende Fehlermeldung:
Guten morgen,
habe gelesen das Lastexecute ab der Version 4.0 durch Scriptexecuted ersetzt wird. gesagt getan… aber das Script wird trotzdem sofort wieder ausgeführt, obwohl ich doch bei DeltaT 80 Sekunden eingetragen habe… Die Fehlermeldung ist nun weg… aber warum wird das Script trotzdem gleich wieder ausgeführt?
<?
// ID von diesem Skript ermitteln
$event = IPS_GetObject($_IPS['SELF']);
$id = $event['ObjectID'];
echo "Skript-ID: $id
";
$data = IPS_GetScript($id);
// Unix Timestamp des letzten Aufrufs
// siehe auch:IPS_GetScript — IP-Symcon :: Automatisierungssoftware
$last_up = $data['ScriptExecuted'];
echo "Letzte Ausführung Unix: $last_up
";
// zur Kontrolle
// siehe auch: PHP: date - Manual
echo "Letzte Ausführung (His): ".date("H:i:s", $last_up)."
";
$deltaT = time() - $last_up;
echo "Letzte Ausführung in sec. : $deltaT
";
if ($deltaT > 80){
// hier folgt ein tolles Skript
// das nur alle 60 Sekunden ausgeführt werden darf
}
ZW_SwitchMode(39941 /*[Erdgeschoss\Beleuchtung\Beleuchtung Strauch]*/, true);
?>
Eine Frage habe ich allerdings noch! Wie kann ich mir jetzt z.b. bei erneutem Sufruf des Scripts anzeigen lassen wie lange es noch dauert oder wieviel Zeit des Timers schon verstrichen ist?
EDIT: Glaub ich hatte da einen Denkfehler…Wird ja angezeigt wenn ich das Script Ausführe:banghead: