Skript-Ausführung

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

}

MST

Hallo,

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;
}

Gruß
HJH

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.


<?

$event = IPS_GetObject($IPS_SELF);
$id = $event['ObjectID'];  
echo "Skript-ID: $id
";

$data = IPS_GetScript($id);

$last_up = $data[ScriptExecuted];   
echo "Letzte Ausführung Unix: $last_up
";
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){

MXC_SwitchMode(52358 /*[Lichter\Deckenlicht Küche ]*/, true);

} 

?>

[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

Gesendet von meinem SM-T715 mit Tapatalk

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.

Danke dir!!

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:

Was ist hier Falsch.
Das Script sieht wie folgt aus:

<?
// 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](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: [PHP: date - Manual](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 > 80){ 

    // hier folgt ein tolles Skript 
    // das nur alle 60 Sekunden ausgeführt werden darf 

} 
ZW_SwitchMode(39941 /*[Erdgeschoss\Beleuchtung\Beleuchtung Strauch]*/, true);
ZW_SwitchMode(27834 /*[Erdgeschoss\Beleuchtung\Beleuchtung Vase]*/, true);
ZW_SwitchMode(41854 /*[Obergeschoss\Beleuchtung\Deko Oben]*/, true);
ZW_DimSet(16667 /*[Erdgeschoss\Beleuchtung\Wohnwand]*/, 20);
HUE_SetValue(41815 /*[Erdgeschoss\Philips Hue\Hue bloom 2]*/,'STATE',true );
HUE_SetValue(20119 /*[Erdgeschoss\Philips Hue\Hue bloom 1]*/,'STATE',true );
HUE_SetValue(41815 /*[Erdgeschoss\Philips Hue\Hue bloom 2]*/,'COLOR',hexdec('DEE0FF'));
HUE_SetValue(20119 /*[Erdgeschoss\Philips Hue\Hue bloom 1]*/,'COLOR',hexdec('DEE0FF'));
?>

Versuch mal $data[‚LastExecute‘];

Danke, aber nein… der gleiche Fehler

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);
?>

So Habe den fehler gefunden… das auszuführende muss vor die letzte Klammer! Dann geht es! :slight_smile:
Hier mal wie es richtig sein muss…

<?
// 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:

Mittels IPS_GetEvent — IP-Symcon :: Automatisierungssoftware kannst du Informationen über den Timer herausfinden. Ich sehe in Deinem Skript jedoch keinen Timer? :confused:

Mit IPS_GetScript — IP-Symcon :: Automatisierungssoftware bekommst Du den TimeStamp des letzten Aufrufs - das hast Du ja schon eingebaut.