Shuttercontrol blockiert IPS-Console während Rollladenfahrt

Hallo,

Ich habe mir ein Testscript mit folgender Befehlszeile geschrieben:

SC_Move(xxxx,100);

Also komplettes schließen des Rollladens.

Wenn ich dieses Script von der Console aus starte, reagiert diese auf keine Eingabe mehr, solange der Rollladen fährt. Nach Ende der Fahrt ist sie wieder freigegeben und ich kann normal weiter arbeiten.

Woran kann dies liegen (Bug?). Es ist recht ungünstig, wenn meine Konsole für ca. 30 Sekunden komplett blockiert ist.

anbei nochmals meine Skripte:

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

// umgeschrieben - $SC_Instance bestimmt den betroffenen Rollladen und wird hier im Skript unterschieden
include("57236.ips.php");

if($IPS_SENDER != "ShutterControl")
 die("This script can only be started by the ShutterControl Module");

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 "{542CC907-CA63-4E7A-A8C7-92F74639FA4C}": //Shutter Control by SW
		$running = CreateVariableByName($SC_INSTANCE, "Moving", 0);
      //$value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE, "StatusVariable"));
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          if(GetValue($running))
          {
              FS20_SwitchDuration(Rollladen_mitte, true,1);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_UP:
          if(!GetValue($running))
          {
              FS20_SwitchDuration(Rollladen_oben, true,1);
              SetValue($running, true);
          }
          if($SC_DURATION > 0)
          {
              IPS_Sleep($SC_DURATION);
              FS20_SwitchDuration(Rollladen_mitte, true,1);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_DOWN:
          if(!GetValue($running))
          {
              FS20_SwitchDuration(Rollladen_unten, true,1);
              SetValue($running, true);
          }
          if($SC_DURATION > 0)
          {
              IPS_Sleep($SC_DURATION);
              FS20_SwitchDuration(Rollladen_mitte, true,1);
              SetValue($running, false);
          }
          break;
      }
      break;


  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 > 0)
          {
              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 > 0)
          {
              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 > 0)
          {
              IPS_Sleep($SC_DURATION);
              MXC_ShutterStop($SC_INSTANCE);
          }
          break;
         case SC_DIRECTION_DOWN:
          MXC_ShutterMoveDown($SC_INSTANCE);
          if($SC_DURATION > 0)
          {
              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 > 0)
            {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE,0,0);
            }
            break;
          case SC_DIRECTION_DOWN:
            LCN_SetIntensity($SC_INSTANCE2,100,4);
            if($SC_DURATION > 0)
            {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE2,0,0);
            }
            break;
        }
        break;
      case 2: //Reais
        switch($SC_DIRECTION)
        {
          case SC_DIRECTION_STOP:
            LCN_SwitchRelay($SC_INSTANCE,false);
            break;
          case SC_DIRECTION_UP:
            LCN_SwitchRelay($SC_INSTANCE,true);
            LCN_SwitchRelay($SC_INSTANCE2,false); // Um Relaisrichtung zu ändern bitte auf true
            if($SC_DURATION > 0)
            {
            IPS_Sleep($SC_DURATION);
            LCN_SwitchRelay($SC_INSTANCE,false);
            }
            break;
          case SC_DIRECTION_DOWN:
            LCN_SwitchRelay($SC_INSTANCE,true);
            LCN_SwitchRelay($SC_INSTANCE2,true);// Um Relaisrichtung zu ändern bitte auf false
            if($SC_DURATION > 0)
            {
            IPS_Sleep($SC_DURATION);
            LCN_SwitchRelay($SC_INSTANCE,false);
            }
            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 > 0)
          {
              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 > 0)
          {
              IPS_Sleep($SC_DURATION);
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          }
           break;
      }
    break;
  default:
    die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}

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

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

?>
<?

// Rollladen links
switch($SC_INSTANCE)
{
case 12058:
   define("Rollladen_oben", 58689 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rolladen_links_Shutter Control\.E3_Wohnzimmer_Rolladen_links_Taste_oben]*/);
   define("Rollladen_mitte", 25327 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rolladen_links_Shutter Control\.E3_Wohnzimmer_Rolladen_links_Taste_mitte]*/);
   define("Rollladen_unten", 34977 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rolladen_links_Shutter Control\.E3_Wohnzimmer_Rolladen_links_Taste_unten]*/);
	break;

// Rollladen rechts
case 45568:
   define("Rollladen_oben", 19315 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rollladen_rechts_Shutter Control\.E3_Wohnzimmer_Rolladen_rechts_Taste_oben]*/);
   define("Rollladen_mitte", 50957 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rollladen_rechts_Shutter Control\.E3_Wohnzimmer_Rolladen_rechts_Taste_mitte]*/);
   define("Rollladen_unten", 33733 /*[Innenbereich\Wohnhaus\Etage 3\Wohnzimmer\E3_Wohnzimmer_Rollladen_rechts_Shutter Control\.E3_Wohnzimmer_Rolladen_rechts_Taste_unten]*/);
	break;
}

?>

Vielen Dank

Stefan

Hy,
wurde irgendwo mal beschrieben das es so ist.

Hallo Stefan,

das Problem liegt in dem oberen Script.

 if($SC_DURATION > 0) 
          { 
              IPS_Sleep($SC_DURATION);              <------------------------ !!!
              FS20_SwitchMode($SC_INSTANCE, true); 
              SetValue($running, false); 
          } 

case SC_DIRECTION_UP: 
           if($SC_DURATION == 0) 
             $SC_DURATION = 120000;                <------------------------ !!! 
           OneWireShutter($SC_INSTANCE, 0, $SC_DURATION); 
          break; 

Mit IPS_Sleep wird das Scipt für 120000 Millisekunden = 120 Sekunden angehalten !
Rufst Du das Script über die Console auf, sie ist diese solange blockiert!

siehe auch :

IPS_Sleep - IP-Symcon :: Automatisierungssoftware

Lösungsmöglichkeit:

Diese Script-Teile in eigenständige Scripte auslagern.

Hallo,

das Problem ist so, da der Sleep Befehl das Script „anhält“.
Problematischer wird das noch wenn man (wie ich) als „Alles Runter“ 30 Rolläden/Jalousien auf einmal startet. Und das ist nicht nur in der Konsole das Problem, auch wenn man so ein Script im Designer per Button startet ist der Designer blockiert.

Ich bin gerade daran das Shutterscript so umzubauen, dass der Sleep Befehl durch einen Timer, welcher das Script erneut aufruft. Somit kann man die Blockade aufheben.

Ich mach das für meine LCN Anlage, allerdings kann man diese Function dann sicherlich auch mit FS20 oder anderen Systemen nutzen.

Wird aber bei mir noch etwas dauern, da meine Zeit gerade etwas eingeschränkt ist.

Gruß Philipp

Scripte mittels die mittels IPS_RunScriptEx ( string SkriptID, array Parameter ) aufgerufen werden haben dieses Problem nicht.:wink: Das liegt an paresys geändertem Errorhandling.:wink:

Trotzdem ist die Lösung mit den Timern besser, da sie die PHP Threads nicht unnötig aufhalten. Bei 30 Rolladen würden in der normalen Einstellung nur max. 10Stk gleichzeitig fahren und für die Dauer der 30 Rolladen würden keine anderen Ereignisse in IPS ausgeführt, was nicht gerade optimal ist.

paresy

Hallo Micha,

ich gebe Dir grundsätzlich natürlich recht, dass der Einsatz eines Timers die bessere Alternative und sauberere Programmierung darstellt.
Meine Antwort bezog sich auch eher auf:

…auch wenn man so ein Script im Designer per Button startet ist der Designer blockiert.

Und es ist schon nervig, dass schon von 2 Sekunden Sleep das Dashboard nicht mehr zum arbeiten zu bewegen ist. Im übrigen war der Einsatz eines NOP (No Operation Performed),was dem Sleep() Befehl ähnelt eine brauchbare Progammierfunktion in der Assemblersprache. (für kurze Wartezeiten!)

Hallo,

so, habe das Shutterscript jetzt umgebaut, so dass statt dem Sleep-Befehl ein Ereignis angelegt wird, welches dann das Shutterscript wieder startet.
Wird das Shutterscript per Ereignis aufgerufen werden die STOP-Befehle gesendet.

Das Shutterscript legt für jede Instance ein Ereignis an, welches als Namen die Instance bekommt, somit hat man die Info welche Instance durch das Ereignis angesprochen werden soll.

Habe es bisher mit einer Test-Jalousie getestet, und es funktioniert :slight_smile:
Leider ist dasScript noch etwas „dirty“ so dass ich es erst noch ins reine bringen muss. Wird aber nicht mehr lange dauern :slight_smile:

Ich werde dann nicht nur LCN integrieren, sondern auch die anderen Systeme, welche bisher im Script unterstützt werden.

Gruß

Philipp

Hallo Philipp,

ganz sauber waere es, wenn nach der „Arbeit“ das Ereignis auch wieder geloescht wird. Hast Du das gleich mit vorgesehen? Dann haette man damit eine ganz saubere Struktur.

Hallo Torro,

gelöscht nicht, aber es wird deaktiviert, damit sieht man im Treeview gleich welches aktiv ist und welches nicht.

Von daher denke ich ist die Struktur schon übersichtlich.

Gruß

Philipp

ok, verstanden. So ist es auch ok.

:slight_smile:

Na dann will ich mal schauen, ob ich heute Abend noch zum „cleanen“ des Scripts komme :wink:

Und natürlich auch zum integrieren der Timer für die anderen im Shutterscript unterstützten Systeme :slight_smile:

Gruß Philipp

Hallo Philipp,

hat es mit dem Script geklappt? Ich wäre sehr interessiert an der Timer-Variante und würde mich über das Script freuen.

Vielen Dank

Stefan

Hallo,

sorry kam noch nicht dazu, mal schauen ob das heute geht :slight_smile:

Gruß

Philipp

Hallo,

so habe das Script nun auch mit mehreren Jalousien getestet, und es funktioniert :slight_smile: bei mir mit LCN problemlos.

Ich habe die anderen Systeme auch reingepackt, konnte die aber mangels Vorhandensein der Systeme nicht testen. Daher poste ich hier das Script mit der Bitte um Rückmeldung ob es mit den anderen Systemen auch sauber läuft. Wenn dem dann so ist werde ichs Paresy für die Doku zusenden.


<?
//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);
          	break;
         	case SC_DIRECTION_UP:
          	LCN_SwitchRelay($SC_INSTANCE,true);
          	LCN_SwitchRelay($SC_INSTANCE2,false); // Um Relaisrichtung zu ändern bitte auf 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);
          	}
          	break;
         	case SC_DIRECTION_DOWN:
          	LCN_SwitchRelay($SC_INSTANCE,true);
          	LCN_SwitchRelay($SC_INSTANCE2,true);// Um Relaisrichtung zu ändern bitte auf false
          	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);
          	}
          	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);
	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_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;
}





?>

Wie gesagt bitte ich um Feedback für die unterschiedlichen Systeme.
Nutzung auf eígene Gefahr.

Gruß Philipp

Hallo,

das Prinzip scheint gut zu funktionieren. Ich habe wieder meine Anpassung eingefügt und nach ein wenig schwitzen funktioniert es auch super.

Vielen Dank.

Einzig beim ersten Anlegen des Timers bekomme ich einmalig eine Fehler- bzw. Statusmeldung mit der Beschreibung „-“ angezeigt.

Nochmals vielen Dank für die Umsetzung mit den Timern.

Stefan

Hallo,

freut mich dass es geht :slight_smile:

Die Meldung beim ersten anlegen resultier aus der Rückmeldung aus dem check ob die Variable existiert. VOn daher kann man das getrost vernachläaasigen :slight_smile:

Danke fürs Feedback :slight_smile:

Philipp

Hallo Philipp,

hast Du das fuer 1-Wire auch implementiert oder nicht? Weil ich im Script dort noch einige Sleep Befehle gesehen habe, ich dachte, Du hast es komplett ueberarbeitet? Oder habe ich das jetzt falsch verstanden?

Hallo Torro,

ist komplett überarbeitet.

Nur funktionieren Timer nur im Sekundebereich, so dass ich bei einer Duration < 1 Sekunde die MS weiterhin über den Sleep Befehl im Script abarbeite.

Aber alles in Sekunden wird in die Timer ausgelagert.

Gruß Philipp

Hallo Philipp,

ich habe hier Moeller xComfort, das Script läuft, bis auf den Fehler am Anfang beim ersten mal setzen, ohne Probleme.

Klasse Arbeit.:smiley:

Viele Grüße

Olaf