Das Skript tut nichts anderes, als alle 10 Sekunden einen ScriptTimer auf Skript 2 zu erstellen.
Sieht dann so aus wie auf dem o.g. Screenshot. Das kann ich stundenlang so laufen lassen. Skript 2 wird niemals ausgeführt, so lange Ereignis 54162 aktiv ist.
Das kann ich stundenlang so laufen lassen. Skript 2 wird niemals ausgeführt. Warum nicht? Weil ich alle 10 Sekunden dem ScriptTimer wieder auf 20 Sekunden setze.
Du sagst, dass das erneute Setzen auf 20 Sekunden nach 10 Sekunden nichts bringt bzw. den Timer nicht neu startet, da der SkriptTimer trotzdem abläuft.
Wenn ich das Ereignis 54162 5 Sekunden nach seiner Ausführung deaktiviere, läuft der ScriptTimer 20 Sekunden, nachdem Skript 1 ausgeführt wurde los.
Funktioniert so, wie ich es gesagt habe. Funktioniert so, wie ich es erwarte. Funktioniert so, wie es in der Doku steht.
Ernsthaft… ihr diskutiert hier 3 Foren-Seiten wegen so einem Script?
Nagut, hier meine Lösung, zur weiteren Diskussion freigegeben…
Hierbei ist es egal ob der Bewegungsmelder jede Bewegung sendet oder erst nach Ablauf des Timerfensters des BW auf False schaltet.
Ich schreibe es jetzt mal in „Pseudo-Code“ runter, da ich es gerade nicht testen kann, also bitte ggf. Syntax korrigieren:
$id_lampe = XXXXXX; Die ID der zu schaltenden Lampe
$id_BW-Status = YYYYY; ID der Status-Variable des Bewegungsmelders
if($_IPS['SENDER'] == "TimerEvent") // Script wurde also vom abgelaufenen Timer aufgerufen
{
if (getValue($id_BW-Status)) // Überprüfen ob der BW-Melder schon wieder aus ist
{
// Nein, er steht noch auf Aktive (True) also ist entweder noch Bewegung oder der BWM-Timer ist noch nicht abgelaufen
// deswegen Timer verlängern
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
else
{
// Timer ist abgelaufen UND es ist keine Bewegung mehr auf dem BWM
// Timer Löschen
IPS_SetScriptTimer($_IPS['SELF'], 0);
//Lampe aus
SetValue($id_ledlampe, false); // im übrigen ein komischer Befehl zum schalten, bist du dir da sicher, hab den von dir übernommen
}
} else { // Script wurde also vom Ereignis aufgerufen
if (getValue($id_BW-Status)) // BWM hat Bewegung erkannt also Lampe an und Timer aufziehen
$brightness = 199; // <<---- das ist sicher nur zum Testen oder??
if($brightness < 200) // nur einschalten wenn der Wert unter 200 liegt
{
//An Befehl
SetValue($id_ledlampe, true);
//Timer einschalten
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
} else {
// Script wurde aufgerufen weil der BWM auf "aus" gegangen ist
// Wenn ab jetzt noch der Timer 20 Sekunden laufen soll die nächste Zeile benutzen (also Timer des Bewegungsmelder + 20 Sekunden)
//IPS_SetScriptTimer($_IPS['SELF'], 20);
// ansonsten Timer nicht neu setzen, dann geht das Licht aus, wenn der Scripttimer abgelaufen ist und der BWM "aus" ist
//alternativ hier direkt "AUS" senden, dann geht das Licht mit dem Zeitfenster des BWM zusammen aus, frei nach Wunsch
}
Wie gesagt, ganz aus dem Kopf geschrieben, das Prinzip müsste aber klar sein oder?
Diskutieren ist doch was feines, davon lebt doch eine Community. :)
Ich konnte es nur so wieder geben, wie ich es gelesen und verstanden habe, wenn es schöner geht, dann habe ich wieder etwas gelernt und das nur durch diese Diskussionen.
Also auch danke an Christoph für diesen ausführlichen Test.
klar, der erste Parameter ist ja die ID des Script-Timers, musst du nur statt
IPS_SetScriptTimer($_IPS[‚SELF‘], 0);
z.B.
IPS_SetScriptTimer(XXXX, 0);
verwenden
wobei XXXX die ID des Scripts, nicht die des Timers ist!
Das ist möglich. Ich hatte mich auf Aussagen aus diesem Thread bezogen ohne das ganze selber zu prüfen. Dann nehme ich meine Aussage zurück
Mein überarbeitetes Skript, dass beim Ausschalten des Bewegungsmelders immer schaltet wäre dann dieses:
<?
$id_ledlampe = 26937 /*[Keller\Flur-Keller\Flur Keller Licht Bewegung]*/ ;
$id_bewegungsmelder= 12345; // Variable für Bewegungsmelder TODO: Anpassen
if($_IPS['SENDER'] == "TimerEvent")
{
//Aus Befehl
if (!GetValue($id_bewegungsmelder)) { // Prüfe ob Bewegungsmelder nicht mehr meldet
HM_WriteValueBoolean($id_ledlampe, "STATE" , false);
}
//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
$brightness = GetValue(29913 /*[Keller\Flur-Keller\BM Keller\ILLUMINATION]*/); // Variable mit dem Helligkeitswert
if ($_IPS['SENDER'] == "Variable") // <-- Neu: Nur beimein ausgelöstes Ereignis
{
if (($_IPS['VALUE']) && ($brightness < 200)) { // <-- Neu: Nur anschalten, wenn Bewegungsmelder angeht und es dunkel genug ist
// An Befehl
HM_WriteValueBoolean($id_ledlampe, "STATE" , true);
}
else if (!$_IPS['VALUE']){ // <--- Neu: Timer nur aktivieren, wenn Bewegungsmelder ausgeht
//Timer einschalten
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
}
}
?>
Prinzipiell habe ich die Bedingungen bei den if-Blöcken ein wenig verschoben. Wenn jetzt keine Bewegung gemeldet wird und es hell ist, wird der Ausschalt-Timer trotzdem gestartet.