Chromoflex RC, FTDI

Updated: 12.03.2010

Hi alle zusammen.

Chromoflex wurde hier im Forum schon angesprochen. Dabei handelt es sich um einen RGB Controller mit dem man RGB Stripes oder Spots ansteuern kann.
Ich hab mich damals gleich für die Luxus-Variante entschieden: „RC“ diese baut selbst ein Funknetzwerk auf und kann über einen USB Dongle ferngesteuert werden (Bis zu 8 verschiedene Netze paralel).

Nun ein paar von euch haben die Beta des ChromoflexRC Moduls ja schon erfolgreich am laufen.
Da ich in letzter Zeit immer mehr von Euch das Modul zugeschickt habe, denke ich die Zeit ist nun gekommen die Beta öffentlich zu machen.

An diesem Post findet Ihr für die unterschiedlichen IPS Versionen downloads

Wenn ich die Zeit gefunden habe um weiterzu arbeiten, findet Ihr hier immer die neuste Version der dll.

Changelog:

-beta 0.3 (b0.3):
FadeColor Funktion für weiche Übergänge
Ablaufsteuerung/Programm Funktionen

-beta 0.2 (b0.2):
Variablen hinzugefügt (Farbe, Programm + Dimmer)

-beta 0.1 (b0.1):
Erste Beta mit allen gängigen Funktionen

Es stehen alle Versionen zum Download bereit.

Die b0.3 für IPS 2.2 kommt mit neuen Funktionen:
So gibt es jetzt die Funktion FadeColor, die es ermöglicht über eine definierbare Zeitspanne von der aktuellen Farbe zu einer neuen Überzublenden.
Neu sind auch die Programm Funktionen:
Mit dessen Hilfe kann man selbst eine Ablaufsteuerung definieren und so eigene Programme für das CF entwerfen. Anders als bei den Controller-Internen Programmen wird hier die Steuerung allerdings über IPS und den Dongle vorgenommen. Der Server sendet also alle Änderungen „LIVE“ an die Controller. Um möglichst viel Spielraum bei dem Programm-Entwurf zu gewährleisten ist das ganze etwas komplizierter geworden. Es liegt aber eine Doku bei.

Anleitung
Das ganze ist eine dll Datei (ChromoflexRC.dll) die in den Modules Ordner von IPS gehört.
Wenn die drin ist, Service neu starten und es gibt ein neues Modul.
Barthelme > Chromoflex III RC Stripe und i350.
Ist egal welches man nimmt, ist beides das selbe…aber Ordnung muss sein ^^.

Als Parent wählt man FTDI und in dessen Einstellungen den Chromoflex Dongle aus der Liste.

Da man selber leider noch keine Eigenschaften-Seiten für seine Module bauen kann, müssen die Modul-Einstellungen noch per PHP vorgenommen werden. Mittels SetNet (Netz 8 ist default) und SetDeviceId (s.u.) kann man das Modul einstellen.
Die DeviceID kriegt man momentan nur mit dem Hersteller Tool, dort auf Suche gehen und die so ermittelten IDs (Hexadezimal) mit dem Windows-Taschenrechner (oder aus dem Kopf ;)) in Dezimal-Zahlen umwandeln. Mit google gehts auch: „0xEmpfängerID in decimal“ eingeben (also z.B. „0x1009D2 in decimal“)

Entweder legt man nur ein Chromoflex Modul an und setzt die ID vor jedem Befehl neu oder man legt ein Modul pro Receiver an (so ists gedacht) und setzt die Eigenschaften jeweils einmal mit PHP, danach sollte IPS sich das merken…


###############  
#  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); // $dimm: 0...254 0=aus, 254 voll an (alternativ zu 254 geht auch -1)
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  

###############  
# Beispiel # 
############### 
ChromoflexRC_SetDeviceID(47950 /*[ChromoflexRC III Stripe]*/, 1051090); // Device ID setzen (Netz ist 8=Default)
ChromoflexRC_BroadcastSetColor(47950 /*[ChromoflexRC III Stripe]*/ ,255,0,0,254); //Rot, Voll an

Das wars auch schon.

Das Modul ist nach wie vor als Beta zu sehen.
Es fehlen Eigenschaften und die Receiver Suche!
Paresy hatte mir aber schon vor längerer Zeit angeboten eine Eigenschafts-Seite in IPS mit einzukompilieren, ich will aber erst die Suche fertig machen und dazu fehlt’s grad an der Zeit.

Wenn sich das Ändert gibt es hier das neuste Modul.

Na dann machts mal Bunt!
gruß Huelke

Neue Funktionen der Beta 0.3


##### Change-Log / Neue Befehle

//"Stand-Alone"
Chromflex_FadeColor(ObjectId,r,g,b,dimm,duration)
Chromflex_BroadcastFadeColor(ObjectId,r,g,b,dimm,duration)

//"Program"
Chromflex_Program_Length(ObjectId) : integer
Chromflex_Program_IsRunning(ObjectId) : boolean
Chromflex_Program_Add(ObjectId,function,duration)
Chromflex_Program_Clear(ObjectId)
Chromflex_Program_Start(ObjectId,repeat)
Chromflex_Program_StartBroadcast(ObjectId,repeat)
Chromflex_Program_Stop(ObjectId)

######

###### „Stand-Alone“ Funktionen:



Chromflex_FadeColor(ObjectId,r,g,b,dimm,duration)
Chromflex_BroadcastFadeColor(ObjectId,r,g,b,dimm,duration)
/*
Von Aktueller Farbe zu Übergebener Farbe überblenden.
Dauer des Überblendens: duration in Millisekunden, aber nicht unter 50 ms (Chromoflex blendet ohnehin minimal über)
Während des Vorgangs wird die ProgramVariable des Moduls auf "88" gesetzt, nach Ablauf des Programms steht es dann auf 18 => Farbe
Wird während eines Vorgangs eine andre CF Steuer-Funktion (SetColor,SetProgram,usw....) ausgeführt, so wird der Fade abgebrochen.
*/

######

###### Programmfunktionen:
Das Modul bietet nun Zeitgesteuerte Programmfunktionen
Man kann ein eigenes Ablauf-Program zusammenstellen und dieses starten.
Dabei wird allerdings nicht das Interne ROM des Empfängers programmiert sondern der Empfänger wird „LIVE“ angesteuert.
Die Möglichkeiten sind beim Internen Rom zu begrenzt.
Das bedeutet aber das (im Höchstfall) 25 mal pro Sekunde ein Befehl über den Dongle an die Empfänger geschickt wird.
Das klingt krasser als es ist :). Es wird nur ein Befehl gesendet wenn sich die Farbe auch wirklich geändert hat.
Ich habe keine Störungen anderer Geräte feststellen können.



Chromflex_Program_Add(ObjectId,function,duration)
/*
Fügt dem Programm einen weiteren Punkt hinzu.
duration:integer
Dauer der Aktion

function:string
Zurzeit gibt es 3 Funktionen:

"fadeTo(farbe)" // dimm: optional,default:254
//Zu Farbe Überblenden (über die dauer)

"set(farbe)"		 // dimm: optional,default:254
//Farbe setzen (und für die dauer halten)

"hold"
//Aktuelle Farbe halten (für die dauer)

Die Farbe (farbe) hat grundsätzlich folgendes Format:
r,g,b,dimm 
Allerdings kann Sie auch viel mehr sein (siehe dazu unten: Farb-Definitionen) 
*/


Chromflex_Program_Clear(ObjectId)
// Program löschen

Chromflex_Program_Start(ObjectId,repeat)
// Starten für die betroffenen Device
// repeat=false => Das Program läuft ein mal und beendet dann den Program Modus
// repeat=true => Das Program wiederholt sich 

Chromflex_Program_StartBroadcast(ObjectId,repeat)
// Starten für alle Devices
// repeat=false => Das Program läuft ein mal und beendet dann den Program Modus
// repeat=true => Das Program wiederholt sich

Chromflex_Program_Stop(ObjectId)
// Das Program stoppen (wird auch durch jede andere Funktion die den Receiver ansteuert beendet (SetColor,SetProgram....)

Chromflex_Program_Length(ObjectId) : integer
// Länge des Programms (in Millisekunden) 

Chromflex_Program_IsRunning(ObjectId) : boolean
// Läuft grade das Userprogram?
// Alternativ wird auch die ProgramVariable des Moduls auf "99" gesetzt, nach Ablauf des Programms steht es dann auf 18 => Farbe

########### Beispiel „Sonnenaufgang“ (langsam):


// Vor einem neuen Programm: resetten
Chromflex_Program_Clear(11199)

// Sonnen-Aufgang (über ~ 300 Sekunden, dann 10 Sekunden "halten")
ChromoflexRC_Program_Add(11199,'set(255,0,0,0)',100);		 //Rot und Dunkel machen
ChromoflexRC_Program_Add(11199,'fadeTo(255,205,70,254)',300000);  //über 300 Sekunden aufblenden und Farbe auf Warmweiß
ChromoflexRC_Program_Add(11199,'hold',10000);  //Tageslicht 10 Sekunden halten (hier unnötig) 

// Programm starten: (nicht im Repeat Modus=> False)
Chromflex_Program_Start(11199,FALSE);

Zumindest bei meinen RGB Stripes sind die Schritte bei Dunkelen Farben (rund Ums Schwarz) leider etwas grob und somit stufig.

Theoretisch können beliebig viele Program-Punkte aneinander gereiht werden

###### Farb-Definitionen: (für Program_Add)

Die Farben werden in folgendem Format angegeben, fehlt ein Parameter, so wird der Default-Wert gesetzt.

Farb-Format:
r,g,b,dimm

r:rot : Default = 0
g:grün : Default = 0
b:blau : Default = 0
dimm:dimmer : Default=254

Die einzelnen Werte können Absolut oder auch Zufällig sein:

Wert-Formate:
x Zahl Absolut: x
x-y Zufallszahl x bis y
-y Zufallszahl 0 bis y
x- Zufallszahl x bis 255

  •   Zufallszahl 0 bis 255
    

FarbPaletten:
Anstelle nur einer Farbe können auch Paletten verwendet werden.
Diese machen nur Sinn in sich wiederholenden Programmen!
Hierbei werden die einzelnen „Farben“ mit Semikolon getrennt.
Man hat die Wahl ob eine Zufällige Farbe aus der Palette gewählt werden soll ODER die Farben in Reihe „abgearbeitet“ werden sollen:

(Zufällig)
[farbe1;farbe2;farbe3]

(Reihe)
{farbe1;farbe2;farbe3}

##### Beispiele (alle für den „repeat-modus“ gedacht):

Für alle Beispiele gilt:
Vor dem Adden das alte Programm löschen, also ChromoflexRC_Program_Clear aufrufen - Nach dem Adden muss das Programm noch gestartet werden (siehe oben)


	// Kleine Pallette durchwandern: {}
	ChromoflexRC_Program_Add(11199,'set({255,0,0; 255,255,0; 0,255,0; 0,255,255; 0,0,255; 255,0,255})',5000); // Nächste Paletten Farbe 5 Sekunden halten
	
	// -geht natürlich auch als Fading -> "Regenbogen":
	ChromoflexRC_Program_Add(11199,'fadeTo({255,0,0; 255,255,0; 0,255,0; 0,255,255; 0,0,255; 255,0,255})',5000); // 5 Sekunden zu nächster Paletten Farbe Faden
	
	// Das entspricht im überigen exakt diesem Program - ist aber auf eine Zeile Komprimiert:
	ChromoflexRC_Program_Add(11199,'fadeTo(255,0,0)',5000);
	ChromoflexRC_Program_Add(11199,'fadeTo(255,255,0)',5000);
	ChromoflexRC_Program_Add(11199,'fadeTo(0,255,0)',5000);
	ChromoflexRC_Program_Add(11199,'fadeTo(0,255,255)',5000);
	ChromoflexRC_Program_Add(11199,'fadeTo(0,0,255)',5000);
	ChromoflexRC_Program_Add(11199,'fadeTo(255,0,255)',5000);
							
	// Gleiche Palette aber diesmal ist Reihenfolge zufällig [] - das kann man nicht durch ein alternativ Programm lösen
	ChromoflexRC_Program_Add(11199,'set([255,0,0; 255,255,0; 0,255,0; 0,255,255; 0,0,255; 255,0,255])',5000); // 5 Sekunden zu nächster Paletten Farbe Faden
	

	### Nun Zufällige Farbwerte

	// Zufall Farben r,g,b je 0 bis 255
	ChromoflexRC_Program_Add(11199,'set(-,-,-)',10000); // Zufälltige Farbe 10 Sekunden halten

	// Zufall Farben Primär Rot (Der Rotanteil liegt bei 200 - 255)
	ChromoflexRC_Program_Add(11199,'set(200-,-,-)',10000); // Zufälltige Farbe 10 Sekunden halten

	// Zufall Farben diesmal noch definierter (rot: 100 bis 200 - grün: 10 bis 100 - blau: 200-230
	ChromoflexRC_Program_Add(11199,'set(100-200,10-100,200-230)',10000); // Zufälltige Farbe 10 Sekunden halten

	// Natürlich kann man auch den Dimmer auf Zufall setzen (hier 100 bis 200)
	ChromoflexRC_Program_Add(11199,'set(255,190,230,100-200)',10000); 
	
	// Man kann Zufällige Zahlen auch in Paletten verwenden (Hier ein Zufälliger RotTon gefolgt von Weiß ... usw.)
	ChromoflexRC_Program_Add(11199,'set({200-,-100,-70; 255,255,255})',10000); 

	
	### Hier noch einmal ein paar Beispiele
	
	// Weicher Wechsel 
	ChromoflexRC_Program_Add(11199,'fadeTo(100-,100-,100-)',3000); // 3 Sekunden zu Zufälltiger Farbe überblenden
	ChromoflexRC_Program_Add(11199,'hold',10000);						 // Farbe 10 Sekunden halten (für Repeat Modus)

	// FlashChange: Ein RotTon gefolgt von einem GrünTon dann ein BlauTon, Dazwischen jeweils ein kurzes aufblitzen in Weiß
	ChromoflexRC_Program_Add(11199,'set({200-,-100,-100;-100,200-,-100;-100,-100,200-})',5000 );
	ChromoflexRC_Program_Add(11199,'set(255,255,255)',100 );

	// So etwas wie Blob:
	ChromoflexRC_Program_Add(11199,'fadeTo({200-,-100,-100;-100,200-,-100;-100,-100,200-})',3000 );
	ChromoflexRC_Program_Add(11199,'fadeTo({200-,-100,-100;-100,200-,-100;-100,-100,200-})',3000 );	
	


	### Beispiel für "kompliziertere" Proramme:

	// Gewitter: (Nicht so gut wie das "echte" -ein wenig "sanfter"*- aber es geht...   (* Das liegt daran das der CF leider IMMER leicht fadet wenn man die Farbe per Funk wechselt)
	// Auf diese Weise lässt sich sicherlich auch etwas wie das "Feuer-Program" erstellen.	 
	ChromoflexRC_Program_Add(11199,'fadeTo(-50,-50,200-,-50)',1500 ); // fade zu einem zufälligen dunkelen Blau 
	ChromoflexRC_Program_Add(11199,'fadeTo(-50,-50,200-,-50)',1500 ); // fade zu einem (weiteren) zufälligen dunkelen Blau
	ChromoflexRC_Program_Add(11199,'fadeTo(-50,-50,200-,-50)',1500 ); // fade zu einem (weiteren) zufälligen dunkelen Blau (insg 4,5 Sekunden)
	// Das ist quasi das Hintergrund "Rauschen"

	// Nun muss ab und zu für einen Blitz gesorgt werden:
	// Dafür wird zufällig aus einer Palette aus Farben gewählt. Meistens ist es wieder nur ein weiteres zufälliges Blau. Manchmal aber auch ein reines Weiß:
	// Je nachdem wie oft man die Blaue Farbe da mit reinschreibt verringert sich natürlich die Wahrscheinlichkeit für den weißen Blitz...
	ChromoflexRC_Program_Add(11199,'set([-50,-50,200-,-50;-50,-50,200-,-50; -50,-50,200-,-50; 255,255,255,254)',100 ); // Kurzer "Flash" wahrscheinlichkeit 3:1 für weiß(=Blitz)
	ChromoflexRC_Program_Add(11199,'set([-50,-50,200-,-50; -50,-50,200-,-50; 255,255,255,254)',100 ); // Kurzer "Flash" wahrscheinlichkeit 2:1 für weiß(=Blitz)
	ChromoflexRC_Program_Add(11199,'set([-50,-50,200-,-50; -50,-50,200-,-50; 255,255,255,254)',100 ); // Kurzer "Flash" wahrscheinlichkeit 2:1 für weiß(=Blitz)
	ChromoflexRC_Program_Add(11199,'set([-50,-50,200-,-50;-50,-50,200-,-50; -50,-50,200-,-50; 255,255,255,254)',100 ); // Kurzer "Flash" wahrscheinlichkeit 3:1 für weiß(=Blitz)

	// Weil danach das Programm wiederholt wird wollen wir nicht das die letzte Farbe Weiß war:
	ChromoflexRC_Program_Add(11199,'set(-50,-50,200-,-50)',200 ); // Setze Dunkeles Blau (damit nicht vom Weiß eines "Blitzes" 1,5 Sek gefaded wird (repeat)


Der Kreativität sollten keine Grenzen gesetzt sein,
wenn doch: also wenn Ihr ein Ablauf-Programm bauen wollt das Ihr so nicht umsetzten könnt… PN → an HUELKE

Nun denn, bitte Postet doch das ein oder andere Program, welches Ihr erstellt habt.
Ich bin mal gespannt auf eure Ideen.

Die Nutzung geschieht auf eigene Gefahr.

WARNUNG: nicht mehrere Programme die Viel „Funkbedarf“ (~25 Farbänderungen in der Sekunde) haben gleichzeitig laufen lassen.
Der Dauer Test mit einem Einzelnen Programm hat problemlos funktioniert.
Der Stress Test mit 4 Parallen Stressreichen(~25 Farbänderungen in der Sekunde mal 4!!! = 100) Programmen hat zu einer Fehlfunktion des Dongels geführt (nach längerer Laufzeit).

Hier noch ein paar PHP Defines/Variabelen die Ihr brauchen könntet


//Programme
define("cf_program_off",0);
define("cf_program_savecolorandoff",1);
define("cf_program_savedcolor",2);					
define("cf_program_colorchange",3);
define("cf_program_medium_colorchange",4);
define("cf_program_slow_colorchange",5);
define("cf_program_blob",6);
define("cf_program_burst",7);
define("cf_program_fire",8);
define("cf_program_flashes",9);
define("cf_program_lsd",10);
define("cf_program_user1",11);
define("cf_program_user2",12);
define("cf_program_user3",13);
define("cf_program_slow_strobo",14);
define("cf_program_strobo",15);
define("cf_program_fast_strobo",16);
define("cf_program_mix",17); // fast colorchange + blob
define("cf_program_color",18); // set by "...SetColor"

//Farbpalette (wie die im Herstellertool)
$cf_color_table=array(
	array(255, 0, 0),		/*/0: Rot */
	array(255, 20, 0),		/*/1: Hell3rot */
	array(255, 40, 0),		/*/2: Hell2rot*/
	array(255, 80, 0),		/*/3: Hellrot*/
	array(255, 120, 0),		/*/4: Orange*/
	array(255, 255, 0),		/*/5: Gelb*/
	array(200, 255, 0),		/*/6: Gruengelb*/
	array(100, 255, 0),		/*/7: Hellgruen*/
	array(0, 255, 0),	             /*/8: Reingruen*/
	array(0, 255, 80),		/*/9: Leicht Indigo*/
	array(0, 255, 144),		/*/10: Indigo*/
	array(0, 255, 255),		/*/11: Hellblau*/
	array(0, 100, 255),		/*/12: Hellblau*/
	array(0, 50, 255),		/*/13: Dunkelblau*/
	array(0, 0, 255),		/*/14: Royal*/
	array(50,	0, 255),		/*/15:*/
	array(100, 0, 255),		/*/16:*/
	array(255, 0, 255),		/*/17: Magenta*/
	array(255, 0, 100),		/*/18 */
	array(255, 0, 50),		/*/19 */
	array(255, 255, 255),	/*/ 20 *Weiss */
	array(255, 255, 80),	/*/ 21 Ungefaehr Weiss*/
	array(120, 255, 120),	/*/ 22 Ungefaehr Weiss*/
	array(190, 255, 180),	/*/ 23 Ungefaehr Weiss*/
	array(160, 255, 255)	/*/ 24 Ungefaehr Weiss */
);

// Passende Funktion für Palette
function ChromoflexRC_SetPalColor($objectId, $palColor, $dimm);
    global $cf_color_table;
    ChromoflexRC_SetColor($objectId, $cf_color_table[$palColor][0],$cf_color_table[$palColor][1],$cf_color_table[$palColor][2],$dimm);
}

###############  
# Beispiel # 
############### 
ChromoflexRC_SetPalColor(47950 /*[ChromoflexRC III Stripe]*/, 4, 254);  // Orange - voll an

Hier das „Ur-Posting“:(um den weiteren Thread nicht zu zerstören )

Nun gibt es zu der alten Kabel-Variante schon länger die Spezifikationen zum Protokol.
Ich habe lange Zeit die Leute von Barthelme bekniet das die auch die Spezifikationen zum Chromoflex III RC rausgeben. Und ich hab sie nun endlich bekommen. Genauer gesagt hab ich die Sourcecodes des ColorEditors bekommen. =)

Das tolle ist, das der USB Dongle vom Chromoflex auch den FTDI Chip benutzt und somit den selben Treiber wie die FHZ 1300 (FS 20) verwendet.
Der IO Treiber (FTDI) zeigt den Chromoflex auch bereits an.

Das bedeutet ich könnte ja theoretisch auf die FTDI IO Unit aufbauen und müsste nur noch den Splitter und ein Modul programmieren.

Und da kommt Ihr ins Spiel, ich hab nämlich keine Ahnung wie genau ich da anfangen soll. :confused: Am besten wäre es natürlich die Source von dem FHZ1X00PC Splitter quasi als SDK bekommen könnte (vllt auch ein FS20-Modul dazu), dann könnte ich genau sehen wie die Kommunikation funktioniert.

Ich arbeite allerdings schon mit V2…

Hilfe! :slight_smile:

Vielen Dank im Vorraus,
Huelke

Edit von paresy:
Download für IP-Symcon 2.3: http://www.ip-symcon.de/forum/92019-post199.html

ChromoflexRC_b0.1_2.04.rar (242 KB)

ChromoflexRC_b0.1_2.1.rar (242 KB)

ChromoflexRC_b0.2_2.04.rar (243 KB)

ChromoflexRC_b0.2_2.1.rar (243 KB)

ChromoflexRC_b0.3_2.1.rar (248 KB)

ChromoflexRC_b0.3_2.2.rar (249 KB)

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);
}

?>