Bewegungsmelder Script mit Timer

Es hat mir keine Ruhe gelassen. Deine Aussage ist Quatsch! Der Timer startet neu, sowie er gesetzt wird.

Folgende Testumgebung:

Der Inhalt von Skript 1 (ID 17414) ist schlicht und ergreifend:

IPS_SetScriptTimer(49076 /*[Test ScriptTimer\Skript 2]*/, 20);

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.

Noch Fragen? Oder habe ich was falsch verstanden?

Grüße,
Christoph

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. :):stuck_out_tongue:
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. :slight_smile:

Also auch danke an Christoph für diesen ausführlichen Test. :smiley:

Grüße,
Kai

Genau, man lern ja viel aus den Diskussionen :slight_smile:

Eine Frage hätte ich da noch: kann ich in einem Script einen ander Timer (der zu einem anderen Script gehört bzw. verlinkt ist) ausschalten?

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!

hm…, da bekomme ich aber folgende Warnung:
Warning: Skript #10316 exisitert nicht in C:\IP-Symcon\scripts\10054.ips.php on line 4

und da passiert auch nichts, ich kann den Timer weder starten noch ausschalten. Die ID habe ich von dem Timer kopiert.

sorry, hab das mit der ID überlesen, jetzt gehts.
DANKE

Du musst die ID von dem Script nehmen.
Schau mal hier: IPS_SetScriptTimer — IP-Symcon :: Automatisierungssoftware

Edit: Du warst selbst schon schneller und hast deinen Fehler gefunden.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

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

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.