Zefau / ioBroker.jarvis

jarvis - just another remarkable vis
https://forum.iobroker.net/topic/49776
Other
148 stars 38 forks source link

Deconz XY CIE Farbwahl #399

Open ma-gu-16 opened 3 years ago

ma-gu-16 commented 3 years ago

Hallo ist es möglich die folgende Farbwahl via Hueslider in Jarvis zu verwirklichen ?

image

bisher hab ich nichts dazu gefunden.

Danke.

Zefau commented 3 years ago

Nicht mittels xy, aber mittels hue, rgb oder hex.

ma-gu-16 commented 3 years ago

Hi Zefau, danke für die Rückmeldung.

Scheint nicht zu funktionieren, HEX und RGB gibt es nicht lediglich HUE, aber selbst wenn ich im iobroker diesen Wert ändere passiert nix.

Es klappt nur via diesem XY Wert. in der VIS habe ich den Colorpicker HUE.

Es handelt sich um eine IKEA RGB Bulb.

Danke dir.

Zefau commented 3 years ago

Bitte stell mal deine Geräte- und Widget-Konfiguration bereit.

ma-gu-16 commented 3 years ago

Gerät

   "affe_f43bd": {
      "id": "affe_f43bd",
      "name": "Affe",
      "function": "light",
      "states": {
         "power": {
            "state": {
               "node": "deconz.0.lights.000d6ffffe1caf1a.on"
            },
            "action": "deconz.0.lights.000d6ffffe1caf1a.on",
            "label": "an / aus",
            "bodyElement": null
         },
         "level": {
            "state": {
               "node": "deconz.0.lights.000d6ffffe1caf1a.level"
            },
            "action": "deconz.0.lights.000d6ffffe1caf1a.level",
            "label": "Dimmer",
            "icon": {}
         },
         "hue": {
            "state": {
               "node": "deconz.0.lights.000d6ffffe1caf1a.hue"
            },
            "action": "deconz.0.lights.000d6ffffe1caf1a.hue",
            "label": "Farbe",
            "actionElement": null
         }
      },
      "options": {},
      "attributes": {
         "imported": true,
         "manufacturer": {
            "name": "Deconz",
            "namespace": "deconz"
         },
         "_created": 1606824431693,
         "_updated": 1606864161626
      }
   },

Layout

                  {
                     "moduleConfig": {},
                     "devices": [
                        {
                           "type": "device",
                           "deviceId": "affe_f43bd",
                           "bodyStateKey": null,
                           "actionType": "action",
                           "actionElement": "SwitchAction",
                           "primaryStateKey": "power"
                        }
                     ],
                     "module": "StateList",
                     "title": "Ambiente",
                     "icon": "floor-lamp-variant",
                     "id": "ca9f85ed-5e78-4026-aa41-42f217d558ad",
                     "index": 0
                  },
ma-gu-16 commented 3 years ago

Von meiner Seite erledigt.

Ich habe alternativ diverse Javascripte zur Umrechnung HSL zu RGB, HSL zu HEX, HUE zu RGB und RGB zu HSV (Homematic Farbbereich bis 0-199)

Ich benutze nun überall den schicken HUE Slider im Jarvis und schreibe es in eine Variable im iobroker und onchange rechne ich die Farbe um und setzte sie beim entsprechenden Aktor.

Zefau commented 3 years ago

Also für deconz sollte es auch im default funktionieren. Welchen Wert liefert denn deconz.0.lights.000d6ffffe1caf1a.hue ?

Wenn du das Widget mit dem Datenpunkt im BodyState + HueBody nimmst, sollte es gehen?

ma-gu-16 commented 3 years ago

Deconz klappt nicht, evtl liegt es auch am Adapter , aber bisher konnte ich mit keiner Version den HUE wert via iobroker setzten. Die Farben haben sich nur geändert via XY Wert.

Kann dir nicht sagen wieso. Habe auch den Deconz auf die aktuellste Repo Version aktualisiert. Kein Erfolg.

Nunja mit meiner JS Übersetzung klappt es ganz gut und im Grunde flüssig.

Danke dir dennoch. Grüsse

florian84z commented 3 years ago

Deconz klappt nicht, evtl liegt es auch am Adapter , aber bisher konnte ich mit keiner Version den HUE wert via iobroker setzten. Die Farben haben sich nur geändert via XY Wert.

Kann dir nicht sagen wieso. Habe auch den Deconz auf die aktuellste Repo Version aktualisiert. Kein Erfolg.

Nunja mit meiner JS Übersetzung klappt es ganz gut und im Grunde flüssig.

Danke dir dennoch. Grüsse

Ich habe das gleiche Problem, allerdings mit den aktuellen Zigbee Lampen vom Lidl. Dank des HUE-Extended Adapters kann ich die Lampen nun auch farblich steuern.

Der Adapter ist ebenfalls von @Zefau !

Vielleicht klappt es bei dir ja auch?!

Zefau commented 3 years ago

Dann scheint es am deconz Adapter zu liegen.

ma-gu-16 commented 3 years ago

Kann gut sein das der Deconz da etwas "nicht" kann. wie gesagt habe das via JS gelöst im iobroker.

nukleuz80 commented 3 years ago

Habe eine Frage dazu: Funktioniert das Steuern über den HUE-Extended Adapter des Datenpunkts HUE?

Bei mir geht das über DeConz auch nur über xy...

Danke für Info.

Zefau commented 3 years ago

Ja, über hue-extended via .hue sollte gehen. Was funktioniert denn nicht? Hast du https://github.com/Zefau/ioBroker.jarvis/issues/431 (https://zefau.gitbook.io/jarvis-de/sonstiges/faq#farben-mit-lighthuebody-bzw-lightcolorbody-beim-hue-extended-sind-falsch) gesehen?

nukleuz80 commented 3 years ago

Ok, das werde ich gleich mal testen. Habe eine Ikea Tradfri RGB Lampe über DeConz eingebunden. Die Farben lassen sich aber lediglich über xy steuern und nicht über HUE. Also die Datenpunkte...

So bin ich auf diesen Eintrag gestoßen beim googeln :)

Ich nutze Jarvis und Lovelace und schaffe es nicht die Farben über die ‚Colorpicker‘ zu ändern.

nukleuz80 commented 3 years ago

Also, ich habe nun den Extended-Hue Adapter installiert - mit DeConz/Phoscon erfolgreich verbunden und erhalte alle Lichter.

In Jarvis habe ich nun entsprechend power, Level und Hue mit den DP gefüllt. Power und Level funktionieren nur leider immer noch nicht Hue - also die Farbwahl...

Soll ich hier weiter schreiben oder ein neues Issue erstellen?

Nun kommt auch noch ein unknown error 🤷‍♂️

nukleuz80 commented 3 years ago

Ok, sorry - hatte die Einstellung verwenden von xy anstelle von hue nicht gesehen. Nach Aktivierung klappt das nun auch.

Vielen Dank für die tollen Adapter! 👍 Weiter so...

uwe72 commented 2 years ago

Kann gut sein das der Deconz da etwas "nicht" kann. wie gesagt habe das via JS gelöst im iobroker.

Hallo, kannst Du mir das Script geben? Ich suche ein Script welches mit XY nach Hue/Sat und umgekehrt umwandelt

ma-gu-16 commented 2 years ago

Kann gut sein das der Deconz da etwas "nicht" kann. wie gesagt habe das via JS gelöst im iobroker.

Hallo, kannst Du mir das Script geben? Ich suche ein Script welches mit XY nach Hue/Sat und umgekehrt umwandelt

Findest du zu genüge im Web. Ich verwende folgendes:

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

function hslToRgb (h, s, l) {
  // Achromatic
  if (s === 0) return [l, l, l]
  h /= 360

  var q = l < 0.5 ? l * (1 + s) : l + s - l * s
  var p = 2 * l - q

  return [
    Math.round(hueToRgb(p, q, h + 1/3) * 255),
    Math.round(hueToRgb(p, q, h) * 255),
    Math.round(hueToRgb(p, q, h - 1/3) * 255)
  ]
}

/**
 * Helpers
 */

function hueToRgb (p, q, t) {
  if (t < 0) t += 1
  if (t > 1) t -= 1
  if (t < 1/6) return p + (q - p) * 6 * t
  if (t < 1/2) return q
  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6

  return p
}

function hslToHex(h, s, l) {
    l /= 100;
    const a = s * Math.min(l, 1 - l) / 100;
    const f = n => {
        const k = (n + h / 30) % 12;
        const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
        return Math.round(255 * color).toString(16).padStart(2, '0');   // convert to Hex and prefix "0" if needed
    };
    return `#${f(0)}${f(8)}${f(4)}`;
}

/**
 *     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)    
{                                
    let R = ($R / 255);
    let G = ($G / 255);
    let B = ($B / 255);

    let maxRGB = Math.max(R, G, B);
    let minRGB = Math.min(R, G, B);
    let chroma = maxRGB - minRGB;
    let h = 0;
    if (chroma == 0)
        return 0;
    if (R == minRGB){
        h = 3 - ((G - B) / chroma);
    }
    else if (B == minRGB){
        h = 1 - ((R - G) / chroma);
    }
    else{
        h = 5 - ((B - R) / chroma);
    }

    let Hue = (60 * h);
    let HomematicHue = (Hue/1.8);

    if (HomematicHue == 200){
        HomematicHue = 199;
    }
    return HomematicHue;
}

/**
 * Converts CIE color space to RGB color space
 * @param {Number} x
 * @param {Number} y
 * @param {Number} brightness - Ranges from 1 to 254
 * @return {Array} Array that contains the color values for red, green and blue
 */
function cie_to_rgb(x, y, brightness)
{
    //Set to maximum brightness if no custom value was given (Not the slick ECMAScript 6 way for compatibility reasons)
    if (brightness === undefined) {
        brightness = 254;
    }

    var z = 1.0 - x - y;
    var Y = (brightness / 254).toFixed(2);
    var X = (Y / y) * x;
    var Z = (Y / y) * z;

    //Convert to RGB using Wide RGB D65 conversion
    var red     =  X * 1.656492 - Y * 0.354851 - Z * 0.255038;
    var green   = -X * 0.707196 + Y * 1.655397 + Z * 0.036152;
    var 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;
    }
    else if (green > blue && green > red && green > 1.0) {

        red = red / green;
        blue = blue / green;
        green = 1.0;
    }
    else if (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) * Math.pow(red, (1.0 / 2.4)) - 0.055;
    green   = green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055;
    blue    = blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055;

    //Convert normalized decimal to decimal
    red     = Math.round(red * 255);
    green   = Math.round(green * 255);
    blue    = Math.round(blue * 255);

    if (isNaN(red))
        red = 0;

    if (isNaN(green))
        green = 0;

    if (isNaN(blue))
        blue = 0;

    return [red, green, blue];
}

/**
 * Converts RGB color space to CIE color space
 * @param {Number} red
 * @param {Number} green
 * @param {Number} blue
 * @return {Array} Array that contains the CIE color values for x and y
 */
function rgb_to_cie(red, green, blue)
{
    //Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device
    var red     = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
    var green   = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
    var blue    = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92); 

    //RGB values to XYZ using the Wide RGB D65 conversion formula
    var X       = red * 0.664511 + green * 0.154324 + blue * 0.162028;
    var Y       = red * 0.283881 + green * 0.668433 + blue * 0.047685;
    var Z       = red * 0.000088 + green * 0.072310 + blue * 0.986039;

    //Calculate the xy values from the XYZ values
    var x       = (X / (X + Y + Z)).toFixed(4);
    var y       = (Y / (X + Y + Z)).toFixed(4);

    if (isNaN(x))
        x = 0;

    if (isNaN(y))
        y = 0;   

    return [x, y];
}

Gruss

ma-gu-16 commented 9 months ago

bisher wurde das noch nicht implementiert. ich hab heute ein neuen zigbee rgbw controller angelernt via deconz. nach wie vor kann man nur die xy werte setzten. über die umwegen mit DP und SCript geht das, aber ich denke das sollte in jarvis mit richtigen color picker möglich sein.

ma-gu-16 commented 8 months ago

vielleicht das Ticket als Feature markieren ? Deconz/Zigbee scheint ja doch viele zu nutzen, ich weiss nicht wie die das machen ;) Vielleicht mag einer seine Scripts zur Verfügung stellen. Gruss