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
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden