Script verspätet starten

Hi ich würde gerne ein Script nach z.B. 30min ausführen lassen, wenn eine Variable sich true ändert.

Beispiel:

Fenster ist offen (Variable == True), 30min warten, wenn dann die Variable immernoch auf True ist, dann ein anderes Script starten.

Ich weis nicht wie ich das hinbekommen.

Vielen Dank für euere Hilfe.

Ich weis nicht wie ich das hinbekommen.

die Forensuche mal bemühen, das wurde die letzte Zeit zig mal durchgekaut.

RWN hat zwar recht, aber ich weiss wie frustrierend solche Antworten sein können, wenn man vor lauter Wald die Bäume nicht sieht, daher ne Kurzanleitung:

Variable ändern triggert Script, welches einen Timer setzt. Dieser kann auf dasselbe Script losgehen oder ein anderes, je nach dem, wie „elegant“ Du das machen willst.

Vielleicht noch beachten:

  • Willst Du „retriggern“, also, falls in den 30 min die Var nochmals gestezt wird, wieder erst nach 30 Min Starten, zum alten Zeitpunkt oder gar ein 2. mal?

  • im letzten Falle: Was, wenn die Var-Änderungen (warum auch immer) zu häufig eintreffen (–> macht Dir die Script Events voll)

jwka

@RWN / IPS:
Wie wäre es eigentlich mit sowas wie Templates für IPS, die solche „typischen“ Problemchen lösen?

Hi danke für eure Antworten.

Ich habe mich schon wund gelesen, finde aber nichts passendes.

Also wenn das Fenster geöffnet wird, ändert sich der Wert vom Fenstersensor auf True.

Dann soll ein Script starten (macht aber nix). Wenn das Fenster nach 30 min immernoch offen ist, soll das Scipt (oder ein neues Script) eine Aktion auslösen.

Ich weis eben nicht wie man sowas programmiert, das das Ereigniss erst nach 30min einen Befehl auslöst und in abhängigkeit mit dem Variablensatus vom Fenster.

Es kommt auf Deine Installation an, wie Du das realisierst.

Erster Gedanke von mir wäre, das Thema in eine „allgemeine Statusroutine“ einzubinden.

Ich frage z.B. minütlich ganz viele Dinge ab und reagiere dann auf Stati (ist der 2. Server noch da, ist Internet erreichbar, muss das Hoflicht ausgeschaltet werden, Teperatrurkontrollen von Warmwasser, Zimmertemperatur usw.)

Wenn Dir das sinnvoll erscheint, baue ein Script, welches per Timer jede Minute aufgerufen wird.

Der Part mit der Fensterüberwachung könnte dann so laufen, dass Du den Status seit dem letzten Lauf checkst und bei Änderung auf „offen“ eine Hilfsvariable setzt (Datum/Uhrzeit), die bei schliessen wieder zurückgesetzt wird. Ist der Wert dann länger als X Minuten „alt“ startest Du das eigentliche Aktionsscript.

jwka das habe ich mir auch schon gedacht, aber dann müste ich doch eine neue Variable erstellen, wo die Uhrzeit drin steht wann das Fenster geöffnet wurde oder ? Die Uhrzeit würde per script eingetragen werden, wenn das Fenster geöffnet wird.

Und dann würde ich einfach ein script jede Minute laufen lassen, das nachschaut ob das Fenster noch offen ist und ob die jetzige Zeit - der Zeit aus der neuen Variable = bzw größer als z.B. 30min ist.

Oder geht das auch ohne neue Variable ?

Theoretisch - als einfache Variante - geht es auch ohne neue Variable, weil Du ja das Aktualisierungsdatum des Fenstermelders abfragen kannst.

Allerdings wird die Sache dann „unscharf“ im Sinne Deiner willkürlichen Behandlung:

Wenn z.B. zwischendurch das Fenster wieder geschlossen wurde, hast Du immer eine Verlängerung und kannst z.B. nicht Alarm geben, wenn das Fenster innerhalb von zwei Stunden länger als x Minuten offen war.

Es genügt übrigens eine Zwischenvariable für viele Stati, denn Du kannst Dir ja eine eigene „Datenstruktur“ für diese Variable überlegen.

jwka

Ich habe es jetzt so gemacht :

  1. Script 1 wird ausgelöst wenn das Fenster geöffnet wird:
<?
$Zeit = date ("Hi");
 
setvalue(41032 /*[Badezimmer\Heizung\Zeit Fenster offen]*/  , $Zeit);
?>
  1. Script 2 (läuft jede Minute)
<?
$Zeit = date ("Hi");
$FZ = getvalue (41032 /*[Badezimmer\Heizung\Zeit Fenster offen]*/ );
$offen = ($Zeit-$FZ);
$Fenster = getvalue (43653 /*[Badezimmer\Heizung\Fenster geöffnet]*/ );
 
 
include('ProwlPHP.php');
 
echo "$Fenster";
 
 
 
 
If (($Fenster == 1) && ( $offen > 29))
{
echo "$offen";
$prowl = new Prowl('xxxxxxxxxxxxyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzz');  // hier dein Magic-Key rein
$prowl->push(array(
 'application'=>'iHome',
 'event'=>'Statusmittteilung',
 'description'=>utf8_encode("Actung: Das Fenster im Bad ist seit_". "$offen" ." Mintuen geöffnet"),
 'priority'=>0
));
 
}
?>

Ich habe eine Variable angelegt, wo die Uhrzeit gespeichert wird, wann das Fenster geöffnet wurde.

Und es funzt :slight_smile:

Vielen Dank für euere Hilfe !

Wie kann ich das machen ?

Weil dann kann ich mir die zusätzliche Variable sparen :wink:

meiner Meinung nach reicht ein Script…

das Script wird mittels ausgelöstes Ereignis (der Variable des Fenster-Statuses) ausgelöst… mit einer switch-case-anweisung wird der Trigger abgefragt…
also ob Variable/Timerevent …
wenns von einer Variable ausgelöst wird -> dann noch checken ob true oder false… falls true, legst dir ein Timerevent mit 30min für das selbe Script an …
wenn in der Zeit das Fenster geschlossen wird, also die Variable wieder false wird, löscht du den Timerevent … Falls die 30min bei offenen Fenster verstreichen -> arbeite das Script ab.

Script sieht in etwa dann so aus:

<?
$time = 30; // Zeit der Verzögerung in Minuten
switch($IPS_SENDER) {
	case 'Variable':
	   if($IPS_VALUE == true) {
			IPS_SetScriptTimer($IPS_SELF, $time*60);
		} else {
	      IPS_SetScriptTimer($IPS_SELF, 0);
		}
		break;
	case 'TimerEvent':
	   IPS_SetScriptTimer($IPS_SELF, 0);
		// Hier kommt rein, was du alles machen willst, nach den $time Minuten abarbeiten willst.
		break;
}
?>

SUper läuft perfekt vielen Dank !

Da wäre ich nie darauf gekommen.

@ChristianS:

Das geht, zweifellos, und ist bei wenigen solcher Vorgänge sicher auch vollkommen in Ordnung.

Es wird halt, wenn man 30, 50 oder gar nochmehr solcher „Ereignisse“ hat (und das geht m.E. schnell), leicht unübersichtlich um festzustellen, was eigentlich wie und wann so alles abläuft.

Es wurde ja auch schon eine „zentrale Eventverwaltung“ gefordert. Aus gutem Grund - Übersichtlichkeit.

Da ist dann eben eine zentrale Routine, die regelmässig läuft sowas wie eine „handgemachte“ Eventverwaltung. Hat auch den Vorteil, dass man Priorisieren kann, was mit „wild verstreuten Events“ nicht geht. Im Zweifel muss dann ein wichtiger Vorgang warten, weil gerade alle Script-Threads belegt sind.

jwka