ich bräuchte wieder Eure Hilfe. Ich habe folgendes Problem:
Ich starte ein Script, sobald eine Bewegung erkannt wird, in dem Script habe ich einen Timer eingebaut, der nach 20sec. das Licht wieder ausschaltet. Das Problem ist, wenn ich mich in diesem Raum länger aufhalte, geht das Licht natürlich nach 20 sec. auch aus. Wie kann ich das Problem Lösen, dass der Timer erst anläuft, wenn keine Bewegung mehr erkannt wird?
Hier mein Script:
<?
$id_ledlampe = 26937 /*[Keller\Flur-Keller\Flur Keller Licht Bewegung]*/ ;
if($_IPS['SENDER'] == "TimerEvent")
{
//Aus Befehl
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($brightness < 200) // nur einschalten wenn der Wert unter 200 liegt
{
//An Befehl
HM_WriteValueBoolean($id_ledlampe, "STATE" , true);
//Timer einschalten
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
}
?>
Ich vermute, dass der Bewegungsmelder die Bewegung nicht kontinuierlich sendet, sonder nur An und Aus. Dann wäre in das Skript noch eine Prüfung dahingehend einzubauen.
Genau, ich komme aber nicht drauf, wie ich das in PHP schreiben muss. Ich kann die Prüfung mit GetValue machen, aber wie kann ich dann den Timer wieder neustarten?
Aber wie baue ich das in mein Script ein? An welcher Stelle? Muss ich den Bewegungsmelder ständig abfragen? Ober wie bekomme ich das mit, wann die Bewegung (untätig) ist?
Sorry, bin noch ein Anfänger
Naja, der „aus“ Befehle wird nur ausgeführt, wenn der Timer abläuft.
Sonst wird der „an“ Befehl gesetzt.
Das Script wird doch schon bei Bewegung ausgeführt, oder nicht, so habe ich dich zumindest verstanden.
Und das Script wird ausgeführt, wenn der Timer abläuft. Das wird ja mit TimerEvent abgefragt.
Irgendwie bekomme ich es nicht hin.
Mein Wunsch wäre:
Wenn Bewegungsmelder true meldet, dann soll das Licht angehen, wenn der Bewegungsmelder wieder false meldet, dann soll das Licht noch 20 sek. an sein /nachlaufen. Und wenn dann gleich danach eine Bewegung erkannt wird, dann soll das Licht auch noch an bleiben.
Ich habe mir eine Variable Bewegung angelegt, auf das Script ein Ereignis, dass wenn die Variable Bewegung auf true gesetzt wird das Script ausgeführt wird.
Dein Script etwas angepasst und siehe das es funktioniert.
<?
$id_ledlampe = 44308;
if($_IPS['SENDER'] == "TimerEvent")
{
//Aus Befehl
SetValue($id_ledlampe, false);
//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
$brightness = 199;
if($brightness < 200) // nur einschalten wenn der Wert unter 200 liegt
{
//An Befehl
SetValue($id_ledlampe, true);
//Timer einschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);
ips_sleep(100);
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
}
?>
Bau einfach in dein Script den „Timer einschalten“ Block so wie ich es gesagt habe.
Das wird bei ihm nicht funktionieren, denke ich. Der Timer wird ablaufen und dann geht das Licht aus. Ob Du da diese komische Konstruktion einbaust, oder nicht, ist völlig egal. Sein Problem ist, so vermute ich, dass der Bewegungsmelder „an“ sendet wenn er Bewegung erkennt und dann irgendwann einfach „aus“ sendet, wenn er keine Bewegung mehr erkennt. Was macht Dein Skript dann?
Wenn der Sensor keine Bewegung mehr meldet, dann 20 Sekunden Timer starten
Wenn Timer abgelaufen ist, wieder ausschalten (Ich würde hier noch prüfen, dass immer noch keine Bewegung gemeldet ist)
Das resultierende Skript könnte so aussehen:
<?
$id_ledlampe = 26937 /*[Keller\Flur-Keller\Flur Keller Licht Bewegung]*/ ;
$id_bewegungsmelder= 12345; // <--- Neu: Variable für Bewegungsmelder TODO: Anpassen
if($_IPS['SENDER'] == "TimerEvent")
{
//Aus Befehl
if (!GetValue($id_bewegungsmelder)) { // <--- Neu: 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 (($brightness < 200) && ($_IPS['SENDER'] == "Variable")) // Neu: nur schalten wenn der Wert unter 200 liegt UND durch ein ausgelöstes Ereignis kam
{
if ($_IPS['VALUE']) { // <--- Neu: Nur anschalten, wenn Bewegungsmelder angeht
// An Befehl
HM_WriteValueBoolean($id_ledlampe, "STATE" , true);
}
else { // <--- Neu: Timer nur aktivieren, wenn Bewegungsmelder ausgeht
//Timer einschalten
IPS_SetScriptTimer($_IPS['SELF'], 20);
}
}
}
?>
Für das Skript bräuchtest du dann noch ein ausgelöstes Ereignis, welches bei Änderungen der Variable des Bewegungsmelders das Skript auslöst. Außerdem musst du in der zweiten Zeile noch die tatsächliche ID deines Bewegungsmelders eintragen.
Das vorherige zurücksetzen auf 0 startet den Timer neu. Steht er sonst bereits beispielsweise schon auf 20 Sekunden und es sind schon 10 Sekunden um, dann löst der Timer in 10 Sekunden aus, auch wenn ich ihn erneut auf 20 Sekunden setze. Stelle ich ihn stattdessen vorher auf 0, dann werden wieder die vollen 20 Sekunden gewartet.
Das sollte in meiner Skriptvariante keine Probleme verursachen, unter meiner Annahme, dass gemeldete Bewegung mindestens 20 Sekunden hält. Wenn das nicht der Fall ist, dann müsste man beim Anschalten noch den Timer auf 0 zurücksetzen.
Ein Problem ist mir aber gerade noch aufgefallen, denn in meiner Skriptvariante schaltet sich die Lampe nur aus, wenn es hell genug ist. Falls das nicht gegeben ist, startet der 20 Sekunden Timer nicht, auch wenn der Bewegungsmelder keine Bewegung meldet. Hierfür müsste man die Bedingungen noch ein wenig umschichten.
Funktioniert soweit Perfekt, genau so wie ich es mir vorgestellt hatte.
Eine Frage noch, Du meintest, man müsste noch die eine Bedingung mit der Brightness umschreiben, könntest Du mir da noch helfen?