Chromoflex RC Steuerung mit RGB Fader und Color Picker

Hat jemand das ganze schon auf einem Raspberry Pi umgesetzt! Bei mir klappt alles ausser das der eigentliche jpeg bild des Colorpickers nicht angezeigt wird!

Würde mich freuen wenn mir da jemand helfen könnte

bei mir hat es bis zur Umstellung auf 4.0 und Mac funktioniert. Jetzt geht leider gar nichts mehr. Hat jemand schon die gleichen erfahrungen gemacht oder schon eine Lösung bzw. alternative?

Gruß Holger

Hab das ganze bis IPS 3.4 genutzt. Ist es noch in IPS 4 kompatibel? Irgendwie bekomme ich jedoch die Treiber auf Server 2012 R2 nicht zum laufen. USB Durchgereicht via ESXi 6.0.0. Damals auf der Win 7 Maschine funktionierte dies einwandfrei!

Moin Moin,
ich muss hier auch noch mal nachhaken …
Bei mir funktioniert die Steuerung auch auf einem RasPi mit (noch) IPS4.3 recht gut. Den colorpicker nutze ich dabei gar nicht.
Ich habe nun noch ein paar Hue im Haus und würde gerne die Farben etwas anpassen. Auf eine Zeile wie

IPS_RunScriptEx(idchromoscript, Array("Action"=>"SetColor", "R"=> $R, "G" => $G, "B" => $B, "D" => 255));

mag mein Controller aber die Farben nicht verändern.

Hat jemand eine Idee wie ich das hin kriege? Mit anderen Controllern (LCN, IPS868) geht das recht gut …

Grüße, Uwe

Keine Möglichkeit den Chromoflex in IPS 4.x zu nutzen?

Doch, tue ich doch. Wenn ich direkt steuere geht das auch ganz prima - nur bei Kommandos, die sich irgendwo „angleichen“ sollen, habe ich meine Probleme (ich vermute aber größtenteils mit Fehler 40 :rolleyes: ).

Grüße, Uwe

Komisch, das geht bei mir problemlos.

Hast du mal ein Skript bereit, mit dem das problemlos geht, Tom?
Vermutlich sehe ich dann schon wo mein Fehlerteufel steckt …

Grüße, Uwe

Gerne, Uwe, aber ich habe das arg umgebaut:

<?

//ID der I/O Instanz vom Chromoflex RC III.
//Konfiguration: 115200, 8, 1, N
//
//
$id = 41566 /*[Chromoflex]*/; //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));
                    SPRT_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(!isset($_IPS['D']))
                    $_IPS['D'] = 0xFF;

                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(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)
                            break;
                    }

//                    FTDI_SendText($id, CreatePacket($x));
                    SPRT_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;
    SPRT_SetDTR($id, true);
    SPRT_SetRTS($id, true);
    SPRT_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);
}

?>

ich rufe es dann so auf wie bei dir.

Aber fehlt bei dir nicht nur ein $ bei idchromoscript ? Also müsste es nicht

IPS_RunScriptEx($idchromoscript, Array("Action"=>"SetColor", "R"=> $R, "G" => $G, "B" => $B, "D" => 255));  

lauten ?

Reicht es bei dem Skript zur externen Steuerung des CF nur die ID des Hauptskriptes einzutragen, oder muss ich auch die Parameter von „net“ und „Device-ID“ aktualisieren. Ich will mir meine funktionierende Struktur nicht kaputt machen!

Meine Chromos funktionieren so ganz gut, nur die externe Steuerung über ein Skript bekomme ich einfach nicht hin.

Danke für einen Tipp im Voraus.

Nicht sicher, was du genau meinst, aber in dem Beispiel oben wird ohne Angabe von Net und device das Net 8 angesprochen, das ist i.d.R. der Auslieferzustand der Module (alle dips unten)

Ich steuere immer über die Angabe mit „Net“, da mir die einzelnen Deviceids zu unübersichtlich sind und meine Module eh gruppiert als Master/Slave insrtalliert sind.

@TomW
Ok, dass werde ich dann auch so versuchen.

Zum Verständnis: Du hast nur das eine Hauptskript und steuerst es dann über ipsrunskript-Befehl mit einzelnenParametern an. Richtig?

@UweR
Du schreibst, du hast die Chromos unter einem Pi ans Laufen bekommen? Kannst Du das näher ausführen? Ich betreibe meine über den USB-Dongle an einem Win-Rechner und möchte jetzt auf einen PI umziehen. Kann ich den Dongle problemlos am Pi einstecken und irgendwie einbinden oder bedarf es dafür spezielle Treiber und Kniffe?

Danke im Voraus. für die Antworten.

Moin Michel,
mein Chromo hat etwas Geschichte …
Ich habe den (vor „Urzeiten“) mal von Tom zusammen mit einem PI1 als „Treiber“ geschenkt bekommen. Damals nutzte ich IPS auch noch unter Windows.
Dann kam die Anbindung/Skript von Karlheinz und ich habe „einfach mal probiert“ (mit Erfolg).
Es folgte dann der Umzug von IPS auf einen PI. Ich bin aber nicht Linux-Freak genug, um Überschneidungen mit der ebenfalls am USB betriebenen LCN-Schnittstelle zu vermeiden (die haben sich dann bei einem Neustart immer gerne mal ‚verwechselt‘). Das sollte aber mittlerweile auch problemlos gehen, ich habe das aus „Mangel an Notwendigkeit“ nur noch nie probiert…
Ich habe dann einfach den alten PI mit einem IPS drauf genommen, dort nur den Chromo-USB „einfach angesteckt“ und die Daten per

$rpc = new JSONRPC("http://user:passwort@chromoflex.pi.ip:3777/api/");
$rpc->SetValue(12345, $on );
// usw.

dorthin geschickt. So läuft das völlig problemlos (never change …) mit derzeit einer IPS V4.3, anfänglich aber auch mit einer 3.x. Meine ‚Steuerskripte‘ sind (aus Zeitmangel) recht spärlich und kommen (hauptsächlich vom backup aus der WIN-Installation übernommen) nach wie vor von meinem eigentlichen IPS-PI (auch nur ein seinerzeit aktueller PI2)…
Die Chromflex I/O-Instanz hat dann halt PI-typische Einstellungen:

Viel Erfolg und Grüße, Uwe

Vielen Dank für Deine wirklich sehr gute und ausführliche Antwort. Das macht Mut und ich werde es ausprobieren, sobald ich den Umzug durchgeführt habe. Dann gebe ich auch hier wieder eine Rückmeldung!

Für das Problem mit dem Wechseln des USB-Port gibt es den USBMapper

https://www.symcon.de/forum/threads/34786-USBMapper-im-SymconMisc?highlight=USBMapper

Hi

Hat jemand das Script auf einem PI und unter IPS5 am laufen. Habe bei der Ausführung einen PHP Error erhalten in Zeile 261

Parse error: syntax error, unexpected ‚", ‚w‘) or die("‘ (T_CONSTANT_ENCAPSED_STRING), expecting ‚,‘ or ‚)‘ in /var/lib/symcon/scripts/43256.ips.php on line 261
PHP-Error-Parsing Error: syntax error, unexpected ‚", ‚w‘) or die("‘ (T_CONSTANT_ENCAPSED_STRING), expecting ‚,‘ or ‚)‘
Error in Script /var/lib/symcon/scripts/43256.ips.php on Line 261Abort Processing during Fatal-Error: syntax error, unexpected ‚", ‚w‘) or die("‘ (T_CONSTANT_ENCAPSED_STRING), expecting ‚,‘ or ‚)‘
Error in Script /var/lib/symcon/scripts/43256.ips.php on Line 261

Ich selber kann leider kein PHP oder gar wenig Scripte schreiben. Das gröbste klappt zwar, aber wenn es zu komplex wird…
Kann mir da bitte jemand unter den Armen greifen.

Muß der imagepicker auch installiert sein?

Das klingt eher, als wenn du beim Kopieren etwas falsch gemacht hast… Den Parse Errors sollte es eher nicht geben.

paresy

Habe das Modul jetzt mehrmals neu rein kopiert. Kommt immer wieder der gleiche Fehler. Auch wenn ich es teilkopiere.
gibt es denn noch eine andere Möglichkeit so ein Skript zu kopieren. Markiere mit der Maus alles vom Skript und füge es in mein Installskript ein und fertig.

Die Installation ist durch. Im Webfront wird mir auch alles angezeigt. Keine Ahnung, was ich da anders gemacht habe. Nun kann ich aber den Chromo nicht steuern.
Im Webfrontfenster „Color picker“ steht „file not found“ kann das damit was zutun haben?

Die versprochenen Rückmeldung:
Dank den Hinweisen von UweR und TomW laufen die Chromos auch nach dem Umzug auf den Pi. USB-Controller umgesteckt, angepasst, fertig!
Vielen Dank!