Shutter Control schaltet nur einen Rollladen

Hallo,

ich habe 2 Instanzen der Shuttercontrol eingerichtet. Komischerweise schaltet immer der gleiche Rollladen, egal welche Instanz ich bemühe. Ich habe leider keine Idee, woran es liegen kann.

Folgendes Szenario:

Rollladen A hat 3 Tasten, die von einem 4 Kanal Schaltmodul betätigt werden (also 3 aktive Instanzen)

Rollladen B hat ebenso 3 Tasten, die von einem anderen 4 Kanal Schaltmodul betätigt werden.

Ich habe nun 2 Instanzen des Shuttercontrolmoduls angelegt. Transmit Device ist jeweils die eigene Instanz des Shuttermoduls.

Mein Handlerscript habe ich folgendermaßen angepasst:

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

?>

hier noch das Include-Script, welches mir die Tastenzuordnung zum jeweiligen Shuttercontrolmoduls herstellt (ID 57236)

<?

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

?>

45568 ist das Shuttercontrol des rechten Rollladens, 12058 entsprechend das linke.

Ich habe per IPS_Logmessage schon überprüft -> es wird der richtige Case-Block abgearbeitet. Also linkes Modul durchläuft define Block des linken Moduls und das rechte Modul durchläuft den Block des rechten.

Leider fährt aber generell nur der linke Rollladen, egal welches der beiden Shuttercontrol ich ansteuere.

(direktes Schalten der 2 Schaltmodule funktioniert, d.h. Adressen sind richtig programmiert)

Hat jemand eine Idee?

Vielen Dank

Stefan

Hallo Stefan,

mir scheint Du machst einen schweren Fehler (oder ich habe Dich nicht verstanden):

Beispiel: Du legst 3 Instanzen vom Modul-Typ „KFZ“ an: 1 PKW, 1 LKW und einen Bagger.
Du versuchst nun diese drei Instanzen anhand ihrer Modul-ID zu unterscheiden. Das wird Dir nicht gelingen, da alle drei vom selben Typ („KFZ“) sind.
Bei IP-Symcon hat die Modul-ID die Form {xxxxxxxx-…-xxxxxxxx}. Sie wird für normale Programmierarbeiten so gut wie nie benötigt.

Als Unterscheidungsmerkmal wird üblicherweise die 5-stellige Instanzen-ID verwendet.

Gruß
HJH

Hallo Stefan. Das Prinzip scheint ok zu sein (Hatte an soeine Konstruktion garnicht gedacht, als ich das ShutterModul gebaut habe).

Es sollte eigentlich funktionieren. Du kannst ein paar IPS_LogMessage hinzufügen, um zu sehen, was schiefläuft.

paresy

Hallo ihr beiden,

dann habe ich das „Prinzip“ tatsächlich nicht verstanden.

Kann mir das einer mal etwas näher erklären?

Gruß
HJH

Da er im ShutterControl als „Transmit Device“ die Shutter Instanz selbt gewählt hat, ist deren ID im $SC_INSTANCE drin. Durch den include/switch,case setzt er die Instanzen zum Schalten und durch den switch/case auf die GUID vom ShutterControl übergibt der die InstanzIDs an die FS20 Funktionen zum schalten.

paresy

Hallo,

ich habe die Modul-ID gewählt, um möglichst geringe Änderungen am Handler-Script auszuführen und nahe am Standard zu bleiben. Aus diesem Grund habe ich die Modul-ID der Shuttercontrol eingefügt, da ich dies bei mir als Transmitdevice ausgewählt habe.

Um das Prinzip nochmals kurz und einfach zu erklären (mit nur einem Rollladen):

1x Shuttercontrol Instanz
4x FS20 Kanäle, von denen 3 Stück direkt an die Bedienung des Rollladens gelötet wurden, ein Kanal bleibt unbenutzt
1x Rollladendefinitionsskript

Im Shuttercontrol ist als Transmit-Device das Shuttercontrol selbst gewählt (da ich ansonsten ja 3 verschiedene Transmitdevices hätte).

Das Handlerskript wird nun aufgerufen -> InstanceID ist das aufrufende Shuttercontrolmodul (dieses definiert ja genau den betroffenen Rollladen).

Über die include-Anweisung überprüfe ich die Instance-ID des Shuttercontrol Moduls und definiere die Instance-IDs der 3 betroffenen Rollladen"knöpfe" bzw. zugehörigen FS20 Kanäle.

Im Case-Block des Handler-Skriptes habe ich nun einen neuen Funktionsblock speziell mit meinen einfachen Befehlsfolgen integriert (stark an die FS20 Variante angelehnt). Um diesen Block anzusteuern brauche ich die Module-ID des Shuttercontrolmoduls, da dieses ja das Transmitdevice ist.

Da ich momentan 2 Rollläden besitze, habe ich 2 Shuttercontrol Instanzen und 2 Blöcke im Rollladendefinitionsskript.

Leider (warum auch immer) fährt bei jeder der beiden Instanzen immer nur der rechte Rollladen herunter. Über die Logging Festures habe ich schon herausgefunden, dass der richtige Case-Block zum zugehörigen Shuttercontrolmodul durchlaufen wird. Ich habe keine Ahnung, warum die falschen FS20 Kanäle schalten.

Diesen exotischen Weg habe ich gewählt, um einfach weitere Rollläden einbinden zu können (wäre ein Dreizeiler in der Rollladendefinition) und das Handlerscript funktionell möglichst im Originalzustand zu belassen.

Hat jemand noch eine Idee, woran es liegen könnte? Kann ich irgendwelche Logs posten?

Vielen Dank

Stefan

Hallo,

vielen Dank für eure Ausführungen. Ich werde jetzt mal darüber nachdenken (als Trockenübung, da ich kein Shuttercontrol habe). :slight_smile:

Gruß
HJH

Hallo,

wenn ich mich nicht irre, hat muckel 14 Rolladen und steuert die damit. Er hat 1 x das Shutter_Script eingerichtet.

dann hat er 14 x die Instanz des Rolladen (Hardware) eingerichtet und 14 x das ShutterControl. In diesem wird die Instanz des Rolladen zugeordnet als Transmit Instance 1 und das Shutter_Script. Das ist bei allen gleich.

Damit funktionierts bei ihm als auch bei mir. Vielleicht hilft die Kurzbeschreibung.

Hallo,

vielen Dank für die Informationen.

Hat IP-Symcon einen Scriptcache oder ähnliches? Nach einem Neustart des Serverdienstes (die Skripte habe ich nicht geändert) werden auf einmal die richtigen Rollläden angesprochen (so wie ich es mir auch überlegt hatte).

Also 1x Handlerscript, 1x Rollladenunterscheidungsscript, 2x Shuttercontrol-Modul.

Und es funktioniert :D:D:D

Vielen Dank

Stefan

Genau so ist es :wink: