Convertisseur hexa vers xy

Bonjour à tous,
Je cherche désespérément un convertisseur hexa vers xy pour pouvoir gérer la couleur de mes lampes via un bloc code.
Il y a bien un site Red / #ff0000 hex color (#f00) mais les valeurs xy ne sont pas celles que je trouve en interrogeant Phoscon via API.
Par exemple, le rouge #FF0000 c’est « xy »: [0.7006,0.2993] alors que sur le site c’est 0.64, 0.33.

Pourriez-vous m’aider à comprendre ?

Merci par avance.
Mathieu

Hello, en ligne ou en un langage spécifique ?

Je viens de faire une recherche rapide, j’ai pas trouvé en ligne, mais j’ai trouvé un code python qui le fait.

def rgb_to_xy(reg,green,blue):
    r = ((red + 0.055) / (1.0 + 0.055))**2.4 if (red > 0.04045) else (red / 12.92)
    g = ((green + 0.055) / (1.0 + 0.055))**2.4 if (green > 0.04045) else (green / 12.92)
    b = ((blue + 0.055) / (1.0 + 0.055))**2.4 if (blue > 0.04045) else (blue / 12.92)
    X = r * 0.664511 + g * 0.154324 + b * 0.162028
    Y = r * 0.283881 + g * 0.668433 + b * 0.047685
    Z = r * 0.000088 + g * 0.072310 + b * 0.986039
    cx = 0
    cy = 0
    if (X + Y + Z) != 0:
        cx = X / (X + Y + Z)
        cy = Y / (X + Y + Z)
    return (cx, cy)
1 « J'aime »

Hello @HugoVal11 ,
Je pensais plutôt en ligne.
Comment mettre en pratique ton code sous jeedom ?

Mathieu

Ce n’est que du calcul, ce code peut être facilement transposé en PHP et mis dans userfunction.

Hello @Jeandhom ,
Alors si ce n’est que du calcul, je peux faire un fichier excel :smiley:

Mathieu

Tu as une faute de frappe.

Oui :smiley:

Merci pour votre aide.
Mathieu

1 « J'aime »

J’ai fait des fonctions php qu’on peut mettre dans le fichier « userfonction » de jeedom :

note: faut pas mettre de chiffres dans les noms de fonction, sinon elles ne sont pas reconnues.

1 « J'aime »

Héhé
image

1 « J'aime »

Tu cherches à faire quoi ?

Car y’as déjà des fonctions dans jeedom pour convertir les couleurs, suffit sans doute de les appeler dans ton bloc code.

Hello @sagitaz ,
Je cherche à connaitre la valeur xy d’une couleur pour l’intégrer à mon bloc code.

$url_Deconz = 'http://127.0.0.1:8484';
$cle_API_deCONZ = 'XXXXXXXXXXXX';
$light = 7; // Cuisine
$url = $url_Deconz."/api/".$cle_API_deCONZ."/lights/".$light."/state";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(

      //Détente 100
        'on' => true,
        'xy' => [0.5002,0.4143],
        'bri' => 255,
        'transitiontime' => 50, //5 secondes (1*5*10)

    )));
curl_exec($ch);
curl_close($ch);

Dans jeedom tu as une fonction dans le core pour HEX->RGB.
Avec une autre qui fait RGB->XY, tu devrais avoir ce qu’il faut :

$hex = "FF0000"; //ta couleur à convertir au format Hex

//La fonction de convertion RGB vers XY
function rgb2xy($r, $g, $b) {
    $normalizedToOne['red'] = $r / 255;
    $normalizedToOne['green'] = $g / 255;
    $normalizedToOne['blue'] = $b / 255;
    foreach ($normalizedToOne as $key => $normalized) {
      if ($normalized > 0.04045) {
        $color[$key] = pow(($normalized + 0.055) / (1.0 + 0.055), 2.4);
      } else {
        $color[$key] = $normalized / 12.92;
      }
    }
    $xyz['x'] = $color['red'] * 0.664511 + $color['green'] * 0.154324 + $color['blue'] * 0.162028;
    $xyz['y'] = $color['red'] * 0.283881 + $color['green'] * 0.668433 + $color['blue'] * 0.047685;
    $xyz['z'] = $color['red'] * 0.000000 + $color['green'] * 0.072310 + $color['blue'] * 0.986039;
    if (array_sum($xyz) == 0) {
      $x = 0;
      $y = 0;
    } else {
      $x = $xyz['x'] / array_sum($xyz);
      $y = $xyz['y'] / array_sum($xyz);
    }
    return array(
      'x' => $x,
      'y' => $y,
      'bri' => round($xyz['y'] * 255),
    );
  }

// Convertion de HEX vers RGB avec la fonction du core
$rgb = hex2rgb($hex);
$r = $rgb[0];
$g = $rgb[1];
$b = $rgb[2];

// conversion de RGB vers XY
$xy = rgb2xy($r, $g, $b);
// arrondi à 5 chiffres
$x = round($xy['x'],5);
$y = round($xy['y'],5);
$bri = $xy['bri'];
  
$scenario->setLog($hex);
$scenario->setLog('rouge :' . $r . ', vert :' . $g . ', bleu :' . $b);
$scenario->setLog('x :' . $x . ', y :' . $y . ', bri :' . $bri);

Capture d’écran 2022-04-13 155339

3 « J'aime »

Merci énormément @sagitaz :slight_smile:
Je l’ai intégré à mon code et ça marche très bien.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.