Bewegung/Anwesend Rücksetzung funktioniert nur manchmal

Hallo Zusammen

Ich habe das Bewegungsmelderscript von paresy meinen Bedürfnissen angepasst. Bei Bewegung wird bei entsprechender Dunkelheit das Licht eingeschaltet und die Anwesenheitsvariabel gesetzt. Wenn 15 Minuten keine Bewegung mehr erkannt wird, soll die Anwesenheitsvariabel wieder auf false gesetzt werden. Und genau da liegt das Problem. Das passiert nur in ca 50% der Fälle. Sonst bleibt sie einfach auf Anwesend stehen. (das Licht ist aus) Was mache ich falsch? Liegt es am Code oder am ScriptTimer?

Danke für eure Hilfe
gruss remo

<?
$somemove = GetValueBoolean("Bewegung_Remo");
// Lux von der WS2000
$Lux = GetValueInteger("Lux_WS");
$Luxtag = 5000;
$lastmove = GetValueInteger("Anwesend_Dach_Zeit");
$jemandda = GetValueBoolean("Anwesend_Dach");
$lichtflur = GetValueBoolean("Steckdose.Licht_Remo.Status");
$nachtsch = GetValueBoolean("Nachtschalter_Remo");
if ($somemove == True)  {                                // Bewegung erkannt
   SetValueBoolean("Bewegung_Remo",False);                  // zurücksetzen
   SetValueInteger("Anwesend_Dach_Zeit", time());           // Zeit merken
   if ($jemandda == false)  {
   SetValueBoolean("Anwesend_Dach",True);                // Flag setzen
   //TTS_Speak(12498, "Wohnung Anwesend");
    }
// Beleuchtung einschalten bei Bewegung und Dunkelheit
if (($lichtflur == False) && ($Lux <= $Luxtag) && ($nachtsch == False)) {
      IPS_RunScript("Steckdose.Licht_Remo_ON");
      IPS_SetScriptTimer("Bewegung_Remo", 600);              // false = Tag
   }
} else {                                                 // keine Bewegung dann:

// nach 15 Minuten > keiner da ! 15*60 = 900
   if ((time() >= $lastmove + 900) && ($jemandda == True)) {
//   SetValueBoolean("Bewegung_Remo",False);
   SetValueBoolean("Anwesend_Dach",False);
   IPS_RunScript("Steckdose.Licht_Remo_OFF");             // zurücksetzen
   IPS_SetScriptTimer("Bewegung_Remo",0);
   //TTS_Speak(12498, "Wohnung verlassen");
  } else {
    IPS_SetScriptTimer("Bewegung_Remo", 600);
}
}
?>

Hallo Remo,

Nach schnellem durchlesen finde ich keinen Grund dafür, dass die Variable auf Anwesend bleibt obwohl das Licht aus ist. Ich sehe nur ein kleines Problem mit den Timern. Das Licht wird erst nach 20 Minuten ausgeschaltet. Nach den ersten 10 Minuten ist die Bedingung time() >= $lastmove + 900 noch „false“. Ich würde es so machen:


if ($IPS_SENDER=="Variable") {
   $timerLightOn = 600;

   // React only on PIRI (Dunkel) Status Change
   if (GetValueBoolean("Bewegung_Remo"))
   {
      echo "Bewegung. 
";
      
      $isLightOn = GetValueBoolean("Steckdose.Licht_Remo.Status"); 
      if ($isLightOn)
      {
         echo "Licht bleibt an
";
      }
      else
      {
         echo "Licht an.
";
         IPS_RunScript("Steckdose.Licht_Remo_ON");
         SetValueBoolean("Anwesend_Dach",True);
      }
      // reinitialize the timer, independant of the light status (even if on)
      IPS_SetScriptTimer("Bewegung_Remo",$timerLightOn);
   }
}
if ($IPS_SENDER=="TimerEvent") {
   echo "Licht aus. 
";   // Turn the light off
   IPS_RunScript("Steckdose.Licht_Remo_OFF");
   SetValueBoolean("Anwesend_Dach",True);
   // Reset this Script's timer to 0 and react only on PIRI Status change
   IPS_SetScriptTimer("Bewegung_Remo",0);
}

Hallo Zapp

Vielen Dank, für die Scriptanalyse.

Verstehe ich dich richtig, dass das Script nach den ersten 10 Minuten (set Scripttimer = 600) sinnloserweise aufgerufen wird, weil die $lastmove Kondition ja nicht zutreffen kann? Dann werde ich das ändern.

Dann beobachte ich die Sache mal und wenn der Zustand bleibt, hänge ich es in den Bug-Thread.

gruss remo

Hallo Remo,

ich habe hier ein Script über das ich meine Lüftungsanlage für eine bestimmte Zeit einschalte wenn der PIRI anspricht (wenn Katze aufs Klo geht) und die Aussentemp. niedriger ist als die Raumtemp. (um im Sommer eine Aufheizung des Raumes zu vermeiden).
Im Prinzip die gleiche Funktion die du benötigst oder??
Wenn PIRI Bewegung erkennt und dunkel dann ein für eine bestimmte Zeit und dann wieder aus.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Anforderung_Lueftung.ips.php
Trigger  : Staus Bewegungsmelder
Interval : 
*/
$AT = GetValueFloat("Aussentemperatur");
$RT = GetValueFloat("Raumtemperatur_Katzenzimmer_DG");
$iLastUpdate = time() - IPS_GetUpdateTime("Status_Bewegungsmelder_Katzen_DG");
IF (($iLastUpdate < 900) and ($AT <= $RT)){
SetValueBoolean("Bewegung_Katzenzimmer",True);
 }else {
SetValueBoolean("Bewegung_Katzenzimmer",False);
}
?>

Vielleicht kannst du ja was mit anfangen.

Grüße
Thomas