NEWS
[Gelöst] Math.round einbinden in bestehende Funktion
-
Hallo alle,
habe ein kleines Problem:
Wie bekomme ich folgenden Code, bzw. dessen Ergebnis gerundet ?
mit Math.round - Soviel weiß ich schonmal. aber wie binde ich diesen Befehl am besten in mein setstate ?
<code>setState ("javascript.0.Geraete.YAHKA.r1"/*r1*/, 255 * r), setState ("javascript.0.Geraete.YAHKA.g1"/*g1*/, 255 * g), setState ("javascript.0.Geraete.YAHKA.b1"/*b1*/, 255 * b);/code] vielen Dank für eure Hilfe Mit freundlichen Grüßen</code>
-
du müsstest mit einer variable arbeiten die erstmal abrunde und dan den setstate ausführt.
-
wo kommt dein wert her ?
-
was willst du genau erreichen ?
in deinem jetzigen setztet setzt du den wert auf 255, könntest du dein scenario beschreiben das macht es leichter etwas sinniges zu sagen
-
-
Also der ganze Quellcode sieht so aus:
var h = getState("javascript.0.Geraete.YAHKA.hue").val / 360; var s = getState("javascript.0.Geraete.YAHKA.saturation").val / 100; var v = getState("javascript.0.Geraete.YAHKA.dimmer").val / 100; function HSVtoRGB() { var r, g, b, i, f, p, q, t; i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } setState ("javascript.0.Geraete.YAHKA.r1"/*r1*/, 255 * r), setState ("javascript.0.Geraete.YAHKA.g1"/*g1*/, 255 * g), setState ("javascript.0.Geraete.YAHKA.b1"/*b1*/, 255 * b); } // Ende der Funktion HSVtoRGB(); // Aufruf bei Skriptstart on("javascript.0.Geraete.YAHKA.hue", function(dp) { h = dp.state.val / 360; HSVtoRGB(); // Aufruf bei Änderung von hue }); on("javascript.0.Geraete.YAHKA.saturation", function(dp) { s = dp.state.val / 100; HSVtoRGB(); // Aufruf bei Änderung von saturation }); on("javascript.0.Geraete.YAHKA.dimmer", function(dp) { v = dp.state.val / 100; HSVtoRGB(); // Aufruf bei Änderung von dimmer });
Aber mir wird nicht 255 ausgegeben, sondern der Wert von r, g, bzw b mit 255 multipliziert und dann ausgegeben. Und genau das Ergebnis möchte ich runden…
Natürlich dann erst nach der Multiplikation mit 255
-
Sollen Werte von 0 bis 255 auf ganze Zahlen gerundet werden ? Dann so
setState ("javascript.0.Geraete.YAHKA.r1"/*r1*/, Math.round(255 * r)); setState ("javascript.0.Geraete.YAHKA.g1"/*g1*/, Math.round(255 * g)); setState ("javascript.0.Geraete.YAHKA.b1"/*b1*/, Math.round(255 * b));
Kein Komma, sondern ein Semikolon an das Befehlsende !
-
Sollen Werte von 0 bis 255 auf ganze Zahlen gerundet werden ? Dann so
setState ("javascript.0.Geraete.YAHKA.r1"/*r1*/, Math.round(255 * r)); setState ("javascript.0.Geraete.YAHKA.g1"/*g1*/, Math.round(255 * g)); setState ("javascript.0.Geraete.YAHKA.b1"/*b1*/, Math.round(255 * b));
Kein Komma, sondern ein Semikolon an das Befehlsende ! `
Das war schonmal Goldrichtig.
hatte zwar vorher schon den Weg mit den Zwischen-Variablen gemacht. aber das ist durchaus eleganter
Danke
-
Allerdings ist dies anscheinend nicht die Lösung für mein Problem gewesen…
Folgendes passiert:
Die Werte werden sauber als RGB-Werte raus gegeben. dann kommt dahinter folgender Code zum Wandeln von RGB in Hex. und da scheint irgendetwas schief zu gehen... erstmal nimmt der RGB-Stripe die richtige Farbe an und dann nach ein paar Sekunden "Fadet" der Hex-Wert und es wird eine komplett andere Farbe dargestellt.... woran könnte das liegen ?
createState('ledRGB',0); getState('javascript.0.Geraete.YAHKA.r1'); getState('javascript.0.Geraete.YAHKA.g1'); getState('javascript.0.Geraete.YAHKA.b1', function () { on('javascript.0.Geraete.YAHKA.r1', calculateColor); on('javascript.0.Geraete.YAHKA.g1', calculateColor); on('javascript.0.Geraete.YAHKA.b1', calculateColor); }); function toHex(number) { if (number < 0) number = 0xFFFFFFFF + number + 1; var n = number.toString(16).toUpperCase(); if (n.length == 1) { n = '0' + n; } return n; } function calculateColor() { var R = Math.round(parseFloat(getState('javascript.0.Geraete.YAHKA.r1').val) || 0); var G = Math.round(parseFloat(getState('javascript.0.Geraete.YAHKA.g1').val) || 0); var B = Math.round(parseFloat(getState('javascript.0.Geraete.YAHKA.b1').val) || 0); setState('yeelight.0.stripe_0x0000000004cdb76b.rgb', '#' + toHex(R) + toHex(G) + toHex(B));
-
Versuche es mal so:
var R = getState('javascript.0.Geraete.YAHKA.r1').val; var G = getState('javascript.0.Geraete.YAHKA.g1').val; var B = getState('javascript.0.Geraete.YAHKA.b1').val; function toHex(number) { if (number < 0) number = 0xFFFFFFFF + number + 1; var n = number.toString(16).toUpperCase(); if (n.length == 1) { n = '0' + n; } return n; } function calculateColor() { setState('yeelight.0.stripe_0x0000000004cdb76b.rgb', '#' + toHex(R) + toHex(G) + toHex(B)); } calculateColor(); // Skriptstart on('javascript.0.Geraete.YAHKA.r1', function(dp) { R = dp.state.val; calculateColor(); }); on('javascript.0.Geraete.YAHKA.g1', function(dp) { G = dp.state.val; calculateColor(); }); on('javascript.0.Geraete.YAHKA.b1', function(dp) { B = dp.state.val; calculateColor(); });
-
Eigentlich genauso…wenn nicht noch schlimmer.
Hab davon mal ein Video gemacht...Wie kann ich dir das zukommen lassen oder posten ?
Versuche es mal so:
var R = getState('javascript.0.Geraete.YAHKA.r1').val; var G = getState('javascript.0.Geraete.YAHKA.g1').val; var B = getState('javascript.0.Geraete.YAHKA.b1').val; function toHex(number) { if (number < 0) number = 0xFFFFFFFF + number + 1; var n = number.toString(16).toUpperCase(); if (n.length == 1) { n = '0' + n; } return n; } function calculateColor() { setState('yeelight.0.stripe_0x0000000004cdb76b.rgb', '#' + toHex(R) + toHex(G) + toHex(B)); } calculateColor(); // Skriptstart on('javascript.0.Geraete.YAHKA.r1', function(dp) { R = dp.state.val; calculateColor(); }); on('javascript.0.Geraete.YAHKA.g1', function(dp) { G = dp.state.val; calculateColor(); }); on('javascript.0.Geraete.YAHKA.b1', function(dp) { B = dp.state.val; calculateColor(); }); ```` `
-
Die Werte werden sauber als RGB-Werte raus gegeben. dann kommt dahinter folgender Code zum Wandeln von RGB in Hex. und da scheint irgendetwas schief zu gehen… erstmal nimmt der RGB-Stripe die richtige Farbe an und dann nach ein paar Sekunden "Fadet" der Hex-Wert und es wird eine komplett andere Farbe dargestellt.... woran könnte das liegen ? `
Das gehört nicht mehr zum Thema "Math.round einbinden in bestehende Funktion". Mache dazu bitte ein neues Thema auf.Füge zum Testen mal vor dem setState() ein Log ein
log('#' + toHex(R) + toHex(G) + toHex(B));
-
Die Werte werden sauber als RGB-Werte raus gegeben. dann kommt dahinter folgender Code zum Wandeln von RGB in Hex. und da scheint irgendetwas schief zu gehen… erstmal nimmt der RGB-Stripe die richtige Farbe an und dann nach ein paar Sekunden "Fadet" der Hex-Wert und es wird eine komplett andere Farbe dargestellt.... woran könnte das liegen ? `
Das gehört nicht mehr zum Thema "Math.round einbinden in bestehende Funktion". Mache dazu bitte ein neues Thema auf.Füge zum Testen mal vor dem setState() ein Log ein
log('#' + toHex(R) + toHex(G) + toHex(B)); ```` `
Dann werde ich mal einen neuen Beitrag aufmachen.
Danke
Hier gehts weiter
! viewtopic.php?f=21&t=13730/spoiler]
! Gesendet von iPhone mit Tapatalk