+ Antworten
Seite 2 von 3 ErsteErste 1 2 3 LetzteLetzte
Ergebnis 11 bis 20 von 22
  1. #11
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,845

    Hallo Kai,

    sind die xY-Werte zwischen 0 und 65535?

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  2. #12
    Registriert seit
    Aug 2016
    Beiträge
    3,999

    Nein, ich brauche aber gerade auch genau diesen Wertebereich und versuche mich daran.

    Edit: Hast du eine Webseite, bei der du genau die Farbwerte eingeben kannst und dir dazu der RGB Wert angezeigt wird?
    Finde dazu irgendwie nichts.

    Grüße,
    Kai
    Geändert von KaiS (13.08.20 um 15:52 Uhr)
    IPS 5.2, auf Tinkerboard und RPI, piVCCU, Homematic & Homematic IP, diverse Tasmota Geräte, Shelly, GHoma, LG HomBot, Sonos, Tvheadend, HomeKit, AppleTV
    Einfach mal rein schauen: IP-Symcon Discord Channel

  3. #13
    Registriert seit
    Aug 2016
    Beiträge
    3,999

    Versuch es mal damit:

    PHP-Code:

    function RGBToCIE($red$green$blue$opt false)
        {
            
    $red = ($red 0.04045) ? pow(($red 0.055) / (1.0 0.055), 2.4) : ($red 12.92);
            
    $green = ($green 0.04045) ? pow(($green 0.055) / (1.0 0.055), 2.4) : ($green 12.92);
            
    $blue = ($blue 0.04045) ? pow(($blue 0.055) / (1.0 0.055), 2.4) : ($blue 12.92);

            
    $X $red 0.664511 $green 0.154324 $blue 0.162028;
            
    $Y $red 0.283881 $green 0.668433 $blue 0.047685;
            
    $Z $red 0.000088 $green 0.072310 $blue 0.986039;
            
    //$this->SendDebug('RGBToCIE', 'X: ' . $X . ' Y: ' . $Y . ' Z: ' . $Z, 0);

            
    if ($opt) {
                
    $cie['x'] = round(($X / ($X $Y $Z) * 65536), 0);
                
    $cie['y'] = round(($Y / ($X $Y $Z) * 65536), 0);
            } else {
                
    $cie['x'] = round(($X / ($X $Y $Z)), 4);
                
    $cie['y'] = round(($Y / ($X $Y $Z)), 4);
            }

            return 
    $cie;
        } 
    PHP-Code:
    function CIEToRGB($x$y$brightness 255$opt false)
        {

            if (
    $opt) {
                
    $x $x 65536;
                
    $y $y 65536;
            }
            
            
    $z 1.0 $x $y;
            
    $Y $brightness 255;
            
    $X = ($Y $y) * $x;
            
    $Z = ($Y $y) * $z;

            
    $red $X 1.656492 $Y 0.354851 $Z 0.255038;
            
    $green = -$X 0.707196 $Y 1.655397 $Z 0.036152;
            
    $blue $X 0.051713 $Y 0.121364 $Z 1.011530;

            if (
    $red $blue && $red $green && $red 1.0) {
                
    $green $green $red;
                
    $blue $blue $red;
                
    $red 1.0;
            } elseif (
    $green $blue && $green $red && $green 1.0) {
                
    $red $red $green;
                
    $blue $blue $green;
                
    $green 1.0;
            } elseif (
    $blue $red && $blue $green && $blue 1.0) {
                
    $red $red $blue;
                
    $green $green $blue;
                
    $blue 1.0;
            }
            
    $red $red <= 0.0031308 12.92 $red : (1.0 0.055) * $red ** (1.0 2.4) - 0.055;
            
    $green $green <= 0.0031308 12.92 $green : (1.0 0.055) * $green ** (1.0 2.4) - 0.055;
            
    $blue $blue <= 0.0031308 12.92 $blue : (1.0 0.055) * $blue ** (1.0 2.4) - 0.055;

            
    $red ceil($red 255);
            
    $green ceil($green 255);
            
    $blue ceil($blue 255);

            
    $color sprintf('#%02x%02x%02x'$red$green$blue);

            return 
    $color;
        } 
    PHP-Code:
    function HexToRGB($value)
        {
            
    $RGB = [];
            
    $RGB[0] = (($value >> 16) & 0xFF);
            
    $RGB[1] = (($value >> 8) & 0xFF);
            
    $RGB[2] = ($value 0xFF);
            
    //$this->SendDebug('HexToRGB', 'R: ' . $RGB[0] . ' G: ' . $RGB[1] . ' B: ' . $RGB[2], 0);
            
    return $RGB;
        } 
    Mit HexToRGB kannst du Hex in RGB umrechnen.
    Wenn du von HEX in RGB umgerechnet hast kannst du mit der Funktion RGBToCIE in X und Y umrechnen.
    Der Parameter $opt = false gibt an, x und y im Wertebereich zwischen 0 und 65535 liegen

    Mit CIEToRGB kannst du RGB zu x und y umrechnen.
    Dazu musst du x, y, Helligkeit angeben.
    Mit dem Parameter $opt = true gibst du wieder an, dass x und y im Wertebreich zwischen 0 und 65535 liegen.

    Ich würde mich über eine Rückmeldung freuen ob es klappt.

    Grüße,
    Kai
    Geändert von KaiS (13.08.20 um 15:53 Uhr)
    IPS 5.2, auf Tinkerboard und RPI, piVCCU, Homematic & Homematic IP, diverse Tasmota Geräte, Shelly, GHoma, LG HomBot, Sonos, Tvheadend, HomeKit, AppleTV
    Einfach mal rein schauen: IP-Symcon Discord Channel

  4. #14
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,845

    Hallo Kai,

    konnte es noch nicht vollumfänglich prüfen, aber ein Problem ist schwarz (0,0,0), da gibt es ein Division by Zero Error. Ich weiß jetzt nicht, wie man das am Besten prüft. Möglicherweise tritt der Fehler immer dann auf, wenn einer der drei Werte 0 ist.

    Ansonsten bist Du auf dem richtigen Weg, habe nur mal einen Blauton probiert und das funktionierte.

    Ist also noch etwas zu machen, sollte man aber hinbekommen.
    Übrigens hatten wir wohl beide die gleiche Quelle, mein Code ist nahezu identisch aufgebaut, nur hatte ich die Skalierung anders gemacht (und damit gescheitert)...

    Melde mich wenn ich da weiter bin...

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  5. #15
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,845

    ...nach meinen Tests tritt der Fehler nur bei Schwarz (0,0,0) auf....

    Ansonsten sehen der gesendete Wert und das Ergebnis sehr ähnlich aus.

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  6. #16
    Registriert seit
    Aug 2016
    Beiträge
    3,999

    Ich glaube ich werde mal ein für ColorHelper Trait erstellen.
    Kann man dann als Submodule einbinden.

    Grüße,
    Kai
    IPS 5.2, auf Tinkerboard und RPI, piVCCU, Homematic & Homematic IP, diverse Tasmota Geräte, Shelly, GHoma, LG HomBot, Sonos, Tvheadend, HomeKit, AppleTV
    Einfach mal rein schauen: IP-Symcon Discord Channel

  7. #17
    Registriert seit
    Nov 2011
    Ort
    Tönisvorst
    Beiträge
    834

    Hallo,


    da euch für die Ausführungen.

    Die Lampen bei mir sind keine RGB-Lampen, sondern welche mit mehreren Weiss-Tönen. Das ist daher nicht so wirklich tragisch, wenn es nicht funktioniert. Schalten und Dimmen ist wichtiger.

    Ich werde die Farbvariablen überall rauswerfen.

    WEnn ich was testen soll, sagt Bescheid

  8. #18
    Registriert seit
    Aug 2009
    Ort
    Lippe
    Beiträge
    2,486

    Zitat Zitat von JPaeper Beitrag anzeigen
    ...nach meinen Tests tritt der Fehler nur bei Schwarz (0,0,0) auf....

    Ansonsten sehen der gesendete Wert und das Ergebnis sehr ähnlich aus.

    Joachim
    Hab den Fehler mal abgefangen :

    PHP-Code:
    function RGBToCIE($red$green$blue$opt false)
        {
         if( 
    $red == || $green == || $blue == 0) { 
            
    $cie['x'] = 0;
            
    $cie['y'] = 0;
         }
         else{
            
    $red = ($red 0.04045) ? pow(($red 0.055) / (1.0 0.055), 2.4) : ($red 12.92);
            
    $green = ($green 0.04045) ? pow(($green 0.055) / (1.0 0.055), 2.4) : ($green 12.92);
            
    $blue = ($blue 0.04045) ? pow(($blue 0.055) / (1.0 0.055), 2.4) : ($blue 12.92);

            
    $X $red 0.664511 $green 0.154324 $blue 0.162028;
            
    $Y $red 0.283881 $green 0.668433 $blue 0.047685;
            
    $Z $red 0.000088 $green 0.072310 $blue 0.986039;
            
    //$this->SendDebug('RGBToCIE', 'X: ' . $X . ' Y: ' . $Y . ' Z: ' . $Z, 0);

            
    if ($opt) {
                
    $cie['x'] = round(($X / ($X $Y $Z) * 65536), 0);
                
    $cie['y'] = round(($Y / ($X $Y $Z) * 65536), 0);
            } else {
                
    $cie['x'] = round(($X / ($X $Y $Z)), 4);
                
    $cie['y'] = round(($Y / ($X $Y $Z)), 4);
            }
         }
            return 
    $cie;
        } 
    lg Thomas
    IPS Raspberry Pi2(3) mit LCN, HM, Sonoff+Shelly per MQTT, SONOS und viel Eigenbau + Pi2(3) mit Heizungssteuerung über GPIO per IPS

  9. #19
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,845

    Hallo Kai und Thomas,

    die beiden Funktionen auf meine Bedürfnisse angepasst sehen jetzt so aus:
    PHP-Code:
    private function HexToCIE($HexColor)
        {
            
    $red = (($HexColor >> 16) & 0xFF);
            
    $green = (($HexColor >> 8) & 0xFF);
            
    $blue = ($HexColor 0xFF);
            
    $this->SendDebug('HexToCIE''red: ' $red ' green: ' $green ' blue: ' $blue0);
            
            
    $red = ($red 0.04045) ? pow(($red 0.055) / (1.0 0.055), 2.4) : ($red 12.92);
            
    $green = ($green 0.04045) ? pow(($green 0.055) / (1.0 0.055), 2.4) : ($green 12.92);
            
    $blue = ($blue 0.04045) ? pow(($blue 0.055) / (1.0 0.055), 2.4) : ($blue 12.92);

            
    $X $red 0.664511 $green 0.154324 $blue 0.162028;
            
    $Y $red 0.283881 $green 0.668433 $blue 0.047685;
            
    $Z $red 0.000088 $green 0.072310 $blue 0.986039;
            
    $this->SendDebug('HexToCIE''X: ' $X ' Y: ' $Y ' Z: ' $Z0);

            If ((
    $X $Y $Z) > 0) {
                
    $cie['x'] = round(($X / ($X $Y $Z) * 65536), 0);
                
    $cie['y'] = round(($Y / ($X $Y $Z) * 65536), 0);
            }
            else {
                
    $cie['x'] = 0;
                
    $cie['y'] = 0;
            }
            
        return 
    $cie;
        } 
         
        private function 
    CIEToHex($x$y)
        {
            
    $brightness 255;
            
    $x $x 65536;
            
    $y $y 65536;

            
    $z 1.0 $x $y;
            
    $Y $brightness 255;
            
    $X = ($Y $y) * $x;
            
    $Z = ($Y $y) * $z;

            
    $red $X 1.656492 $Y 0.354851 $Z 0.255038;
            
    $green = -$X 0.707196 $Y 1.655397 $Z 0.036152;
            
    $blue $X 0.051713 $Y 0.121364 $Z 1.011530;

            if (
    $red $blue && $red $green && $red 1.0) {
                
    $green $green $red;
                
    $blue $blue $red;
                
    $red 1.0;
            } elseif (
    $green $blue && $green $red && $green 1.0) {
                
    $red $red $green;
                
    $blue $blue $green;
                
    $green 1.0;
            } elseif (
    $blue $red && $blue $green && $blue 1.0) {
                
    $red $red $blue;
                
    $green $green $blue;
                
    $blue 1.0;
            }
            
    $red $red <= 0.0031308 12.92 $red : (1.0 0.055) * $red ** (1.0 2.4) - 0.055;
            
    $green $green <= 0.0031308 12.92 $green : (1.0 0.055) * $green ** (1.0 2.4) - 0.055;
            
    $blue $blue <= 0.0031308 12.92 $blue : (1.0 0.055) * $blue ** (1.0 2.4) - 0.055;

            
    $red ceil($red 255);
            
    $green ceil($green 255);
            
    $blue ceil($blue 255);
            
            
    $Hex = ($red << 16) | ($green << 8) | $blue;
        return 
    $Hex;
        } 
    Was ich zuvor nicht richtig gemacht hatte war die Skalierung, aber jetzt sieht es gut aus!

    Danke!

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  10. #20
    Registriert seit
    Aug 2016
    Beiträge
    3,999

    Ich würde brightness optional mit als Parameter aufnehmen.

    Grüße,
    Kai
    IPS 5.2, auf Tinkerboard und RPI, piVCCU, Homematic & Homematic IP, diverse Tasmota Geräte, Shelly, GHoma, LG HomBot, Sonos, Tvheadend, HomeKit, AppleTV
    Einfach mal rein schauen: IP-Symcon Discord Channel

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 06.02.20, 08:47
  2. Antworten: 2
    Letzter Beitrag: 12.11.19, 23:09
  3. eigene Icons werden nicht korrekt übernommen
    Von harry28 im Forum WebFront Skins
    Antworten: 9
    Letzter Beitrag: 24.10.17, 15:30
  4. IKEA Trådfri / Zigbee Lampen
    Von Fonzo im Forum Schaufenster
    Antworten: 0
    Letzter Beitrag: 28.03.17, 08:24