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