I have do it, with Javascript.
My item : Color grill_eg_terasse “Grill” (geg) {mqtt="<[sari:shellies/shellyrgbw2-B0983A/color/0/status:state:JS(rgbjson_hsv.js)],>[sari:shellies/shellyrgbw2-B0983A/color/0/command:command:ON:MAP(shellyonoff.map)],>[sari:shellies/shellyrgbw2-B0983A/color/0/command:command:OFF:MAP(shellyonoff.map)],>[sari:shellies/shellyrgbw2-B0983A/color/0/set:command:*:JS(hsv_rgbjson.js)]"}
rgbjson_hsv.js
// Wrap everything in a function
(function(i) {
var min, max, delta, r, g, b, h, s, v, v1, w, erg=“falsch”;
// r,g,b-Werte zwischen 0 und 1
// h = [0,360], s = [0,1], v = [0,1]
// Wenn s == 0, dann h = -1 (undefined)
obj=JSON.parse(i);
r=Number(obj.red)/255;
g=Number(obj.green)/255;
b=Number(obj.blue)/255;
w=Number(obj.white)
v1=Number(obj.gain)
min=g; if (r<min) {min=r;} if (b<min) {min=b;}
max=g; if (r>max) {max=r;} if (b>max) {max=b;}
delta = max - min;
if( max != 0 ) s = delta / max;
else { s = 0; h = 0; } // r = g = b = 0
if (max == min) { h = 0; s = 0; } // hier ist alles Grau
if (s>0)
{
if( r == max ) { h = ( g - b ) / delta; } // zwischen Gelb und Magenta
else if( g == max ) { h = 2 + ( b - r ) / delta; } // zwischen Cyan und Gelb
else { h = 4.0 + ( r - g ) / delta;} // zwischen Magenta und Zyan
h *= 60; // degrees
if( h < 0 ) h += 360;
}
erg=Number(h)+","+Number(s*100)+","+Number(v1);
//erg=Number(w);
return erg;
})(input)
// input variable contains data passed by openhab
and hsv_rgbjson.js
/ Wrap everything in a function
(function(i) {
var p1, p2, hi, f, p, q, t, r, g, b, h, s, v, v1, w, erg=“falsch”;
if ((i=="ON") || (i=="OFF")) {erg="";}
else
{
p1= i.indexOf(",");
p2= i.indexOf(",",p1+1);
h=Number(i.substring(0,p1));
s=Number(i.substring(p1+1,p2));
v1=Number(i.substring(p2+1,99));
s=s/100;
//v=v1/100;
v=1;
hi=Math.floor(h/60)
f=(h/60-hi);
p=v*(1-s);
q=v*(1-s*f);
t=v*(1-s*(1-f));
if ((hi==0) || (hi==6)) {r=v; g=t; b=p; }
else if (hi==1) {r=q; g=v; b=p;}
else if (hi==2) {r=p; g=v; b=t;}
else if (hi==3) {r=p; g=q; b=v;}
else if (hi==4) {r=t; g=p; b=v;}
else {r=v; g=p; b=q;}
w=0;
if (s<0.5) {w=(0.5-s)*2*v1/100;}
erg="{\"red\":" + (r*255) + ",\"green\":" + (g*255) + ",\"blue\":" + (b*255) + ",\"white\":" + (w*255) + ",\"gain\":" + (v1) + "}";
}
return erg;
})(input)
// input variable contains data passed by openhab
the onoff maps only convert upper lower case
After a saturation below 50% , I start the White Led also. At Saturation 0 the White is 100%. So I dont need so mutch Items or Swtiches to Controll the RGBW.
I know its not perfect, but it works for me.