LD382 "Magic UFO" RGBW LED WIFI Controller Script

Hallo,

Ich hab gestern endlich meinen LED WIFI Controller bekommen, und zwar vom Typ LD382a „Magic UFO“ LED WIFI Controller – kleines rundes Ding mit vier 4A RGBW Ausgaengen:

41WbaGBkb8L.SY300.jpg

Es gibt eine ganz nette smartphone app dafuer, aber natuerlich wollte ich das sofort in Symcon einbinden… Fuer das spezifische Modul gibt es anscheinend noch nichts, also hab ich mal schnell ein rudimentaeres script dafuer angelegt – moege es anderen Besitzern des Moduls helfen, bzw. hier auch weiterentwickelt werden.

Basis ist die Info aus https://www.symcon.de/forum/threads/22749-WLAN-RGB-Controller-einbinden?p=218115#post218115 – von dort darf ich auch gleich die Anleitung uebernehmen:

Folgende Arbeitsschritte:

  1. Dummy-Instanz anlegen. Die erzeugten Objekte in Punkt 2-4 in dieser Instanz ablegen.

  2. Integer-Variable mit Namen „HexColor“ und Profil HexColor anlegen.

  3. Boolean-Variable mit Namen „ledOnOff“ und Profil ~Switch anlegen.

  4. Skript vom Ende des Posts anlegen

  5. Dieses Skript den Variablen von Punkt 2 und 3 als Actionskript zuordnen.

  6. Client-Socket anlegen. Host ist die IP des Wifi-Controller, Port: 5577. Aktivieren.

  7. Im Skript die ID des Sockets eintragen.

  8. Im Webfront zwei Links auf die Variablen aus Punkt 2 und 3 anlegen. Beschriftung nach Geschmack.

Derzeit ist nur An/Aus und RGB Farbwert setzen implementiert – sinnvolle Erweiterungen waeren noch volle Unterstuetzung fuer RGBW-LED strips (ich hab nur RGB strips), sowie ein allgemeiner Helligkeitsschalter.

Ich hab nur einen neuen LD382a, die aelteren Modelle haben anscheinend ein leicht anderes Protokoll – alle Infos um das anzupassen sind hier zu finden: https://github.com/herrmannj/wifilight/blob/master/FHEM/32_WifiLight.pm

Frage an die Kenner: soll der Client Socket am Ende des scripts geschlossen werden? Im Basisscript ist der code dazu vorhanden aber auch auskommentiert…?

Hier nun das Script:


<?
// simple ld382a control module
// codes used:
// power on       "\x71\x23\x0F"
// power off      "\x71\x24\x0F"
// rgb color      "\x31\xRR\xGG\xBB\x00\x00\x0F"

if ($IPS_SENDER == "WebFront")
{
   SetValue ($_IPS['VARIABLE'], $_IPS['VALUE']);
}

// Variablen-IDs, RGB-Gruppe und Controller-Instanz definieren
   $id_rgb      = 10148 /*[LED1Socket]*/; // CHANGE to own socket ID
   $HexColorID  = IPS_GetObjectIDByName("HexColor", IPS_GetParent($_IPS['SELF']));

   // RGB Socket öffnen
   CSCK_SetOpen($id_rgb, true);
   IPS_ApplyChanges($id_rgb);

	// on/off
	if(IPS_GetName($_IPS['VARIABLE'])=="ledOnOff")
	{
	   if($_IPS['VALUE']==true)
	   	CSCK_SendText($id_rgb, ledCheckSum("\x71\x23\x0F"));
	   else if($_IPS['VALUE']==false)
	   	CSCK_SendText($id_rgb, ledCheckSum("\x71\x24\x0F"));
   }
	else
	{
		$ValueHEX = dechex($_IPS['VALUE']);
		$ValueHEX = substr("000000", 0, 6 - strlen($ValueHEX)).$ValueHEX;
		$RR   = chr(hexdec(substr($ValueHEX, 0, 2)));
		$GG = chr(hexdec(substr($ValueHEX, 2, 2)));
		$BB  = chr(hexdec(substr($ValueHEX, 4, 2)));

		// rgb color					        "\x31\xRR\xGG\xBB\x00\x00\x0F"
	   CSCK_SendText($id_rgb, ledCheckSum("\x31".$RR.$GG.$BB."\x00\x00\x0F"));
	}
	
	// close socket?
   //CSCK_SetOpen($id_rgb, false);
   //IPS_ApplyChanges($id_rgb);

function ledCheckSum($str)
{
	// calc checksum: sum of ascii value of each char modulo 256
	$cs = 0;
	foreach(str_split($str) as $c)
	   $cs=$cs+ord($c);
	$cs = $cs % 256;
	return $str . chr($cs);
}
?>

Hallo,

kann mir hier jemand helfen den weißen Kanal, sowie Luminance und Sättigung einzubauen?

Danke und Grüße
Stephan

hi,

all die extras koennte man aus dem verlinkten post zum anderen thread entnehmen. zB von dort den luminance slider fuer den W Kanal nehmen, ebenfalls mit dem script verlinken, und dann entsprechend um das 4. byte erweitern, in etwa so (untested):


  else
    {
$ValueHEX = dechex(GetValue( ID_of_RGB_Slider ));
        $ValueHEX = substr("000000", 0, 6 - strlen($ValueHEX)).$ValueHEX;
        $RR   = chr(hexdec(substr($ValueHEX, 0, 2)));
        $GG = chr(hexdec(substr($ValueHEX, 2, 2)));
        $BB  = chr(hexdec(substr($ValueHEX, 4, 2)));
$WW = chr(GetValue( ID_of_White_Slider ));

        // rgb color                            "\x31\xRR\xGG\xBB\x00\x00\x0F"
       CSCK_SendText($id_rgb, ledCheckSum("\x31".$RR.$GG.$BB.$WW."\x00\x0F"));
    } 

es ist also der RGB wert aus der richtigen ID auszulesen, dann eine extra variable ($WW) notwendig, die den weisswert ausliest, und nach RGB statt dem 00 den wert schreibt. wiegesagt ungetestet, sollte aber so klappen.

Hallo,

vielen Dank für die Hilfe. Das mit dem dimmen des weißen Lichtes hat super funktioniert.

Jetzt würde ich gerne noch wie in der Magic UFO App die Sättigung für RGB steuern. Leider schaffe ich es nicht dies aus dem anderen Skript in dieses zu übertragen :confused::(. Tut mir leid.

Kann mir hier vielleicht nochmal jemand helfen? Danke!!!

Es geht da ja um diesen Teil, oder? Wie kann ich den denn umbauen??


        // Helligkeit senden
            // Anpassung an den zulässigen Wertebereich 2-27 Dezimal
                $Luminance2 = round(($Luminance / 9.44), 0);
                if ($Luminance2 <  2) $Luminance2 =  2;
                if ($Luminance2 > 27) $Luminance2 = 27;
           USCK_SendText($id_rgb, $GruppeAN."\x00\x55"); // Sende Gruppe xyz AN
           ips_sleep(110);
           $Output = "\x4e".chr($Luminance2)."\x55";
            USCK_SendText($id_rgb, $Output); // Sende Helligkeit an Gruppe xyz
        // Wert in Variable Helligkeit schreiben
        SetValue($LuminanceID, $Luminance);
        return;

Wäre super wenn mir jemand helfen könnte!

Danke und Grüße
Stephan

Hallo,
also ich habe auch ein paar von dem LD382 im Einsatz.
Da ich nicht ganz so fit bin in php, habe ich das recht simpel bei mir gelöst.

Hier mal ein paar Screenshots.

Wenn mein Ansatz für Dich interessant ist,
kann ich alle meine verwendeten Action-Scripte hier einfügen.

Hallo,

ja klar, sieht interessant aus. Ich bin auch nicht fit in PHP und habe echt Probleme ein Skript umzubauen. Ich steig da teilweise echt einfach nicht durch.

Wäre schon interessiert an deiner Lösung und würde mich freuen wenn du diese veröffentlichen würdest.

Danke und Gruß
Stephan

Hallo Stephan,
hier meine Umsetzung des ganzen:
Achtung ich verwende IPS 4.0 auf Ubuntu.
Die Scripte liegen unter den Variablen und werden als Action-Scripte gestartet.
161102-IPS-Action-Script-snip_20160211225457.png

Die Profile müssen entsprechend erstellt werden.
Die IP-Adresse und die ID müssen natürlich auch angepasste werden.
Ich habe keinen Client Socket verwendet, sondern führe die Befehle direkt aus.
So muss ich nicht ständig den Client Socket öffnen und schließen.
Zudem habe ich den Eindruck, dass der LD382 so schneller auf Befehle reagiert.

Hier der Inhalt des „LED-Toggle-On-Off“

<?
if($_IPS['SENDER'] == 'WebFront') 
  {
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);  
if ($_IPS["VALUE"] == true)  
fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x71\x23\x0F\xA3");//Stripe An
else
fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x71\x24\x0f\xa4");//Stripe Aus
  }
?>

Hier der Inhalt von „Farben-Auswahl“

<?
if($_IPS['SENDER'] == 'WebFront')
   {
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if ($_IPS["VALUE"] == 1){fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x31\xff\x00\x00\x00\x00\x0f\x3f") && SetValue (30431 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Farbe]*/,16711680);}//rot
else
if ($_IPS["VALUE"] == 2){fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x31\x00\xff\x00\x00\x00\x0f\x3f") && SetValue (30431 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Farbe]*/,65280);}//gruen
else
if ($_IPS["VALUE"] == 3){fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x31\x00\x00\xff\x00\x00\x0f\x3f") && SetValue (30431 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Farbe]*/,255);}//blau
else
if ($_IPS["VALUE"] == 4){fwrite(fsockopen("tcp://192.168.0.201", 5577), "\x31\x00\x00\x00\xff\x00\x0f\x3f");}//weiss
    }
?>

Profil Farben-Fix

Hier der Inhalt von „Farbpicker“

<?
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']); // Speichert den vom Picker gesendeten Wert in der angelegten Variable

//Picker Umwandlung und Zerteilung in HEX Farben
$r = (($_IPS['VALUE'] >> 16) & 0xFF);
$g = (($_IPS['VALUE'] >> 8) & 0xFF);
$b = (($_IPS['VALUE'] >> 0) & 0xFF);

$sigdez = 49+$r+$g+$b+15;//Signatur Berechnung Dezimal
$sighex = dechex($sigdez);//Signatur Umrechnung Dezimal zu Hex
$signatur = substr($sighex, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($signatur); //Signatur Umrechnung Hex zu Dezimal

//Sendet Dezimal Werte an Client Socket
fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(49) . chr($r) . chr($g) . chr($b) . chr(00) . chr(00) . chr(15) . chr($signatur1));
?>

Profil für Farbe (Farbpicker)

Hier der Inhalt von „Programm“

<?
$speed = GetValue (16388 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Speed]*/);
$p1 = 37; //Seven Color Cross Fade
$p2 = 40; //Blue Gradual Change
$p3 = 39; //Green Gradual Change
$p4 = 42; //Cyan Gradual Change
$p5 = 44; //White Gradual Change
$p6 = 46; //Red, Blue, Cross Fade
$p7 = 47; //Green, Blue Cross Fade
$p8 = 45; //Red,Green Cross Fade

$sigdez1 = 97+$p1+$speed+15; //Signatur Berechnung Dezimal
$sighex1 = dechex($sigdez1); //Signatur Umrechnung Dezimal zu Hex
$sigkurz1 = substr($sighex1, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($sigkurz1); //Signatur Umrechnung Hex zu Dezimal

$sigdez2 = 97+$p2+$speed+15; //Signatur Berechnung Dezimal
$sighex2 = dechex($sigdez2); //Signatur Umrechnung Dezimal zu Hex
$sigkurz2 = substr($sighex2, -2); //Nur letzte 2 Zeichen verwenden
$signatur2 = hexdec($sigkurz2); //Signatur Umrechnung Hex zu Dezimal

$sigdez3 = 97+$p3+$speed+15; //Signatur Berechnung Dezimal
$sighex3 = dechex($sigdez3); //Signatur Umrechnung Dezimal zu Hex
$sigkurz3 = substr($sighex3, -2); //Nur letzte 2 Zeichen verwenden
$signatur3 = hexdec($sigkurz3); //Signatur Umrechnung Hex zu Dezimal

$sigdez4 = 97+$p4+$speed+15; //Signatur Berechnung Dezimal
$sighex4 = dechex($sigdez4); //Signatur Umrechnung Dezimal zu Hex
$sigkurz4 = substr($sighex4, -2); //Nur letzte 2 Zeichen verwenden
$signatur4 = hexdec($sigkurz4); //Signatur Umrechnung Hex zu Dezimal

$sigdez5 = 97+$p5+$speed+15; //Signatur Berechnung Dezimal
$sighex5 = dechex($sigdez5); //Signatur Umrechnung Dezimal zu Hex
$sigkurz5 = substr($sighex5, -2); //Nur letzte 2 Zeichen verwenden
$signatur5 = hexdec($sigkurz5); //Signatur Umrechnung Hex zu Dezimal

$sigdez6 = 97+$p6+$speed+15; //Signatur Berechnung Dezimal
$sighex6 = dechex($sigdez6); //Signatur Umrechnung Dezimal zu Hex
$sigkurz6 = substr($sighex6, -2); //Nur letzte 2 Zeichen verwenden
$signatur6 = hexdec($sigkurz6); //Signatur Umrechnung Hex zu Dezimal

$sigdez7 = 97+$p7+$speed+15; //Signatur Berechnung Dezimal
$sighex7 = dechex($sigdez7); //Signatur Umrechnung Dezimal zu Hex
$sigkurz7 = substr($sighex7, -2); //Nur letzte 2 Zeichen verwenden
$signatur7 = hexdec($sigkurz7); //Signatur Umrechnung Hex zu Dezimal

$sigdez8 = 97+$p8+$speed+15; //Signatur Berechnung Dezimal
$sighex8 = dechex($sigdez8); //Signatur Umrechnung Dezimal zu Hex
$sigkurz8 = substr($sighex8, -2); //Nur letzte 2 Zeichen verwenden
$signatur8 = hexdec($sigkurz8); //Signatur Umrechnung Hex zu Dezimal

if($_IPS['SENDER'] == 'WebFront') 
  { 
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if ($_IPS["VALUE"] == 1){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p1) . chr($speed) . chr(15) . chr($signatur1));}//Seven Color Cross Fade
else
if ($_IPS["VALUE"] == 2){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p2) . chr($speed) . chr(15) . chr($signatur2));}//Blue Gradual Change
else
if ($_IPS["VALUE"] == 3){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p3) . chr($speed) . chr(15) . chr($signatur3));}//Green Gradual Change
else
if ($_IPS["VALUE"] == 4){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p4) . chr($speed) . chr(15) . chr($signatur4));}//Cyan Gradual Change 
else
if ($_IPS["VALUE"] == 5){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p5) . chr($speed) . chr(15) . chr($signatur5));}//White Gradual Change
 else
if ($_IPS["VALUE"] == 6){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p6) . chr($speed) . chr(15) . chr($signatur6));}//Red, Blue, Cross Fade
 else
if ($_IPS["VALUE"] == 7){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p7) . chr($speed) . chr(15) . chr($signatur7));}//Green, Blue Cross Fade
else
if ($_IPS["VALUE"] == 8){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p8) . chr($speed) . chr(15) . chr($signatur8));}//Red,Green Cross Fade 
   }
?>

Profil für Programm

Hier der Inhalt von „speed“

<?
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$speed = GetValue (16388 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Speed]*/);
$p1 = 37; //Seven Color Cross Fade
$p2 = 40; //Blue Gradual Change
$p3 = 39; //Green Gradual Change
$p4 = 42; //Cyan Gradual Change
$p5 = 44; //White Gradual Change
$p6 = 46; //Red, Blue, Cross Fade
$p7 = 47; //Green, Blue Cross Fade
$p8 = 45; //Red,Green Cross Fade

$sigdez1 = 97+$p1+$speed+15; //Signatur Berechnung Dezimal
$sighex1 = dechex($sigdez1); //Signatur Umrechnung Dezimal zu Hex
$sigkurz1 = substr($sighex1, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($sigkurz1); //Signatur Umrechnung Hex zu Dezimal

$sigdez2 = 97+$p2+$speed+15; //Signatur Berechnung Dezimal
$sighex2 = dechex($sigdez2); //Signatur Umrechnung Dezimal zu Hex
$sigkurz2 = substr($sighex2, -2); //Nur letzte 2 Zeichen verwenden
$signatur2 = hexdec($sigkurz2); //Signatur Umrechnung Hex zu Dezimal

$sigdez3 = 97+$p3+$speed+15; //Signatur Berechnung Dezimal
$sighex3 = dechex($sigdez3); //Signatur Umrechnung Dezimal zu Hex
$sigkurz3 = substr($sighex3, -2); //Nur letzte 2 Zeichen verwenden
$signatur3 = hexdec($sigkurz3); //Signatur Umrechnung Hex zu Dezimal

$sigdez4 = 97+$p4+$speed+15; //Signatur Berechnung Dezimal
$sighex4 = dechex($sigdez4); //Signatur Umrechnung Dezimal zu Hex
$sigkurz4 = substr($sighex4, -2); //Nur letzte 2 Zeichen verwenden
$signatur4 = hexdec($sigkurz4); //Signatur Umrechnung Hex zu Dezimal

$sigdez5 = 97+$p5+$speed+15; //Signatur Berechnung Dezimal
$sighex5 = dechex($sigdez5); //Signatur Umrechnung Dezimal zu Hex
$sigkurz5 = substr($sighex5, -2); //Nur letzte 2 Zeichen verwenden
$signatur5 = hexdec($sigkurz5); //Signatur Umrechnung Hex zu Dezimal

$sigdez6 = 97+$p6+$speed+15; //Signatur Berechnung Dezimal
$sighex6 = dechex($sigdez6); //Signatur Umrechnung Dezimal zu Hex
$sigkurz6 = substr($sighex6, -2); //Nur letzte 2 Zeichen verwenden
$signatur6 = hexdec($sigkurz6); //Signatur Umrechnung Hex zu Dezimal

$sigdez7 = 97+$p7+$speed+15; //Signatur Berechnung Dezimal
$sighex7 = dechex($sigdez7); //Signatur Umrechnung Dezimal zu Hex
$sigkurz7 = substr($sighex7, -2); //Nur letzte 2 Zeichen verwenden
$signatur7 = hexdec($sigkurz7); //Signatur Umrechnung Hex zu Dezimal

$sigdez8 = 97+$p8+$speed+15; //Signatur Berechnung Dezimal
$sighex8 = dechex($sigdez8); //Signatur Umrechnung Dezimal zu Hex
$sigkurz8 = substr($sighex8, -2); //Nur letzte 2 Zeichen verwenden
$signatur8 = hexdec($sigkurz8); //Signatur Umrechnung Hex zu Dezimal

$prog = GetValue (24047 /*[Native-Geraete\Wifi-Controller-LD382A\LED-Stripe-TV-Schrank-Wohnzimmer-EG\Programm]*/);
if ($prog == 1){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p1) . chr($speed) . chr(15) . chr($signatur1));}//Seven Color Cross Fade
else
if ($prog == 2){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p2) . chr($speed) . chr(15) . chr($signatur2));}//Blue Gradual Change
else
if ($prog == 3){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p3) . chr($speed) . chr(15) . chr($signatur3));}//Green Gradual Change
else
if ($prog == 4){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p4) . chr($speed) . chr(15) . chr($signatur4));}//Cyan Gradual Change
else
if ($prog == 5){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p5) . chr($speed) . chr(15) . chr($signatur5));}//White Gradual Change
else
if ($prog == 6){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p6) . chr($speed) . chr(15) . chr($signatur6));}//Red, Blue, Cross Fade
else
if ($prog == 7){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p7) . chr($speed) . chr(15) . chr($signatur7));}//Green, Blue Cross Fade
else
if ($prog == 8){fwrite(fsockopen("tcp://192.168.0.201", 5577), chr(97) . chr($p8) . chr($speed) . chr(15) . chr($signatur8));}//Red,Green Cross Fade
?>

Profil für Speed

Ich hoffe Du kannst mit meinem Ansatz was anfangen.
Das ist alles nicht besonders elegant, besser habe ich es aber nicht hin bekommen
und letztlich ist alles drin was mir wichtig war.
Falls Fragen hast melde Dich einfach noch mal hier.

Gruss
Giuseppe

Hallo,

Eine einfache Gesamthelligkeit laesst sich umsetzen, indem man den Faktor des Sliders mit den Einzelwerten multipliziert – dazu muss der maximale Sliderwert 1 ergeben; also falls Slider 0-100 dann / 100, bei 0-255 eben durch 255 dividieren.

Dies einfach jeweils fuer RGBW so in etwa (untested):


$brightness = GetValue( ID_of_Brightness_Slider ) / 255.0; // oder 100.0, je nachdem was der maximalwert ist
$RR   = chr(hexdec(substr($ValueHEX, 0, 2))*$brightness);
$GG = chr(hexdec(substr($ValueHEX, 2, 2))*$brightness);
$BB  = chr(hexdec(substr($ValueHEX, 4, 2))*$brightness);
$WW = chr(GetValue( ID_of_White_Slider )*$brightness);

lg tom

Hallo Guiseppe,

vielen Dank für deine Skripte, werde ich definitiv nutzen!

Bin leider erst heute ein wenig zum testen gekommen. Deshalb auch erst jetzt der Dank!

@Obstler42
Vielen Dank, mit deinem Ansatz kann ich jetzt alle 4 Kanäle dimmen!

Da ich das Ufo für meine Auquarienbeleuchtung nutzen möchte, ist das wirkl
ich Klasse. Ich würde gerne über einen Zeitraum von sagen wir 30 Minuten, von 0 auf 90% hoch dimmen. Kennt hier jemand eine Lösung?

Danke und Grüße
Stephan

Hallo Stephan,
ich würde einen Script Timer starten, der alle 20 Sekunden +1% hoch dimmt.
Wie man die Signatur berechnet kannst ja aus meinen Sripts entnehmen.

Gruß
Giuseppe

Hat jemand schon Erfahrungen mit dem mini Wifi LED RGBW 192w Controller gemacht ?

Hier ein Bild:

$_12.JPG

Der wird auch über die Magic Home App angesteuert :wink:

So ich habe jetzt den RGBW Kotroller erhalten :smiley:

Er lässt perfekt mit den Scripten vom Magic Ufo ansteuern :D:p

So ich habe mal alles in ein Script zusammengefasst, nur die IP ändern und den Namen der Instanz ändern und 1 x ausführen.

Es werden alle Variablen mit den passierenden Variableprofielen angelegt :smiley:

Wenn mir jemand noch den fertigen Part für den Helligkeit postet baue ich das auch noch ein…

Verbesserungswünsche oder Erweiterungen könnt Ihr mir gerne mitteilen :rolleyes:

Man kenn jetzt auch ganz einfach per Script die Farbe wechseln:

<?

setvalue(46867 /*[RGBW Controller 1\Power]*/, true); // Gerät einschalten !
IPS_Sleep(1000);
setvalue(36409 /*[RGBW Controller 1\Farben]*/, 1); // Feste Farbe wählen !


?>

Das funktioniert genauso mit den Programmen :cool:

Hier das Script:

<?
// ***************Config: *************************************

$name="RGBW Controller 1";
$ip="192.168.0.121";


//********************** Ab hier nix mehr ändern **************


$varid = @$_IPS['VARIABLE']; // Wer hat das Script ausgelöst ?
$varsender=$_IPS['SENDER'];

//print $varsender;



// Variable Profil erstellen
$vprofilname="RGBW-Farben";
if (!IPS_VariableProfileExists($vprofilname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
{

IPS_CreateVariableProfile($vprofilname, 1); // Variabelprofil erstellen
IPS_SetVariableProfileAssociation($vprofilname, 1, "Rot", "", 0xff0000);
IPS_SetVariableProfileAssociation($vprofilname, 2, "Gruen", "", 0x2EFE2E);
IPS_SetVariableProfileAssociation($vprofilname, 3, "Blau", "", 0x0000ff);
IPS_SetVariableProfileAssociation($vprofilname, 4, "Weiss", "", 0xffffff);
}

// Variable Profil erstellen
$vprofilname="RGBW-Programm";
if (!IPS_VariableProfileExists($vprofilname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
{

IPS_CreateVariableProfile($vprofilname, 1); // Variabelprofil erstellen
IPS_SetVariableProfileAssociation($vprofilname, 1, "7-Farben", "", 0xff0000);
IPS_SetVariableProfileAssociation($vprofilname, 2, "Blau", "", 0xff0000);
IPS_SetVariableProfileAssociation($vprofilname, 3, "Gruen", "", 0x2EFE2E);
IPS_SetVariableProfileAssociation($vprofilname, 4, "Cyan", "", 0x0000ff);
IPS_SetVariableProfileAssociation($vprofilname, 5, "Weiss", "", 0xffffff);
IPS_SetVariableProfileAssociation($vprofilname, 6, "Rot-Blau", "", 0xffffff);
IPS_SetVariableProfileAssociation($vprofilname, 7, "Grün-Blau", "", 0xffffff);
IPS_SetVariableProfileAssociation($vprofilname, 8, "Rot-Grün", "", 0xffffff);
}


$instance=GetOrCreateInstanz($name , "dummy", 0);

$powerid=GetOrCreateVariable( "Power", "0", "", "~Switch",$_IPS['SELF'], true, $instance);
$farbenid=GetOrCreateVariable( "Farben", "1",  "", "RGBW-Farben",$_IPS['SELF'], false, $instance);
$farbenpickerid=GetOrCreateVariable( "Farben-Picker", "1","",  "~HexColor",$_IPS['SELF'], false, $instance);
$programmid=GetOrCreateVariable( "Programme", "1","",  "RGBW-Programm",$_IPS['SELF'], false, $instance);
$speedid=GetOrCreateVariable( "Geschwindigkeit", "1","",  "~Intensity.255",$_IPS['SELF'], false, $instance);

IPS_SetPosition($powerid, 1);
IPS_SetPosition($farbenid, 2);
IPS_SetPosition($farbenpickerid,3);
IPS_SetPosition($programmid,4);
IPS_SetPosition($speedid, 5);

$powereventid=GetOrCreateEvent("power",$powerid, $_IPS['SELF']);
$farbeneventid=GetOrCreateEvent("farben",$farbenid, $_IPS['SELF']);
$farbenpickereventid=GetOrCreateEvent("farbenpicker",$farbenpickerid, $_IPS['SELF']);
$programmeventid=GetOrCreateEvent("programm",$programmid, $_IPS['SELF']);
$speedeventid=GetOrCreateEvent("speed",$speedid, $_IPS['SELF']);

IPS_SetHidden($_IPS['SELF'], true);
if ($varsender=="Execute") IPS_SetParent($_IPS['SELF'],$instance);



// Webfrontend
//if($_IPS['SENDER'] == 'WebFront') SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);



 
$power=getvalue($powerid);






//******************** On / Off **************
if ($varid==$powerid)
{
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$power=getvalue($powerid);

if ($power == true) fwrite(fsockopen("tcp://$ip", 5577), "\x71\x23\x0F\xA3");//Stripe An
else fwrite(fsockopen("tcp://$ip", 5577), "\x71\x24\x0f\xa4");//Stripe Aus
}

// ************************ Farben Setzten *******************

if (($varid==$farbenid) && ($power==true))
{
$farben=getvalue($farbenid);
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if ($farben == 1){fwrite(fsockopen("tcp://$ip", 5577), "\x31\xff\x00\x00\x00\x00\x0f\x3f") && SetValue ($farbenpickerid,16711680);}//rot
else
if ($farben == 2){fwrite(fsockopen("tcp://$ip", 5577), "\x31\x00\xff\x00\x00\x00\x0f\x3f") && SetValue ($farbenpickerid,65280 /*[Objekt #65280 existiert nicht]*/);}//gruen
else
if ($farben == 3){fwrite(fsockopen("tcp://$ip", 5577), "\x31\x00\x00\xff\x00\x00\x0f\x3f") && SetValue ($farbenpickerid,255);}//blau
else
if ($farben == 4){fwrite(fsockopen("tcp://$ip", 5577), "\x31\x00\x00\x00\xff\x00\x0f\x3f");}//weiss
    }
else  if  (($varid==$farbenid) && ($power !=true)) echo "Gerät muss an sein, um es zu steuern !";

// ************************** Farbenpicker ***********************************
if (($varid==$farbenpickerid) && ($power==true))
{
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$farbenpicker=getvalue($farbenpickerid);
//SetValue($_IPS['VARIABLE'], $_IPS['VALUE']); // Speichert den vom Picker gesendeten Wert in der angelegten Variable

//Picker Umwandlung und Zerteilung in HEX Farben
$r = (($_IPS['VALUE'] >> 16) & 0xFF);
$g = (($_IPS['VALUE'] >> 8) & 0xFF);
$b = (($_IPS['VALUE'] >> 0) & 0xFF);

$sigdez = 49+$r+$g+$b+15;//Signatur Berechnung Dezimal
$sighex = dechex($sigdez);//Signatur Umrechnung Dezimal zu Hex
$signatur = substr($sighex, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($signatur); //Signatur Umrechnung Hex zu Dezimal

//Sendet Dezimal Werte an Client Socket
fwrite(fsockopen("tcp://$ip", 5577), chr(49) . chr($r) . chr($g) . chr($b) . chr(00) . chr(00) . chr(15) . chr($signatur1));
}
else if (($varid==$farbenpickerid) && ($power !=true)) echo "Gerät muss an sein, um es zu steuern !";

// ********************** Programme *****************

if (($varid==$programmid) && ($power==true))
{
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$speed=getvalue($speedid);
$programm=getvalue($programmid);

$p1 = 37; //Seven Color Cross Fade
$p2 = 40; //Blue Gradual Change
$p3 = 39; //Green Gradual Change
$p4 = 42; //Cyan Gradual Change
$p5 = 44; //White Gradual Change
$p6 = 46; //Red, Blue, Cross Fade
$p7 = 47; //Green, Blue Cross Fade
$p8 = 45; //Red,Green Cross Fade

$sigdez1 = 97+$p1+$speed+15; //Signatur Berechnung Dezimal
$sighex1 = dechex($sigdez1); //Signatur Umrechnung Dezimal zu Hex
$sigkurz1 = substr($sighex1, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($sigkurz1); //Signatur Umrechnung Hex zu Dezimal

$sigdez2 = 97+$p2+$speed+15; //Signatur Berechnung Dezimal
$sighex2 = dechex($sigdez2); //Signatur Umrechnung Dezimal zu Hex
$sigkurz2 = substr($sighex2, -2); //Nur letzte 2 Zeichen verwenden
$signatur2 = hexdec($sigkurz2); //Signatur Umrechnung Hex zu Dezimal

$sigdez3 = 97+$p3+$speed+15; //Signatur Berechnung Dezimal
$sighex3 = dechex($sigdez3); //Signatur Umrechnung Dezimal zu Hex
$sigkurz3 = substr($sighex3, -2); //Nur letzte 2 Zeichen verwenden
$signatur3 = hexdec($sigkurz3); //Signatur Umrechnung Hex zu Dezimal

$sigdez4 = 97+$p4+$speed+15; //Signatur Berechnung Dezimal
$sighex4 = dechex($sigdez4); //Signatur Umrechnung Dezimal zu Hex
$sigkurz4 = substr($sighex4, -2); //Nur letzte 2 Zeichen verwenden
$signatur4 = hexdec($sigkurz4); //Signatur Umrechnung Hex zu Dezimal

$sigdez5 = 97+$p5+$speed+15; //Signatur Berechnung Dezimal
$sighex5 = dechex($sigdez5); //Signatur Umrechnung Dezimal zu Hex
$sigkurz5 = substr($sighex5, -2); //Nur letzte 2 Zeichen verwenden
$signatur5 = hexdec($sigkurz5); //Signatur Umrechnung Hex zu Dezimal

$sigdez6 = 97+$p6+$speed+15; //Signatur Berechnung Dezimal
$sighex6 = dechex($sigdez6); //Signatur Umrechnung Dezimal zu Hex
$sigkurz6 = substr($sighex6, -2); //Nur letzte 2 Zeichen verwenden
$signatur6 = hexdec($sigkurz6); //Signatur Umrechnung Hex zu Dezimal

$sigdez7 = 97+$p7+$speed+15; //Signatur Berechnung Dezimal
$sighex7 = dechex($sigdez7); //Signatur Umrechnung Dezimal zu Hex
$sigkurz7 = substr($sighex7, -2); //Nur letzte 2 Zeichen verwenden
$signatur7 = hexdec($sigkurz7); //Signatur Umrechnung Hex zu Dezimal

$sigdez8 = 97+$p8+$speed+15; //Signatur Berechnung Dezimal
$sighex8 = dechex($sigdez8); //Signatur Umrechnung Dezimal zu Hex
$sigkurz8 = substr($sighex8, -2); //Nur letzte 2 Zeichen verwenden
$signatur8 = hexdec($sigkurz8); //Signatur Umrechnung Hex zu Dezimal


//SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if ($_IPS["VALUE"] == 1){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p1) . chr($speed) . chr(15) . chr($signatur1));}//Seven Color Cross Fade
else
if ($_IPS["VALUE"] == 2){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p2) . chr($speed) . chr(15) . chr($signatur2));}//Blue Gradual Change
else
if ($_IPS["VALUE"] == 3){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p3) . chr($speed) . chr(15) . chr($signatur3));}//Green Gradual Change
else
if ($_IPS["VALUE"] == 4){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p4) . chr($speed) . chr(15) . chr($signatur4));}//Cyan Gradual Change
else
if ($_IPS["VALUE"] == 5){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p5) . chr($speed) . chr(15) . chr($signatur5));}//White Gradual Change
 else
if ($_IPS["VALUE"] == 6){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p6) . chr($speed) . chr(15) . chr($signatur6));}//Red, Blue, Cross Fade
 else
if ($_IPS["VALUE"] == 7){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p7) . chr($speed) . chr(15) . chr($signatur7));}//Green, Blue Cross Fade
else
if ($_IPS["VALUE"] == 8){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p8) . chr($speed) . chr(15) . chr($signatur8));}//Red,Green Cross Fade
   }
else if (($varid==$programmid) & ($power !=true)) echo "Gerät muss an sein, um es zu steuern !";

// ****************************** Speed ******************
if (($varid==$speedid) & ($power==true))
{
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$speed=getvalue($speedid);
$p1 = 37; //Seven Color Cross Fade
$p2 = 40; //Blue Gradual Change
$p3 = 39; //Green Gradual Change
$p4 = 42; //Cyan Gradual Change
$p5 = 44; //White Gradual Change
$p6 = 46; //Red, Blue, Cross Fade
$p7 = 47; //Green, Blue Cross Fade
$p8 = 45; //Red,Green Cross Fade

$sigdez1 = 97+$p1+$speed+15; //Signatur Berechnung Dezimal
$sighex1 = dechex($sigdez1); //Signatur Umrechnung Dezimal zu Hex
$sigkurz1 = substr($sighex1, -2); //Nur letzte 2 Zeichen verwenden
$signatur1 = hexdec($sigkurz1); //Signatur Umrechnung Hex zu Dezimal

$sigdez2 = 97+$p2+$speed+15; //Signatur Berechnung Dezimal
$sighex2 = dechex($sigdez2); //Signatur Umrechnung Dezimal zu Hex
$sigkurz2 = substr($sighex2, -2); //Nur letzte 2 Zeichen verwenden
$signatur2 = hexdec($sigkurz2); //Signatur Umrechnung Hex zu Dezimal

$sigdez3 = 97+$p3+$speed+15; //Signatur Berechnung Dezimal
$sighex3 = dechex($sigdez3); //Signatur Umrechnung Dezimal zu Hex
$sigkurz3 = substr($sighex3, -2); //Nur letzte 2 Zeichen verwenden
$signatur3 = hexdec($sigkurz3); //Signatur Umrechnung Hex zu Dezimal

$sigdez4 = 97+$p4+$speed+15; //Signatur Berechnung Dezimal
$sighex4 = dechex($sigdez4); //Signatur Umrechnung Dezimal zu Hex
$sigkurz4 = substr($sighex4, -2); //Nur letzte 2 Zeichen verwenden
$signatur4 = hexdec($sigkurz4); //Signatur Umrechnung Hex zu Dezimal

$sigdez5 = 97+$p5+$speed+15; //Signatur Berechnung Dezimal
$sighex5 = dechex($sigdez5); //Signatur Umrechnung Dezimal zu Hex
$sigkurz5 = substr($sighex5, -2); //Nur letzte 2 Zeichen verwenden
$signatur5 = hexdec($sigkurz5); //Signatur Umrechnung Hex zu Dezimal

$sigdez6 = 97+$p6+$speed+15; //Signatur Berechnung Dezimal
$sighex6 = dechex($sigdez6); //Signatur Umrechnung Dezimal zu Hex
$sigkurz6 = substr($sighex6, -2); //Nur letzte 2 Zeichen verwenden
$signatur6 = hexdec($sigkurz6); //Signatur Umrechnung Hex zu Dezimal

$sigdez7 = 97+$p7+$speed+15; //Signatur Berechnung Dezimal
$sighex7 = dechex($sigdez7); //Signatur Umrechnung Dezimal zu Hex
$sigkurz7 = substr($sighex7, -2); //Nur letzte 2 Zeichen verwenden
$signatur7 = hexdec($sigkurz7); //Signatur Umrechnung Hex zu Dezimal

$sigdez8 = 97+$p8+$speed+15; //Signatur Berechnung Dezimal
$sighex8 = dechex($sigdez8); //Signatur Umrechnung Dezimal zu Hex
$sigkurz8 = substr($sighex8, -2); //Nur letzte 2 Zeichen verwenden
$signatur8 = hexdec($sigkurz8); //Signatur Umrechnung Hex zu Dezimal

$prog = GetValue ($programmid);
if ($prog == 1){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p1) . chr($speed) . chr(15) . chr($signatur1));}//Seven Color Cross Fade
else
if ($prog == 2){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p2) . chr($speed) . chr(15) . chr($signatur2));}//Blue Gradual Change
else
if ($prog == 3){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p3) . chr($speed) . chr(15) . chr($signatur3));}//Green Gradual Change
else
if ($prog == 4){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p4) . chr($speed) . chr(15) . chr($signatur4));}//Cyan Gradual Change
else
if ($prog == 5){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p5) . chr($speed) . chr(15) . chr($signatur5));}//White Gradual Change
else
if ($prog == 6){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p6) . chr($speed) . chr(15) . chr($signatur6));}//Red, Blue, Cross Fade
else
if ($prog == 7){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p7) . chr($speed) . chr(15) . chr($signatur7));}//Green, Blue Cross Fade
else
if ($prog == 8){fwrite(fsockopen("tcp://$ip", 5577), chr(97) . chr($p8) . chr($speed) . chr(15) . chr($signatur8));}//Red,Green Cross Fade

}
else if (($varid==$speedid) & ($power !=true)) echo "Gerät muss an sein, um es zu steuern !";


// ************************** Funktionen ******************

function GetOrCreateVariable($name , $vtyp, $ident, $profil, $ascript, $log ,$parent ) // erstellt eine Variable, wenn es noch nicht exestiert
// Erstellt eine Variable, Wert 1 = Name , Wert 2 ist der Typ der Variable, Wert 3, Variabel-Ident, Wert 4 Provil, Wert 5 ScriptID , Wert 6 ist die Übergeordnete Instanz, wo die Variable angelegt werden soll
{
    $ObjId = @IPS_GetObjectIDByName($name , $parent);
    if ($ObjId === false)
    {
	     $ObjId = IPS_CreateVariable($vtyp);

        IPS_SetName($ObjId, $name); // Namer vergeben
        @IPS_SetIdent($ObjId, $ident); // ObjectIdent vergeben...
        @IPS_SetParent($ObjId,$parent ); //  Variable unter die Instantz verschieben
		  @IPS_SetVariableCustomProfile($ObjId, $profil); // Variable Profil zuordnen
	     @IPS_SetVariableCustomAction($ObjId, $ascript);// Verknüpft das Script mit der Variable als Actionscript

// Archive Control ID herrausfinden
foreach(IPS_GetInstanceList ( ) as $m_id)// Durchsucht alle Instanzen und gibt die INstanzid an $i_id weiter
{
$typ=IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; // Fragt die Instanzen nach den Modulnamen ab....
if ($typ=="Archive Control") $modul_id=$m_id; // Wenn die INstanz den Modulnamen "Archive Control" hat, dann schreibe die ID in $modul_id
}
$logging=AC_GetLoggingStatus($modul_id,$ObjId);
if ($logging != 1)
{
AC_SetLoggingStatus($modul_id,$ObjId, $log);
IPS_ApplyChanges($modul_id);
}// Ende Logging

    }
    return $ObjId;
} //Ende der Funktion GetOrCreateVariable



function GetOrCreateInstanz($name , $ityp, $parent ) // erstellt eine Variable, wenn es noch nicht exestiert
// Erstellt eine Variable, Wert 1 = Name , Wert 2 ist der Typ der Variable, Wert 3, Variabel-Ident, Wert 4 Provil, Wert 5 ScriptID , Wert 6 ist die Übergeordnete Instanz, wo die Variable angelegt werden soll
{
    $ObjId = @IPS_GetObjectIDByName($name , $parent);
    if ($ObjId === false)
    {

    if ($ityp=="dummy") $ityp='{485D0419-BE97-4548-AA9C-C083EB82E61E}';

	     $ObjId = IPS_CreateInstance($ityp);
        IPS_SetName($ObjId, $name); // Namer vergeben

        IPS_SetParent($ObjId,$parent ); //  Variable unter die Instantz verschieben
		  }
    return $ObjId;
} //Ende der Funktion GetOrCreateInstanz

function GetOrCreateEvent($name,$vid, $scriptid)  // erstellt ein Event, wenn es noch nicht exestiert
// Erstellt ein Event, Wert 1 = Name , Wert 2 ist die VariableID, wo das Event angelegt werden soll, Wert 3 ist das Script was das Event auslösen soll

{
    $ObjId = @IPS_GetObjectIDByName($name , $scriptid);
    if ($ObjId === false)
    {
	     $ObjId = IPS_CreateEvent(0);
        IPS_SetEventTrigger($ObjId, 1, $vid);        //Bei Änderung von Variable mit ID $vid
		  IPS_SetName($ObjId, $name);
		  IPS_SetParent($ObjId, $_IPS['SELF']);         //Eregnis zuordnen
		  IPS_SetEventActive($ObjId, true);             //Ereignis aktivieren
	 }


    return $ObjId;

} //Ende der Funktion GetOrCreateEvent
?>

Hallo drapple,
danke für dein komplett Script, ist so deutlich eleganter als mein Ansatz.

Gruß
Giuseppe

@drapple - Was für LEDs haste denn so im Einsatz und woher ? Danke, MaLu

Ich habe ganz normale standard LED Strips aus china im Einsatz :confused:

Hallo Drapple
Vielen Dank für dein Skript.
Konnte es für den LW 12 mit ansteuerung MH super gebrauchen.

Gesendet von iPhone mit Tapatalk

Danke für dein feedback, ich werde es noch erweitern, das man mehrere RGB Controller steuern kann :rolleyes:

Aber das steht ganz hinten auf der to do Liste :eek:

Vielen Dank für das Script, funktioniert super (und wie geschrieben schneller als über eine eigene I/O Instanz)!

Bei mir hat im Script lediglich die Wahl der Farbe „Weiss“ nicht funktioniert, habe im Script daher die Zeile 107 von

if ($farben == 4){fwrite(fsockopen(„tcp://$ip“, 5577), „\x31\x00\x00\x00\xff\x00\x0f\x3f“);}//weiss

auf

if ($farben == 4){fwrite(fsockopen(„tcp://$ip“, 5577), „\x31\x00\x00\x00\xff\x00\x0f\x3f“) && SetValue ($farbenpickerid,16777215);}//weiss

geändert, nun funktioniert das auch :slight_smile:

So, jetzt muss ich hier mal (exemplarisch für alle anderen Posts) meinen Dank äußern!
Bin echt noch neu in Sachen IPS. --> komme von FHEM

Die Dokumentation, Wiki, Blogs etc. ist leider bei FHEM deutlich besser als bei IPS.

Durch dieses Forum habe ich aber bisher echt viel implementieren können und bewege mich immer sicherer (auch wenn ich noch keine eigenen Scripte erstellt habe [bisher hab ich immer für alles was gefunden]

Vielen Dank dafür!!!