Shutter Handler Debugging

Hallo Leute!

Ich werde noch Wahnsinning. Ich habe heute in meinem Shutterscript eine kleinere Änderung vorgenommen, und erhalte seither im Webfront die Fehlermeldung „Fehler Shutter Handler Result“ und die Uhrzeit der Ausführung. Das Skript wird als fehlerhaft markiert.
Bei den Meldungen in der Verwaltungskonsole tut sich nichts, in der Logdatei steht nur „Fehler“.

Kein Hinweis, in welcher Zeile der Fehler ist oder um was für einen Fehler es sich handeln könnte.
Wenn ich das Skript komplett leere kommt der Fehler nicht. Wenn ich nur "IPS_LOGMESSAGE(„Test“,$IPS_SENDER); " reinschreibe, kommt wieder im Webfront der obige Fehler. Wenn ich das Skript mit dem Ausführen-Knopf starte, kommt der Fehler nicht und es wird auch brav „Test Execute“ geloggt.

Wie kann ich so was debuggen? Hat jemand eine Idee, was das sein könnte?

LG
Hugo

IPS_LogMessage($_IPS['SENDER'], "Test");

Hallo Rainer!

Danke für die Antwort. Die Fehlermeldung bei dem speziellen Beispiel kommt jetzt nicht mehr, obwohl ich den Unterschied nicht verstehe.
Wenn ich nun aber den Rest des Skripts (das vorher schon funktionierte) wieder einkommentiere, kommt wieder „Fehler Shutter Handler Result:“.
Gibt es nirgendwo ein Log, aus dem ich auslesen kann in welcher Zeile der Fehler auftritt oder was für ein Fehler das ist?

LG
Hugo

Der Fehler, sollte in den Meldungen stehen. Häng mal dein Script hier an, eventuell sieht man ja was falsch ist.

Der Unterschied hierzu sollte dir aber schon auffallen.

IPS_LOGMESSAGE(„Test“,$IPS_SENDER);

IPS_LogMessage($_IPS[‚SENDER‘], „Test“);

Klar, fällt mir ein Unterschied auf. Ich verstehe nur nicht, warum $IPS_SENDER nicht funktioniert (ist doch eine Systemvariable und bringt bei Ausführen auch „Execute“ als Ergebnis).

Hier mal das Skript:


<?
//Variables provided by ShutterControl Module
//IPS_LogMessage("InstanceID", $SC_INSTANCE); /* InstanceID */
//IPS_LogMessage("Direction", $SC_DIRECTION); /* {0..2} Stop, Up, Down */
//IPS_LogMessage("Duration", $SC_DURATION); /* ms */
//IPS_LogMessage($_IPS['SENDER'], "Test");

switch($_IPS['SENDER']){
case "ShutterControl": //Script wurde vom Shuttermodul aufgerufen

define("SC_DIRECTION_STOP", 0);
define("SC_DIRECTION_UP", 1);
define("SC_DIRECTION_DOWN", 2);

$instance = IPS_GetInstance($SC_INSTANCE);
      $running = CreateVariableByName($SC_INSTANCE, "Moving", 0);
      $value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE, "StatusVariable"));
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          if(GetValue($running))
          {
              IPS_LogMessage($SC_INSTANCE, $value);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_UP:
          if(!GetValue($running))
          {
              IPS_LogMessage($SC_INSTANCE, true);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "BTicino_UP");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
                    IPS_Sleep($SC_DURATION);
              IPS_LogMessage($SC_INSTANCE, true);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_DOWN:
          if(!GetValue($running))
          {
              IPS_LogMessage($SC_INSTANCE, false);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "BTicino_DN");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              IPS_LogMessage($SC_INSTANCE, false);
              SetValue($running, false);
          }
          break;
      }
break;

case "TimerEvent": //Script wurde von einem Ereignis aufgerufen

IPS_SetEventActive($IPS_EVENT, false);    //Ereignis deaktivieren
$timer=IPS_GetName($IPS_EVENT);
$SCT_INSTANCE = intval(substr($timer,-5,5));

    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
      IPS_LogMessage($SCT_INSTANCE, false);
      IPS_LogMessage("Shutter Test","Script wurde vom Ereignis aufgerufen, Stop wurde gesendet. Wert der Positionsvarible: " . GetValue(IPS_GetVariableIDByName("Position",$SCT_INSTANCE)));
      if (GetValue(IPS_GetVariableIDByName("Position",$SCT_INSTANCE)) == 99){
         IPS_LogMessage("Shutter Test", "Rollo fährt hoch");
         ips_sleep(1000);
         IPS_LogMessage("Shutter Test", "Rollo stoppt und ist jetzt gekippt");
      }
      SetValue($running, false);


break;
}


function TimerDelay($id, $time, $bus) {
    global $IPS_SELF;
    $sekunden=intval(substr($time, 0,-3));
   $msekunden=substr($time, -3, 3);
   $timerid = IPS_GetObjectIDByName($bus.$id, $IPS_SELF);
    if ($timerid ==0)
    {
    $newtimer = IPS_CreateEvent(1);
   IPS_SetEventScript($newtimer, $IPS_SELF); //Aktuelles Skript aufrufen
   IPS_SetName($newtimer, $bus.$id);
   IPS_Sleep(intval($msekunden));
   IPS_SetEventCyclic($newtimer, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($newtimer, 0, 0);
    IPS_SetEventCyclicTimeBounds($newtimer, time(), 0);
    IPS_SetEventActive($newtimer, true);    //Ereignis aktivieren
   }
   else
   {
   IPS_Sleep(intval($msekunden));
   IPS_SetEventCyclic($timerid, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($timerid, 0, 0);
    IPS_SetEventCyclicTimeBounds($timerid, time(), 0);
    IPS_SetEventActive($timerid, true);    //Ereignis aktivieren
   }
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
     $vid = IPS_CreateVariable($type);
     IPS_SetParent($vid, $id);
     IPS_SetName($vid, $name);
     IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
   }
   return $vid;
}


?>

Es ist die zurechtgestutzte Version des Shutterscripts, das Timer für die Laufzeit verwendet. Statt den Kommandos zum Steuern des Bussystems habe ich IPS_Logmessage verwendet um es auszutesten ohne dass ständig die Rollos hin und herfahren.

LG
Hugo

Du nutzt die 2.5

global $IPS_SELF; entfällt

ersetzen.

IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);

Aha, das erklärt schon mal was.

Ich habe alle

$IPS_SENDER

durch

$_IPS['SENDER']

ersetzt und bekomme immer noch die gleiche Meldung.

Es läuft nicht mal bis zur IPS_LogMessage (siehe Codeschnipsel) durch.


switch($_IPS['SENDER']){
case "ShutterControl": //Script wurde vom Shuttermodul aufgerufen
IPS_LogMessage($_IPS['SENDER'], "Test");

So. Problem gelöst. Ich könnt mich … :mad:

Falls jemand, auch in so ein Problem rennt - ich habe die Instanzen per Skript angelegt. Die Instanzen waren im Objektbaum auch vorhanden. Leider habe ich IPS_ApplyChanges vergessen und somit konnte rannte das Skript in den Fehler.

LG
Hugo