NEWS
Skript für Relatives Dimmen von Hue-Lampen (oder Gruppen) über KNX-Taster (und eine Frage dazu)
-
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.20Edit vom 11.5.2019:
Anpassungen an Tradfri etc. Siehe nachfolgender Post. -
-
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; } });
-
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
-
Hi Tobias,
Frage: hast du schon eine Lösung gefunden?
Sorry für die verdammt späte Antwort.
LG Andreas
-
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 43if (obj.state.val.decr_incr == 0 && obj.state.val.data == 1) {
die Objekte direkt abfragen und damit funktioniert das Script bestens...
-
@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
-
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 -
@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
-
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
-
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.
-
@andreaskos super vielen Danka an dich fine ich top!!!
-
@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.