HM - LC - RGBW - WM eine Farbe direkt ansprechen

Hi liebe Leute,

ich habe wie oben beschrieben einen Homematic RGBW Modul. Das funktioniert soweit auch ganz gut. Mit folgendem Script funktioniert auch bis auf die Helligkeit (Also den kleinen Kreis im Color Picker) alles soweit super.
Weiß einer wie man die Helligkeit mit einbinden kann?

 <?
   /**
    * Set_HM_RGBW_Color
    *
    * Umwandeln eines HEX-RGB Wertes von einem IPS-Color-Picker in
     * den benötigten Wert von 0-199 für den HomeMatic RGBW-Controller
    *
    * Christian Wolter
    * Version 1.0, 28.10.2015
    */


// Speichert des HEX-Wert vom Color-Picker
$Farbe = $_IPS['VALUE'];
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

// HEX-Wert in einzelne Werte für Rot / Grün / Blau zerlegen
$r = (($Farbe >> 16) & 0xFF);
$g = (($Farbe >> 8) & 0xFF);
$b = (($Farbe >> 0) & 0xFF);

// Umwandeln der RGB Werte
$hsv =  RGBtoHSV($r, $g, $b);

// Schreiben des Homematic Hue Wert in den Controller
HM_WriteValueInteger(22849 /*[Räume\Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);


/**
 *     Umwandeln der RGB-Werte in ein Farbwert des HSV-Farbraum
 *        RGB Werte:          0-255, 0-255, 0-255
 *        H Wert:                   0-360°
 *        Homematic H Wert: 0-199
 */
function RGBtoHSV($R, $G, $B)    
{                                
    $R = ($R / 255);
    $G = ($G / 255);
    $B = ($B / 255);

    $maxRGB = max($R, $G, $B);
    $minRGB = min($R, $G, $B);
    $chroma = $maxRGB - $minRGB;

    if ($chroma == 0)
        return 0;

    if ($R == $minRGB)
        $h = 3 - (($G - $B) / $chroma);
    elseif ($B == $minRGB)
        $h = 1 - (($R - $G) / $chroma);
    else // $G == $minRGB
        $h = 5 - (($B - $R) / $chroma);

    $Hue = (60 * $h);
     $HomematicHue = ($Hue/1.8);
     
     if ($HomematicHue == 200)
       $HomematicHue = 199;
 
    return $HomematicHue;
}

?> 

Und dann habe ich versucht ein neues Script zu schreiben, womit ich direkt z.B. die Farbe Rot aufrufen kann. Habe dazu überlegt doch nur folgende Zeile zu brauchen:

// Schreiben des Homematic Hue Wert in den Controller
HM_WriteValueInteger(22849 /*[Räume\Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);

ich weiß aber nicht genau wie ich anstelle von $hsv meinen Farbwert eingeben soll. Habe einiges Probiert es hat aber immer nicht geklappt. Bin mir aber auch nicht sicher ob rein diese Zeile funktioniert.

Vielen Dank im voraus für eure Hilfe :slight_smile:

Lieben Gruß
Derderneburger

Moin Derderneburger,

der Color Picker (CP) liefert dir einen Wert zurück mit dem du über das Skript den Farbwert setzt. Dies passiert auch so in dieser Zeile

HM_WriteValueInteger(22849 /*[Räume\Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);

Bei den HM RGBW Controllern musst du aber zusätzlich auch das Gerät einschalten, da das Setzen der Farbe nicht das Einschalten bewirkt. Das kannst du auch in der WebGui von HM leicht ausprobieren.

HM_WriteValueInteger(22849 /*[Räume\Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);
HM_WriteValueFloat($IdDimmer, "LEVEL", $Helligkeit)

$Helligkeit muss zwischen 0.0 für Aus und 1.0 für 100 % liegen.

Da du nur einen Wert vom CP bekommst, musst du von diesem Wert ausgehend die Helligkeit berechnen, mit der du den RGBW Dimmer schalten willst. Ich nutze dafür die Formel aus diesem Link Helligkeit von Farben des RGB-Farbraums berechnen - Frank Seitz - Developer Logbuch mit der ich gute Erfahrungen gemacht habe. Im Netz finden sich aber auch andere Beispiele.

$Helligkeit = (sqrt(0.299 * pow($r, 2) + 0.587 * pow($g, 2) + 0.114 * pow($b, 2))) / 255;

Danach sollte eigentlich alles so funktionieren wie du dir das vorstellst :slight_smile:

Gruß
Hans

Hi,

Danke schonmal für den Hinweis und tut mir leid das die Rückmeldung jetzt so spät kommt.
Ich habe die 2 Zeilen hinzugefügt aber bekomme jetzt leider über die Symcon App folgenden Fehler:

Instanz #25308 existiert nicht in /var/lib/symcon/scripts/46248.ips.php on line 29.

 <?
   /**
    * Set_HM_RGBW_Color
    *
    * Umwandeln eines HEX-RGB Wertes von einem IPS-Color-Picker in
     * den benötigten Wert von 0-199 für den HomeMatic RGBW-Controller
    *
    * Christian Wolter
    * Version 1.0, 28.10.2015
    */


// Speichert des HEX-Wert vom Color-Picker
$Farbe = $_IPS['VALUE'];
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);


// HEX-Wert in einzelne Werte für Rot / Grün / Blau zerlegen
$r = (($Farbe >> 16) & 0xFF);
$g = (($Farbe >> 8) & 0xFF);
$b = (($Farbe >> 0) & 0xFF);

// Umwandeln der RGB Werte
$hsv =  RGBtoHSV($r, $g, $b);
$Helligkeit = (sqrt(0.299 * pow($r, 2) + 0.587 * pow($g, 2) + 0.114 * pow($b, 2))) / 255;  

// Schreiben des Homematic Hue Wert in den Controller
HM_WriteValueInteger(22849 /*[Räume\Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);
HM_WriteValueFloat(25308 /*[Räume\Wohnzimmer\RGBW_DIMMER\LEVEL]*/, "LEVEL", $Helligkeit);


/**
 *     Umwandeln der RGB-Werte in ein Farbwert des HSV-Farbraum
 *        RGB Werte:          0-255, 0-255, 0-255
 *        H Wert:                   0-360°
 *        Homematic H Wert: 0-199
 */
function RGBtoHSV($R, $G, $B)    
{                                
    $R = ($R / 255);
    $G = ($G / 255);
    $B = ($B / 255);

    $maxRGB = max($R, $G, $B);
    $minRGB = min($R, $G, $B);
    $chroma = $maxRGB - $minRGB;

    if ($chroma == 0)
        return 0;

    if ($R == $minRGB)
        $h = 3 - (($G - $B) / $chroma);
    elseif ($B == $minRGB)
        $h = 1 - (($R - $G) / $chroma);
    else // $G == $minRGB
        $h = 5 - (($B - $R) / $chroma);

    $Hue = (60 * $h);
     $HomematicHue = ($Hue/1.8);
     
     if ($HomematicHue == 200)
       $HomematicHue = 199;
 
    return $HomematicHue;
}

?> 

Zeile 29 ist:

HM_WriteValueFloat(25308 /*[Räume\Wohnzimmer\RGBW_DIMMER\LEVEL]*/, "LEVEL", $Helligkeit);

Aber die ID des Dimmers stimmt definitiv.

Vielen Dank für die Hilfe.

Moin,

ich denke, dass du versuchst die Variable LEVEL direkt zu beschreiben. Wenn dem so ist dann ist das falsch. Du musst die Instanz des Controllers für den Dimmer angeben. Schau auf mein Beispiel.

Gruß
Hans

Vielen Dank. Das war der Fehler :banghead:

Jetzt läuft alles :slight_smile:

Hi,

na bitte, geht doch :smiley:

Im Netz findest du so einiges an Links zum Thema der Helligkeitsberechnung.

Wenn du nur einen Controller hast, dann kann das alles so bleiben. Obwohl die Dinger hinsichtlich ihrer Möglichkeiten beschränkt sind, habe ich davon 1 Dutzend im Einsatz. U. a. habe ich mir Skripte geschrieben, die auch eine Kopplung mehrerer Controller ermöglichen. Dies ist z. B. dann sinnvoll, wenn man in einem Raum mehrere Controller hat und die Farben identisch sein sollen.

Noch ein Tipp zur Funktion ON_TIME - auch hier gilt, erst die Zeitdauer festlegen und dann mit einem weiteren Befehl den Controller einschalten.

Gruß
Hans

Da machst du direkt das 2. Fass auf ^^

Ich spiele mit dem Gedanken einen 2 und 3 RGBW Dimmer zu holen. Der Stripe ist schon vorhanden.
Wieso kann ich das dann nicht wieder alles genauso machen wie bei dem einen? Wieso kann das nur so bleiben solange ich nur 1 habe?

Danke

Hallo,

das ist ein Missverständnis :slight_smile: Du kannst natürlich für jeden Controller ein eigenes Skript machen. Ich habe für meine 12 Controller ein Skript, welches alle Controller steuert, sowohl bzgl. der Farben, Helligkeiten, der Kopplung und der Programme. Darüber muss man dann aber gut nachdenken und das auch entsprechend umsetzen können :wink:

Gruß
Hans

Würdest du mir das Skript zur Verfügung stellen? Wenn man immer mehr darüber nachdenkt, ist es ja nicht verkehrt wenn die Stripes vor einem und hinter einem dann die selbe Farbe haben ^^.

Gruß
Tobias

Hallo Tobias,

mein Skript wird bei dir nicht funktionieren da bestimmte Voraussetzungen erfüllt sein müssen.

Als erstes ist es für den Einsatz mit IPSView gedacht. Das Bild zeigt dir, dass man bei IPSView die Möglichkeit hat, mehrere Felder an das Programm zurückgeben zu können (Sender, Value, Variable). Diese Daten wertet das Skript aus und findet basierend auf meinem System der Namensvergabe die richtige Instanz und die korrekte ID zum Schalten des Controllers.

Dabei wird das eigentliche Schalten in einem weiteren Skript durchgeführt, welches mit IPS_RunScriptEx und den entsprechenden Parametern aufgerufen wird, so dass z. B. mit einem Befehl alle Controller in einem Raum geschaltet werden können.

Wenn du bei dir erreichen möchtest, dass 2 Controller die identische Farbe haben, so musst du ja lediglich den Schaltbefehl an zwei Instanzen schicken :wink:

Gruß
Hans

Hallo Hans,

ich habe IPSView im Einsatz, daher würde mich dein Steuerungsskript sehr Interessieren.

Aber eine andere Frage wäre ob ihr es hinbekommen habt das bei RGBW Strippen bei Weiß auch nur der Kanal für weiß läuft. Bei mir benutzt er dann trotzdem noch die RGB Dioden zusätzlich.

Gruß Lukas

Hallo Lukas,

ich denke nicht, dass es sinnvoll ist sich mit meinen Skripten zu beschäftigen. Zum einen ist es so, dass es sich um 2 Skripte und einigen Includes handelt und zum anderen müsstest du den Aufbau der Namen exakt nach meinem Schema für alle Controller anpassen. Ferner müsstest du meine Gedankengänge diesbezüglich nachvollziehen und in der Lage sein, die ca. 1.000 Zeilen php-Code (sehr größzügige Schreibweise inkl. Kommentarzeilen) zu verstehen :rolleyes: Ich weiß aus meiner Erfahrung, dass dies sehr viel schwieriger ist als den Code selbst zu schreiben :slight_smile:

Das ist bei mir genauso und das Thema wurde schon häufig im HM Forum angesprochen. Da eq-3 jetzt voll auf IP abfährt kann man wohl davon ausgehen, dass die alten Controller kein FW Update mehr erhalten werden :eek:

Hier noch ein Auszug aus dem Handbuch:

Am Gerät kann mittels eines Schalters festgelegt werden, wie die
Farbe „Weiß“ dargestellt wird. Bei LED-Stripes mit zusätzlichen
weißen LEDs (RGBW) können wahlweise nur die weißen LEDs oder
in Kombination mit den RGB-LEDs aktiviert werden. Für die RGBLEDs
kann zusätzlich ein Weißabgleich vorgenommen werden. Die
Korrekturwerte werden abgespeichert und stehen auch einer Zentrale
zur Verfügung (Auslesen der Geräteparameter).
Jeder der 3 Steuerkanäle (Helligkeit / Farbe / Automatik)

Gruß
Hans

Guten Mittag,

gut dann setzte ich mich selber an schreiben. Und zu dem Thema mit dem weiß. Ich habe die drei weißabgleich Regler komplett auf null gedreht ohne erfolg. Nach dem ich aber in der CCU die Einstellungen geöffnet habe, stand im ersten Parameter unter weißabgleich trotzdem 100% das habe ich bei allen drei auf null gesetzt und siehe da. Bei mir leuchtet nur noch die weiße Lampe und die anderen Kanäle sind aus.

grüß Lukas

Moin,

der Weißabgleich dient nicht zum Abschalten der weißen Dioden - also ist keine Helligkeitsregelung :slight_smile: Näheres findest du hier Weißabgleich – Wikipedia

Gruß
Hans