Was können wir verbessern?

Dokumentation

Shutter Control

Um das IP-Symcon Shutter-Modul hardwareunabhängig zu machen, braucht das Modul ein Skript, welches sich um die Weitergabe der Befehle an Ihre Hardware kümmert.

Alle, die folgende Hardware besitzen, können das Skript einfach kopieren und verwenden. Andere Hardware lässt sich leicht hinzufügen. (Mehr dazu unterhalb des Skripts).

Skripte, die durch das Shutter-Control ausgeführt werden, beinhalten diese Systemvariablen

Dieses Skript muss im Normalfall nur einmal in IP-Symcon vorhanden sein und es können beliebig viele Instanzen darauf zugreifen. Es muss Nichts editiert werden.

Rolladen einmessen

Beim zweiten Schritt werden die Zeiten gemessen, die der Rolladen braucht, um auf die einzelnen Positionen zu fahren. Die Messung muss zweimal durchgeführt werden. Für Auf und Ab. Zum Starten wird der entsprechende Button gedrückt, woraufhin der Rolladen sich in Bewegung setzen sollte. Der Button muss erneut gedrückt werden, wenn die auf ihm stehende Position erreicht wird.

Nach jedem Einlernen müssen die Werte mit dem “Setzen” Button übernommen werden.

Tipps & Tricks

Bei einer Fahrt auf 0% und 100% werden fünf Sekunden zur Fahrzeit addiert, um eine definierte Position zu erreichen.

Sollte die Laufzeit des Rollladens oberhalb des PHP-Skript-Limits liegen (180sek) muss dieses in der php.ini erhöht werden. (siehe PHP)

Hinweise für LCN Nutzer

Das Shuttermodul kann mit dem Script universell für die Steuerung des Rolladen/Jalousie über die Ausgänge wie auch über die Relais genutzt werden.

Soll das Shuttermodul einen Rolladen/Jalousie steuern, welche/r an den zwei Ausgängen eines UPP/SH/HU hängt, dann muss unter “Instance1″ die Instanz des Ausgangs 1 des Moduls gewählt werden und für “Instance2″ die Instanz des Ausgangs 2 des Moduls. Diese Belegung entspricht dann der Standardrichtung, wie sie aus der LCN-Pro mit Hoch- bzw. Runterfahren angesteuert wird. Sollte der Anschluss umgekehrt sein, muss nur die Zuordung von Ausgang 1 und Ausgang 2 zu den Einstellungen “Instance1″ und “Instance2″ geändert werden.

Beim Betrieb mit Relais muss für “Instance1″ immer das erste Relais der beiden angegeben werden. Das erste Relais ist das, welches den Strom AN/AUS schaltet. “Instance2″ ist immer das Relais, welches die Richtung steuert.
Sollte die Fahrtrichtung verdreht sein, muss dies manuell im Script geändert werden. Im “case Block für LCN” des Shutter Scriptes findet sich an den beiden Stellen ein entsprechender Kommentar.
Für den Fall, dass man unterschiedlich verdrahtete Rolladen/Jalousien an den Relais nutzt, müssen also für die jeweiligen Konfigurationen zwei Shutterscripte verwendet werden.

Shutter Skript

//Variables provided by ShutterControl Module
//IPS_LogMessage("InstanceID", $_IPS['INSTANCE']); /* InstanceID */
//IPS_LogMessage("Direction", $_IPS['DIRECTION']); /* {0..2} Stop, Up, Down */
//IPS_LogMessage("Duration", $_IPS['DURATION']); /* ms */
 
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($_IPS['INSTANCE']);
switch($instance['ModuleInfo']['ModuleID'])
{   
    case "{932076B1-B18E-4AB6-AB6D-275ED30B62DB}": //Siemens Device S7/LOGO
        switch($_IPS['DIRECTION']) {
            case SC_DIRECTION_STOP:
                S7_WriteBit($_IPS['INSTANCE'], false);
                S7_WriteBit($_IPS['INSTANCE2'], false);
                break;
            case SC_DIRECTION_UP:
                S7_WriteBit($_IPS['INSTANCE'], true);
                if($_IPS['DURATION'] > 0) {
                    IPS_Sleep($_IPS['DURATION']);
                    S7_WriteBit($_IPS['INSTANCE'], false);
                }
                break;
            case SC_DIRECTION_DOWN:
                S7_WriteBit($_IPS['INSTANCE2'], true);
                if($_IPS['DURATION'] > 0) {
                    IPS_Sleep($_IPS['DURATION']);
                    S7_WriteBit($_IPS['INSTANCE2'], false);
                }
                break;
        }
    break;
    case "{48FCFDC1-11A5-4309-BB0B-A0DB8042A969}": //FS20
        $running = CreateVariableByName($_IPS['INSTANCE'], "Moving", 0);
        $value = GetValue(IPS_GetObjectIDByIdent("StatusVariable", $_IPS['INSTANCE']));
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                if(GetValue($running))
                {
                    FS20_SwitchMode($_IPS['INSTANCE'], $value);
                    SetValue($running, false);
                }
                break;
            case SC_DIRECTION_UP:
                if(!GetValue($running))
                {
                    FS20_SwitchMode($_IPS['INSTANCE'], true);
                    SetValue($running, true);
                }
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    FS20_SwitchMode($_IPS['INSTANCE'], true);
                    SetValue($running, false);
                }
                break;
            case SC_DIRECTION_DOWN:
                if(!GetValue($running))
                {
                    FS20_SwitchMode($_IPS['INSTANCE'], false);
                    SetValue($running, true);
                }
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    FS20_SwitchMode($_IPS['INSTANCE'], false);
                    SetValue($running, false);
                }
                break;
        }
        break;
    case "{1463CAE7-C7D5-4623-8539-DD7ADA6E92A9}": //EnOcean
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                ENO_ShutterStop($_IPS['INSTANCE']);
                break;
            case SC_DIRECTION_UP:
                ENO_ShutterMoveUp($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    ENO_ShutterStop($_IPS['INSTANCE']);
                }
                break;
            case SC_DIRECTION_DOWN:
                ENO_ShutterMoveDown($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    ENO_ShutterStop($_IPS['INSTANCE']);
                }
                break;
        }
        break;            
    case "{3DDA1E2B-B807-4680-AB6D-E7E8FBD6093A}": //digitalStrom
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                DS_ShutterStop($_IPS['INSTANCE']);
                break;
            case SC_DIRECTION_UP:
                DS_ShutterMoveUp($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    DS_ShutterStop($_IPS['INSTANCE']);
                }
                break;
            case SC_DIRECTION_DOWN:
                DS_ShutterMoveDown($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    DS_ShutterStop($_IPS['INSTANCE']);
                }
                break;
        }
        break;             
    case "{1B7B5B7D-CAA9-4AB5-B9D8-EC805EC955AD}": //xComfort
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                MXC_ShutterStop($_IPS['INSTANCE']);
                break;
            case SC_DIRECTION_UP:
                MXC_ShutterMoveUp($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    MXC_ShutterStop($_IPS['INSTANCE']);
                }
                break;
            case SC_DIRECTION_DOWN:
                MXC_ShutterMoveDown($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    MXC_ShutterStop($_IPS['INSTANCE']);
                }
                break;
        }
        break;
    case "{2D871359-14D8-493F-9B01-26432E3A710F}": //LCN Unit
        $type=IPS_GetProperty($_IPS['INSTANCE'],'Unit');
        switch($type)
        {
            case 0: //Ausgänge
                switch($_IPS['DIRECTION'])
                {
                    case SC_DIRECTION_STOP:
                        LCN_SetIntensity($_IPS['INSTANCE'],0,0);
                        LCN_SetIntensity($_IPS['INSTANCE2'],0,0);
                        break;
                    case SC_DIRECTION_UP:
                        LCN_SetIntensity($_IPS['INSTANCE'],100,4);
                        if($_IPS['DURATION'] > 0)
                        {
                        IPS_Sleep($_IPS['DURATION']);
                        LCN_SetIntensity($_IPS['INSTANCE'],0,0);
                        }
                        break;
                    case SC_DIRECTION_DOWN:
                        LCN_SetIntensity($_IPS['INSTANCE2'],100,4);
                        if($_IPS['DURATION'] > 0)
                        {
                        IPS_Sleep($_IPS['DURATION']);
                        LCN_SetIntensity($_IPS['INSTANCE2'],0,0);
                        }
                        break;
                }
                break;
            case 2: //Reais
                switch($_IPS['DIRECTION'])
                {
                    case SC_DIRECTION_STOP:
                        LCN_SwitchRelay($_IPS['INSTANCE'],false);
                        break;
                    case SC_DIRECTION_UP:
                        LCN_SwitchRelay($_IPS['INSTANCE2'],false); // Um Relaisrichtung zu ändern bitte auf true
                        LCN_SwitchRelay($_IPS['INSTANCE'],true);
                        if($_IPS['DURATION'] > 0)
                        {
                            IPS_Sleep($_IPS['DURATION']);
                            LCN_SwitchRelay($_IPS['INSTANCE'],false);
                        }
                        break;
                    case SC_DIRECTION_DOWN:
                        LCN_SwitchRelay($_IPS['INSTANCE2'],true);// Um Relaisrichtung zu ändern bitte auf false
                        LCN_SwitchRelay($_IPS['INSTANCE'],true);
                        if($_IPS['DURATION'] > 0)
                        {
                            IPS_Sleep($_IPS['DURATION']);
                            LCN_SwitchRelay($_IPS['INSTANCE'],false);
                        }
                        break;
                }
                break;
        }
        break;
    case "{C81E019F-6341-4748-8644-1C29D99B813E}": //LCN Shutter
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                LCN_ShutterStop($_IPS['INSTANCE']);
                break;
            case SC_DIRECTION_UP:
                LCN_ShutterMoveUp($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    LCN_ShutterStop($_IPS['INSTANCE']);
                }
                break;
            case SC_DIRECTION_DOWN:
                LCN_ShutterMoveDown($_IPS['INSTANCE']);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    LCN_ShutterStop($_IPS['INSTANCE']);
                }
                break;
        }
        break;            
    case "{BD0F2622-F67C-4248-9A04-316DF13914C3}":  //1-Wire Shutter Modul (e-service Online)
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                OW_SetPin($_IPS['INSTANCE'], 0, true);
                OW_SetPin($_IPS['INSTANCE'], 1, true);
                IPS_Sleep(100);
                OW_SetPin($_IPS['INSTANCE'], 0, false);
                OW_SetPin($_IPS['INSTANCE'], 1, false);
                break;
            case SC_DIRECTION_UP:
                OW_SetPin($_IPS['INSTANCE'], 0, true);
                IPS_Sleep(100);
                OW_SetPin($_IPS['INSTANCE'], 0, false);
 
                if($_IPS['DURATION'] > 0)
                {
                    OW_SetPin($_IPS['INSTANCE'], 0, true);
                    OW_SetPin($_IPS['INSTANCE'], 1, true);
                    IPS_Sleep(100);
                    OW_SetPin($_IPS['INSTANCE'], 0, false);
                    OW_SetPin($_IPS['INSTANCE'], 1, false);
                }
                break;
            case SC_DIRECTION_DOWN:
                OW_SetPin($_IPS['INSTANCE'], 1, true);
                IPS_Sleep(100);
                OW_SetPin($_IPS['INSTANCE'], 1, false);
 
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    OW_SetPin($_IPS['INSTANCE'], 0, true);
                    OW_SetPin($_IPS['INSTANCE'], 1, true);
                    IPS_Sleep(100);
                    OW_SetPin($_IPS['INSTANCE'], 0, false);
                    OW_SetPin($_IPS['INSTANCE'], 1, false);
                }
                break;
        }
      break;
    case "{6A75828A-25CD-4CF3-83EA-DAAB914030A7}": //1-Wire Shutter (1-wire.de)
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                OneWireShutter($_IPS['INSTANCE'], 0, $_IPS['DURATION']);
                break;
            case SC_DIRECTION_UP:
                if($_IPS['DURATION'] == 0)
                    $_IPS['DURATION'] = 120000;
                OneWireShutter($_IPS['INSTANCE'], 0, $_IPS['DURATION']);
                break;
            case SC_DIRECTION_DOWN:
                if($_IPS['DURATION'] == 0)
                    $_IPS['DURATION'] = 120000;
                OneWireShutter($_IPS['INSTANCE'], 1, $_IPS['DURATION']);
                break;
        }
        break;
    case "{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}": //Homematic Shutter
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                HM_WriteValueBoolean($_IPS['INSTANCE'], "STOP", true);
                break;
            case SC_DIRECTION_UP:
                HM_WriteValueFloat($_IPS['INSTANCE'], "LEVEL", 1.0);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    HM_WriteValueBoolean($_IPS['INSTANCE'], "STOP", true);
                }
                break;
            case SC_DIRECTION_DOWN:
                HM_WriteValueFloat($_IPS['INSTANCE'], "LEVEL", 0.0);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    HM_WriteValueBoolean($_IPS['INSTANCE'], "STOP", true);
                }
                break;
        }
        break;
    default:
        die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
 
function OneWireShutter($ins, $dir, $sec) {
    @OW_SetStrobe($ins, True);
    $res = ($dir * 128) + ($sec / 1000);
    @OW_SetPort((integer)$ins, (integer)$res);
}
 
function CreateVariableByName($id, $name, $type)
{
    $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");
    }
    return $vid;
}

Informationen zum Erweitern des Skriptes

Es werden bei einem Aufruf immer drei Parameter übergeben.

In den “Case Statements” müssen die GUIDs für das jeweilige Modul eingefügt werden. Alle IP-Symcon Funktionen können verwendet werden. Es darf kein Output generiert werden (echo), andernfalls gilt dies als Fehler und wird im Message-Log angezeigt und der Status der “Position” Variable wird nicht aktualisiert.