Hallo
Möchte hier mal meinen Beitrag teilen, der bei mir in Verbindung mit Tuya RGBW Controllern aus China läuft.
Man benötigt 2 Skripte und ein paar Datenpunkte, die angelegt werden müssen.
Skript wandelt die von Homekit gesendeten Werte für Hue und Saturation in HEX
var red = "0_userdata.0.rgb_rot";
var green = "0_userdata.0.rgb_gruen";
var blue = "0_userdata.0.rgb_blau";
var hue = "0_userdata.0.rgb_hue"; //in Yahka mit Hue verknüpfen
var saturation = "0_userdata.0.rgb_saturation"; //in Yahka mit Saturation verknüpfen
var hex = "tuya.0.xxxxxxxxxxxxxxxxxxxxx.24-rgb"; //Hex Wert im Tuya Gerät, der geschrieben werden soll
var hexUpdateFromHomekit = true;
var hexUpdateFromHex = true;
function updateRGB() {
var h = getState(hue).val;
var s = getState(saturation).val / 100;
var v = 1;
var c = v * s;
var x = c * (1 - Math.abs((h / 60) % 2 - 1));
var m = v - c;
var r = 0;
var g = 0;
var b = 0;
if (h < 60) {
r = c;
g = x;
} else if (h < 120) {
r = x;
g = c;
} else if (h < 180) {
g = c;
b = x;
} else if (h < 240) {
g = x;
b = c;
} else if (h < 300) {
r = x;
b = c;
} else {
r = c;
b = x;
}
r = Math.round((r + m) * 255);
g = Math.round((g + m) * 255);
b = Math.round((b + m) * 255);
var hexValue = "#" + ("0" + r.toString(16)).slice(-2) + ("0" + g.toString(16)).slice(-2) + ("0" + b.toString(16)).slice(-2);
setState(hex, hexValue);
setState(red, r);
setState(green, g);
setState(blue, b);
}
on({id: hue, change: "ne"}, function (obj) {
if (hexUpdateFromHex) {
hexUpdateFromHomekit = false;
updateRGB();
setTimeout(function () {
hexUpdateFromHomekit = true;
}, 2000); // 2 seconds
}
});
on({id: saturation, change: "ne"}, function (obj) {
if (hexUpdateFromHex) {
hexUpdateFromHomekit = false;
updateRGB();
setTimeout(function () {
hexUpdateFromHomekit = true;
}, 2000); // 2 seconds
}
});
2.Skript wandelt die in der Smart Life App eingestellten Hex-Werte rückwärtig über RGB wieder in Hue und Saturation. Die Live Listener pausieren sich gegenseitig um 2 Sekunden, damit man nicht in eine Schleife läuft.
var red = "0_userdata.0.rgb_rot";
var green = "0_userdata.0.rgb_gruen";
var blue = "0_userdata.0.rgb_blau";
var hue = "0_userdata.0.rgb_hue"; //in Yahka mit Hue verknüpfen
var saturation = "0_userdata.0.rgb_saturation"; //in Yahka mit Saturation verknüpfen
var hex = "tuya.0.xxxxxxxxxxxxxxxxxxxxx.24-rgb"; //Hex Wert im Tuya Gerät, der geschrieben werden soll
var hexUpdateFromHomekit = true;
var hexUpdateFromHex = true;
function updateHS() {
var hexValue = getState(hex).val;
hexValue = hexValue.replace("#", "");
var r = parseInt(hexValue.substring(0, 2), 16);
var g = parseInt(hexValue.substring(2, 4), 16);
var b = parseInt(hexValue.substring(4, 6), 16);
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b),
min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0;
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
setState(hue, Math.round(h * 360));
setState(saturation, Math.round(s * 100));
setState(red, Math.round(r * 255));
setState(green, Math.round(g * 255));
setState(blue, Math.round(b * 255));
}
on({id: hex, change: "ne"}, function(obj) {
if (hexUpdateFromHomekit) {
hexUpdateFromHex = false;
setTimeout(function() {
updateHS();
hexUpdateFromHex = true;
}, 2000);
}
});
on({id: red, change: "ne"}, function(obj) {
if (hexUpdateFromHex) {
hexUpdateFromHomekit = false;
updateHex();
setTimeout(function() {
hexUpdateFromHomekit = true;
}, 2000);
}
});
on({id: green, change: "ne"}, function(obj) {
if (hexUpdateFromHex) {
hexUpdateFromHomekit = false;
updateHex();
setTimeout(function() {
hexUpdateFromHomekit = true;
}, 2000);
}
});
on({id: blue, change: "ne"}, function(obj) {
if (hexUpdateFromHex) {
hexUpdateFromHomekit = false;
updateHex();
setTimeout(function() {
hexUpdateFromHomekit = true;
}, 2000);
}
});
function updateHex() {
var r = getState(red).val;
var g = getState(green).val;
var b = getState(blue).val;
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b),
min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0;
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
var hexValue = "#" + ("0" + Math.round(r * 255).toString(16)).slice(-2) +
("0" + Math.round(g * 255).toString(16)).slice(-2) +
("0" + Math.round(b * 255).toString(16)).slice(-2);
hexUpdateFromHex = false;
setState(hex, hexValue);
setTimeout(function () {
hexUpdateFromHex = true;
}, 2000); // 2 seconds
hexUpdateFromHomekit = false;
setState(hue, Math.round(h * 360));
setState(saturation, Math.round(s * 100));
setTimeout(function () {
hexUpdateFromHomekit = true;
}, 2000); // 2 seconds
}
Somit wird Homekit und Smart Life App immer synchron gehalten.
Was ich noch nicht zum laufen gebraucht habe ist das Dimmen der Farben über Homekit. Zieht man hier den Regler runter, geht der Tuya Controller in der Weiß-Modus und dimmt da runter. Da muss ich mich nochmal hinsetzen und das Dimmen über RGB implementieren.