Mit Pokeys5xE das Shutter Control Modul nutzen

Zuerst erstellt man eine Shutter Control Instance, Name als Beispiel „Rolladentest mit 2 Rolläden Relais“ ID hier 11669

Erst mal nicht mit Daten füttern.

Darunter 2 Modbus Instance, entweder mit Coil- oder mit Sharedata- Adressen (nicht sichtbar in Webfront).

Eine für das Power-Relais, eine für das Richtungs-Relais.

Hier im Beispiel habe ich Adressen ab 200 für Sharedata-Bit Adressen, wenn man mit PoBlocks schon eine Schaltung hat und IPS nur dazu kommt.

Geht natürlich mit zB Modbus-Adresse 52 und 51.

Dann ein Shutter Contol Script Name (hier Name: Shutter Contol Script mit 2 Zuständen, nicht sichtbar in der Webfront) schreiben, das folgenden Inhalt hat:

  <?
//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'])
{
// diese komischen hexzeichen vom ShutterControl herausfinden? Mit dem Befehl (einfach in ein Skript packen und ausführen)
//Daten des Shutter Dummy Modules heraus finden:
//print_r(IPS_GetInstance(57230 /*[Shutter\Rolladen Test Zimmer 1]*/)['ModuleInfo']['ModuleID']);

//siehe https://www.symcon.de/service/dokumentation/befehlsreferenz/instanzenverwaltung/ips-getinstance/


    case "{542CC907-CA63-4E7A-A8C7-92F74639FA4C}": //hier die komischen Daten rein kopieren von der Shutter Control Instance
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
				ModBus_WriteCoil(48651 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Power]*/, false);

            case SC_DIRECTION_UP:
					ModBus_WriteCoil(58611 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Richtung]*/, false);
					IPS_Sleep(100);
        		   ModBus_WriteCoil(48651 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Power]*/, true);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    ModBus_WriteCoil(48651 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Power]*/, false);
                }
              break;
            case SC_DIRECTION_DOWN:
        		    ModBus_WriteCoil(48651 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Power]*/, true);
        		    IPS_Sleep(100);
					 ModBus_WriteCoil(58611 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Richtung]*/, true);
					  if($_IPS['DURATION'] > 0)
                 {
                    IPS_Sleep($_IPS['DURATION']);
				ModBus_WriteCoil(48651 /*[Shutter\Rolladentest mit 2 Rolläden Relais\Pokey_Rollädenrelais Power]*/, false);
                 }
              break;
        }
        break;
    default:
        die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
?>  

Die ID’s der Modbus-Instancen für Power und Richtung (ModBus_WriteCoil(xxxx…, true/false) müssen von Hand eingetragen werden.

Es gibt leider keine Variablen von IPS dafür

Dann müßte der Baum so aussehen.

Jetzt noch die Shutter Control Instance mit Daten füttern.

In dem Feld Sendeinstance kommt die ID von der Shutter Contol Instance rein.

In Abarbeitungsscript kommt die ID von dem oberen Script rein.

Erst einmal keine Zeiten ausprobieren.

So, nun kann man(n) schon ausprobieren, ob es in der Webfront funktioniert.

Wenn es funktioniert, dann kann man auch die Zeiten in der Shutter Contol Instance eintragen, immer speichern nicht vergessen.

Hab’s mit Baba’s Hilfe so erstellen können, Danke für Deine Hilfe. Wollte es in die Wiki schreiben, bekomme aber keine Bilder rauf…

Script um die komischen Hex-Zeichen der Shutter Control Instance raus zu finden:

 <?
//Daten des Shutter Dummy Modules heraus finden:
print_r(IPS_GetInstance(11669 /*[Shutter\Rolladentest mit 2 Rolläden Relais]*/)['ModuleInfo']['ModuleID']);
?>
  

Gruß Helmut

Wenn du nur 2 Sende-Instanzen (Powerrelais und Richtungsrelais) hast, musst du diesen „Umweg“ nicht gehen.
Analog zu: Shutter Control — IP-Symcon :: Automatisierungssoftware hier eine Anleitung für Modbus (PoKeys):

Hinweise für Modbus/ Pokeys Nutzer:
Beim Betrieb mit Relais muss für „Sende-Instanz (1)“ immer das erste Relais der beiden angegeben werden. Das erste Relais ist das, welches den Strom AN/AUS schaltet. „Sende-Instanz (2)*“ ist immer das Relais, welches die Richtung steuert.
Sollte die Fahrtrichtung verdreht sein, muss dies manuell im Skript geändert werden. Im “case Block für Modbus Address (Pokeys)” des Shutter Skriptes 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 für die jeweiligen Konfigurationen zwei unterschiedliche Shutterskripte verwendet werden. Einmal ein Skript für die eine Verdrahtung und ein zweites Skript mit vertauschten Werten für das Richtungsrelais für die spiegelverkehrte Verdrahtung.

Konfiguration der zwei Sende-Instanzen:

Abarbeitungsskript:


<?
//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 "{CB197E50-273D-4535-8C91-BB35273E3CA5}": //Modbus Address (Pokeys)
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                ModBus_WriteCoil($_IPS['INSTANCE'], false);
                break;
            case SC_DIRECTION_UP:
                ModBus_WriteCoil($_IPS['INSTANCE2'], false); //Um Relaisrichtung zu ändern, bitte auf true
                IPS_Sleep(100);
                ModBus_WriteCoil($_IPS['INSTANCE'], true); 
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    ModBus_WriteCoil($_IPS['INSTANCE'], false);
                }
                break;
            case SC_DIRECTION_DOWN:
                ModBus_WriteCoil($_IPS['INSTANCE2'], true); //Um Relaisrichtung zu ändern bitte, auf false
                IPS_Sleep(100);
                ModBus_WriteCoil($_IPS['INSTANCE'], true);
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    ModBus_WriteCoil($_IPS['INSTANCE'], 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 "{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
        $type=LCN_GetUnit($_IPS['INSTANCE']);
        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['INSTANCE'],true);
                    LCN_SwitchRelay($_IPS['INSTANCE2'],false); // Um Relaisrichtung zu ändern bitte auf true
                    if($_IPS['DURATION'] > 0)
                    {
                        IPS_Sleep($_IPS['DURATION']);
                        LCN_SwitchRelay($_IPS['INSTANCE'],false);
                    }
                    break;
                case SC_DIRECTION_DOWN:
                    LCN_SwitchRelay($_IPS['INSTANCE'],true);
                    LCN_SwitchRelay($_IPS['INSTANCE2'],true);// Um Relaisrichtung zu ändern bitte auf false
                    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 "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}":  //1-Wire Shutter Modul (e-service Online)
        switch($_IPS['DIRECTION'])
        {
            case SC_DIRECTION_STOP:
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, true);
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, true);
                IPS_Sleep(100);
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, false);
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, false);
                break;
            case SC_DIRECTION_UP:
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, true);
                IPS_Sleep(100);
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, false);
 
                if($_IPS['DURATION'] > 0)
                {
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, true);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, true);
                    IPS_Sleep(100);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, false);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, false);
                }
                break;
            case SC_DIRECTION_DOWN:
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, true);
                IPS_Sleep(100);
                TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, false);
 
                if($_IPS['DURATION'] > 0)
                {
                    IPS_Sleep($_IPS['DURATION']);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, true);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, true);
                    IPS_Sleep(100);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 0, false);
                    TMEX_F3A_SetPin($_IPS['INSTANCE'], 1, false);
                }
                break;
        }
      break;   
/*                
    case "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}": //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) {
    @TMEX_F29_SetStrobe($ins, True);
    $res = ($dir * 128) + ($sec / 1000);
    @TMEX_F29_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;
}
?>

Das Skript kan einfach 1zu1 kopiert werden, ohne etwas zu verändern (außer wenn die Fahrtrichtung verdreht ist). Bei einem neuen Rollo werden in der Konfiguration vom Shutter Control Modul, die entsprechenden Sende-Instanzen für Powerrelais und Richtungsrelais eingetragen und das oben gepostete Skript als Abarbeitungsskript angegeben.

Gruß Basti

hier stand nur Müll

Hallo Baba,

macht es nicht eher Sinn bei falscher Laufrichtung dies an der HW des Richtungsrelais zu machen, sprich die Anschlüsse zu vertauschen?
Wenn ich dich hier richtig verstanden habe, nutzt du das Script hier für alle zu steuernden Rolladen zusammen und dann müssten doch alle Rolladen auch die falsche Laufrichtung haben, damit diese Änderung im Script funktioniert?

Grüße,
Doc

Hallo Doc,

sicher ist das auch eine Möglichkeit. Sind aber schon alle Rollos verdrahtet, ist das nicht immer so einfach möglich.

Für den Fall, dass man unterschiedlich verdrahtete Rolladen/Jalousien an den Relais nutzt, müssen für die jeweiligen Konfigurationen zwei Shutterscripte verwendet werden. Einmal ein Skript für die eine Verdrahtung und ein zweites Skript mit vertauschten Werten für das Richtungsrelais für die spiegelverkehrte Verdrahtung.

Gruß Basti

Klar, das geht natürlich auch.
Aber an die Anschlüsse kommt wohl jeder dran, der ein Pokeys einsetzt.
Das wäre mir lieber, als 2 Scripte zu verwalten.

Wenn jemand andere Komponenten evtl. unter Putz verwendet, ist das aber bestimmt der leichtere Weg.

Grüße,
Doc

Ja, ich persönlich würde auch die Laufrichtung an der HW des Richtungsrelais anpassen bzw. zumindest alle gleich verdrahten. Aber wenn das z.B. ein Elektriker macht und man keine Ahunung davon hat oder es Unterputz liegt, bleibt halt nur die „softwareseitige“ Lösung. Ich habe das von dem LCN Relais Shutter Control Eintrag aus Shutter Control — IP-Symcon :: Automatisierungssoftware übernommen.

Gruß Basti

Das Script habe ich nun am Laufen.
Wie kann ich den Rollladen aber von einem Taster steuern?
In den Einstellungen finde ich nur, wo man die Relais anklemmt (Instance). Aber nicht wo man die Taster für hoch/runter anbringt.

Ich bin hier sehr neu. Deshalb die vermeintlich einfache Frage.

Hast Du die Modbus Instancen alle erstellt?

Dann solltest Du in der Webfront tasten können.

Gruß Helmut

Für die Relais habe ich das gemacht. Ich möchte aber auch eine manuelle Möglichkeit haben, die Rollläden zu fahren. Darum ist bei mir neben jedem Fenster ein Taster für hoch/runter. Diese wollte ich schon mit einbinden. Auch ein zeitabhängiges Schalten sollte möglich sein.
Muss ich das programmieren oder kann ich das auch selber „Zusammenklicken“? D.h. meine Taster dann über den Modbus wieder in IPS bekommen und damit den Rollladen steuern?

Wenn Du die Taster über das Pokeys-Modul verdrahtest, dann könntest Du mit PoBlock innerhalb des Pokeysmodul ein Programm dafür schreiben, es kann auch von IPS aufgerufen werden.

Beschreibe mal wie Du was wie installiert/verdrahtest hast !? Ein nacktes Pokeysmodul wirst Du nicht haben, ich meine ohne Schutzbeschaltung bzw. Treiber

Welche Pin Nr ist was bei Dir usw.

Der Sinn des Shuttermodul ist aber, dass man die Stellungen anfahren kann und nicht einfach nur rauf- und runterfahren.

Gruß Helmut

Ich bin noch am Testen. Sind ja meine ersten Versuche.
Bisher sind an der Symbox noch keine Taster dran. Ich kann nur über das Webfront sehen, was passiert.
Die derzeitige Rollladensteuerung habe ich derzeit noch mit einer anderen Steuerung programmiert.
Zum Thema.
Ich möchte das Shutter Modul nutzen, um über Modbus auf eine Wago zu gehen. An der Wago sind dann die E/A dran.
Die Ausgänge sehe ich schon im Webfront. Das geht schon. Diese dann an die Wago zu übergeben, sollte auch kein Problem sein.
Nun zur Ansteuerung.
1.) Vollautomatisch durch ein Script oder ein zyklisches Ereignis.
2.) Manuell durch die Wago über den Modbus die Taster reinbekommen und dann das Shutter bedienen.
So hatte ich mir das vorgestellt. Das Pokeys nutze ich nicht, sondern derzeit eine Wago 750-842.

Wie schon geschrieben, das Shuttermodul arbeitet mit der jeweiligen Hardware eher ausschließlich mit IP-Symcon.

Zeitsteuerung und externe Taster gehören nicht zum Shuttermodul. Man kann alles Einbinden, aber dazu gehört ein gewisses Verständnis für diese Funktionen in Pokeys, PoBlock speziell von den Parameterübergaben S0 Funktionen mit PoBlock und IP-Symcon.

Mir scheint es aber, dass Du das Pokeysmodul nur wegen der Vielfalt der Ein- und Ausgänge über Modbus TCP ins Auge geschmissen hast.

Ein Tipp: mach eine kleine Funktion zu Anfang, nicht zu komplex mit vielen verschiedenen Geräten.

Gruß Helmut