Bewegungsmelder Script mit Timer

Hallo Liebe Community,

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);
}

 }  
 
?>

Hallo,

den Timer einfach bei jeder Bewegung auch einmal deaktivieren und dann wieder aktivieren sollte funktionieren.

IPS_SetScriptTimer($_IPS['SELF'], 0); 

Grüße,
Kai

die Frage ist, wie mache ich das?
Ein zweites Ereignis, der bei Bewegung (untätig) den gleichen Script ausführt?

Wozu dieser Umweg? :confused::confused::confused:

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?

Timer neustarten:

IPS_SetScriptTimer($_IPS['SELF'], 0);
ips_sleep(100);
IPS_SetScriptTimer($_IPS['SELF'], 20);

Ich weiß nicht ob das Sleep dazwischen muss, ich hatte das mal irgendwo so gesehen.

Grüße,
Kai

Die Konstruktion von KaiS ist nicht erforderlich! In dem Moment, wo Du den Befehl

IPS_SetScriptTimer($_IPS['SELF'], 20);  

absetzt, fangen die eingestellten Sekunden an zu laufen. Also einfach immer diesen Befehl vor Ablauf der Zeit absetzen.

Wieder was gelernt, danke!

Edit: Eigentlich bin ich mir aber ziemlich sicher, dass man den Timer erst auf 0 setzen muss.

Grüße,
Kai

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 :frowning:

Anstatt Aus-Befehl fragst Du die Variable vom Bewegungsmelder ab, ob die TRUE ist. Wenn ja, dann noch mal 20 Sekuden, wenn nein, dann Licht aus.

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.

Oder bin ich jetzt total durcheinander? :confused:

Edit: Timer Reset

Michael hatte es mir damals so erklärt, wie ich es beschrieben habe.

Grüße,
Kai

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.

Also, ich habe es gerade mal getestet:

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.

Grüße,
Kai

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?

Guten Morgen,

also so wie ich deine Wünsche verstehe:

  • Wenn der Sensor Bewegung meldet, dann anschalten
  • 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.

Ist das so das, was dir vorschwebt?

@Niels, kannst du mir sagen, wieso ich dann den ScriptTimer vorher auf 0 setzen sollte?

Grüße,
Kai

Danke Niels, so in der Art meinte ich das.

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.

Bei IPS_SetEventActive hätte ich dem Verhalten sofort zugestimmt.

Ich werde mal schauen, was ich da gestern Abend getestet habe…

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?

Vielen Dank schon mal.