Zigbee2MQTT color_x/y -> RGB #demnächst obsolet

Begonnen von KernSani, 01 Februar 2019, 00:26:22

Vorheriges Thema - Nächstes Thema

KernSani

Anmerkung: Dank justme1968 wird vergleichbare Funkionalität demnächst "im Standard" verfügbar sein (s.u.): Color::xyY2rgb und Color::xyY2hex

Ich bin sicher nicht der Erste, der das gebastelt hat, aber ich war zu faul zum Suchen ;)

Zigbee RGB-Lampen liefern über zigbee2mqtt und (in meinem Fall) MQTT2_SERVER) häufig ein color_x und color_y reading statt eines RGB Wertes. Dadurch wird z.B. der colorpicker nicht korrekt dargestellt. Eine Umwandlung der colorx/y-Werte in RGB (hex) macht folgende sub in 99_myUtils:

########################################################################################################
# converts zigbee2mqtt color_x and color_y values to RGB (hex)
# stolen from https://stackoverflow.com/questions/22894498/philips-hue-convert-xy-from-api-to-hex-or-rgb
########################################################################################################

sub cieToRgb($$$) {
    my ( $x, $y, $b ) = @_;

    my $z = 1.0 - $x - $y;
    my $Y = ( $b / 254 );
    my $X = ( $Y / $y ) * $x;
    my $Z = ( $Y / $y ) * $z;

    #Convert to RGB using Wide RGB D65 conversion
    my $red   = $X * 1.656492 - $Y * 0.354851 - $Z * 0.255038;
    my $green = -$X * 0.707196 + $Y * 1.655397 + $Z * 0.036152;
    my $blue  = $X * 0.051713 - $Y * 0.121364 + $Z * 1.011530;

    #If red, green or blue is larger than 1.0 set it back to the maximum of 1.0
    if ( $red > $blue && $red > $green && $red > 1.0 ) {
        $green = $green / $red;
        $blue  = $blue / $red;
        $red   = 1.0;
    }
    elsif ( $green > $blue && $green > $red && $green > 1.0 ) {

        $red   = $red / $green;
        $blue  = $blue / $green;
        $green = 1.0;
    }
    elsif ( $blue > $red && $blue > $green && $blue > 1.0 ) {

        $red   = $red / $blue;
        $green = $green / $blue;
        $blue  = 1.0;
    }

    #Reverse gamma correction
    $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;

    #Convert normalized decimal to decimal
    $red   = ceil( $red * 255 );
    $green = ceil( $green * 255 );
    $blue  = ceil( $blue * 255 );

    my $hex = sprintf( "%X%X%X", $red, $green, $blue );
    return ($hex);

}


ein userreading:

attr meineLampe userReadings color {cieToRgb(ReadingsVal($name,"color_x",0),ReadingsVal($name,"color_y",0),ReadingsVal($name,"brightness",254))}


und noch quick & dirty ein devStateIcon


attr meineLampe devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}



RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

justme1968

magst du mal probieren ob es auch mit xyYtorgb aus 31_HUEDevice und den dort verwendet  farbraum eckdaten einigermaßen passt?

dann würde ich es zentral in Color.pm (https://wiki.fhem.de/wiki/Color) einbauen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rippi46

#2
Hallo KernSani

wie sieht dann die Definition deiner Lampe aus.

habe meine Lampe so definiert:
defmod 0x00158d0003248906 XiaomiMQTTDevice 404000/404005/404012 0x00158d0003248906
attr 0x00158d0003248906 IODev mqtt
attr 0x00158d0003248906 devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}
attr 0x00158d0003248906 rgb rgb
attr 0x00158d0003248906 room XiaomiMQTTDevice
attr 0x00158d0003248906 stateFormat state
attr 0x00158d0003248906 userReadings color {cieToRgb(ReadingsVal($name,"color-x",0),ReadingsVal($name,"color-y",0),ReadingsVal($name,"brightness",254))}
attr 0x00158d0003248906 webCmd toggle:on:off:brightness:color:color_temp
attr 0x00158d0003248906 widgetOverride brightness:colorpicker,BRI,0,15,255 color:colorpicker,RGB color_temp:colorpicker,CT,250,1,454


Gruß rippi
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

KernSani

Zitat von: justme1968 am 01 Februar 2019, 09:24:14
magst du mal probieren ob es auch mit xyYtorgb aus 31_HUEDevice und den dort verwendet  farbraum eckdaten einigermaßen passt?

dann würde ich es zentral in Color.pm (https://wiki.fhem.de/wiki/Color) einbauen.
Hmm, die Logik ist die selbe, aber die Faktoren sind unterschiedlich. Zudem macht zigbee2mqtt noch eine "Gamma-Korrektur", die mein geklautes Coding wieder rückgängig macht... Passt also nicht ganz :-(
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KernSani

Zitat von: rippi46 am 01 Februar 2019, 09:46:32
Hallo KernSani

wie sieht dann die Definition deiner Lampe aus.

habe meine Lampe so definiert:
defmod 0x00158d0003248906 XiaomiMQTTDevice 404000/404005/404012 0x00158d0003248906
attr 0x00158d0003248906 IODev mqtt
attr 0x00158d0003248906 devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}
attr 0x00158d0003248906 rgb rgb
attr 0x00158d0003248906 room XiaomiMQTTDevice
attr 0x00158d0003248906 stateFormat state
attr 0x00158d0003248906 userReadings color {cieToRgb(ReadingsVal($name,"color-x",0),ReadingsVal($name,"color-y",0),ReadingsVal($name,"brightness",254))}
attr 0x00158d0003248906 webCmd toggle:on:off:brightness:color:color_temp
attr 0x00158d0003248906 widgetOverride brightness:colorpicker,BRI,0,15,255 color:colorpicker,RGB color_temp:colorpicker,CT,250,1,454


Gruß rippi

Meine sind Aldi TINT GU10s basierend auf AttrTemplate zigbee_colorbulb:

defmod EG_WoZi_Led11_Licht MQTT2_DEVICE zigbee_0xd0cf5efffe411115
attr EG_WoZi_Led11_Licht userattr floor floor_map room_map structexclude
attr EG_WoZi_Led11_Licht IODev MQTT2_FHEM_Server
attr EG_WoZi_Led11_Licht devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}
attr EG_WoZi_Led11_Licht icon light_control
attr EG_WoZi_Led11_Licht model L_02b_zigbee2mqtt_colorbulb
attr EG_WoZi_Led11_Licht readingList zigbee2mqtt/0xd0cf5efffe411115:.* { json2nameValue($EVENT) }
attr EG_WoZi_Led11_Licht room Devices->MQTT
attr EG_WoZi_Led11_Licht setList on:noArg zigbee2mqtt/0xd0cf5efffe411115/set {"state":"on"}\
  off:noArg zigbee2mqtt/0xd0cf5efffe411115/set {"state":"off"}\
  brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/0xd0cf5efffe411115/set {"state":"on","$EVTPART0":"$EVTPART1"}\
  color_temp:colorpicker,CT,250,1,454 zigbee2mqtt/0xd0cf5efffe411115/set {"$EVTPART0":"$EVTPART1"}\
  color:colorpicker,RGB {"zigbee2mqtt/0xd0cf5efffe411115/set ".zigbee2mqtt_RGB2JSON($EVTPART1)}\
  preset1:noArg zigbee2mqtt/0xd0cf5efffe411115/set {"state":"on","color_temp":"310","brightness":"254"}
attr EG_WoZi_Led11_Licht stateFormat {lc ReadingsVal("$name","state",0)}
attr EG_WoZi_Led11_Licht structexclude .*:.*
attr EG_WoZi_Led11_Licht userReadings color {cieToRgb(ReadingsVal($name,"color_x",0),ReadingsVal($name,"color_y",0),ReadingsVal($name,"brightness",254))}
attr EG_WoZi_Led11_Licht webCmd toggle:on:off:brightness:color_temp:color

Wieso fragst du? Funktioniert es bei dir nicht korrekt? Hast du die entsprechenden readings?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

justme1968

hast du mal das ergebnis verglichen oder nur die faktoren angeschaut?

so wirklich genau ist es ohne die exakten daten des jeweiligen lampe sowieso nicht.

philips veröffentlich sogar zwei sätze parameter. je nach farbunfang der leuchtmittel. leider funktioniert aber deren veröffentlichte formeln überhaupt nicht.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

KernSani

Zitat von: justme1968 am 01 Februar 2019, 11:26:47
hast du mal das ergebnis verglichen oder nur die faktoren angeschaut?

so wirklich genau ist es ohne die exakten daten des jeweiligen lampe sowieso nicht.

philips veröffentlich sogar zwei sätze parameter. je nach farbunfang der leuchtmittel. leider funktioniert aber deren veröffentlichte formeln überhaupt nicht.

Ich habe nur Coding verglichen... Ich versuche heute abend mal mit der sub aus dm HUE_DEVICE
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KernSani

Zitat von: KernSani am 01 Februar 2019, 11:28:37
Ich habe nur Coding verglichen... Ich versuche heute abend mal mit der sub aus dm HUE_DEVICE
Hab's doch schnell gemacht... Teils mssive Abweichungen, vor allem bei der Helligkeit. Welchen Wertebereich hat Y (dritter Parameter) bei dir?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

KernSani

Zitat von: justme1968 am 01 Februar 2019, 11:46:11
0-1
Arg... hatte einen Typo im sprintf um in Hex zu wandeln, daher hat's nicht gepasst... Näherungsweise passt die HUE_DEVICE-Konvertierung. Schön fände ich eine xyYtoHex in der Color.pm :)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

justme1968

ab morgen gibt es Color::xyY2rgb und Color::xyY2hex
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rippi46

@KernSani  meine readings waren color-x bzw color-y anstatt color_x und color_y und hatte dadurch "Division by null"
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

KernSani

@Andre: Hab's mir gerade mal aus dem SVN gezogen, zwei Dinge:
1.) In Zeile 389 sollte my $f = main::maxNum($X,$Y,$Z); stehen
2.) Irgendwie hopst mein Colorpicker jetzt doch ziemlich durch die Gegend... Hast du noch irgendwas anderes verändert? (Ich kann nichts finden)
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

justme1968

1. habs repariert.

2. nein. jedenfalls nicht absichtlich.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Kawaci

Hallo!
Ich habe mich an eure Anleitung aus diesem Eintrag einigermaßen gehalten! Ich hatte einen kleinen Erfolg da meine IKEA LED jetzt anstelle von Weiss Blau violett leuchtet! dimmen geht nicht mehr bzw wenn ich auf 10 dumme leuchtet sie schwach blau und wenn ich auf 255 hoch dumme auch so schwach blau!
ein List meiner LED!
Internals:
   DEF        LED1624G9 0xccccccfffe9e80a9 Stehlampe2_oben
   FRIENDLYNAME Stehlampe2_oben
   FUUID      5ddbc299-f33f-f967-6c44-638a88f94be09d37
   IODev      Mosquitto
   MODEL      LED1624G9
   NAME       Stehlampe2_oben
   NOTIFYDEV  LED1624G9 0xccccccfffe9e80a9 Stehlampe2_oben
   NR         241
   SID        0xccccccfffe9e80a9
   STATE      ON
   TYPE       XiaomiMQTTDevice
   READINGS:
     2019-11-28 22:41:55   brightness      135
     2019-11-28 22:41:55   color           E1B669
     2019-11-28 21:49:27   color-x         0.458
     2019-11-28 21:49:27   color-y         0.41
     2019-11-28 22:41:55   color_mode      1
     2019-11-28 22:41:55   device-datecode unknown
     2019-11-28 22:41:55   device-friendlyname Stehlampe2_oben
     2019-11-28 22:41:55   device-hwversion unknown
     2019-11-28 22:41:55   device-ieeeaddr 0xccccccfffe9e80a9
     2019-11-28 22:41:55   device-manufid  4476
     2019-11-28 22:41:55   device-manufname IKEA of Sweden
     2019-11-28 22:41:55   device-modelid  TRADFRI bulb E27 CWS opal 600lm
     2019-11-28 22:41:55   device-nwkaddr  28472
     2019-11-28 22:41:55   device-powersource Mains (single phase)
     2019-11-28 22:41:55   device-status   offline
     2019-11-28 22:41:55   device-swbuildid unknown
     2019-11-28 22:41:55   device-type     Router
     2019-11-28 22:41:55   linkquality     26
     2019-11-28 22:41:55   state           ON
     2019-11-28 22:41:55   transmission-state incoming publish received
   message_ids:
   subscribe:
     zigbee2mqtt/Stehlampe2_oben
     xiaomi/0xccccccfffe9e80a9/#
   subscribeExpr:
     ^zigbee2mqtt\/Stehlampe2_oben$
     ^xiaomi\/0xccccccfffe9e80a9.*$
   subscribeQos:
     xiaomi/0xccccccfffe9e80a9/# 0
     zigbee2mqtt/Stehlampe2_oben 0
Attributes:
   IODev      Mosquitto
   devStateIcon {return ".*:light_light_dim_100@#".ReadingsVal($name,"color","FFFFF").":toggle"}
   room       XiaomiMQTTDevice
   stateFormat state
   userReadings color {cieToRgb(ReadingsVal($name,"color-x",0),ReadingsVal($name,"color-y",0),ReadingsVal($name,"brightness",254))}
   webCmd     toggle:on:off:brightness:color:color_temp
   widgetOverride brightness:colorpicker,BRI,0,1,255 color:colorpicker,RGB color_temp:colorpicker,CT,250,1,454


ich habe das 99_myutilities 1 zu 1 übernommen!

was könnte der Fehler sein? bzw wie komm ich zur Lösung das ich alle färben meiner LED heraus hohlen kann?
danke in Vorraus!