Shutter Control Skript mit Timer aktualisiert Position nicht + WebFront ErrorCode 2

Hallo Zusammen,

ich bin gerade intensiv dabei, alles über das Webfront bedienbar zu machen. Soweit klappt das auch (nochmals großes Lob - V2.2 gefällt sehr gut). Allerdings habe ich ein Problem mit dem Shutter Control. Das (im Handbuch dargestellte) Skript funktioniert natürlich im Webfront problemlos. Aber die mehrfache Ausführung ist damit schwierig, da jede Ausführung bis zum Abschluß der Rolladenfahrt ja blockiert ist (es gibt ja genügend Einträge dazu im Forum). Auch der Aufruf über IPS_RunScriptEx hilft bei 13 Rolläden nur bedingt weiter (max. 10 PHP Threats gleichzeitig). Nun habe ich das Shutter Controll Skript mit Timer gefunden. Das würde zwar die mehrfache Ausführung deutlich verbessern, aber die Position wird dabei nicht mehr aktualisiert und beim Ausführen über das Webfront kommt ein Fehler (siehe angehängte Fehlermeldung). Der Rolladen fährt trotzdem (ausreichend genau) auf die gewünschte Position. Hat jemand eine Idee? Der zugehörige Timer wird angelegt (sprich der V2.1 Umstellungsbug sollte nicht schuld sein:

		//IPS_SetEventScript($newtimer, $IPS_SELF); //Aktuelles Skript aufrufen
		IPS_SetParent($newtimer, $IPS_SELF); // NEU WEGEN IPS2.1

Kurz gesagt: Man klickt auf 25% im Webfront oder nutzt den Befehl SC_Move(12345,25) und der Rollladen fährt auch dahin. Aber die Position im ShutterControl bleibt auf dem alten Wert stehen. Und im Webfront kommt der Fehler.

Für Ideen bin ich sehr dankbar. Ich vermute das Shutter Control erwartet eine Rückmeldung. Aber wo und wie?

Bussystem: LCN mit Relais (das Skript ist hier auch leicht modifiziert zur sicheren Umschaltung der Richtung etc).
IPS: V2.2 #1671

Ich weiß es gibt gute Ausweichskripts - aber ich würde gerne beim Shutter Control bleiben.

Danke schon mal.

Hier 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 */

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);
switch($instance['ModuleInfo']['ModuleID'])
{
  case "{48FCFDC1-11A5-4309-BB0B-A0DB8042A969}": //FS20
      $running = CreateVariableByName($SC_INSTANCE, "Moving", 0);
      $value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE, "StatusVariable"));
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          if(GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, $value);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_UP:
          if(!GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, true);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "FS20U");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
                    IPS_Sleep($SC_DURATION);
              FS20_SwitchMode($SC_INSTANCE, true);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_DOWN:
          if(!GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, false);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "FS20D");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              FS20_SwitchMode($SC_INSTANCE, false);
              SetValue($running, false);
          }
          break;
      }
      break;
  case "{1B7B5B7D-CAA9-4AB5-B9D8-EC805EC955AD}": //xComfort
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          MXC_ShutterStop($SC_INSTANCE);
          break;
         case SC_DIRECTION_UP:
          MXC_ShutterMoveUp($SC_INSTANCE);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "XCOM");
          }
          if($SC_DURATION > 0 and $SC_DURATION <= 999)
          {
              IPS_Sleep($SC_DURATION);
              MXC_ShutterStop($SC_INSTANCE);
          }
          break;
         case SC_DIRECTION_DOWN:
          MXC_ShutterMoveDown($SC_INSTANCE);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "XCOM");
          }
          if($SC_DURATION > 0 and $SC_DURATION <= 999)
          {
              IPS_Sleep($SC_DURATION);
              MXC_ShutterStop($SC_INSTANCE);
          }
          break;
      }
      break;
      case "{2D871359-14D8-493F-9B01-26432E3A710F}": //LCN
      $type=LCN_GetUnit($SC_INSTANCE);
        switch($type)
        {
            case 0: //Ausgänge

                switch($SC_DIRECTION)
              {
             case SC_DIRECTION_STOP:
             LCN_SetIntensity($SC_INSTANCE,0,0);
              LCN_SetIntensity($SC_INSTANCE2,0,0);
              break;
             case SC_DIRECTION_UP:
              LCN_SetIntensity($SC_INSTANCE,100,4);
              if($SC_DURATION > 999)
              {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNA");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE,0,0);
              }
              break;
             case SC_DIRECTION_DOWN:
              LCN_SetIntensity($SC_INSTANCE2,100,4);
              if($SC_DURATION > 999)
              {
             TimerDelay($SC_INSTANCE2, $SC_DURATION, "LCNA");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE2,0,0);
              }
              break;
              }
          break;

          case 2: //Relais
          switch($SC_DIRECTION)
              {
             case SC_DIRECTION_STOP:
               LCN_SwitchRelay($SC_INSTANCE,false); // ein/aus
               IPS_Sleep(100);
              break;

             case SC_DIRECTION_UP:
              LCN_SwitchRelay($SC_INSTANCE2,false); // Richtung
              IPS_Sleep(100);
              LCN_SwitchRelay($SC_INSTANCE,true); // ein/aus
              if($SC_DURATION > 999)
              {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNR");
                }
                if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SwitchRelay($SC_INSTANCE, false); // ein/aus
              IPS_Sleep(100);
              }
              break;

             case SC_DIRECTION_DOWN:
              LCN_SwitchRelay($SC_INSTANCE2,true); // Richtung
              IPS_Sleep(100);
              LCN_SwitchRelay($SC_INSTANCE,true);
              if($SC_DURATION > 999)
              {
                  TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNR");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SwitchRelay($SC_INSTANCE, false); // ein/aus
              IPS_Sleep(100);
              }
              break;
              }
          break;
            }
          break;
  case "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}": //1-Wire Shutter
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
           OneWireShutter($SC_INSTANCE, 0, $SC_DURATION);
          break;
         case SC_DIRECTION_UP:
           if($SC_DURATION == 0)
             $SC_DURATION = 120000;
           OneWireShutter($SC_INSTANCE, 0, $SC_DURATION);
          break;
         case SC_DIRECTION_DOWN:
           if($SC_DURATION == 0)
             $SC_DURATION = 120000;
           OneWireShutter($SC_INSTANCE, 1, $SC_DURATION);
          break;
      }
    break;
    case "{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}": //Homematic Shutter
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          break;
         case SC_DIRECTION_UP:
              HM_WriteValueFloat($SC_INSTANCE, "LEVEL", 1.0);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "HOME");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          }
           break;
         case SC_DIRECTION_DOWN:
              HM_WriteValueFloat($SC_INSTANCE, "LEVEL", 0.0);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "HOME");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          }
           break;
      }
    break;
  default:
    die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
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));
$bus = substr($timer,0,-5);

    switch ($bus)
    {
    case "LCNA":
    LCN_SetIntensity($SCT_INSTANCE,0,0);
    break;

    case "LCNR":
    LCN_SwitchRelay($SCT_INSTANCE,false);
    IPS_Sleep(100);
    break;

    case "XCOM":
    MXC_ShutterStop($SCT_INSTANCE);
    break;

    case "HOME":
    HM_WriteValueBoolean($SCT_INSTANCE, "STOP", true);
    break;

    case "FS20U":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
        FS20_SwitchMode($SCT_INSTANCE, true);
       SetValue($running, false);
    break;

    case "FS20D":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
       FS20_SwitchMode($SCT_INSTANCE, false);
      SetValue($running, false);
    break;

    }



break;
}


function OneWireShutter($ins, $dir, $sec) {
   @TMEX_F29_SetStrobe($ins, True);
   $res = ($dir * 128) + ($sec / 1000);
   @TMEX_F29_SetPort((integer)$ins, (integer)$res);
}

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_SetParent($newtimer, $IPS_SELF); // NEU WEGEN IPS2.1

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

?>

nimm mal aus dem Script ganz oben vor dem <? die Leerzeichen weg, dann sollte es gehen.

Gruß

Manfred

…und wenn´s das nicht war, dann sag mal, welches Zeile 433 ist. Ist zum Abzählen dann doch ein bißchen viel. :smiley:

Vielen Dank für die schnellen Antworten. Also das Leerzeichen ganz oben war wohl (leider) nicht schuld (ich bin schon im Boden versunken). Fehler bleibt bestehen. Und wichtig. Der Fehler in Zeile 433 kommt ja von der Datei …\IP-Symcon\webfront\data\ips.php - hier ein Ausschnitt (die Zeile 433 ist rot gekennzeichnet - im Ausschnitt fast ganz unten zu finden) - Danke.

IPS_RequestAction($instanceID, $ident, $value);

		case "doAction":
			$result = "success";
			if ((int)$_GET['VariableCustomAction'] > 0)
			{
				$variableID = (int)$_GET['VariableID'];
				$linkedID = getLinkedID($variableID);
				$actionID = getLinkedID((int)$_GET['VariableCustomAction']);
				$value = stripslashes(utf8_decode($_GET['Value']));
				
				$variable = IPS_GetVariable($linkedID);
				switch ($variable['VariableValue']['ValueType'])
				{
					case 0: $value = (bool)$value; break;
					case 1: $value = (int)$value; break;
					case 2: $value = (float)$value; break;
					case 3: $value = (string)$value; break;
				}
				
				$vars = array();
				$vars['IPS_SENDER'] = "WebFront";
				$vars['IPS_VARIABLE'] = $linkedID;
				$vars['IPS_VALUE'] = $value;
				$vars['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
				if ($linkedID != $variableID) { $vars['IPS_LINK'] = $variableID; }

				$cmdError = IPS_RunScriptWaitEx($actionID, $vars);
				if (trim($cmdError) !== "")
				{
					raiseError($cmdError, "");
				}
				else
				{
					echo prepareContent(array("sid"=>SID, "cmdResult"=>$result));
				}
			}
			else
			{
				$instanceID = getLinkedID((int)$_GET['InstanceID']);
				$ident = stripslashes($_GET['VariableIdent']);
				$value = stripslashes(utf8_decode($_GET['Value']));
				$variable = IPS_GetStatusVariable($instanceID, $ident);
				
				switch ($variable['VariableType'])
				{
					case 0: $value = (bool)$value; break;
					case 1: $value = (int)$value; break;
					case 2: $value = (float)$value; break;
					case 3: $value = (string)$value; break;
				}
				
				IPS_RequestAction($instanceID, $ident, $value);
				echo prepareContent(array("sid"=>SID, "cmdResult"=>$result));
			}
		break;

Der Fehler wird nur an die ips.php weitergereicht. ShutterControl gibt die Meldung aus, wenn das ShutterControl-Skript eine Rückgabelänge > 0 Zeichen hat. Daher solltest Du mal kontrollieren, ob am Anfang / Ende des Skripts nicht noch Leerzeichen oder Zeilenumbrüche vor/nach dem <? / ?> sind.

Soweit hatte ich das befürchtet (also das mit dem weiterreichen). Aber irgendwo wird es doch evtl. Hinweis zur Verwendung des Shutter Moduls geben? Ich vermute es benötigt ein Feedback oder überwacht die Laufzeit. Die Rollos laufen für einen 25% Sprung gute 8 sek. Für die volle Fahrt dann 21 Sek. … aber das ist ja unwichtig für das Shutter Control. Wobei ich kann ehrlich gesagt auch im originalen Skript keine großen Unterschiede finden. Einmal wird der IPS Sleep Befehl abgewartet und das Relais ausgeschaltet und einmal wird der Timer gestetzt und beim erneuten Aufruf wieder das Relais ausgeschaltet.

Leerzeichen nochmals geprüft. Danke für den Tip. Aber da sind kein (mehr).

Bin für jedes Feedback dankbar.

Grüße Christof

Hast Du das Skript eventuell mit UTF-8 mit Byte Order Mark kodiert gespeichert? Das könnte eine Rückgabe erzeugen. Da hilft das Abspeichern als ANSI oder UTF-8 ohne BOM.

Gute Frage - Drag & Drop vom Forum heraus via RDC Sitzung in die IPS Console … Sprich dort zuerst ein neues leeres Skript erzeugt und dort hinein die Zwischenablage kopiert. 100mal gemacht. Aber das könnte schon trotzdem schief gegangen sein … ich versuch das mal mit Notpad+ zu prüfen.

DANKE!:slight_smile:

Hmm - ist UTF8 ohne BOM :confused:,

Aber - ich habe kurzer Hand das Skript neu abgetippt (nur mit LCN) - und siehe da - Problem ist das Weg. Nur beim ersten Aufruf kommt noch die Meldung. Bei den folgenden Aufrufen kommt nichts mehr und die Position wird sauber gesetzt.

Vielen Dank für die Unterstützung - warum auch immer - irgendwo im Skript war ein „unsichtbarer“ Fehler - oder ich war blind - will ich nicht ganz ausschliessen.

Wenn alles passt, folgt das Skript. Ich versuche den Fehler (vermutlich in der Funktion TimerDelay) noch zur finden.

Danke.