Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. *GELÖST* HSV to RGB Script Frage/ Hilfe

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    *GELÖST* HSV to RGB Script Frage/ Hilfe

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

      Hi, ich bräuchte mal Hilfe.

      Und zwar möchte ich gerne HSV Werte umwandeln in RGB Werte.

      Ich habe das hier gefunden und schon ein wenig probiert, aber bekomme es nicht hin.

      Das Original Script:

      ! ````
      /* accepts parameters

      • h Object = {h:x, s:y, v:z}
      • OR
      • h, s, v
        */
        function HSVtoRGB(h, s, v) {
        var r, g, b, i, f, p, q, t;
        if (arguments.length === 1) {
        s = h.s, v = h.v, h = h.h;
        }
        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;
        }
        return {
        r: Math.round(r * 255),
        g: Math.round(g * 255),
        b: Math.round(b * 255)
        };
        }
      
      Das was ich gerne machen möchte:
      
      Ich habe 3 Objekte (h,s,v) wo z.B. die Werte drin sind: h=120 s=100 v=100 (Farbe Grün)
      
      Jetzt möchte ich gerne das in den 3 Objekten die ich angelegt habe (r,g,b) die Werte für Grün dann drin stehen (0,255,0)
      
      Ich habe das probiert, aber ohne Erfolg.
      
      Weiß jemand wie es richtig gemacht wird?
      
      

      /* accepts parameters

      • h Object = {h:x, s:y, v:z}
      • OR
      • h, s, v
        */
        function HSVtoRGB(

      h = getState("javascript.0.Geraete.Arduino.hue").val,
      s = getState("javascript.0.Geraete.Arduino.saturation").val,
      v = getState("javascript.0.Geraete.Arduino.dimmer").val)

      {
      var r, g, b, i, f, p, q, t;
      if (arguments.length === 1) {
      s = h.s, v = h.v, h = h.h;
      }
      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;
      }
      return {
      r: Math.round(r * 255),
      g: Math.round(g * 255),
      b: Math.round(b * 255)
      };

      setState("javascript.0.Geraete.Arduino.r1"/r1/, r),
      setState("javascript.0.Geraete.Arduino.g1"/g1/, g),
      setState("javascript.0.Geraete.Arduino.b1"/b1/, b);

      }

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

        /push

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

          Eine Funktion wird nur abgearbeitet, wenn sie auch aufgerufen wird.

          // Initialisierung bei Skriptstart
          var h = getState("javascript.0.Geraete.Arduino.hue").val; 
          var s = getState("javascript.0.Geraete.Arduino.saturation").val;
          var v = getState("javascript.0.Geraete.Arduino.dimmer").val;
          
          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.Arduino.r1"/*r1*/, Math.round(255 * r));
             setState("javascript.0.Geraete.Arduino.g1"/*g1*/, Math.round(255 * g));
             setState("javascript.0.Geraete.Arduino.b1"/*b1*/, Math.round(255 * b));     
          } // Ende der Funktion
          
          HSVtoRGB();  // Aufruf bei Skriptstart 
          
          on("javascript.0.Geraete.Arduino.hue", function(dp) {
             h = dp.state.val;
             HSVtoRGB();  // Aufruf bei Änderung von hue
          });
          on("javascript.0.Geraete.Arduino.saturation", function(dp) {
             s = dp.state.val;
             HSVtoRGB();  // Aufruf bei Änderung von saturation
          });
          on("javascript.0.Geraete.Arduino.dimmer", function(dp) {
             v = dp.state.val;
             HSVtoRGB();  // Aufruf bei Änderung von dimmer
          });
          
          

          EDIT: Faktor 255 bei setState() zugefügt.

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

            Leider funktioniert es so noch nicht.

            Ganz oben stimmt was mit der Klammer nicht.

            hm..

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

              Sorry. Die Variablendeklaration stimmt nicht (Semikolon).

              // Initialisierung bei Skriptstart
              var h = getState("javascript.0.Geraete.Arduino.hue").val;
              var s = getState("javascript.0.Geraete.Arduino.saturation").val;
              var v = getState("javascript.0.Geraete.Arduino.dimmer").val; 
              
              

              Sowas kommt von Copy & paste.

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

                Kann sein das was an der Formel nicht stimmt. Es ändert sich nichts. Es werden keine Werte gesetzt in r,g,b.

                r1 hat immer den Wert 255… b.z.w. 100.. grad nochmal geguckt

                g1 u. b1 haben immer 0

                hm..
                4339_2018-03-26.jpg

                1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  Sieht für mich aus als wird hue, sat, brightness im Bereich von 0..1 erwartet, nicht 0..360 bzw. 0..100. Probier mal folgende Änderung:

                  on("javascript.0.Geraete.Arduino.hue", function(dp) {
                     h = dp.state.val / 360;
                     HSVtoRGB();  // Aufruf bei Änderung von hue
                  });
                  on("javascript.0.Geraete.Arduino.saturation", function(dp) {
                     s = dp.state.val / 100;
                     HSVtoRGB();  // Aufruf bei Änderung von saturation
                  });
                  on("javascript.0.Geraete.Arduino.dimmer", function(dp) {
                     v = dp.state.val / 100;
                     HSVtoRGB();  // Aufruf bei Änderung von dimmer
                  });
                  

                  und außerdem

                  // Initialisierung bei Skriptstart
                  var h = getState("javascript.0.Geraete.Arduino.hue").val / 360;
                  var s = getState("javascript.0.Geraete.Arduino.saturation").val / 100;
                  var v = getState("javascript.0.Geraete.Arduino.dimmer").val / 100;
                  
                  1 Reply Last reply Reply Quote 0
                  • Elzershark
                    Elzershark last edited by

                    Super. Funzt… Danke schön 🙂 🙂

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

                      Hallo zusammen,

                      darf ich das Thema nochmal aufnehmen ?

                      Habe das ganze halbwegs ans laufen bekommen.

                      Mir werden allerdings Kommazahlen für r g und b ausgegeben. wie runde ich die ?

                      Danke für eure Hilfe

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        Magicmoon1 @rom.wagner80 last edited by

                        @rom-wagner80 Math.Round(); würde ich sagen oder .Ceil() zum aufrunden oder .floor() zum abrunden

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        729
                        Online

                        31.6k
                        Users

                        79.4k
                        Topics

                        1.3m
                        Posts

                        5
                        10
                        2353
                        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