Generisches Skript für Fensteralarm

Hallo zusammen,

ich bin noch relativ am Anfang was meine PHP Kenntnisse betrifft. Ich habe zu meiner Herausforderung auch die Suche bemüht und einige Treffer gefunden, die zwar in eine ähnliche Richtung gehen, aber dann doch nicht so ganz passen. Falls ich da nicht ordentlich gesucht habe, freue ich mich auf einen Hinweis zum entsprechenden Thread.

Ich möchte gerne ein möglichst generisches Skript haben, dass bei jedem öffnen eines Fensters einen (eigenen) Timer startet und mir nach 900 Sekunden mitteilt, dass das Fenster noch offen ist.

Mein erster Schritt war in etwa dieses Skript:

<?
//$VariableID = array(31553, 34053, 56835, 42785, 53123, 21124, 48802, 43749, 47486 ); 

//$Ausloeser = $_IPS['VARIABLE'];
$Ausloeser = $_IPS['VARIABLE'];
$AusloeserE = $_IPS['EVENT'];
echo $Ausloeser; 
echo $AusloeserE; 
$status = $Ausloeser;
//$status = GetValueBoolean(16129); // Deine Alarm Boolean Variable
$time   = 900; // Zeit in Sekunden für den Timer

If ($_IPS['SENDER'] == "Variable" or $_IPS['SENDER'] == "EVENT")
{

   If ($status == True)
   {
    IPS_SetScriptTimer($_IPS['SELF'],$time);
   }
   else
   {
   //mach nix
   }
}

else
{
echo "Dieses Sript kann nur entweder durch eine Variable oder ein Timerevent gestartet werden";
}

If ($_IPS['SENDER'] == "TimerEvent") // Wenn das Script durch den Timer gestartet wird
{
    If ($status == True)
    {
    //Hier das rein, was nach ablauf des Timers passieren soll, wenn die Variable immer noch auf True steht
    IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
    echo "15 Minuten auf";
    }
    else
    {
    IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
    }
}
else
{
}
?>

Das ganze habe ich als Skript angelegt und an das Ereignis des Fensterstatus gehängt.

Das funktioniert auch, es wird ein Timer angelegt.
Was mir aber fehlt ist die Referenz auf den jeweiligen Fensterkontakt der den Timer gestartet hat. Das merke ich insbesondere daran, dass die Prüfung im TimerEvent Teil

  If ($status == True)

fehlt schlägt, da $status ja nicht mehr bekannt ist, da das Skript im zweiten Durchlauf ja durch den TimerEvent aufgerufen wird.

Habt Ihr eine Idee, wie ich das lösen kann?

Grüße
Dominic

Moin, ich würde die Timer fest anlegen und dann nur aktivieren. Dann kannst du sie identifizierbar machen. Kann dir nachher nen Beispiel geben wie du dein Script bauen könntest, geht jetzt vom Handy schlecht.

Gruß

Gesendet von iPhone mit Tapatalk Pro

Moin,

Ein Beispiel wie ich das in das skript einbauen könnte wäre prima.

Hab ich es richtig verstanden, du würdest für jedes Fenster einen Timer anlegen?

Dank Dir schonmal für deine Hilfe!

Moin, bin gerade am Script schreiben und testen :stuck_out_tongue:

Du hast du das gesagt …

Was möchtest du genau ?
Soll das Script dir sagen, bzw. möchtest du auswerten.

[ol]
[li]Es ist irgendein Fenster länger als $Zeit offen[/li][li]Es ist genau $dieses Fenster länger als $Zeit offen[/li][li]Es ist Insgesamt länger als $Zeit gelüftet worden. (Dabei könnten auch einzelnen Fenster kürzer als $Zeit, insgesamt aber ununterbrochen mindestens eins offen gewesen sein.[/li][/ol]

Ausser bei Nummer „1“ kommst du nur mit eigenen Timern pro Fenster aus wenn ich keinen Denkfehler habe. Ich habe dich so verstanden, mir gedacht, du willst „2“, richtig ?

Gruß

Moin,

Genau, Variante 2 :slight_smile:

So würde ich mir das Script basteln … kA ob es noch einfacher geht, bin auch nur Hobby Programmierer. Inbesondere die Timer finde ich ganz schön umständlich, einfache „Script-Timern“ darf es aber so wie ich das sehe nur einen pro Script geben, nicht mehrere. Beim Anlegen sind sie nicht eindeutig identifizierbar. Falls es da einfachere Varianten gibt, gerne ein Hinweis, das würde mich auch Interessieren.

Du musste unterhalb des Scripts ausgelöste Ereignisse anlegen, auslösen bei Fenstervariable == true.
Erhälst dann für jedes Fenster einzeln die Meldung wenn es länger als $interval offen war.
Wenn das Fenster vor ablaufen von $intervall zugemacht wird und dann wieder aufgemacht, fängt die Zeit neu an zu zählen.
Wenn das Fenster länger als $intervall offen war und die Meldung ignoriert wurde (Fenster bleibt auf) erfolgt nach weiteren $intervall keine erneute Meldung.
Wenn das ausgelöste Ereignis wieder auslöst fängt die Zeit neu an zu zählen. (nachfolgende Ereignisse nicht berücksichtigen wäre je nach Sensor sinnvoll)

Wenn das so nicht richtig ist, ist die Anforderung nicht genau genug formuliert.

<?

/*
Unter das Script müssen ausgelöste Ereignisse von den Variablen deiner Fenster angelegt werden.
Auslösen bei bestimmtem Wert = true
Ich gehe davon aus, dass deine Variablen für den Fensterstatus true sind bei offen, ansonsten unten die if-Anweisung unten anpassen bzw. auch deine ausgelösten Ereignisse anpassen.
*/

$interval   = 5; // Zeit in Sekunden für den Timer

$time = time();
$timestamp = $time + $interval;
$Jahr = date("Y", $timestamp);
$Monat = date("n", $timestamp);
$Tag = date("j", $timestamp);
$hour = date("H", $timestamp);
$minute = date("i", $timestamp);
$second = date("s", $timestamp);

if ($_IPS['SENDER'] == "Variable")
{
	$Ausloeser = $_IPS['VARIABLE'];
	$TimerID = @IPS_GetObjectIDByIdent ($Ausloeser, $_IPS['SELF']);
	if ($TimerID)
	{
		IPS_SetEventCyclicDateFrom ($TimerID, $Tag, $Monat, $Jahr);
		IPS_SetEventCyclicTimeFrom($TimerID, $hour, $minute, $second);
		IPS_SetEventActive ($TimerID, true);
	}else
		{
		$eid = IPS_CreateEvent(1);
		IPS_SetIdent ($eid, $Ausloeser);
		IPS_SetParent($eid, $_IPS['SELF']);
		IPS_SetEventCyclic($eid, 1, 0, 0, 0, 0, 0);
		IPS_SetEventCyclicDateFrom ($eid, $Tag, $Monat, $Jahr);
		IPS_SetEventCyclicTimeFrom($eid, $hour, $minute, $second);
		IPS_SetEventActive ($eid, true);
		}
}

if ($_IPS['SENDER'] == "TimerEvent")
	{
	$Objekt = IPS_GetObject ($_IPS['EVENT']);
	$Ident = $Objekt['ObjectIdent'];
	$Status = GetValueBoolean ($Ident);
	if($Status)
		{
		//Hier kommt das rein, was passieren soll wenn das Fenster nach verstreichen von $Intervall immer noch offen ist.
		//in $Ident steht die Variablen ID von dem offenen Fenster drin, damit könnte man den Variablen oder Instanz Name ausgeben oder sonstwas machen :)
		}
	IPS_SetEventActive ($_IPS['EVENT'], false);
	}


?>

Edit: hab mir beim Editieren den eigenen Post zerschossen ausversehen, hoffe es stimmt so wieder einigermaßen.

Vielen lieben Dank. Ich werde das heute Abend testen:-)

Moin,

das Script funktioniert prima - noch einmal vielen Dank dafür.

Ich habe aber noch ein kleines Detail übersehen. Das Skript gibt mir ja über $Ident die Statusvariable zurück. Die heissen bei mir dummerweise alle „Zustand“ (also bei jedem Fensterkontakt).

Habe ich eine Chance, irgendwie auf den Namen der darüberliegende Instanz zu kommen?

Moin,

war wohl noch zu früh heute…

Mit IPS_GETPARENT bekomme ich die ID von der übergeordneten Instanz.

Genau, an den Namen kommst du mit IPS_GetName(IPSGetParent($Ident))

Oder du legst noch ein Array an mit eigenen Namen für jede ID.

Gruß

Gesendet von iPhone mit Tapatalk Pro