Chromoflex RC III für IP-Symcon 2.5

Supportdiskussionen zum Script verschoben in Q&A Chromoflex RC III für IP-Symcon 2.5
Dieses Skript erlaubt es euch alle oder einzelne Geräte über das Chromoflex RC III anzusteuern. Ihr müsst dieses Skript nur genau einmal in eurem System haben. Die Ansteuerung wird über die IPS_RunScriptEx Funktionen gelöst.

Nachdem ihr das Skript eingerichtet habt, müsst ihr die ID der I/O Instanz anpassen und könnt es direkt danach ausführen. Dadurch wir auf allen Geräten im Net 8 ein zufälliger Farbwert gesetzt. Erneutes Ausführen setzt einen neuen zufälligen Farbwert. Falls dies nicht geschieht, überprüft die ID und die Konfiguration der I/O Instanz.

Um das Skript durchgehend nutzen zu können, muss ein Start Skript vorhanden sein, welches über Kern Instanzen -> Event Handler eingerichtet werden kann. In dem Start Skript muss folgende Zeile hinzugefügt werden:


$id = 0; //Hier die ID vom Hauptskript angeben
IPS_RunScriptEx($id, Array("Action"=>"Initialize"));

Um die Farbwerte setzen zu können kann folgende Funktion genutzt werden, wobei nicht alle Parameter erforderlich sind. Falls Parameter weggelassen werden, sind die Standardwerte wie folgt: (Net = 8, DeviceID = 000000, Werte = 255). Der Parameter D ist der Dimmer und gibt die Helligkeit aller Farbkanäle an.


$id = 0; //Hier die ID vom Hauptskript angeben
IPS_RunScriptEx($id, Array("Net" => 8, "DeviceID" => "000000", "Action"=>"SetColor", "R"=> 255, "G" => 255, "B" => 255, "D" => 255));

Um Programme anzusteuern, kann folgender Code genutzt werden. Dabei kann der Parameter P die Werte 1-18 für die einzelnen Programme und den Wert 0 für das „Aus“-Programm gesetzt werden.


IPS_RunScriptEx($id, Array("Action"=>"SetProgram", "P"=> 6));

Hauptskript, welches nur 1x im System sein muss. (ggf. mehrmals, falls mehrere Chromoflex RC III Gateways im Einsatz sind)


<?

//ID der I/O Instanz vom Chromoflex RC III.
//Konfiguration: 115200, 8, 1, N
$id = 0; //I/O Instanz

/*******************************************************************************

 Copyright 2012, IP-Symcon/meike0_0. Version 1.2.0 - DO NOT MODIFY BELOW THIS LINE!

********************************************************************************/

if($_IPS['SENDER'] == "RunScript")
{
    if(isset($_IPS['Action']))
    {
       switch($_IPS['Action'])
        {
           case "Initialize":
              Initialize();
                break;
            case "SetColor":
                if(!isset($_IPS['Net']))
                    $_IPS['Net'] = 8;
                if(!isset($_IPS['DeviceID']))
                    $_IPS['DeviceID'] = "000000";
                if(!isset($_IPS['R']))
                    $_IPS['R'] = 0xFF;
                if(!isset($_IPS['G']))
                    $_IPS['G'] = 0xFF;
                if(!isset($_IPS['B']))
                    $_IPS['B'] = 0xFF;
                if(!isset($_IPS['D']))
                    $_IPS['D'] = 0xFF;

                if(IPS_SemaphoreEnter($IPS_SELF, 5000))
                {
                    $x = "";
                    $x .= chr($_IPS['Net']); //Network
                    $x .= HexToStr($_IPS['DeviceID']); //Remote Serial
                    $x .= chr(GetSequenceNumber());
                    $x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial

                    $x .= chr(0x80); //Command: Write
                    $x .= chr(0x01); //RAM Adress (???)
                    $x .= chr(0x12); //ProgramPC (???)

                    $x .= chr(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)
                    $x .= chr(0x00); //Index (???)
                    $x .= chr(0x01); //Dummy (???)
                    $x .= chr(0xFF); //Temp (???)

                    $x .= chr($_IPS['R']); //Red
                    $x .= chr($_IPS['G']); //Green
                    $x .= chr($_IPS['B']); //Blue

                    FTDI_SendText($id, CreatePacket($x));
                    IPS_Sleep(100);
                    IPS_SemaphoreLeave($IPS_SELF);
                }
               break;
            case "SetProgram":
                if(!isset($_IPS['Net']))
                    $_IPS['Net'] = 8;
                if(!isset($_IPS['DeviceID']))
                    $_IPS['DeviceID'] = "000000";
                if(!isset($_IPS['P']))
                    $_IPS['P'] = 0;
              
                if(IPS_SemaphoreEnter($IPS_SELF, 5000))
                {    
                    switch ($_IPS['P'])
                    {
                        case 0: //Aus
                        case 1: //Speichern&Aus
                        case 2: //Fix Color
                        case 3: //Color Change
                        case 4: //Med.Color
                        case 5: //Slow.Color
                        case 6: //Blob
                        case 7: //LSD
                        case 8: //Fire
                        case 9: //Flashes
                        case 10: //Bursts
                        case 11: //User 1
                        case 12: //User 2
                        case 13: //User 3
                        case 14: //Slow Strobo
                        case 15: //Strobo
                        case 16: //Fast Strobo
                        case 17: //Mix
                        case 18: //Color
                            $x = "";
                            $x .= chr($_IPS['Net']); //Network
                            $x .= HexToStr($_IPS['DeviceID']); //Remote Serial
                            
                            $x .= chr(GetSequenceNumber());
                            $x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial
                            $x .= chr(0x80); //Index (???)
                            $x .= chr(0x01); //Dummy (???)
                            $x .= chr($_IPS['P']); //Temp (???)
                            $x .= chr(0x00); //Temp (???)
                            break;
                    }

                    FTDI_SendText($id, CreatePacket($x));
                    IPS_Sleep(100);
                    IPS_SemaphoreLeave($IPS_SELF);
                }
                break;
        }
    }
}
if($_IPS['SENDER'] == "Execute")
{
    Initialize();
    IPS_Sleep(200);
    IPS_RunScriptEx($IPS_SELF, Array("Action"=>"SetColor", "R"=> rand(0, 255), "G" => rand(0, 255), "B" => rand(0, 255)));
}

function Initialize()
{
    global $id;
    FTDI_SetDTR($id, true);
    FTDI_SetRTS($id, true);
    FTDI_SendText($id, "!n0701\r");
}

function GetSequenceNumber()
{
    //32-47 Sequence Number (0..15 + 32)
    $seq_id = CreateVariableByIdent($_IPS['SELF'], "SequenceNumber", "Sequence Number", 1);
    $seq = GetValue($seq_id);
    $seq = ($seq+1) % 16;
    SetValue($seq_id, $seq);
    return $seq + 32;
}

function CreateVariableByIdent($id, $ident, $name, $type)
 {
     $vid = @IPS_GetObjectIDByIdent($ident, $id);
     if($vid === false)
     {
         $vid = IPS_CreateVariable($type);
         IPS_SetParent($vid, $id);
         IPS_SetName($vid, $name);
         IPS_SetIdent($vid, $ident);
         IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
     }
     return $vid;
}

function CreatePacket($data)
{
    return "!x0000".StrToHex(Chr(strlen($data)+2)).StrToHex($data).StrToHex(MakeCRC($data))."\r\r";
}

function MakeCRC($data)
{
    // Fast generation of CRC by using a table...
    $CRC_TABLE_A = Array(
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    );

    $CRC_TABLE_B = Array(
         0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
         0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
         0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
         0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
         0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
         0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
         0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
         0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
         0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
         0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
         0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
         0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
         0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
         0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
         0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
         0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
         0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
         0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
         0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
         0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
         0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
         0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
         0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
         0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
         0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
         0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    );

    $CRC_A = 0xFF;
    $CRC_B = 0xFF;

    for($i=0; $i<strlen($data); $i++)
    {
       $INDEX = $CRC_A ^ Ord($data{$i});
       $CRC_A = $CRC_TABLE_A[$INDEX] ^ $CRC_B;
       $CRC_B = $CRC_TABLE_B[$INDEX];
    }
    return Chr($CRC_B) . Chr($CRC_A);
}

//Copy&Paste from php.net (http://php.net/manual/de/function.hexdec.php)
function StrToHex($x) {
    $s = '';
    $p = str_split($x);
    foreach($p as $c)
        $s .= strtolower(sprintf("%02X",ord($c)));
    return($s);
}

function HexToStr($x) {
    $s = '';
    $p = explode("
",trim(chunk_split($x,2)));
    foreach($p as $h)
        $s .= chr(hexdec($h));
    return($s);
}

?>

Als Alternative für das Modul von huelke. Die Auswahl von Programfunktionen kommt irgendwann in den nächsten Wochen.

Supportdiskussionen zum obigen Script verschoben in Q&A Chromoflex RC III für IP-Symcon 2.5