Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Skript für Relatives Dimmen von Hue-Lampen (oder Gruppen) über KNX-Taster (und eine Frage dazu)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Skript für Relatives Dimmen von Hue-Lampen (oder Gruppen) über KNX-Taster (und eine Frage dazu)

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

      Liebe Leute des ioBroker-Forums,

      nachdem ich eine längere Homematic-Vergangenheit hinter mir habe und nun seit ca. einem Jahr verstärkt KNX beackere, habe ich mich vor Monaten erstmals auch intensiver mit ioBroker auseinander gesetzt. D.h. ich bin einer der vielen neuen Anwender die 2017 ioBroker für sich entdeckt haben.

      Eine meiner ersten Hürden war die Koppelung von KNX mit Philips Hue, weil ich hier relatives Dimmen einfach über KNX Taster erreichen wollte. Das Ergebnis ist ein simples Skript, wobei ich dieses mit euch teilen wollte - quasi als Einstands- oder Weihnachtsgeschenk für die, dies es brauchen können… 😉

      Vorab noch ein paar Anmerkungen dazu:

      • Die KNX-Gruppe, welche die steuernden Events liefert muss DPT-3 haben, also relatives Dimmen.

      • Die Hue-ID kann eine einzelne Lampe oder auch eine Gruppe sein. Diese Gruppe muss über das Hue-System eben vorher eingerichtet worden sein.

      • Die Dimm-Geschwindigkeit ist mit einer Konstanten im Skript einstellbar. Ich habe gemerkt, dass die Hue-Bridge überfordert ist, wenn zuviel auf einmal kommt. Mit 500ms Abstand zwischen den Schalt-Befehlen funktioniert das Dimmen gut.

      • Ich weiß nicht, wie plump die globalen Variablen sind die ich verwende, vermutlich gibt es hier schönere Lösungen.

      Ich bin natürlich gern für Verbesserungsvorschläge offen.

      Eine Frage zum Beispiel fällt mir gleich ein: Innerhalb der on-Funktionsdeklaration kann doch schon mit dem Parameter "val" auf den richtigen geprüft werden und ich würde mir die if-Abfrage im Code sparen. Durch den DPT-3 der KNX-Gruppe erhält man hier ja ein Objekt als Value. Wie müsste das in der on-Deklaration richtigerweise aussehen?

      /* ####### Relatives Dimmen von Philips Hue-Lampe oder Gruppe über KNX-Taster #######
         #
         # Skript reagiert auf Tastendruck eines KNX-Tasters, Auswertung einer Gruppe mit
         # DPT-3 (relatives Dimmen).Es wird mit dem Tastendruck hoch bzw. runtergedimmt
         # in beliebigen Schritten und Geschwindigkeit. Mit dem Loslassen der Taste wird
         # der Vorgang gestoppt.
         #
         # Erstellt von A.Kos am 07.12.2017
         # Geändert aufgrund von Umstellungen des KNX-Adapters am 01.05.2019
         ################################################################################## */
      
      // Channel-IDs
      var idTaster =      "XXXXXXXXX";  // ID der KNX-Gruppe mit DPT-3, z.B. Tastenwippe oder Tastenpaar
      var idHueLampe =    "XXXXXXXXX";  // ID der Hue-Lampe oder Gruppe
                                        // hier sollte der .bri-Datenpunkt stehen (bei Hue) oder 
                                        // falls z.B. Tradfri verwendet wird, dann der .brightness-Datenpunkt, etc.
      // Konstante zum Anpassen des Dimm-Verhaltens
      const REL_DIM_VAL = 50;     // Schrittweite beim relativen Dimmen (Achtung, das ist (bei Hue) KEIN %-Wert)
      const ABS_DIM_MAX = 254;    // Maximaler Absolutwert (Hue: 254)
      const ABS_DIM_MIN = 0;      // Minimaler Absolutwert (0)
      const DIM_DELAY = 500;     // Zeit im ms für die einzelnen Dimm-Schritte
      
      // ############ NACH DIESER ZEILE NICHTS MEHR ÄNDERN ############
      // ########### DO NOT CHANGE ANYTHING BELOW THIS LINE ########### 
      
      
      // Globale Variablen
      var BOOL_stop = 0;
      var emergency_counter = 1;
      
      
      // DimDown Runter-Dimmen
      on({id: idTaster, change: "any"} , function(obj) {
          if (obj.state.val[0] == 0 && obj.state.val[1] == 1) {
              BOOL_stop = 0;
              emergency_counter = 0;
              dimdown(REL_DIM_VAL);
          }
      });
      
      // DimUp Rauf-Dimmen
      on({id: idTaster, change: "any"} , function(obj) {
          if (obj.state.val[0] == 1 && obj.state.val[1] == 1) {
              BOOL_stop = 0;
              emergency_counter = 0;
              dimup(REL_DIM_VAL);
          }
      });
      
      
      function dimup(a) {
          if (BOOL_stop || getState(idHueLampe).val >= ABS_DIM_MAX || emergency_counter >= 100) {
              console.log("Ende erreicht");
              BOOL_stop = 0;
              return 0;
          }
          
          if (getState(idHueLampe).val <= (ABS_DIM_MAX-REL_DIM_VAL)) { 
              console.log("erhöhe um " + a + " auf den Wert " + (getState(idHueLampe).val + a) + " (" + emergency_counter + ")");
              setState(idHueLampe, getState(idHueLampe).val + a);
              setTimeout(function() {
                  emergency_counter++;
                  dimup(REL_DIM_VAL);
              }, DIM_DELAY);    
              
          } else {
              console.log("ELSE: erhöhe um " + (ABS_DIM_MAX-getState(idHueLampe).val) + " auf den Wert " + ABS_DIM_MAX + " (" + emergency_counter + ")");
              setState(idHueLampe,ABS_DIM_MAX);
              emergency_counter++;
              return 0;
          }
      }
      
      function dimdown(a) {
          if (BOOL_stop || getState(idHueLampe).val <= ABS_DIM_MIN || emergency_counter >= 100) {
              console.log("Ende erreicht");
              BOOL_stop = 0;
              return 0;
          }
          
          if (getState(idHueLampe).val >= (ABS_DIM_MIN+REL_DIM_VAL)) { 
              console.log("verringere um " + a + " auf den Wert " + (getState(idHueLampe).val - a) + " (" + emergency_counter + ")");
              setState(idHueLampe, getState(idHueLampe).val - a);
              setTimeout(function() {
                  emergency_counter++;
                  dimdown(REL_DIM_VAL);
              }, DIM_DELAY);    
              
          } else {
              console.log("ELSE: verringere um " + (ABS_DIM_MIN+getState(idHueLampe).val) + " auf den Wert " + ABS_DIM_MIN + " (" + emergency_counter + ")");
              setState(idHueLampe,ABS_DIM_MIN);
              emergency_counter++;
              return 0;
          }
      }
      
      // STOP
      on({id: idTaster, change: "any"} , function(obj) {
          if (obj.state.val[1] == 0 ) {
              // Info zum Testen: Diese Code-Zeile kann in der Praxis nicht erreicht werden,
              // ohne vorher die Funktion dimup oder dimdown ausgeführt zu haben. D.h. BOOL_stop ist vorher immer 0;
              BOOL_stop = 1;
          }
      });
      
      
      

      Hilfreich waren für mich übrigens folgende Posts:

      • Aus dem iobroker-Forum: http://forum.iobroker.net/viewtopic.php?t=8496

      • Aus dem KNX-User-Forum: https://knx-user-forum.de/forum/%C3%B6f … -auf-8-bit

      Edit vom 1.5.2019:
      Änderungen aufgrund Anpassung an den aktuellen KNX-Adapter in der Version 1.0.20

      Edit vom 11.5.2019:
      Anpassungen an Tradfri etc. Siehe nachfolgender Post.

      D 1 Reply Last reply Reply Quote 0
      • A
        axel.rathey last edited by Jey Cee

        Hallo Andreas,

        schönen Dank für das Skript. Ich stand vor ähnlichem Problem, habe aber das tradfri Gateway von IKEA.

        Da das tradfri Gateway den .bri Value als ".lightbulb.brightness" bzw. bei Gruppen nur mit ".brightness" hat, definiere ich das direkt als "idHueLampe" bzw. bei mir nun "idTradfriLampe" und habe den ".bri" im Code herausgenommen.

        Die Art und Weise wie iobroker das Objekt anliegt ist übrigens nicht von der Lampe abhängig (Hue, Tradfri etc.) sondern vom verwendeten Gateway bzw. vermutlich davon wie das im iobroker Modul des Gateways programmiert ist.

        Zu Deiner Frage kann ich leider keine Antwort geben, da ich mit Javascript noch wenig Erfahrung habe.

        Viele Grüße

        Axel

         /* ####### Relatives Dimmen von Philips Hue-Lampe oder Gruppe über KNX-Taster #######
         #
         # Skript reagiert auf Tastendruck eines KNX-Tasters, Auswertung einer Gruppe mit
         # DPT-3 (relatives Dimmen).Es wird mit dem Tastendruck hoch bzw. runtergedimmt
         # in beliebigen Schritten und Geschwindigkeit. Mit dem Loslassen der Taste wird
         # der Vorgang gestoppt.
         #
         # Erstellt von A.Kos am 07.12.2017
         # angepasst von Axel Rathey am 20.07.2018 auf Ikea tradfri
         ################################################################################## */
         // Channel-IDs
         var idTaster = "XXXXXXXXX"; // ID der KNX-Gruppe mit DPT-3, z.B. Tastenwippe oder Tastenpaar
         //var idHueLampe = "XXXXXXXXX"; // ID der Hue-Lampe oder Gruppe
         var idTradfriLampe = "XXXXXXXXX.lightbulb.brightness"; // ID der tradri-Lampe oder Gruppe (inkl. "(.lightbulb).brightness")
         // Konstante zum Anpassen des Dimm-Verhaltens
         const REL_DIM_VAL = 10; // Schrittweite beim relativen Dimmen (Achtung, das ist (bei Hue) KEIN %-Wert)
         const ABS_DIM_MAX = 100; // Maximaler Absolutwert (Hue: 254)(tradfri 100%)
         const ABS_DIM_MIN = 1; // Minimaler Absolutwert (Wert 1 sonst geht die tradfri komplett aus)
         const DIM_DELAY = 500; // Zeit im ms für die einzelnen Dimm-Schritte
         // ############ NACH DIESER ZEILE NICHTS MEHR ÄNDERN ############
         // ########### DO NOT CHANGE ANYTHING BELOW THIS LINE ###########
         // Globale Variablen
         var BOOL_stop = 0;
         var emergency_counter = 1;
         // DimDown Runter-Dimmen
         on({id: idTaster, change: "any"} , function(obj) {
         if (obj.state.val.decr_incr === 0 && obj.state.val.data === 1) {
         BOOL_stop = 0;
         emergency_counter = 0;
         dimdown(REL_DIM_VAL);
         }
         });
         // DimUp Rauf-Dimmen
         on({id: idTaster, change: "any"} , function(obj) {
         if (obj.state.val.decr_incr === 1 && obj.state.val.data === 1 ) {
         BOOL_stop = 0;
         emergency_counter = 0;
         dimup(REL_DIM_VAL);
         }
         });
         function dimup(a) {
         if (BOOL_stop || getState(idTradfriLampe).val >= ABS_DIM_MAX || emergency_counter >= 100) {
         console.log("Ende");
         BOOL_stop = 0;
         return 0;
         }
         if (getState(idTradfriLampe).val <= (ABS_DIM_MAX-REL_DIM_VAL)) {
         console.log("erhöhe um " + a + " auf den Wert " + (getState(idTradfriLampe).val + a) + " (" + emergency_counter + ")");
         setState(idTradfriLampe, getState(idTradfriLampe).val + a);
         setTimeout(function() {
         emergency_counter++;
         dimup(REL_DIM_VAL);
         }, DIM_DELAY);
         } else {
         console.log("ELSE: erhöhe um " + (ABS_DIM_MAX-getState(idTradfriLampe).val) + " auf den Wert " + ABS_DIM_MAX + " (" + emergency_counter + ")");
         setState(idTradfriLampe,ABS_DIM_MAX);
         emergency_counter++;
         return 0;
         }
         }
         function dimdown(a) {
         if (BOOL_stop || getState(idTradfriLampe).val <= ABS_DIM_MIN || emergency_counter >= 100) {
         console.log("Ende");
         BOOL_stop = 0;
         return 0;
         }
         if (getState(idTradfriLampe).val >= (ABS_DIM_MIN+REL_DIM_VAL)) {
         console.log("verringere um " + a + " auf den Wert " + (getState(idTradfriLampe).val - a) + " (" + emergency_counter + ")");
         setState(idTradfriLampe, getState(idTradfriLampe).val - a);
         setTimeout(function() {
         emergency_counter++;
         dimdown(REL_DIM_VAL);
         }, DIM_DELAY);
         } else {
         console.log("ELSE: verringere um " + (ABS_DIM_MIN+getState(idTradfriLampe).val) + " auf den Wert " + ABS_DIM_MIN + " (" + emergency_counter + ")");
         setState(idTradfriLampe,ABS_DIM_MIN);
         emergency_counter++;
         return 0;
         }
         }
         // STOP
         on({id: idTaster, change: "any"} , function(obj) {
         if (obj.state.val.data === 0 ) {
         // Info zum Testen: Diese Code-Zeile kann in der Praxis nicht erreicht werden,
         // ohne vorher die Funktion dimup oder dimdown ausgeführt zu haben. D.h. BOOL_stop ist vorher immer 0;
         BOOL_stop = 1;
         }
         });
        
        1 Reply Last reply Reply Quote 0
        • D
          do5tj80 last edited by

          Hallo,

          Ich habe das Script als Java Script im Scripteditor eingebunden.

          Meine KNX GA hat 3.007 als dpt.

          Leider erfolgt auf den Tastendruck keinerlei Reaktion.

          Wo könnte ich am besten anfangen zu suchen wo mein Fehler liegt?

          Gibt es irgendwas zu beachten?

          LG

          Tobias

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

            Hi Tobias,

            Frage: hast du schon eine Lösung gefunden?

            Sorry für die verdammt späte Antwort.

            LG Andreas

            1 Reply Last reply Reply Quote 0
            • T
              tetzlav last edited by tetzlav

              @do5tj80

              Bei mir war es ähnlich. Ich hatte über

              obj.state.val[0]
              obj.state.val[1]
              

              keinen Zugriff auf die Daten, weil des state-Objekt vermutlich nicht als Array erkannt wurde.
              Stattdessen musste ich in Zeile 43

              if (obj.state.val.decr_incr == 0 && obj.state.val.data == 1) {
              

              die Objekte direkt abfragen und damit funktioniert das Script bestens...

              1 Reply Last reply Reply Quote 0
              • D
                Denis1988 @andreaskos last edited by

                @andreaskos vielen Dank für das Script, welches ich auch nutze 🙂

                Das einzige was mich bisschen noch stört ist dass die Lampen nicht so smooth rauf und runter dimmen.
                Es gibt doch bei den hue lampen den datenpunkt command, in dem man eine JSON eintragen kann wie z.B.: "{"level":100,"transitiontime":50} und so weiter.... Hierbei dimmt die Lampe echt sehr schön rauf und runter.

                Wäre es vielleicht möglich bei langem Tastendruck so eine command auszuführen und bei Loslassen zu stoppen/Löschen.

                leider bin ich nicht so fit im Skripten

                andreaskos 1 Reply Last reply Reply Quote 0
                • andreaskos
                  andreaskos @Denis1988 last edited by

                  Hallo @denis1988 ,

                  ja, das wäre eine schöne Erweiterung, kann ich gerne einbauen! Aber vorher noch eine Frage: Gibt's da irgendwo eine Doku dazu? Die "transistiontime" wird ja wie ich schon bemerkt habe in Zehntelsekunden angegeben.

                  Und noch eine Frage (eventuell auch an @tetzlav ) : Ich hab das Skript selbst schon länger nicht mehr genutzt. Muss ich für den aktuellen KNX-Adapter - wie von @tetzlav angeführt - die Zeilen 34, 43 und 99 anpassen, damit es geht? Das könnt ich für die neue Version auch gleich mit anpassen und oben im ersten Thread aktualisieren.

                  Danke & LG
                  Andreas

                  D 2 Replies Last reply Reply Quote 0
                  • D
                    Denis1988 @andreaskos last edited by Denis1988

                    @andreaskos
                    Danke für die Rückmeldung und für deine Mühe! hier ist die Doku, du musst dich jedoch anmelden um sie zu lesen:

                    https://developers.meethue.com/develop/hue-api/lights-api/

                    der Punkt bri_inc hört sich auch sehr spannend an. Leider ist dieser Datenpunkt im hue.adapter nicht vorhanden.

                    Darf ich fragen warum Du das Skript nicht mehr nutzt bzw. was du stattdessen benutzt?

                    VG

                    andreaskos 1 Reply Last reply Reply Quote 0
                    • D
                      Denis1988 @andreaskos last edited by

                      @andreaskos

                      Vielleicht ist das hier auch eine gute Vorlage:

                      https://community.symcon.de/t/hue-lampen-via-knx-taster-steuern/51436/24

                      (Post ab 20.Januar 2021)

                      Ich bin leider nicht so fit im Skripte schreiben

                      1 Reply Last reply Reply Quote 0
                      • andreaskos
                        andreaskos @Denis1988 last edited by

                        Danke @denis1988 !
                        Ich bin Systemintegrator und hab das Skript bei zwei Kunden in Betrieb, wo es auch anstandslos seine Dienste tut.
                        In letzter Zeit aber hatte ich keine KNX-Hue-Kombi, es hat sich aber einiges getan beim KNX-Adapter in der Zwischenzeit.

                        Ich seh es mir an und stell eine neue Version hier rein.

                        D 1 Reply Last reply Reply Quote 0
                        • D
                          Denis1988 @andreaskos last edited by

                          @andreaskos super vielen Danka an dich fine ich top!!!👍

                          C 1 Reply Last reply Reply Quote 0
                          • C
                            CyberChris79 @Denis1988 last edited by

                            @andreaskos
                            Danke für dein Script. Es funktioniert einwandfrei.
                            Gibt es eine Möglichkeit das auch für HSV zu nutzen.
                            Ich möchte gerne über den MDT Glastaster 2 über 2 Tasten HSV Werte an die Hue Lampe senden.

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            777
                            Online

                            31.7k
                            Users

                            79.8k
                            Topics

                            1.3m
                            Posts

                            javascript
                            6
                            12
                            2539
                            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