Script zeitlich beenden

Hallo zusammen

brauche hier einen denk anstoss…

Ich habe ein script, dies läuft und kontrolliert alle 5 sec. meinen Türkontakt. Wenn dieser auf true „Türe offen“ schaltet dies meine Aussenbeleuchtung an wie auch wieder aus.

Starten kann ich dies ja über einen TimerEvent, sagen wir 21.00 Uhr…

Das script „unten“ sollte sich automatisch um 5.00 Uhr beenden, so das ich dies über den TimerEventr am Abend wieder starten kann…

<?
IPS_SetScriptTimer ($IPS_SELF, 5); //Timer schalten

 //Holt den Wert von Fensterkontakt
 $fenster_garten = GetValueBoolean(17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/);
 
 if ($fenster_garten == true) //Zustand des Fensterkontakts
{
TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); //Licht Garten schaltet ein
}
if ($fenster_garten == false) //Zustand des Fensterkontakts
{
TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); //Licht Garten schaltet aus
}

?>

Was ist hier das einfachste, ein Hilfescript über Tag/ Nacht somit oben eine if entragen, oder gibts einen Befehl um das script zu beenden.

Merci für einen denkanstoss

grüsse

Hi!

Ja, es wäre möglich mit Zeiten zu arbeiten, siehe hier:
IP-Symcon - Wie kann ich… 2.0 - Seite 2

Aber warum machst du es nicht einfacher und überwachst die Variable deiner Haustür mit einem Ereignis (Event). Wenn die Variable sich ändert, also Haustür geöffnet oder geschlossen wird, nur dann soll das Skript aufgerufen werden und dies und das machen!?
Ereignis - Ausgelöst — IP-Symcon :: Automatisierungssoftware

Quasi so wie hier mit dem Bewegungsmelder, nur halt mit einer Tür als „Auslöser“:
IP-Symcon - Wie kann ich… 2.0 - Seite 3

Hier noch ein Beispiel von meiner Haustür, welche wenn es Dunkel/Nacht ist, das Licht im Treppenhaus für gut 2 Minuten einschaltet (dieses Skript wird durch Variablenänderung meines Haustür-Kontakt getriggert und ausgeführt):

<?
include 'AktorSteuerung.ips.php';

$Nacht = GetValue(50635 /*[Skripte & Variablen\Astro-Funktion\Nacht]*/);
$Dunkel = GetValue(51408 /*[Hardware\HomeMatic\Systemvariablen\HomeMatic Systemvariablen\DUNKEL]*/);
$B01Bewegung = GetValue(59324 /*[Hardware\HomeMatic\Bewegungsmelder\B01 (Flur oben - vorne)\Sensor\MOTION]*/);
$B02Bewegung = GetValue(57400 /*[Hardware\HomeMatic\Bewegungsmelder\B02 (Flur unten)\Sensor\MOTION]*/);


if($_IPS['SENDER'] == "TimerEvent")  {
   IPS_SetScriptTimer($_IPS['SELF'], 0);
   AktorSteuerung('Flur_Treppenlicht_Wand', 'SPERRE', 'AUS');
	AktorSteuerung('Flur_Stehlampe_Unten', 'SPERRE', 'AUS');

	if (($B01Bewegung == true) OR ($B02Bewegung == true))  {
	   IPS_RunScript(58718 /*[Skripte & Variablen\Bewegungsmelder\Flur\B01, B02, B03, B05 - Flur]*/);
	}
	else  {
		AktorSteuerung('Flur_Treppenlicht_Wand', 'AUS');
  		AktorSteuerung('Flur_Stehlampe_Unten', 'AUS');
	}
}
else {
	if (($Nacht == true) OR ($Dunkel == true)) {
		AktorSteuerung('Flur_Treppenlicht_Wand', 'AN');
	   AktorSteuerung('Flur_Stehlampe_Unten', 'AN');
	   AktorSteuerung('Flur_Treppenlicht_Wand', 'SPERRE', 'AN');
	   AktorSteuerung('Flur_Stehlampe_Unten', 'SPERRE', 'AN');
	   IPS_SetScriptTimer($_IPS['SELF'], 135);
	}
}
?>

Grüße,
Chris

Hallöle

merci für Deine schnelle Antwort, diese Scripte habe ich schon gesehen, und gewisse Befehle versucht bei mir einzubauen. Leider hat das nicht geklappt, wahrscheinlich habe ich was falsches eingetippt.

(Bewegungsmelder geht bei uns leider nicht, „Katzen“ da geht permanent ein Lichtchen an…

Der Sinn ist sicherlich später mit einem Hellikeitssensor zuarbeiten, jedoch kommt dies später, habe noch div. Fehlermeldungen in meinem System, die ich auch noch bereinigen muss.

Das Ziel ist es ja, dass das Licht am Tag nicht angeht, wenn ich die Türe öffne… Ich verfolge dies mal weiter und versuche parallel noch eine Tag Nacht Variable zu erstellen, diese kann ich sicherlich später vielleicht nochmals gebrauchen.

Also nochmals DANKE

Moin :slight_smile:

Ok, nochmal langsam von vorne :smiley:

> Du hast doch sicher eine Variable, die entweder TRUE oder FALSE ist, wenn die Tür offen ist, oder? Wenn ja, dann schreib mir mal die ID dieser Variable. Oder geht es gar nicht um eine Türe, sondern um dein „Fenster_Garten“?

Grüße,
Chris

Da kann ich nur empfehlen, den beschriebenen Weg von Chris zu gehen. Dann kommt auch das Verständnis für Events. Die Logik, ein Ereignis zu erfassen mit regelmässigen Abfragen ist bei einem grossen System undenkbar (nur schon weil die PHP-Threads sofort ausgelastet sind) und der Ansatz macht Dir das Leben garantiert irgendwann mal sehr schwer.

Lieber jetzt noch etwas Zeit investieren! Im Forum bekommst Du genug Hilfe dafür.

Gruss, kjb

Guten Morgen

Türe, Fenster… es ist eine Türe mit Fenster… so ne Gartentüre mit Fenster… sorry Spass bei seite…

Die Variable des Fenster Garten (Türe) ist die 17316, des unterstehenden Scrips, dies soll bei true das Licht schalten, jedoch natürlich nicht am Tag. Darum kommt später eine Abfrage über einen Hellikeitssensor (wenn ich den dann habe), bis dato würde ich gerne dies über eine zeitliche Begrenzung steuern.

Dies soll von 21.00 Uhr bis 05.00 Uhr aktiv sein, Das Script geht ja, leider halt 24 Stunden am Tag, habe auch die Variante mit dem Script Start nach Variable Änderung versucht, DOCH DA KANN ICH DOCH AUCH NICHT EINE ZEITLICHE BEGRENZUNG EINSTELLEN…

Jeder Anfang ist schwer, doch steigt mein Verständlis von Tag zu Tag:), ich danke schon mal für die Hilfe, unten nochmal das script:

<? 
IPS_SetScriptTimer ($IPS_SELF, 5); //Timer schalten 

 //Holt den Wert von Fensterkontakt 
 $fenster_garten = GetValueBoolean(17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/); 
  
 if ($fenster_garten == true) //Zustand des Fensterkontakts 
{ 
TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); //Licht Garten schaltet ein 
} 
if ($fenster_garten == false) //Zustand des Fensterkontakts 
{ 
TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); //Licht Garten schaltet aus 
} 

?>

Gruss und danke

Hi!

An sich habe ich alles schon gut beschrieben wie es funktioniert, aber ich will mal nicht so sein :slight_smile:

Hier ein Skript aus dem Kopf, also ungetestet:

<?
/* SKRIPT EINMAL VON HAND AUSFÜHREN, danach wird das Skript automatisch beim Öffnen/Schließen von Fenster/Tür ausgeführt und je nach IF/ZEIT wird das Licht im Garten eingeschaltet, oder nicht */

$Fenster_Garten_ID = 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/; 

// Diese Zeile legt ein Event an, welches die Variable mit der ID 17316 auf Variablenänderung überwacht und bei jeder Variablenänderung (und auch nur dann) dieses Skript ausführt
CreateEventTrigger("Haustuer_Oeffnung", 17316, $_IPS['SELF'], 1);  // Legt ein Trigger-Event (bei Variablenänderung) für die Variable mit der Objekt-ID 12345 an (damit dieses Skript hier ausgeführt wird, wenn die Variable sich ändert)

if (GetValueBoolean($Fenster_Garten_ID) === true) {   // Wenn das Gartenfenster offen ist dann...
	if ((date("H") >= 21) AND (date("H") <= 5)) { // Und wenn es zwischen 21.00 und 4.59 Uhr ist
		TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
	}
} 
else { // Oder wenn das Gartenfenster geschlossen ist/wurde
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); // Dann das Licht im Garten ausschalten
}


// Diese Funktion erstellt ein Event
function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
    }
}
?>

Das Skript muss einmal von Hand ausgeführt werden und von da an startet es sich automatisch über das Event, wenn das Fenster/Tür geöffnet/geschlossen wird. Also läuft es nicht mehr tausende Male am Tag, sondern nur dann, wenn sich der Fenster/Tür-Status sich wirklich ändert :slight_smile: Und je nach Uhrzeit schaltet sich das Licht im Garten an oder nicht. Und dieses Skript kannst du später einfach umschreiben, dass nicht mehr die Zeitspanne geprüft wird, sondern die Variablen Dunkel/Nacht :slight_smile:

Grüße,
Chris

Hallo Chris

sorry für mein verspätetes Rückmelden, war etwas bussy…

ich verstehe den Sinn des Timers und das Script geht auch fast so wie Du mir dies geschickt hast.
jedoch habe ich mit der zeitlichen einschränkung ein kleines Problem, habe immer einen Fehler im Script.

habe mir jetzt einen Hellikeitssensor bestellt, etwas früher als geplant,

bleibe aber am Ball.

merci nochmals, gruss Urs

Kein Problem :slight_smile:

Dann poste einfach mal das Skript wie du es hast und die zugehörigen Fehler und ruck zuck wird sich eine Lösung finden :cool:

Grüße,
Chris

@urs
du kannst dieDämmerung/sonnenauf-/untergang auch berechnen, dazu brauchst du keinen Sensor.
läuft seit 5J problemlos bei mir und schaltet alle wichtigen Scripte

Hallo Chris und oder zusammen

So funktioniert mein Script, (Vorlage von Dir) wenn ich die Terrassentüre öffne, dass heisst, das Licht der Aussenbeleuchtung geht an. (das Ereignis wird gestartet)

Nun bis mein Hellikeitssensor eingetroffen ist, (geht ja bekanntlich etwas länger bis das Packet aus Deutschland den Weg in die Schweiz findet) möchte ich dies zeitlich einschränken.

Von 21°° bis 5°° soll dies aktiv sein, der Rest vom Tag nicht, ist ja hell drausen, o.k., jetzt ja nicht mehr…

So geht’s:

<?
/* SKRIPT EINMAL VON HAND AUSFÜHREN, danach wird das Skript automatisch beim Öffnen/Schließen von Fenster/Tür ausgeführt, oder nicht */

$Fenster_Garten_ID = 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/;

// Diese Zeile legt ein Event an, welches die Variable mit der ID 17316 auf Variablenänderung überwacht und bei jeder Variablenänderung (und auch nur dann) dieses Skript ausführt
CreateEventTrigger("Gartentuer_Oeffnung", 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/, $_IPS['SELF'], 1);  // Legt ein Trigger-Event (bei Variablenänderung) für die Variable mit der Objekt-ID 12345 an (damit dieses Skript hier ausgeführt wird, wenn die Variable sich ändert)

if (GetValueBoolean($Fenster_Garten_ID) === true) {   // Wenn das Gartenfenster offen ist dann...
        TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
        TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
    }
else { // Oder wenn das Gartenfenster geschlossen ist/wurde
    TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); // Dann das Licht im Garten ausschalten
     TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, false); // Dann das Licht im Garten ausschalten
}


// Diese Funktion erstellt ein Event
function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
}
}
?>

wenn ich jetzt aber die zeitliche Einschränkung noch einbeziehe,

if ((date("H") >= 21) AND (date("H") <= 5)) { // Und wenn es zwischen 21.00 und 4.59 Uhr ist

unterhalt dieser Zeile:

if (GetValueBoolean($Fenster_Garten_ID) === true) { // Wenn das Gartenfenster offen ist dann…
TMEX_F3A_SetPin(42899 /[Garten\switch licht garten]/, 0, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
TMEX_F3A_SetPin(42899 /[Garten\switch licht garten]/, 1, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)

bekomme ich ein fehlerhaftes Script.

Später würde ich dann hier gerne natürlich die Abfrage vom Hellikeitssensor einbauen.

Habe ich hier einen Tippfehler oder etwas vergessen?

Merci für die Hilfe, gruss Urs

Hi!

Ich kann dir sagen was du vergessen hast > die Fehlermeldung zu posten :smiley: :wink:

Version mit Zeitabfrage:

<?
/* SKRIPT EINMAL VON HAND AUSFÜHREN, danach wird das Skript automatisch beim Öffnen/Schließen von Fenster/Tür ausgeführt, oder nicht */

$Fenster_Garten_ID = 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/;

// Diese Zeile legt ein Event an, welches die Variable mit der ID 17316 auf Variablenänderung überwacht und bei jeder Variablenänderung (und auch nur dann) dieses Skript ausführt
CreateEventTrigger("Gartentuer_Oeffnung", 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/, $_IPS['SELF'], 1);  // Legt ein Trigger-Event (bei Variablenänderung) für die Variable mit der Objekt-ID 12345 an (damit dieses Skript hier ausgeführt wird, wenn die Variable sich ändert)

if ((GetValueBoolean($Fenster_Garten_ID) === true) AND ((date("H") >= 21) OR (date("H") < 5))) {   // Wenn das Gartenfenster offen ist und es zw. 21.00 und 4.59 Uhr ist
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
}
else { // Oder wenn das Gartenfenster geschlossen ist/wurde
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); // Dann das Licht im Garten ausschalten
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, false); // Dann das Licht im Garten ausschalten
}


// Diese Funktion erstellt ein Event
function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
	 }
}
?>

Version mit Helligkeitsabfrage:

<?
/* SKRIPT EINMAL VON HAND AUSFÜHREN, danach wird das Skript automatisch beim Öffnen/Schließen von Fenster/Tür ausgeführt, oder nicht */

$Fenster_Garten_ID = 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/;
$Helligkeit_ID = 12345;  // Hier die ID deiner Helligkeitsvariable eintragen

// Diese Zeile legt ein Event an, welches die Variable mit der ID 17316 auf Variablenänderung überwacht und bei jeder Variablenänderung (und auch nur dann) dieses Skript ausführt
CreateEventTrigger("Gartentuer_Oeffnung", 17316 /*[Wohnung\Fensterkontakt Wohnung\Fenster Garten]*/, $_IPS['SELF'], 1);  // Legt ein Trigger-Event (bei Variablenänderung) für die Variable mit der Objekt-ID 12345 an (damit dieses Skript hier ausgeführt wird, wenn die Variable sich ändert)

if ((GetValueBoolean($Fenster_Garten_ID) === true) AND (GetValue($Helligkeit_ID) < 50)) {   // Wenn das Gartenfenster offen ist und der Wert der Helligkeit kleiner als 50 ist
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, true); // Dann das Licht im Garten einschalten, sonst nichts machen (kein else)
}
else { // Oder wenn das Gartenfenster geschlossen ist/wurde
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 0, false); // Dann das Licht im Garten ausschalten
	TMEX_F3A_SetPin(42899 /*[Garten\switch licht garten]*/, 1, false); // Dann das Licht im Garten ausschalten
}


// Diese Funktion erstellt ein Event
function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
	 }
}
?>

Ungetestet, aber wenn das andere Skript geht, dann gehen die beiden auch :slight_smile: Ansonsten bitte nochmal mit Fehlermeldung posten :slight_smile:

Bzgl. „((date(„H“) >= 21) AND (date(„H“) <= 5))“ … das kann nie in Erfüllung gehen, weil eine Zahl niemals größer gleich 21 UND gleichzeitig kleiner gleich 5 sein kann, deswegen muss da ein OR rein :wink:

Grüße,
Chris