Chromoflex RC, FTDI

Das SDK für V2 kann man sich hier downloaden. Die Einbindung des FTDI-Moduls erfolgt (meistens) in dem man es als Parent zu seinem eigenem Modul anlegt oder dynamisch definiert. Das Modul sendet dann seine Daten an das eigene ReceiveText-Interface, während man seine Daten an das SendText-Interface des FTDI-Moduls übergibt.

Das Thema SDK ist doch recht komplex. Evtl. ist es einfacher, sich einen virtuellen Comport für das FTDI-Device zu erstellen und dann mit dem ComPort-Modul direkt aus PHP zu arbeiten.

Tommi

Hi erstmal Danke für Deine Antwort.

Das Problem ist auch das Ihr ja alles in Delphi bastelt, und die Chromoflex III RC Sourcecodes in C++ (Borland Builder 6) geschrieben wurden.
Bin in Delphi jetzt nicht gerade fitt, und das portieren von C könnte schwierig werden :-/
Das betrifft aber eigentlich nur die Schnittstelle zum Dongle, die eigentlichen Daten die da gesendet werden bekomme ich auch noch in Delphi hin. Wenn ich also den IO Treiber benutzte der schon da ist sollte das eigentlich nicht so schwierig sein.

Ein Command sieht ungefähr so aus:

!x00101408000000a1fffffe800112000001ff0000009ee0

gefolgt von einem CR

Hast Du Erfahrung mit dem FTDI Treiber? Hab es nämlich bisher noch nicht hinbekommen den als virtuellen Comport zu installieren. Ich weis das es vom FTDI Hersteller zwei Treiber gibt. Den „direkten“ und den für den VPort. Aber der zweite läuft nicht richtig oder ich mach es falsch.

Hab gerade überlegt man könnte auch einen Server basteln, der per tcp Befehle annimmt. Den könnte man dann per PHP füttern.
Eine Command Line Variante habe ich schon, die ist aber viel zu lahm, da sie ja bei jedem Aufruf erst die Verbindung zum Dongle aufbaut.

Schöner fände ich das aber schon als Splitter/Modul…

Wenn man sich das SDK-Winlirc Modul anschaut so erkennt man ja das mittels
IIPSSendString(GetParent()).SendText( COMMAND/TEXT );
Der Text an den Parent gesendet wird… Eigentlich ist es das doch schon oder? :cool: Denn das FTDI IO Modul erkennt den Chromoflex Dongle ja korrekt und kann auch eine Verbindung aufbauen.
Also muss man doch nur noch den Command zusammenbasteln und das dem Parent FTDI Control „senden“…?

Und wie „registriere“ ich dann passende PHP Funktionen [ z.b CromoflexRC_SetColor(modulID,r,g,b,dimm); ] ?

Viele Fragen ich weiß :rolleyes: … Aber ein „vollwertiges“ SDK ist das ja nicht so wirklich :wink:

Gruß und vielen Dank,
Huelke

Definier in deinem Interface einfache eine neue SetColor Funktion und schon ist sie in PHP drin. Mit dem Prefix, dass du beim „Register“ angibst.

Notfalls kannst du auch die FTDI_SendText Funktion nutzen.

paresy

Hey paresy danke für den Tipp mit FTDI_SendText ! So konnte ich schon mal ausprobieren ob sich was rührt, und ich bin begeistert :slight_smile: direkt beim ersten Versuch hat’s geklappt.
Muss Dir/Euch an dieser Stelle mal ein riesen Lob ausprechen: IP-SYMCON ist echt genial aufgebaut. Dieses Modulare arbeiten ist echt cool.
Auch die neue SOAP Designer Schnittstelle ist ideal.

Ach ja und das die PHP funktionen automatisch aus dem Interface abgeleitet werden ist feinster Luxus. :thumbs up: Danke Dafür!

Ich werde mich jetzt daran machen einen passenden Splitter und Module zu basteln. :slight_smile:

Gruß Huelke

Habe dir mal eine PM geschickt… mit etwas mehr Beispiel-Code.

Ach ja und das die PHP funktionen automatisch aus dem Interface abgeleitet werden ist feinster Luxus. :thumbs up: Danke Dafür!

Tipp: Bei Parametern funktionieren nur simple Typen. Bei den Rückgabeparametern kannst du auch Objekte (immer von TRemotable ableiten) und Arrays (auch dynamische) verwenden. Bei Arrays musst du diese aber erst in einen eigenen „type“ verpacken. (UIPSModuleTypes.pas hat viele Beispiele was Möglich ist)

paresy

Soo
Dank paresy’s Hilfe hab ich die erste Version des Chromoflex III RC Moduls fertig.
Das sendet bisher eigenständig aber nur Broadcast, da ich noch nicht mit der Receiver-Suche fertig bin.
Das kann es aber bald :wink:
Wenn Ihr einen Receiver direkt ansprechen wollt, so geht das auch schon. Aber ihr müsst die ReceiverId vorher mit dem Hersteller Tool „Color Editor CF3“ ermitteln [Suche].
Die könnt Ihr dann dem Modul beibringen…

Bisher verfügbare Funktionen:


############### 
#  Aktionen  #
###############
// An Alle:
ChromoflexRC_BroadcastSetColor($objektID,$r,$g,$b,$dimm);
ChromoflexRC_BroadcastSetProgram($objektID,$program,$dimm);   // $program=0 => Chromoflex aus
ChromoflexRC_BroadcastSetDimmer($objektID,$dimm);

// nur an bestimmten Receiver
ChromoflexRC_SetColor($objektID,$r,$g,$b,$dimm);
ChromoflexRC_SetProgram($objektID,$program,$dimm);   // $program=0 => Chromoflex aus
ChromoflexRC_SetDimmer($objektID,$dimm);

############### 
# Properties #
###############
ChromoflexRC_SetNet($objektID,$NetzId);   // $NetzId=> 1..8 Default ist 8.
ChromoflexRC_GetNet($objektID);      // Rückgabe: NetzId

ChromoflexRC_SetDeviceId($objektID,$DeviceId);   // $DeviceId => Bisher nur zu ermitteln mit CF_3 ColorEditor
ChromoflexRC_GetDeviceId($objektID);      // Rückgabe: DeviceId

Wer interesse hat, meldet sich einfach bei mir :smiley:

MfG
Huelke

Schoen dass sich jemand dem CF IIIRC annimmt. Ich hatte es schon fast bereut auf die RC Version umgestiegen zu sein. Da sich bei Barthelme noch weniger tut als ueblich. Im Herbst sollte sich ja da was tun, aber der ist schon etwas vorbei.
Ich bin auch schon sehr gespannt es aus zu probieren. Doch leider :stuck_out_tongue: bin ich noch im, mit 32Grad noch kuehlen, Sri Lanka.
Also, uebernaechste Woche lege ich los.
(5x CF II und 5x CF IIIRC habe ich im Einsatz)

Hallo huelke, bist du mit deinem Modul schon weiter ? :o

Hat jemand huelkes skript schon einmal erfolgreich eingesetzt ?

Na klar,
noch nicht perfekt, aber Grundfunktion geht. Ich hoffe er macht bald mal weiter.

Verzeiht ich war unterwegs :wink:

@roadsterhh:
Hab Dir gerade ne PM geschickt mit der Dll (dem Modul)

Für Alle interessierten:

Das Modul läuft und kann bereits alles ansteuern.
Nur fehlen noch entsprechende Eigenschaftsseiten und mit den Variabelen harkts ein bissel - hab grad leider keine Zeit :frowning:

Aber man kann das Modul auch prima per PHP einstellen… Und ich mach ja auch bald weiter :wink:

Gruß Huelke

Klasse, vielen Dank !!! :smiley:

Habs gestern nach super Support von huelke hinbekommen ! Danke, funktioniert Klasse !

Hat sich jemand schon eine schöne Webfrontseite mit Farbkarte oder so für Chromoflex gebastelt ? Irgendwas optisch chiques ?

Nachdem ich meine Hardware installiert habe möchte ich mal wieder nachfragen:
Gibt es eine neue Script Version für die Chromoflex RC? Zumindest eine die nicht so viele Variablen generiert währe schön.

Ich habe es in den letzten Tagen mal unter IPS V2.1 ausprobiert, leider scheint es nicht mehr zu gehen. Unter V2.0 läuft es ohne Probleme.

Außerdem wurde in den Befehlen anscheinend die Syntax geändert. Statt RGB heißt es Color.

Gruß Sven

Ich suche für beide Chromoflex Varianten (RS232 und Funk) Scripts, sind die schon fertig?
Ich bin blutiger Anfänger und bin für jede Hilfe dankbar.
Gruß Gunnar

RS232 z.B. http://www.ip-symcon.de/forum/f30/chromoflex-3458/index3.html#post43384

musst Du aber anpassen

Den habe ich für RS232 auch schon gefunden (Danke) und ausprobiert und folgende Fehler bekomme ich:

PHP-Code:

Warning: Variable mit Namen „Dateneingang“ existiert nicht in C:\IP-Symcon\scripts\ChromoflexIR.php on line 28

Warning: Variable mit Namen „Rot“ existiert nicht in C:\IP-Symcon\scripts\ChromoflexIR.php on line 61

Warning: Variable mit Namen „Gruen“ existiert nicht in C:\IP-Symcon\scripts\ChromoflexIR.php on line 67

Warning: Variable mit Namen „Blau“ existiert nicht in C:\IP-Symcon\scripts\ChromoflexIR.php on line 73

Warning: Variable mit Namen „Dimmer“ existiert nicht in C:\IP-Symcon\scripts\ChromoflexIR.php on line 79

Da ich ich gerade erst anfange fällt es mir ziemlich schwer, es zu verstehen.
In der Line 28 steht z.B.

$Chromoflex = GetValueString(„Dateneingang“);

Was mus ich wo ändern, damit es bei mir auch läuft?

Hat denn jemand auch was für den Chromoflex RC?

Gruß Gunnar

Hallo Gunnar,

für den Anfang ist das auch nicht gedacht.

Die Fehlermeldungen besagen, dass Du die entsprechende Variablen nicht angelegt hast. Also Variablen R,G,B anlegen. Dimmer kannst Du weglassen und im Script mit // auskommentieren.

Vielleicht solltest Du erstmal einen Schalter mit Variable testen um zusehen was passiert. Zu jeder Aktion gehört eine Variable, die wenn nicht vom System oder automatisch angelegt wird selbst anzulegen ist.

Nimm mal besser dieses Script, muss aber auch angepasst werden.

Das ganze ist steuerbar über Webfront.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Chromoflex.ips.php
Trigger  : $IPS_VALUE
Interval : 
*/

// Abfragen ob eingeschaltet
$Status = GetValue(21167 /*[Multimedia\Chromoflex\Chromoflex\Status]*/);




if($IPS_SENDER == "WebFront")
{
    SetValue($IPS_VARIABLE, $IPS_VALUE);
}

define ("Comport", 35024 /*[Chromoflex]*/);

$Startbyte =  "\xCA";          // StartByte (Muss nicht verändert werden)
$Adresse   =  "\x00\x00\x00";  // Adresse 0,0,0 = Broadcast

switch ($IPS_VALUE)
{
    case "1":
        SetValue(27515 /*[Multimedia\Chromoflex\Chromoflex\Programm]*/, 269);
        SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 0);
       SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 0);
      SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 0);
     break;
    case "260":
 
     break;
   case "261":

     break;
   case "262":

     break;
/*Programmnummer aufrufen 0-7 und 9. Es erfolgt erst ein Reset,
danach wird das Programm mit einer kleinen Verzögerung aufgerufen, diese muss sein, sonst startet das Programm nicht.
Programm = 200+3*Programmnummer. Hier als Beispiel Nr.3, 200 + 3 * 3 = 209 entspricht 0xD1*/

    case "263": // Eigenes Programm(Alarm)
        if(!$Status)
         {
             FS20_SwitchMode(41478 /*[Multimedia\Chromoflex\Chromoflex]*/, true);
             return;
         }
     else
     {
         Reseten();       // Funktion aufrufen
         IPS_Sleep(750); // 750ms warten, ansonsten starten die Programme nicht(Timing)
         $cmd = chr(0).chr(3).chr(0x7D).chr(0x15).chr(0).chr(0xD1); //Programm. 0xD1 startet Programm 3
         $txt = $Adresse.$cmd;
         $crc = CRC16r($Startbyte.$txt);
         $txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
         $txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
         COMPort_SendText(Comport, $Startbyte.$txt.$crc);
     }
         return;
     break;
    case "265": // Weiß
         if(!$Status)
         {
             FS20_SwitchMode(41478 /*[Multimedia\Chromoflex\Chromoflex]*/, true);
             return;
         }
     else
     {
        SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 255);
         SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 255);
         SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 255);
    }
     break;
    case "266": // Gelb
         SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 255);
         SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 255);
        SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 0);
     break;
    case "267": // Violett
         SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 255);
         SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 0);
         SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 255);
     break;
    case "268":  // Chromoflex ausschalten(Standby) alle Werte auf 0
         SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 0);
         SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 0);
         SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 0);
     break;
    case "269":   // Nach Reset startet das Default Programm
         Reseten();   // Funktion aufrufen
     break;
    default:
       SetValue(27515 /*[Multimedia\Chromoflex\Chromoflex\Programm]*/, 264);
      break;
}
// Werte einlesen
$Rot = GetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/);
$Gruen = GetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/);
$Blau = GetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/);

// Dimmereingang von 0-100%
$Dimmer = GetValue(48745 /*[Multimedia\Chromoflex\Chromoflex\Dimmer]*/);

// Status setzen
$cmd = chr(0).chr(2).chr(0x7E).chr(0x12).chr(0x01);
$txt = $Adresse.$cmd;
$crc = CRC16r($Startbyte.$txt);
$txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
$txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
COMPort_SendText(Comport, $Startbyte.$txt.$crc);

/*
// Track setzen
$cmd = chr(0).chr(3).chr(0x7E).chr(0x11).chr(0x01).chr(0x01);
$txt = $Adresse.$cmd;
$crc = CRC16r($Startbyte.$txt);
$txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
$txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
COMPort_SendText(Comport, $Startbyte.$txt.$crc);

/*
//INKREMENTIERUNG FESTLEGEN -> 255 = sofort, 1 = 2,55ms für Änderungen von 0 auf 255
define('Rot',   255);
define('Gruen', 255);
define('Blau',  255);
$cmd = chr(0).chr(5).chr(0x7E).chr(8).chr(Rot).chr(Gruen).chr(Blau).chr(0x64);
$txt = $Adresse.$cmd;
$crc = CRC16r($Startbyte.$txt);
$txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
$txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
COMPort_SendText(Comport, $Startbyte.$txt.$crc);
*/

//Farben setzen ==> Set
$cmd = chr(0).chr(5).chr(0x7E).chr(4).chr($Rot).chr($Gruen).chr($Blau).chr($Dimmer);
$txt = $Adresse.$cmd;
$crc = CRC16r($Startbyte.$txt);
$txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
$txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
COMPort_SendText(Comport, $Startbyte.$txt.$crc);

//Level setzen
$cmd = chr(0).chr(5).chr(0x7E).chr(0).chr($Rot).chr($Gruen).chr($Blau).chr($Dimmer);
$txt = $Adresse.$cmd;
$crc = CRC16r($Startbyte.$txt);
$txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
$txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
COMPort_SendText(Comport, $Startbyte.$txt.$crc);


// Funktion zur Checksummenberechnung by HJH
function CRC16r($s)       // CRC16 reverse
{
 $CRCreg = 0xffff << 1;   // Startwert
 $PLYreg = 0xA001 << 1;   // Polynom
 $len = strlen($s);

 for ($cp=0; $cp<$len; $cp++)
 {
  $CRCreg ^= ord($s[$cp]) << 1;
  for ($bp=0; $bp<8; $bp++)
  {
   $CRCreg >>= 1;
   if ($CRCreg & 0x01) $CRCreg ^= $PLYreg;
  }
 }
 $crc = $CRCreg >> 1;
 $crcLo = $crc & 0xff;
 $crcHi = $crc >> 8;
 return chr($crcHi).chr($crcLo);
}


// Funktion Reseten
function Reseten()
{
 SetValue(40117 /*[Multimedia\Chromoflex\Chromoflex\Rot]*/ , 0);
 SetValue(37375 /*[Multimedia\Chromoflex\Chromoflex\Grün]*/, 0);
 SetValue(31672 /*[Multimedia\Chromoflex\Chromoflex\Blau]*/, 0);
 $cmd = chr(0).chr(0).chr(0xFE);
 $txt = "\x00\x00\x00".$cmd;
 $crc = CRC16r("\xCA".$txt);
 $txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
 $txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
 COMPort_SendText(Comport,"\xCA".$txt.$crc);
}

?>

Hallo Rainer,

vielen Dank für Deine Hilfe, ich habe es leider immer noch nicht kapiert.

Gibt es für Anfänger wie mich auch eine leichte Anleitung wo ich mit üben kann?

Weil ich weiss nicht wo Du hierrauf zugreifts:

SetValue(27515 /[Multimedia\Chromoflex\Chromoflex\Programm]/, 269);
SetValue(40117 /[Multimedia\Chromoflex\Chromoflex\Rot]/ , 0);
SetValue(37375 /[Multimedia\Chromoflex\Chromoflex\Grün]/, 0);
SetValue(31672 /[Multimedia\Chromoflex\Chromoflex\Blau]/, 0);

Was ist 40117 usw., was muss ich da eingeben (Ist das das Programm CF_Edit)?

Mit dem Serial Port habe ich verstanden den habe ich aus getauscht.

Ich habe den Chromoflex direkt an die Serielle Schnitstelle gehängt, und möchte gerne mit IP-Symcon ihn steuern.

Gruß Gunnar