Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Math.round einbinden in bestehende Funktion

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Gelöst] Math.round einbinden in bestehende Funktion

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      rom.wagner80 last edited by

      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>
      
      1 Reply Last reply Reply Quote 0
      • Dutchman
        Dutchman Developer Most Active Administrators last edited by

        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

        1 Reply Last reply Reply Quote 0
        • R
          rom.wagner80 last edited by

          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 🙂

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            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 !

            1 Reply Last reply Reply Quote 0
            • R
              rom.wagner80 last edited by

              @paul53:

              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

              1 Reply Last reply Reply Quote 0
              • R
                rom.wagner80 last edited by

                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));
                
                
                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                  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();
                  });
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • R
                    rom.wagner80 last edited by

                    Eigentlich genauso…wenn nicht noch schlimmer.

                    Hab davon mal ein Video gemacht...Wie kann ich dir das zukommen lassen oder posten ?

                    @paul53:

                    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();
                    });
                    
                    ```` ` 
                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 last edited by

                      @rom.wagner80:

                      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));
                      
                      1 Reply Last reply Reply Quote 0
                      • R
                        rom.wagner80 last edited by

                        @paul53:

                        @rom.wagner80:

                        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

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        563
                        Online

                        31.7k
                        Users

                        79.9k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        1147
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo