Timer Script (Licht aus nach X min)

Hallo zusammen,

hatte dies schon mal unter Beleuchtung gepostet, aber vermutlich war es dort einfach falsch.
Verzeiht mir wenn ich etwas ähnliches hier nochmals schreibe.

Habe über IPS einen Hue Bewegungsmelder/Lichtsensor und Hue Lampen (eine Lampe mit 5 Spots)
so „verknüpft“ das zwischen 6 - 21 Uhr, bei kleiner 5 lx die Lampen auf 70% eingeschaltet werden, bei Bewegung.
Klappt eigentlich gut, an geht es immer.
Sehr ähnlich habe ich es für nachts gemacht mit 10% Licht…

IPS ist für mich noch relatives Neuland und ich bin bzgl. php totaler Neuling.
SmartHome (HMIP, KNX, Hue, Alexa, …) sind für mich nicht neu, damit arbeite ich seit Jahren.

Habe hin- und her versucht bin aber nicht weitergekommen mit dem Skript das die Lampen
die über das Ergebnis eingeschaltet wurde nach X min aus gehen.
Genutzt hatte ich die Doku (https://www.symcon.de/service/dokumentation/vorgehensweisen/wie-kann-ich/#…_ein_Ger%C3%A4t_einschalten_und_nach_60_Sekunden_wieder_aussschalten).
Aber irgendwie komme ich damit nicht weiter.
Bin sogar unsicher wie ich das Ergebnis hier einbinden soll?
Vielleicht ist es viel einfacher und ich stehe einfach nur auf dem Schlauch.

Kann mir dabei jemand helfen?

Schau dir ggf. mal die Treppenhauslichtsteuerung im Store an. Hilft das?

paresy

Am besten postest Du Deine bisherigen Versuche hier im Thread. PHP Code kannst Du mit den entsprechenden Tags hier einbinden. Meistens ist auch noch ein Screenshot aus dem Objektbaum hilfreich dazu.

Auf Basis der zur Verfügung stehenden Informationen wird man Dir nur sehr schwer bis gar nicht helfen können.

Treppenhauslicht hatte ich mir angesehen, aber hab keinen Anhaltspunkt gefunden es auf ein Ergebnis zu beziehen.
Oder ginge dies doch? Wäre natürlich einfacher als ein Skript und für so einen Neuling wie mich vermutlich ideal.

Wie gesagt hatte einige Skript-Versuche ohne Erfolg durch:

<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    34209
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
    34209
     
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 1200);
}

Hatte auch etwas im Forum gefunden, aber auch damit ging es nicht:

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
   34209, "FLOAT", 0.0
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
   34209, "FLOAT", 1.0
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 1200);
} 

Hab mir bei Udemy schon php Kurs gesucht und begonnen, aber ein Meister fällt nun mal nicht vom Himmel… :confused:


Auf dem Screenshot sieht man das Ergebnis 2x, 1x ist nachts 1x tags, das Skript bezieht sich erstmal auf den Tag.
Läuft es passe ich es auf Nacht an.

Unter An-Befehl und Aus-Befehl sind keine Befehle. Dort schreibst Du einfach nur IDs hin. Das kann so nicht funktionieren.

Dort muss der Befehl hin, der Deine Lampen schaltet. Bei KNX wäre es zum Beispiel

KNX_WriteDPT1(12345, TRUE);

oder

RequestAction(98765, TRUE);

wobei 12345 die ID der Instanz und 98765 die ID der Statusvariable der Instanz wären.

Wie es genau bei HUE ist, weiß ich nicht. Dazu kann bestimmt jemand anderes etwas sagen.

Aber wo in dem IPS Skript zum Timer kommt was hin?

Dort wo die Kommentare „Aus Befehl“ und „An Befehl“ sind, dort kommen die Befehle zum Schalten hin.

Wäre dann das richtig?

<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    34209
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
    32568 
    RequestAction(32568, FALSE); 
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}

Es wäre laut IPS ein Fehler in Zeile 9

Parse error: syntax error, unexpected ‚IPS_SetScriptTimer‘ (T_STRING) in /var/lib/symcon/scripts/15061.ips.php on line 9

Oder wie lässt sich der Treppenhaustimer so umstellen das er hier funktioniert?

Nein … es ist noch genau so falsch wie vorher. Anstatt der ID muss dort der Schaltbefehl stehen. Danach ist es richtig.

<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    32568 
    RequestAction(32568, TRUE); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
    32568 
    RequestAction(32568, FALSE); 
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}

Jetzt ist in Zeile 7 ein Fehler

Vermutlich würde das Modul Treppenhauslichtsteuerung funktionieren, aber das Modul ist nicht auf Zeit änderbar.
Am Tag möchte ich das es länger an bleibt als in der Nacht, aber wie bekomme ich das am Modul hin?
Gäbe ja beide Wege.

Lösch doch endlich die IDS da raus! Was sollen die da?

Falls ich mich zu kompliziert ausdrücke, sag es gerne. Ich wiederhole es noch mal: Die ID muss weg.

Versuche es mal so:


<?php
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
    RequestAction(32568, true); 
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
} 
?>

Um das script am Tag / Nacht unterschiedlich laufen zu lassen würde ich so vorgehen.
Falls noch nicht geschehen :: Das Modul „Objektbaum => Kern Instancen => location“ konfigurieren
die ObjectID der variable :: „Objektbaum => Kern Instancen => location => ist es Tag“ merken

Das Script so ändern:


<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
   RequestAction(32568, true); 
	$istTag = GetValue(/*hier die gemerkte ObjectID*/);
	
	if($istTag) {
		$dauer = 60;
	} else {
		$dauer = 120;
	}		
	IPS_SetScriptTimer($_IPS['SELF'], $dauer);
} 
?>

Gruß Xaver.

Vielen Dank!!! :cool:
Hat geklappt, mal sehen wie es heute Nacht wird.

Wenn ich statt Tag/Nacht auf die lx des Lichtsensors (im Hue Bewegungsmelder) wollte was müsste ich dafür machen?
Das z.B. bei kleiner 5 lx Nachtlicht läuft und bei kleiner 20 lx das helle Tageslicht der Lampe?

<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
   RequestAction(32568, true); 
    $istTag = GetValue(54076);
    
    if($istTag) {
        $dauer = 120;
    } else {
        $dauer = 300;
    }        
    IPS_SetScriptTimer($_IPS['SELF'], $dauer);
} 
?>

Nun du kannst in allen Skripten mit GetValue( ObjektID ) auf alle Variablen in deinem System zugreifen
$wert = GetValue(13688); liefert den Wert von Lichtniveau
und diese dann vergleichen und an/ aus oder sonst etwas schalten/tun

oder ein Ereignis erstellen das ab einem bestimmten wert von (Lichtniveau) an , und eine anderes aus schaltet. Es gibt viele Wege die zum Ziel führen können :slight_smile:

zb.


<?php
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
	$level = GetValue(13688); // Lichtniveau
	// und nun nur schalten wenn der Level ok ist
	if($level > 50) {
	
		RequestAction(32568, true); 
		IPS_SetScriptTimer($_IPS['SELF'], 120);
	}	
	
} 
?>

Oder so


<?php
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    IPS_RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
	$pruefe = GetValue(13688); // Lichtniveau
    $istTag = GetValue(54076);
    
    if($istTag) {
        $dauer = 120;
		$helligkeit=100; // Helligkeit am Tag
		
	} else {
        $dauer = 300;
		$helligkeit=50; // Helligkeit in der Nacht
    }        
	
	// und nun nur schalten wenn der Wert pruefe ok ist
	if($pruefe > 50) {
		RequestAction(56441, $helligkeit); // Helligkeit 
		// bei manchen Modulen muss der nachfolgene befehl (wenn das licht nun an ist) nicht extra ausgegeben werden.
		IPS_RequestAction(32568, true); 
		IPS_SetScriptTimer($_IPS['SELF'], 120);
	}	
	
} 
?>

Xaver

Vielen lieben Dank für die tolle Hilfe!!!

Habe es, vorerst über ein Ergebnis gelöst.
Licht Tag/Nacht über Verschiedene Dauer bei Bewegung einschalten.
Am Tag habe ich als Weitere Bedingung noch Lichtniveau kleiner 7 lx eingestellt.

Zusätzlich ein Ergebnis Licht aus bei größer 15 lx.
So ergibt sich eine „Zone“ zwischen 7-15 lx in der nicht ein oder ausgeschaltet wird, vielleicht passe ich diese noch an.
Mal sehen wir das Licht so ausreicht,…

Einen Punkt hätte ich aber noch, vielleicht hast du einen Rat.
Im Esszimmer sind wir ohnehin weniger und die eingestellte Dauer der Beleuchtung/Tag reicht locker aus wenn wir dort sitzen.
Der Bewegungsmelder ist nicht sensibel genug um festzustellen das wir am Tisch sitzen, zu „ruhig“.
Wenn wir Besuch haben sitzen wir aber auch mal etwas länger am Tisch, spielen vielleicht mal etwas,…, gibt es eine Möglichkeit über einen „Button, Schalter“,… das Licht auf Dauer einzuschalten, das Skript so lange zu ignorieren bis wir es wieder einschalten?
Quasi einen Schalter für das Skript?

Hallo,

klar geht das. Meinst über Web Konsole und der App?
Musst weitere Bedingungen hinzufügen.

Könnte später wie es bei mir ist, hab zwar anders herum.
Falls irgendwas spinnt, kann ich über einen Schalter
starten des Timers verhindern.

Brauche es in Web und App.
Habe in einigen Zimmern Tablets an der Wand hängen mit der App, auch im Esszimmer.
So könnte ich bei Besuch den Timer abschalten damit das Licht an bleibt.
Oder so einrichten das dieser Timer z.B. am dem nächsten Tag wieder normal weiter läuft.

Würde mich sehr interessieren wie du das gelöst hast.
Wie diese Bedingung aussehen könnte wäre mir zur Zeit unklar :confused:

Erstell eine Bool Variable. Nenn die Sperre oder sonst wie. Diese Variable stellt du bei deinem Ereignis bei erweiterte Bedingung ein. Also Variable != True dann Ereignis ausführen. Diese Variable kannst du über das Webfront oder App steuern.

Hatte bisher IPS in einem Container (QNAP) laufen.
Heute morgen ging alles, auch das Skript um die Lampen auszuschalten.
Habe nun von NAT auf Bridge umgestellt, wollte schon lange das IPS seine eigene IP bekommt, hatte nur nie Zeit dafür.
Sonst wurde am System nichts verändert.

Das Skript schaltet die Lampe nicht mehr aus, habt ihr eine Idee oder habe ich am Skript aus Versehen etwas verändert das ich nicht sehen?

<?php

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl (Licht aus)
    
    RequestAction(32568, false); 
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //An Befehl
   RequestAction(32568, true); 
    $istTag = GetValue(54076);
    
    if($istTag) {
        $dauer = 10;
    } else {
        $dauer = 10;
    }        
    IPS_SetScriptTimer($_IPS['SELF'], $dauer);
} 
?>

Zum Skript wird ein Timer erstellt (25308).
Dieser bleibt immer inaktiv, jemand eine Idee?
Manuel kann ich ihn aktivieren, aber das ist ja nicht der Sinn.

Für den Test steht der Timer mal auf 10 sec.

Die Ergebnisse zum Einschalten laufen noch prima.