NEWS
[SKRIPT] Philips hue dynamische Szenen - update
-
Hi,
ich nutze das Skript schon seit einiger Zeit. Einfach Klasse das Skript. Doch seit dem letzten Update der Bridge + Neuaufsetzen des ioBrokers funktioniert nur noch die Szene Kamin. Helligkeit etc. funktioniert auch. Weitere Szenen wie Blau oder Wald funktionieren nicht mehr. Ist in der Hinsicht was bekannt?
mfg
Falk -
Hallo zusammen,
auch bei mir wird nur noch Kamin Effekt angezeigt. Helligkeit und Strabo funktioniert, alles weitere nicht mehr.
-
Moin
Kann es sein, dass das Skript auch mit dem neuen Hue-Adapter (v1.2.3) nicht mehr funktioniert? Mit der Version 0.6.9 lÀuft alles einwandfrei. Bei 1.2.3 gibts nur noch ein statisches rot.
Kann das jemand bestÀtigen?
Dank & GruĂ
Daniel -
Moin
Kann es sein, dass das Skript auch mit dem neuen Hue-Adapter (v1.2.3) nicht mehr funktioniert? Mit der Version 0.6.9 lÀuft alles einwandfrei. Bei 1.2.3 gibts nur noch ein statisches rot.
Kann das jemand bestÀtigen?
Dank & GruĂ
Daniel@ratte-rizzo Probier gerne mal den hue-extended Adapter: https://forum.iobroker.net/topic/24207/neuer-adapter-hue-extended/2
-
@ratte-rizzo Probier gerne mal den hue-extended Adapter: https://forum.iobroker.net/topic/24207/neuer-adapter-hue-extended/2
@Zefau
Danke fĂŒr den Tipp. Copy&Paste geht leider nicht. Also muss ich das mal in Ruhe testen... -
Ich gebs auf, ich bekomme es weder mit hue-extended noch mit hue 2.0 zum laufen. Schade...
Sollte jemand ein Update des Skripts machen, geb ich ein Bier aus. Meine Programmierkenntnise reichen da leider nicht aus.
-
Ich gebs auf, ich bekomme es weder mit hue-extended noch mit hue 2.0 zum laufen. Schade...
Sollte jemand ein Update des Skripts machen, geb ich ein Bier aus. Meine Programmierkenntnise reichen da leider nicht aus.
@ratte-rizzo woran scheitert es bei hue-extended?
-
@ratte-rizzo woran scheitert es bei hue-extended?
@Zefau
Also, generell bekomme ich stÀndig folgende Fehlermeldung, wenn das Skript aktiviert wird:18:00:43.353 warn javascript.0 at szenenwechsel (script.js.common.leuchtfeuer-hue-extended:245:5) 18:00:43.354 warn javascript.0 at Object.<anonymous> (script.js.common.leuchtfeuer-hue-extended:278:17)Ich vermute mal, dass es mit der Einbindung der Lampen zusammenhÀngt, aber meine Versuche waren da auch erfolglos (hat sowohl mit als auch ohne ".action" nicht geklappt):
var lampen ={ "wohnzimmer": // Lampengruppe [ "hue-extended.0.lights.016-wz_decke_esse.action", "hue-extended.0.lights.017-wz_decke_fernseher.action", "hue-extended.0.lights.018-wz_decke_sofa.action" ] };Muss man an anderen Stellen im Script etwas anpassen?
-
Also, ich bekomme es schlichtweg nicht hin. Die beiden Zeilen aus der Fehlermeldung sind die folgenden
245: setState(lampen[lampenGruppe][lampe] + ".command", command); 278: szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]);Ich vermute, dass es an den Namen der Datenpunkte liegt, weià aber nicht, was ich daran noch Àndern soll.
Hat jemand vielleicht ein Script, was mit dem Adapter "hue extended" oder mit dem neuen "hue" Adapter lÀuft?
FĂŒr mich ist das nicht funktionierende Script ein KO-Kriterium fĂŒr ein Update auf eine neue Version des Hue Adapters oder des gerade erschienenen JS Controllers :(
Dank & GruĂ fĂŒr eventuelle Hilfe
Daniel -
Also, ich bekomme es schlichtweg nicht hin. Die beiden Zeilen aus der Fehlermeldung sind die folgenden
245: setState(lampen[lampenGruppe][lampe] + ".command", command); 278: szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]);Ich vermute, dass es an den Namen der Datenpunkte liegt, weià aber nicht, was ich daran noch Àndern soll.
Hat jemand vielleicht ein Script, was mit dem Adapter "hue extended" oder mit dem neuen "hue" Adapter lÀuft?
FĂŒr mich ist das nicht funktionierende Script ein KO-Kriterium fĂŒr ein Update auf eine neue Version des Hue Adapters oder des gerade erschienenen JS Controllers :(
Dank & GruĂ fĂŒr eventuelle Hilfe
Daniel@ratte-rizzo FĂŒr mich unter anderem leider auch. Aber die Zeit tickt leider gegen uns đđ Hast du es schon lösen können?
Denke fĂŒr jemanden mit JS Kenntnisse dĂŒrfte das kein groĂes Hexenwerk sein. Vielleicht haben wir ja noch GlĂŒck.
@paul53 wĂŒrds wahrscheinlich im Schlaf lösen đđ
Foxriver meint es kann nur mit den geÀnderten Datenwerten zusammen hÀngen.
(bluefox) temperature changed from 153-cold, 500-warm to 2200-warm, 6500-cold
(bluefox) hue changed from 0-65535 to 0-360° -
@ratte-rizzo FĂŒr mich unter anderem leider auch. Aber die Zeit tickt leider gegen uns đđ Hast du es schon lösen können?
Denke fĂŒr jemanden mit JS Kenntnisse dĂŒrfte das kein groĂes Hexenwerk sein. Vielleicht haben wir ja noch GlĂŒck.
@paul53 wĂŒrds wahrscheinlich im Schlaf lösen đđ
Foxriver meint es kann nur mit den geÀnderten Datenwerten zusammen hÀngen.
(bluefox) temperature changed from 153-cold, 500-warm to 2200-warm, 6500-cold
(bluefox) hue changed from 0-65535 to 0-360°@Stormbringer @ratte-rizzo probiert mal bitte:
// hue Szenzen - Script fĂŒr ioBroker // V 0.3.2 // // es empfiehlt sich den hue-Adapter-Loglevel auf "warn" zu stellen (viele FarbĂ€nderungen) // // Benutzung ĂŒber Vis, bzw. Datenpunkte // ------------------------------------ // // die Szenen können ĂŒber Datenpunkte, z.B. ĂŒber Vis eingeschaltet und gesteuert werden. // // javascript.0.hue.szene.arbeitszimmer.szene = "love" -> schaltet die Szene "love" im Arbeitszimmer ein // javascript.0.hue.szene.arbeitszimmer.szene = "aus" -> schaltet die aktive Szene im Arbeitszimmer aus, die Lampen gehen aus // javascript.0.hue.szene.arbeitszimmer.szene = "stop" -> stoppt die Szene, die Lampen der Gruppe "arbeitszimmer" leuchten weiter // // javascript.0.hue.szene.arbeitszimmer.bri_inc = -16 -> reduziert de Helligkeit der Szene um 16 Punkte // // javascript.0.hue.szene.arbeitszimmer.bri = 200 -> Ă€ndert die Helligkeit der Szene direkt auf den Wert 200 // javascript.0.hue.szene.arbeitszimmer.sat = 200 -> Ă€ndert die SĂ€ttigung der Szene direkt auf den Wert 200 // // // Benutzung ĂŒber Javascript (Funktionen) // -------------------------------------- // // szeneStart(lampenGruppe,szene,bri); // bri ist optional // // Beispiel: // // szeneStart("wohnzimmer","sonne"); // startet in der Lampengruppe "wohnzimmer" die Szene "sonne" // // // szeneStop(lampenGruppe); // // // lampenAus(lampenGruppe); // // // // // // // // // todo // ---- // // Rotalarm Effekt // // prĂŒfen: // ------- // // // erledigt: // --------- // bri optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Einschaltzeit beim ersten Einschalten // sat optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Ănderungen sat, bri per on() ĂŒberwachen und Lampen in aktiver Gruppe sofort anpassen // neue DP Strukutur () // // // ------------ ANFANG der individuellen Konfiguration ------------ // die eigenen Lampen in Gruppen sortiert (die FarbverlĂ€ufe und Effekte werden nach Gruppen aktiviert) var lampen ={ "wohnzimmer": // Lampengruppe [ 'hue.0.Stehlampe'/*Stehlampe*/, 'hue.0.Vitrine'/*Vitrine*/ ], "schlafzimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.rechts", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.rechts" ], "arbeitszimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.arbeitszimmer.schreibtisch.ls", "hue.0.Hue_2_AZ.arbeitszimmer.vorhang", "hue.0.Hue_2_AZ.arbeitszimmer.regal.li.re" ] }; var hueSzenenApapterPfad = "hue.szene."; // wo sollen die Datenpunkte in den ioBroker Objekten angelegt werden // je Lampengruppe werden die Datenpunkte: // .szene -> Ănderung der Szene per Datenpunkt, z.B. ĂŒber VIS oder im Script per szeneStart(lampenGruppe,szene,bri); // .bri -> Ănderung der Helligkeit per Datenpunkt (0-254) // .sat -> Ănderung der FarbsĂ€ttigung per Datenpunkt ())0-254) // .bri_inc -> Erhöhung/Verminderung der Helligkeit per Datenpunkt (positiver Wert = Heller, negativer Wert = dunkler) // .sat_inc -> Erhöhung/Verminderung der SĂ€ttigung per Datenpunkt (positiver Wert = mehr Farbe, negativer Wert = blasser) // angelegt // z.B. unter: javascript.0.hue.szene.arbeitszimmer.szene (Javascfript Instanz 0, Pfad = "hue.szene.") // globaler Parameter: ZufĂ€llige Zeit zwischen den Wechsel zwischen zwei Farben, je Lampe, in der aktivierten Szene in ms // (wenn keine individuelle Zeit in der Szene definiert ist) var delayMin = 1000; // minimale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln var delayMax = 3000; // maximale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln // ------------ ENDE der individuellen Konfiguration ------------ // ------------------------------------------------------------------------- // Script: Logik & Szenen - ab hier muss in der Regel nichts geĂ€ndert werden // ------------------------------------------------------------------------- var szenen = { "beispiel": { "description": "Beispielszene", // optional: Beschreibung der Szene "delayMin": 2000, // optional (ohne werden die globalen Einstellungen verwendet) "delayMax": 9000, // optional (ohne werden die globalen Einstellungen verwendet) "hueMin": 0, // niedrigste Farbe im Verlauf "hueMax": Math.round(50000 / 65535 * 360) // höchste Farbe im Verlauf }, "kamin": { "description": "roter Farbverlauf", "hueMin": 0, "hueMax": Math.round(10000 / 65535 * 100) }, "wald": { "description": "grĂŒner Farbverlauf", "hueMin": Math.round(20000 / 65535 * 100), "hueMax": Math.round(27000 / 65535 * 100) }, "sonne": { "description": "gelb/oranger Farbverlauf", "hueMin": Math.round(10000 / 65535 * 100), "hueMax": Math.round(17000 / 65535 * 100) }, "blau": { "description": "Energie, blauer Farbverlauf", "hueMin": Math.round(44000 / 65535 * 100), "hueMax": Math.round(48000 / 65535 * 100) }, "strobo": { "description": "Stroboskop", "ct": 6500, "delayMin": 500, "delayMax": 800 }, "feuer": { "description": "pulsierende Farben", "delayMin": 200, "delayMax": 600, "hueMin": 0, "hueMax": Math.round(17000 / 65535 * 100) }, "regenbogen": { "description": "das gesamte Farbspektrum", "delayMin": 1000, "delayMax": 8000, "hueMin": 0, "hueMax": 360 }, "love": { "description": "langsam wechselnder Farbverlauf im lila/violetten Bereich, bis zu den Endpunkten blau und rot", "delayMin": 5000, "delayMax": 8000, "hueMin": Math.round(46920 / 65535 * 100), "hueMax": 360 } }; // ##### Script Variablen ##### var timer = {}; var nextDelay = {}; var szeneAktiv = []; var szene = []; // ##### Script Funktionen ##### function rand(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function dpAnlegen() { for (var lampenGruppe in lampen) { createState(hueSzenenApapterPfad + lampenGruppe + ".szene","aus"); createState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene","keine"); createState(hueSzenenApapterPfad + lampenGruppe + ".bri",254); createState(hueSzenenApapterPfad + lampenGruppe + ".bri_inc",0); createState(hueSzenenApapterPfad + lampenGruppe + ".sat",254); createState(hueSzenenApapterPfad + lampenGruppe + ".sat_inc",0); log(hueSzenenApapterPfad + lampenGruppe + " wurde angelegt","info"); } } function restoreSzenen() { for (var lampenGruppe in lampen) { var aktiveSzene = getState(hueSzenenApapterPfad + lampenGruppe + ".szene").val; var bri = getState(hueSzenenApapterPfad + lampenGruppe + ".bri").val; if (aktiveSzene != "aus") { log("im der Gruppe: " + lampenGruppe + " wurde die Szene: " + aktiveSzene + " wieder aktiviert."); setState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene",aktiveSzene); szeneStart(lampenGruppe,aktiveSzene,bri); } } } function varsAnlegen() { // Script-Variablen fĂŒr jede Lampengruppe anlagen for (var lampenGruppe in lampen) { timer[lampenGruppe] = []; nextDelay[lampenGruppe] = []; szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; // Script-Variablen fĂŒr jede Lampe in jeder Lampengruppe anlegen for (var i = 0; i < lampen[lampenGruppe].length; i++) { // timer und die nĂ€chste Delayzeit fĂŒr jede Lampe zurĂŒckstellen timer[lampenGruppe][i] = null; nextDelay[lampenGruppe][i] = 0; } } } function szenenwechsel (lampenGruppe,lampe,delay) { delay = Math.floor(delay / 100); // der zufĂ€llige Wert fĂŒr die nĂ€chste Lichtfarbe wird auch als transitiontime verwendet (dazu wird das delay durch 100 geteilt) //log("aktive Szene: hueMin: " + szenen[szene[lampenGruppe]]["hueMin"] + " hueMax: " + szenen[szene[lampenGruppe]]["hueMax"]); var hue = rand(szenen[szene[lampenGruppe]].hueMin,szenen[szene[lampenGruppe]].hueMax); var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; var sat = getState(hueSzenenApapterPfad + lampenGruppe+".sat").val; var command = '{"on":true,"hue":' + hue + ',"sat":' + sat + ',"bri":' + bri + ',"transitiontime":' + delay + ',"colormode":"hs"}'; //log ("Lampe: " + lampen[lampenGruppe][lampe] + " # command: " + command); if (bri == 0) command = '{"on":false,"bri":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function stroboskop(lampenGruppe,lampe) { var command = '{"on":true,"ct":153,"bri":254,"transitiontime":0,"colormode":"ct"}'; setState(lampen[lampenGruppe][lampe] + ".command", command); command = '{"on":false,"transitiontime":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function berechneDelay (lampenGruppe,lampe){ // globale Delay-Einstellungen ĂŒbernehmen var delayMinTemp = delayMin; var delayMaxTemp = delayMax; // globale Delay-Einstellungen ĂŒberschreiben, wenn in der Szene ein eingener Delay definiert ist if (szenen[szene[lampenGruppe]].delayMin) delayMinTemp = szenen[szene[lampenGruppe]].delayMin; if (szenen[szene[lampenGruppe]].delayMax) delayMaxTemp = szenen[szene[lampenGruppe]].delayMax; nextDelay[lampenGruppe][lampe] = rand(delayMinTemp,delayMaxTemp); } function szeneTimer(lampenGruppe,lampe) { var delay = nextDelay[lampenGruppe][lampe] || 0; var aktuelleSzene = szene[lampenGruppe]; //log("gesetztes Delay: " + delay); if (timer[lampenGruppe][lampe]) clearTimeout(timer[lampenGruppe][lampe]); timer[lampenGruppe][lampe] = setTimeout(function() { timer[lampenGruppe][lampe] = null; berechneDelay(lampenGruppe,lampe); switch (aktuelleSzene) { case "strobo": stroboskop(lampenGruppe,lampe); break; default: szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]); break; } //log("Delay = " + nextDelay[lampenGruppe][lampe] + " # Lampe: " + lampen[lampenGruppe][lampe]); szeneTimer(lampenGruppe,lampe); // ruft den Timer nach Ablauf wieder auf },delay); } function check254(check) { if (check !== 0) if (!check) check = 254; check = parseInt(check); if (check > 254) check =254; if (check <= 0 ) check = 0; return check; } function setBri(lampenGruppe,aktiveSzene,bri) { if (szenen[aktiveSzene].bri) bri = szenen[aktiveSzene].bri; bri = check254(bri); setState(hueSzenenApapterPfad + lampenGruppe+".bri", bri); } function setSat(lampenGruppe,aktiveSzene,sat) { if (szenen[aktiveSzene].sat) sat = szenen[aktiveSzene].sat; sat = check254(sat); setState(hueSzenenApapterPfad + lampenGruppe+".sat", sat); } function szeneStart(lampenGruppe,aktiveSzene,bri,sat) { if (!szenen[aktiveSzene]) { // undefinierte Szenen abfangen log("# hue Szenen Script: undefinierte Szene wurde versucht aufzurufen: " + aktiveSzene,"error"); return; } szene[lampenGruppe] = aktiveSzene; setBri(lampenGruppe,aktiveSzene,bri); setSat(lampenGruppe,aktiveSzene,sat); if (!szeneAktiv[lampenGruppe]) { szeneAktiv[lampenGruppe] = true; for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen den timer starten nextDelay[lampenGruppe][i] = 0; szeneTimer(lampenGruppe,i); } } } function szeneStop(lampenGruppe) { // alle aktiven timer löschen for (var i = 0; i < lampen[lampenGruppe].length; i++) { clearTimeout(timer[lampenGruppe][i]); log("Timer: " + lampen[lampenGruppe][i] + " gestoppt"); } szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; } function lampenAus(lampenGruppe) { for (var i = 0; i < lampen[lampenGruppe].length; i++) { setState(lampen[lampenGruppe][i]+".command",'{"on":false}'); } } function setBriSat(com,wert,lampenGruppe) { if (wert != check254(wert)) { wert = check254(wert); setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //korrigiert bri/sat und ruft diese on() Funktion direkt wieder auf } else { //log("Lampengruppe: " + lampenGruppe + " # " + com + ": " + wert + " empfangen","warn"); if (szeneAktiv[lampenGruppe]) { // wenn die Szene in der Gruppe aktiv ist: for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen der Gruppe setState(lampen[lampenGruppe][i] + "." + com, wert); // die Helligkeit/Saturation direkt Ă€ndern //log(com + ": " + wert + " # " + lampen[lampenGruppe][i] + " gesetzt","warn"); } } } } function changeBriSat (com, wert, lampenGruppe) { com = com.replace("_inc", ""); var alterWert = getState(hueSzenenApapterPfad + lampenGruppe + "." + com).val; wert = parseInt(wert) + alterWert; setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //setzt bri/sat neu. Dies ruft die on() Funktion direkt wieder auf, diesmal mit bri/sat } // ##### Ăberwachte Datenpunkte ##### // Ănderung der Helligkeit (.bri) oder FarbsĂ€ttigung (.sat) wĂ€hrend der Laufzeit ĂŒber einen Datenpunkt var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat|bri)"); on({"id":reg , "change": "ne"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(bri|sat)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; setBriSat (com, wert, lampenGruppe); }); // Ănderung der Helligkeit oder FarbsĂ€ttignung als adaptiver Wert (.bri_inc, .sat_inc) var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat_inc|bri_inc)"); on({"id":reg , "change": "any"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(sat_inc|bri_inc)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; changeBriSat (com, wert, lampenGruppe); }); // Ănderung einer Szene wĂ€hrend der Laufzeit, z.B. ĂŒber VIS var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.szene"); on(reg , function (obj) { var str = obj.id.replace(/\.szene$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var neueSzene = obj.newState.val; log("Lampengruppe: " + lampenGruppe + " # Szene: " + neueSzene + " empfangen"); switch (neueSzene) { case "aus": szeneStop(lampenGruppe); lampenAus(lampenGruppe); log(lampenGruppe + " Szene deaktiviert"); break; case "stop": szeneStop(lampenGruppe); log(lampenGruppe + " Szene angehalten"); break; default: if (szenen[neueSzene]) { // TODO: bri nur ermitteln, wenn in der Szene kein eigener bri festgelegt ist var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; bri = check254(bri); if (bri == 0) bri = 254; szeneStart(lampenGruppe,neueSzene,bri); setState(hueSzenenApapterPfad + lampenGruppe+".infoAktiveSzene", neueSzene); log(lampenGruppe + " Szene: " + neueSzene + " gestartet"); break; } log("### unbekannte Szene: " + neueSzene,"error"); break; } }); // ##### Scriptstart ##### dpAnlegen(); // je einen Datenpunkt pro Lampengruppe anlegen varsAnlegen(); // die fĂŒr das Script notwendigen Variablen erstellen // warte bis alle States und Objekte angelegt werden. // 500ms und dann starte main(); function main() { // ##### Scriptstart main() ##### restoreSzenen(); // aktiviert zuletzt eingestellte Szenen } setTimeout(main, 500);Habe mal die hue/ct Werte quick'n dirty skaliert.
-
@Stormbringer @ratte-rizzo probiert mal bitte:
// hue Szenzen - Script fĂŒr ioBroker // V 0.3.2 // // es empfiehlt sich den hue-Adapter-Loglevel auf "warn" zu stellen (viele FarbĂ€nderungen) // // Benutzung ĂŒber Vis, bzw. Datenpunkte // ------------------------------------ // // die Szenen können ĂŒber Datenpunkte, z.B. ĂŒber Vis eingeschaltet und gesteuert werden. // // javascript.0.hue.szene.arbeitszimmer.szene = "love" -> schaltet die Szene "love" im Arbeitszimmer ein // javascript.0.hue.szene.arbeitszimmer.szene = "aus" -> schaltet die aktive Szene im Arbeitszimmer aus, die Lampen gehen aus // javascript.0.hue.szene.arbeitszimmer.szene = "stop" -> stoppt die Szene, die Lampen der Gruppe "arbeitszimmer" leuchten weiter // // javascript.0.hue.szene.arbeitszimmer.bri_inc = -16 -> reduziert de Helligkeit der Szene um 16 Punkte // // javascript.0.hue.szene.arbeitszimmer.bri = 200 -> Ă€ndert die Helligkeit der Szene direkt auf den Wert 200 // javascript.0.hue.szene.arbeitszimmer.sat = 200 -> Ă€ndert die SĂ€ttigung der Szene direkt auf den Wert 200 // // // Benutzung ĂŒber Javascript (Funktionen) // -------------------------------------- // // szeneStart(lampenGruppe,szene,bri); // bri ist optional // // Beispiel: // // szeneStart("wohnzimmer","sonne"); // startet in der Lampengruppe "wohnzimmer" die Szene "sonne" // // // szeneStop(lampenGruppe); // // // lampenAus(lampenGruppe); // // // // // // // // // todo // ---- // // Rotalarm Effekt // // prĂŒfen: // ------- // // // erledigt: // --------- // bri optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Einschaltzeit beim ersten Einschalten // sat optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Ănderungen sat, bri per on() ĂŒberwachen und Lampen in aktiver Gruppe sofort anpassen // neue DP Strukutur () // // // ------------ ANFANG der individuellen Konfiguration ------------ // die eigenen Lampen in Gruppen sortiert (die FarbverlĂ€ufe und Effekte werden nach Gruppen aktiviert) var lampen ={ "wohnzimmer": // Lampengruppe [ 'hue.0.Stehlampe'/*Stehlampe*/, 'hue.0.Vitrine'/*Vitrine*/ ], "schlafzimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.rechts", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.rechts" ], "arbeitszimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.arbeitszimmer.schreibtisch.ls", "hue.0.Hue_2_AZ.arbeitszimmer.vorhang", "hue.0.Hue_2_AZ.arbeitszimmer.regal.li.re" ] }; var hueSzenenApapterPfad = "hue.szene."; // wo sollen die Datenpunkte in den ioBroker Objekten angelegt werden // je Lampengruppe werden die Datenpunkte: // .szene -> Ănderung der Szene per Datenpunkt, z.B. ĂŒber VIS oder im Script per szeneStart(lampenGruppe,szene,bri); // .bri -> Ănderung der Helligkeit per Datenpunkt (0-254) // .sat -> Ănderung der FarbsĂ€ttigung per Datenpunkt ())0-254) // .bri_inc -> Erhöhung/Verminderung der Helligkeit per Datenpunkt (positiver Wert = Heller, negativer Wert = dunkler) // .sat_inc -> Erhöhung/Verminderung der SĂ€ttigung per Datenpunkt (positiver Wert = mehr Farbe, negativer Wert = blasser) // angelegt // z.B. unter: javascript.0.hue.szene.arbeitszimmer.szene (Javascfript Instanz 0, Pfad = "hue.szene.") // globaler Parameter: ZufĂ€llige Zeit zwischen den Wechsel zwischen zwei Farben, je Lampe, in der aktivierten Szene in ms // (wenn keine individuelle Zeit in der Szene definiert ist) var delayMin = 1000; // minimale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln var delayMax = 3000; // maximale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln // ------------ ENDE der individuellen Konfiguration ------------ // ------------------------------------------------------------------------- // Script: Logik & Szenen - ab hier muss in der Regel nichts geĂ€ndert werden // ------------------------------------------------------------------------- var szenen = { "beispiel": { "description": "Beispielszene", // optional: Beschreibung der Szene "delayMin": 2000, // optional (ohne werden die globalen Einstellungen verwendet) "delayMax": 9000, // optional (ohne werden die globalen Einstellungen verwendet) "hueMin": 0, // niedrigste Farbe im Verlauf "hueMax": Math.round(50000 / 65535 * 360) // höchste Farbe im Verlauf }, "kamin": { "description": "roter Farbverlauf", "hueMin": 0, "hueMax": Math.round(10000 / 65535 * 100) }, "wald": { "description": "grĂŒner Farbverlauf", "hueMin": Math.round(20000 / 65535 * 100), "hueMax": Math.round(27000 / 65535 * 100) }, "sonne": { "description": "gelb/oranger Farbverlauf", "hueMin": Math.round(10000 / 65535 * 100), "hueMax": Math.round(17000 / 65535 * 100) }, "blau": { "description": "Energie, blauer Farbverlauf", "hueMin": Math.round(44000 / 65535 * 100), "hueMax": Math.round(48000 / 65535 * 100) }, "strobo": { "description": "Stroboskop", "ct": 6500, "delayMin": 500, "delayMax": 800 }, "feuer": { "description": "pulsierende Farben", "delayMin": 200, "delayMax": 600, "hueMin": 0, "hueMax": Math.round(17000 / 65535 * 100) }, "regenbogen": { "description": "das gesamte Farbspektrum", "delayMin": 1000, "delayMax": 8000, "hueMin": 0, "hueMax": 360 }, "love": { "description": "langsam wechselnder Farbverlauf im lila/violetten Bereich, bis zu den Endpunkten blau und rot", "delayMin": 5000, "delayMax": 8000, "hueMin": Math.round(46920 / 65535 * 100), "hueMax": 360 } }; // ##### Script Variablen ##### var timer = {}; var nextDelay = {}; var szeneAktiv = []; var szene = []; // ##### Script Funktionen ##### function rand(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function dpAnlegen() { for (var lampenGruppe in lampen) { createState(hueSzenenApapterPfad + lampenGruppe + ".szene","aus"); createState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene","keine"); createState(hueSzenenApapterPfad + lampenGruppe + ".bri",254); createState(hueSzenenApapterPfad + lampenGruppe + ".bri_inc",0); createState(hueSzenenApapterPfad + lampenGruppe + ".sat",254); createState(hueSzenenApapterPfad + lampenGruppe + ".sat_inc",0); log(hueSzenenApapterPfad + lampenGruppe + " wurde angelegt","info"); } } function restoreSzenen() { for (var lampenGruppe in lampen) { var aktiveSzene = getState(hueSzenenApapterPfad + lampenGruppe + ".szene").val; var bri = getState(hueSzenenApapterPfad + lampenGruppe + ".bri").val; if (aktiveSzene != "aus") { log("im der Gruppe: " + lampenGruppe + " wurde die Szene: " + aktiveSzene + " wieder aktiviert."); setState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene",aktiveSzene); szeneStart(lampenGruppe,aktiveSzene,bri); } } } function varsAnlegen() { // Script-Variablen fĂŒr jede Lampengruppe anlagen for (var lampenGruppe in lampen) { timer[lampenGruppe] = []; nextDelay[lampenGruppe] = []; szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; // Script-Variablen fĂŒr jede Lampe in jeder Lampengruppe anlegen for (var i = 0; i < lampen[lampenGruppe].length; i++) { // timer und die nĂ€chste Delayzeit fĂŒr jede Lampe zurĂŒckstellen timer[lampenGruppe][i] = null; nextDelay[lampenGruppe][i] = 0; } } } function szenenwechsel (lampenGruppe,lampe,delay) { delay = Math.floor(delay / 100); // der zufĂ€llige Wert fĂŒr die nĂ€chste Lichtfarbe wird auch als transitiontime verwendet (dazu wird das delay durch 100 geteilt) //log("aktive Szene: hueMin: " + szenen[szene[lampenGruppe]]["hueMin"] + " hueMax: " + szenen[szene[lampenGruppe]]["hueMax"]); var hue = rand(szenen[szene[lampenGruppe]].hueMin,szenen[szene[lampenGruppe]].hueMax); var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; var sat = getState(hueSzenenApapterPfad + lampenGruppe+".sat").val; var command = '{"on":true,"hue":' + hue + ',"sat":' + sat + ',"bri":' + bri + ',"transitiontime":' + delay + ',"colormode":"hs"}'; //log ("Lampe: " + lampen[lampenGruppe][lampe] + " # command: " + command); if (bri == 0) command = '{"on":false,"bri":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function stroboskop(lampenGruppe,lampe) { var command = '{"on":true,"ct":153,"bri":254,"transitiontime":0,"colormode":"ct"}'; setState(lampen[lampenGruppe][lampe] + ".command", command); command = '{"on":false,"transitiontime":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function berechneDelay (lampenGruppe,lampe){ // globale Delay-Einstellungen ĂŒbernehmen var delayMinTemp = delayMin; var delayMaxTemp = delayMax; // globale Delay-Einstellungen ĂŒberschreiben, wenn in der Szene ein eingener Delay definiert ist if (szenen[szene[lampenGruppe]].delayMin) delayMinTemp = szenen[szene[lampenGruppe]].delayMin; if (szenen[szene[lampenGruppe]].delayMax) delayMaxTemp = szenen[szene[lampenGruppe]].delayMax; nextDelay[lampenGruppe][lampe] = rand(delayMinTemp,delayMaxTemp); } function szeneTimer(lampenGruppe,lampe) { var delay = nextDelay[lampenGruppe][lampe] || 0; var aktuelleSzene = szene[lampenGruppe]; //log("gesetztes Delay: " + delay); if (timer[lampenGruppe][lampe]) clearTimeout(timer[lampenGruppe][lampe]); timer[lampenGruppe][lampe] = setTimeout(function() { timer[lampenGruppe][lampe] = null; berechneDelay(lampenGruppe,lampe); switch (aktuelleSzene) { case "strobo": stroboskop(lampenGruppe,lampe); break; default: szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]); break; } //log("Delay = " + nextDelay[lampenGruppe][lampe] + " # Lampe: " + lampen[lampenGruppe][lampe]); szeneTimer(lampenGruppe,lampe); // ruft den Timer nach Ablauf wieder auf },delay); } function check254(check) { if (check !== 0) if (!check) check = 254; check = parseInt(check); if (check > 254) check =254; if (check <= 0 ) check = 0; return check; } function setBri(lampenGruppe,aktiveSzene,bri) { if (szenen[aktiveSzene].bri) bri = szenen[aktiveSzene].bri; bri = check254(bri); setState(hueSzenenApapterPfad + lampenGruppe+".bri", bri); } function setSat(lampenGruppe,aktiveSzene,sat) { if (szenen[aktiveSzene].sat) sat = szenen[aktiveSzene].sat; sat = check254(sat); setState(hueSzenenApapterPfad + lampenGruppe+".sat", sat); } function szeneStart(lampenGruppe,aktiveSzene,bri,sat) { if (!szenen[aktiveSzene]) { // undefinierte Szenen abfangen log("# hue Szenen Script: undefinierte Szene wurde versucht aufzurufen: " + aktiveSzene,"error"); return; } szene[lampenGruppe] = aktiveSzene; setBri(lampenGruppe,aktiveSzene,bri); setSat(lampenGruppe,aktiveSzene,sat); if (!szeneAktiv[lampenGruppe]) { szeneAktiv[lampenGruppe] = true; for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen den timer starten nextDelay[lampenGruppe][i] = 0; szeneTimer(lampenGruppe,i); } } } function szeneStop(lampenGruppe) { // alle aktiven timer löschen for (var i = 0; i < lampen[lampenGruppe].length; i++) { clearTimeout(timer[lampenGruppe][i]); log("Timer: " + lampen[lampenGruppe][i] + " gestoppt"); } szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; } function lampenAus(lampenGruppe) { for (var i = 0; i < lampen[lampenGruppe].length; i++) { setState(lampen[lampenGruppe][i]+".command",'{"on":false}'); } } function setBriSat(com,wert,lampenGruppe) { if (wert != check254(wert)) { wert = check254(wert); setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //korrigiert bri/sat und ruft diese on() Funktion direkt wieder auf } else { //log("Lampengruppe: " + lampenGruppe + " # " + com + ": " + wert + " empfangen","warn"); if (szeneAktiv[lampenGruppe]) { // wenn die Szene in der Gruppe aktiv ist: for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen der Gruppe setState(lampen[lampenGruppe][i] + "." + com, wert); // die Helligkeit/Saturation direkt Ă€ndern //log(com + ": " + wert + " # " + lampen[lampenGruppe][i] + " gesetzt","warn"); } } } } function changeBriSat (com, wert, lampenGruppe) { com = com.replace("_inc", ""); var alterWert = getState(hueSzenenApapterPfad + lampenGruppe + "." + com).val; wert = parseInt(wert) + alterWert; setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //setzt bri/sat neu. Dies ruft die on() Funktion direkt wieder auf, diesmal mit bri/sat } // ##### Ăberwachte Datenpunkte ##### // Ănderung der Helligkeit (.bri) oder FarbsĂ€ttigung (.sat) wĂ€hrend der Laufzeit ĂŒber einen Datenpunkt var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat|bri)"); on({"id":reg , "change": "ne"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(bri|sat)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; setBriSat (com, wert, lampenGruppe); }); // Ănderung der Helligkeit oder FarbsĂ€ttignung als adaptiver Wert (.bri_inc, .sat_inc) var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat_inc|bri_inc)"); on({"id":reg , "change": "any"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(sat_inc|bri_inc)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; changeBriSat (com, wert, lampenGruppe); }); // Ănderung einer Szene wĂ€hrend der Laufzeit, z.B. ĂŒber VIS var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.szene"); on(reg , function (obj) { var str = obj.id.replace(/\.szene$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var neueSzene = obj.newState.val; log("Lampengruppe: " + lampenGruppe + " # Szene: " + neueSzene + " empfangen"); switch (neueSzene) { case "aus": szeneStop(lampenGruppe); lampenAus(lampenGruppe); log(lampenGruppe + " Szene deaktiviert"); break; case "stop": szeneStop(lampenGruppe); log(lampenGruppe + " Szene angehalten"); break; default: if (szenen[neueSzene]) { // TODO: bri nur ermitteln, wenn in der Szene kein eigener bri festgelegt ist var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; bri = check254(bri); if (bri == 0) bri = 254; szeneStart(lampenGruppe,neueSzene,bri); setState(hueSzenenApapterPfad + lampenGruppe+".infoAktiveSzene", neueSzene); log(lampenGruppe + " Szene: " + neueSzene + " gestartet"); break; } log("### unbekannte Szene: " + neueSzene,"error"); break; } }); // ##### Scriptstart ##### dpAnlegen(); // je einen Datenpunkt pro Lampengruppe anlegen varsAnlegen(); // die fĂŒr das Script notwendigen Variablen erstellen // warte bis alle States und Objekte angelegt werden. // 500ms und dann starte main(); function main() { // ##### Scriptstart main() ##### restoreSzenen(); // aktiviert zuletzt eingestellte Szenen } setTimeout(main, 500);Habe mal die hue/ct Werte quick'n dirty skaliert.
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
quickÂŽn dirt kann man sagen du bist der Hammer. Es lĂ€uft wieder, zwar komischerweise etwas langsamer wie frĂŒher aber es geht wieder.
Vielen lieben Dank. Du hast ja damals den Harmony Adapter schon so gut zum Laufen g Hast auch ne Adresse wo man dir n Bier spendieren kann g
PS: Mir machts nur ehrlich gesagt n bisschen Bauchschmerzen, dass beim Broker so spĂ€testens alle halbe Jahr was rauskommt und wieder einige Sachen nicht abwĂ€rtskompatibel sind und einiges umgeĂ€ndert werden muĂ. WeiĂ da kannst du jetzt nichts dafĂŒr... Wollts nur mal konstruktiv erwĂ€hnt haben g Finds toll, dass sich der Broker so schnell weiter entwickelt aber ich fĂ€nde es noch schöner, wenn das irgendwie in Zukunft nicht mehr (so oft) vorkommen wĂŒrde das es nicht abwĂ€rtskompatibel ist. Vor allem jetzt war es nur ein Skript. Aber wild wirds halt, wenn dann Adapter ĂŒber den Tellerrand fallen. Gut bei den groĂen wo die Community Entwickler dahinter stecken ist das sicher nicht das Problem. MuĂ man "nur" die Skripte Ă€ndern. Aber wie schauts auf Dauer bei den kleinen Nischenadaptern aus...
-
@foxriver76 Bin grad am testen von der 2.0. Verstehe das Verhalten von den Szenen nicht ganz. Poste das mal beim Hue 2.0 Post.
-
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
quickÂŽn dirt kann man sagen du bist der Hammer. Es lĂ€uft wieder, zwar komischerweise etwas langsamer wie frĂŒher aber es geht wieder.
Vielen lieben Dank. Du hast ja damals den Harmony Adapter schon so gut zum Laufen g Hast auch ne Adresse wo man dir n Bier spendieren kann g
PS: Mir machts nur ehrlich gesagt n bisschen Bauchschmerzen, dass beim Broker so spĂ€testens alle halbe Jahr was rauskommt und wieder einige Sachen nicht abwĂ€rtskompatibel sind und einiges umgeĂ€ndert werden muĂ. WeiĂ da kannst du jetzt nichts dafĂŒr... Wollts nur mal konstruktiv erwĂ€hnt haben g Finds toll, dass sich der Broker so schnell weiter entwickelt aber ich fĂ€nde es noch schöner, wenn das irgendwie in Zukunft nicht mehr (so oft) vorkommen wĂŒrde das es nicht abwĂ€rtskompatibel ist. Vor allem jetzt war es nur ein Skript. Aber wild wirds halt, wenn dann Adapter ĂŒber den Tellerrand fallen. Gut bei den groĂen wo die Community Entwickler dahinter stecken ist das sicher nicht das Problem. MuĂ man "nur" die Skripte Ă€ndern. Aber wie schauts auf Dauer bei den kleinen Nischenadaptern aus...
@Stormbringer sagte in [SKRIPT] Philips hue dynamische Szenen - update:
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
quickÂŽn dirt kann man sagen du bist der Hammer. Es lĂ€uft wieder, zwar komischerweise etwas langsamer wie frĂŒher aber es geht wieder.
Ich denke die erhöhte TrĂ€gheit liegt daran, dass mit 1.2.X diese Queue durch Jens Maus implementiert wurde. mMn könnte diese wieder raus, da das Problem anderweitig gelöst wurde. Damals wurde fĂŒr jedes Licht und jede Gruppe eine Anfrage zum pollen benötigt, was zu vielen zeitgleichen Anfragen gefĂŒhrt hat. Jetzt wird nur noch mit 2 Anfragen gepollt, unabhĂ€ngig von der InstallationsgröĂe. Also evtl kommt die Queue wieder weg in einer Future Version.
Vielen lieben Dank. Du hast ja damals den Harmony Adapter schon so gut zum Laufen g Hast auch ne Adresse wo man dir n Bier spendieren kann g
Theoretisch https://www.paypal.com/paypalme/foxriver76, falls du PayPal hast. Nur bitte ohne Alkohol

PS: Mir machts nur ehrlich gesagt n bisschen Bauchschmerzen, dass beim Broker so spĂ€testens alle halbe Jahr was rauskommt und wieder einige Sachen nicht abwĂ€rtskompatibel sind und einiges umgeĂ€ndert werden muĂ. WeiĂ da kannst du jetzt nichts dafĂŒr... Wollts nur mal konstruktiv erwĂ€hnt haben g Finds toll, dass sich der Broker so schnell weiter entwickelt aber ich fĂ€nde es noch schöner, wenn das irgendwie in Zukunft nicht mehr (so oft) vorkommen wĂŒrde das es nicht abwĂ€rtskompatibel ist. Vor allem jetzt war es nur ein Skript. Aber wild wirds halt, wenn dann Adapter ĂŒber den Tellerrand fallen. Gut bei den groĂen wo die Community Entwickler dahinter stecken ist das sicher nicht das Problem. MuĂ man "nur" die Skripte Ă€ndern. Aber wie schauts auf Dauer bei den kleinen Nischenadaptern aus...
Die Ănderung an den Werten hat BF schon irgendwann 2018 gemacht, nur wurde meist die alte v0.6.9 genutzt, da alles neuere ja 1-2 Baustellen hatte. Das mit der KompatibilitĂ€t ist durchaus eine komplexere Sache, da es viele Einflussfaktoren gibt wie nodejs Version, Ănderungen auf Seite des GerĂ€teherstellers oder wie in dem Fall, dass Werte ĂŒber Adapter hinweg einheitlich skaliert sein sollen .. allerdings sind Ingo und Co schon hinterher, dass der User erst mal keine Breaking Changes bekommt. Auch in der v2 vom Hue Adapter in dem ich die Struktur gebrochen habe, gibts die Möglichkeit die alte Objekstruktur zu halten. Sollte sich die erste Ziffer der Versionsnummer nicht erhöhen, sollten normalerweise keine Breaking Changes vom Entwickler gemacht worden sein. Kann man viel drĂŒber schreiben -- jedenfalls versuchen wir solche Geschichten in Zukunft so gering wie möglich zu halten.
-
@Stormbringer sagte in [SKRIPT] Philips hue dynamische Szenen - update:
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
quickÂŽn dirt kann man sagen du bist der Hammer. Es lĂ€uft wieder, zwar komischerweise etwas langsamer wie frĂŒher aber es geht wieder.
Ich denke die erhöhte TrĂ€gheit liegt daran, dass mit 1.2.X diese Queue durch Jens Maus implementiert wurde. mMn könnte diese wieder raus, da das Problem anderweitig gelöst wurde. Damals wurde fĂŒr jedes Licht und jede Gruppe eine Anfrage zum pollen benötigt, was zu vielen zeitgleichen Anfragen gefĂŒhrt hat. Jetzt wird nur noch mit 2 Anfragen gepollt, unabhĂ€ngig von der InstallationsgröĂe. Also evtl kommt die Queue wieder weg in einer Future Version.
Vielen lieben Dank. Du hast ja damals den Harmony Adapter schon so gut zum Laufen g Hast auch ne Adresse wo man dir n Bier spendieren kann g
Theoretisch https://www.paypal.com/paypalme/foxriver76, falls du PayPal hast. Nur bitte ohne Alkohol

PS: Mir machts nur ehrlich gesagt n bisschen Bauchschmerzen, dass beim Broker so spĂ€testens alle halbe Jahr was rauskommt und wieder einige Sachen nicht abwĂ€rtskompatibel sind und einiges umgeĂ€ndert werden muĂ. WeiĂ da kannst du jetzt nichts dafĂŒr... Wollts nur mal konstruktiv erwĂ€hnt haben g Finds toll, dass sich der Broker so schnell weiter entwickelt aber ich fĂ€nde es noch schöner, wenn das irgendwie in Zukunft nicht mehr (so oft) vorkommen wĂŒrde das es nicht abwĂ€rtskompatibel ist. Vor allem jetzt war es nur ein Skript. Aber wild wirds halt, wenn dann Adapter ĂŒber den Tellerrand fallen. Gut bei den groĂen wo die Community Entwickler dahinter stecken ist das sicher nicht das Problem. MuĂ man "nur" die Skripte Ă€ndern. Aber wie schauts auf Dauer bei den kleinen Nischenadaptern aus...
Die Ănderung an den Werten hat BF schon irgendwann 2018 gemacht, nur wurde meist die alte v0.6.9 genutzt, da alles neuere ja 1-2 Baustellen hatte. Das mit der KompatibilitĂ€t ist durchaus eine komplexere Sache, da es viele Einflussfaktoren gibt wie nodejs Version, Ănderungen auf Seite des GerĂ€teherstellers oder wie in dem Fall, dass Werte ĂŒber Adapter hinweg einheitlich skaliert sein sollen .. allerdings sind Ingo und Co schon hinterher, dass der User erst mal keine Breaking Changes bekommt. Auch in der v2 vom Hue Adapter in dem ich die Struktur gebrochen habe, gibts die Möglichkeit die alte Objekstruktur zu halten. Sollte sich die erste Ziffer der Versionsnummer nicht erhöhen, sollten normalerweise keine Breaking Changes vom Entwickler gemacht worden sein. Kann man viel drĂŒber schreiben -- jedenfalls versuchen wir solche Geschichten in Zukunft so gering wie möglich zu halten.
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
Klar, hab dir eins ohne Alkohol ausgegeben. Wennst aus Bayern kommst können wir auch live gern eins trinken ;o)
Ok dann bin ich ja beruhigt, dass ihr das am Schirm habt. Wenn man das TrĂ€ge wieder rausnehmen kann und es dir nichts ausmacht ist es natĂŒrlich gut g
Wegen dem Skript.... Da habe ich mich leider zu frĂŒh gefreut. Anscheinend funktioniert bisher nur kamin (das war natĂŒrlich genau die Testszene)
Wald hat alle möglichen Orangetöne...
Love ist mehr Regenbogenfarbig...
Blau ist grĂŒnlich bis gelbUnd ja die Farben sind nĂŒchtern betrachtet ;D
-
@foxriver76 sagte in [SKRIPT] Philips hue dynamische Szenen - update:
Klar, hab dir eins ohne Alkohol ausgegeben. Wennst aus Bayern kommst können wir auch live gern eins trinken ;o)
Ok dann bin ich ja beruhigt, dass ihr das am Schirm habt. Wenn man das TrĂ€ge wieder rausnehmen kann und es dir nichts ausmacht ist es natĂŒrlich gut g
Wegen dem Skript.... Da habe ich mich leider zu frĂŒh gefreut. Anscheinend funktioniert bisher nur kamin (das war natĂŒrlich genau die Testszene)
Wald hat alle möglichen Orangetöne...
Love ist mehr Regenbogenfarbig...
Blau ist grĂŒnlich bis gelbUnd ja die Farben sind nĂŒchtern betrachtet ;D
@Stormbringer vielen Dank. Bayern passt schon mal. ;-)
Ich schaue mir die Umwandlung nochmal an evtl habe ich da was falsch gemacht und es klappt bei dem einen nur per Zufall. :D
-
@Stormbringer vielen Dank. Bayern passt schon mal. ;-)
Ich schaue mir die Umwandlung nochmal an evtl habe ich da was falsch gemacht und es klappt bei dem einen nur per Zufall. :D
@foxriver76 Ok, dankeschön
-
@foxriver76 Ok, dankeschön
@Stormbringer Lol, ja hatte in allen auĂer 1 Szene aus Versehen * 100 statt * 360 genommen.
// hue Szenzen - Script fĂŒr ioBroker // V 0.3.1 // // es empfiehlt sich den hue-Adapter-Loglevel auf "warn" zu stellen (viele FarbĂ€nderungen) // // Benutzung ĂŒber Vis, bzw. Datenpunkte // ------------------------------------ // // die Szenen können ĂŒber Datenpunkte, z.B. ĂŒber Vis eingeschaltet und gesteuert werden. // // javascript.0.hue.szene.arbeitszimmer.szene = "love" -> schaltet die Szene "love" im Arbeitszimmer ein // javascript.0.hue.szene.arbeitszimmer.szene = "aus" -> schaltet die aktive Szene im Arbeitszimmer aus, die Lampen gehen aus // javascript.0.hue.szene.arbeitszimmer.szene = "stop" -> stoppt die Szene, die Lampen der Gruppe "arbeitszimmer" leuchten weiter // // javascript.0.hue.szene.arbeitszimmer.bri_inc = -16 -> reduziert de Helligkeit der Szene um 16 Punkte // // javascript.0.hue.szene.arbeitszimmer.bri = 200 -> Ă€ndert die Helligkeit der Szene direkt auf den Wert 200 // javascript.0.hue.szene.arbeitszimmer.sat = 200 -> Ă€ndert die SĂ€ttigung der Szene direkt auf den Wert 200 // // // Benutzung ĂŒber Javascript (Funktionen) // -------------------------------------- // // szeneStart(lampenGruppe,szene,bri); // bri ist optional // // Beispiel: // // szeneStart("wohnzimmer","sonne"); // startet in der Lampengruppe "wohnzimmer" die Szene "sonne" // // // szeneStop(lampenGruppe); // // // lampenAus(lampenGruppe); // // // // // // // // // todo // ---- // // Rotalarm Effekt // // prĂŒfen: // ------- // // // erledigt: // --------- // bri optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Einschaltzeit beim ersten Einschalten // sat optional ĂŒbergeben (zur Laufzeit verĂ€nderbar) // Ănderungen sat, bri per on() ĂŒberwachen und Lampen in aktiver Gruppe sofort anpassen // neue DP Strukutur () // // // ------------ ANFANG der individuellen Konfiguration ------------ // die eigenen Lampen in Gruppen sortiert (die FarbverlĂ€ufe und Effekte werden nach Gruppen aktiviert) var lampen ={ "wohnzimmer": // Lampengruppe [ 'hue.0.Stehlampe'/*Stehlampe*/, 'hue.0.Vitrine'/*Vitrine*/ ], "schlafzimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.rechts", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.links", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.mitte", "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.rechts" ], "arbeitszimmer": // Lampengruppe [ "hue.0.Hue_2_AZ.arbeitszimmer.schreibtisch.ls", "hue.0.Hue_2_AZ.arbeitszimmer.vorhang", "hue.0.Hue_2_AZ.arbeitszimmer.regal.li.re" ] }; var hueSzenenApapterPfad = "hue.szene."; // wo sollen die Datenpunkte in den ioBroker Objekten angelegt werden // je Lampengruppe werden die Datenpunkte: // .szene -> Ănderung der Szene per Datenpunkt, z.B. ĂŒber VIS oder im Script per szeneStart(lampenGruppe,szene,bri); // .bri -> Ănderung der Helligkeit per Datenpunkt (0-254) // .sat -> Ănderung der FarbsĂ€ttigung per Datenpunkt ())0-254) // .bri_inc -> Erhöhung/Verminderung der Helligkeit per Datenpunkt (positiver Wert = Heller, negativer Wert = dunkler) // .sat_inc -> Erhöhung/Verminderung der SĂ€ttigung per Datenpunkt (positiver Wert = mehr Farbe, negativer Wert = blasser) // angelegt // z.B. unter: javascript.0.hue.szene.arbeitszimmer.szene (Javascfript Instanz 0, Pfad = "hue.szene.") // globaler Parameter: ZufĂ€llige Zeit zwischen den Wechsel zwischen zwei Farben, je Lampe, in der aktivierten Szene in ms // (wenn keine individuelle Zeit in der Szene definiert ist) var delayMin = 1000; // minimale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln var delayMax = 3000; // maximale Zeit in ms einer Lampe, um in die nĂ€chste Farbe zu wechseln // ------------ ENDE der individuellen Konfiguration ------------ // ------------------------------------------------------------------------- // Script: Logik & Szenen - ab hier muss in der Regel nichts geĂ€ndert werden // ------------------------------------------------------------------------- var szenen = { "beispiel": { "description": "Beispielszene", // optional: Beschreibung der Szene "delayMin": 2000, // optional (ohne werden die globalen Einstellungen verwendet) "delayMax": 9000, // optional (ohne werden die globalen Einstellungen verwendet) "hueMin": 0, // niedrigste Farbe im Verlauf "hueMax": Math.round(50000 / 65535 * 360) // höchste Farbe im Verlauf }, "kamin": { "description": "roter Farbverlauf", "hueMin": 0, "hueMax": Math.round(10000 / 65535 * 360) }, "wald": { "description": "grĂŒner Farbverlauf", "hueMin": Math.round(20000 / 65535 * 360), "hueMax": Math.round(27000 / 65535 * 360) }, "sonne": { "description": "gelb/oranger Farbverlauf", "hueMin": Math.round(10000 / 65535 * 360), "hueMax": Math.round(17000 / 65535 * 360) }, "blau": { "description": "Energie, blauer Farbverlauf", "hueMin": Math.round(44000 / 65535 * 360), "hueMax": Math.round(48000 / 65535 * 360) }, "strobo": { "description": "Stroboskop", "ct": 6500, "delayMin": 500, "delayMax": 800 }, "feuer": { "description": "pulsierende Farben", "delayMin": 200, "delayMax": 600, "hueMin": 0, "hueMax": Math.round(17000 / 65535 * 360) }, "regenbogen": { "description": "das gesamte Farbspektrum", "delayMin": 1000, "delayMax": 8000, "hueMin": 0, "hueMax": 360 }, "love": { "description": "langsam wechselnder Farbverlauf im lila/violetten Bereich, bis zu den Endpunkten blau und rot", "delayMin": 5000, "delayMax": 8000, "hueMin": Math.round(46920 / 65535 * 360), "hueMax": 360 } }; // ##### Script Variablen ##### var timer = {}; var nextDelay = {}; var szeneAktiv = []; var szene = []; // ##### Script Funktionen ##### function rand(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function dpAnlegen() { for (var lampenGruppe in lampen) { createState(hueSzenenApapterPfad + lampenGruppe + ".szene","aus"); createState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene","keine"); createState(hueSzenenApapterPfad + lampenGruppe + ".bri",254); createState(hueSzenenApapterPfad + lampenGruppe + ".bri_inc",0); createState(hueSzenenApapterPfad + lampenGruppe + ".sat",254); createState(hueSzenenApapterPfad + lampenGruppe + ".sat_inc",0); log(hueSzenenApapterPfad + lampenGruppe + " wurde angelegt","info"); } } function restoreSzenen() { for (var lampenGruppe in lampen) { var aktiveSzene = getState(hueSzenenApapterPfad + lampenGruppe + ".szene").val; var bri = getState(hueSzenenApapterPfad + lampenGruppe + ".bri").val; if (aktiveSzene != "aus") { log("im der Gruppe: " + lampenGruppe + " wurde die Szene: " + aktiveSzene + " wieder aktiviert."); setState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene",aktiveSzene); szeneStart(lampenGruppe,aktiveSzene,bri); } } } function varsAnlegen() { // Script-Variablen fĂŒr jede Lampengruppe anlagen for (var lampenGruppe in lampen) { timer[lampenGruppe] = []; nextDelay[lampenGruppe] = []; szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; // Script-Variablen fĂŒr jede Lampe in jeder Lampengruppe anlegen for (var i = 0; i < lampen[lampenGruppe].length; i++) { // timer und die nĂ€chste Delayzeit fĂŒr jede Lampe zurĂŒckstellen timer[lampenGruppe][i] = null; nextDelay[lampenGruppe][i] = 0; } } } function szenenwechsel (lampenGruppe,lampe,delay) { delay = Math.floor(delay / 100); // der zufĂ€llige Wert fĂŒr die nĂ€chste Lichtfarbe wird auch als transitiontime verwendet (dazu wird das delay durch 100 geteilt) //log("aktive Szene: hueMin: " + szenen[szene[lampenGruppe]]["hueMin"] + " hueMax: " + szenen[szene[lampenGruppe]]["hueMax"]); var hue = rand(szenen[szene[lampenGruppe]].hueMin,szenen[szene[lampenGruppe]].hueMax); var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; var sat = getState(hueSzenenApapterPfad + lampenGruppe+".sat").val; var command = '{"on":true,"hue":' + hue + ',"sat":' + sat + ',"bri":' + bri + ',"transitiontime":' + delay + ',"colormode":"hs"}'; //log ("Lampe: " + lampen[lampenGruppe][lampe] + " # command: " + command); if (bri == 0) command = '{"on":false,"bri":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function stroboskop(lampenGruppe,lampe) { var command = '{"on":true,"ct":153,"bri":254,"transitiontime":0,"colormode":"ct"}'; setState(lampen[lampenGruppe][lampe] + ".command", command); command = '{"on":false,"transitiontime":0}'; setState(lampen[lampenGruppe][lampe] + ".command", command); } function berechneDelay (lampenGruppe,lampe){ // globale Delay-Einstellungen ĂŒbernehmen var delayMinTemp = delayMin; var delayMaxTemp = delayMax; // globale Delay-Einstellungen ĂŒberschreiben, wenn in der Szene ein eingener Delay definiert ist if (szenen[szene[lampenGruppe]].delayMin) delayMinTemp = szenen[szene[lampenGruppe]].delayMin; if (szenen[szene[lampenGruppe]].delayMax) delayMaxTemp = szenen[szene[lampenGruppe]].delayMax; nextDelay[lampenGruppe][lampe] = rand(delayMinTemp,delayMaxTemp); } function szeneTimer(lampenGruppe,lampe) { var delay = nextDelay[lampenGruppe][lampe] || 0; var aktuelleSzene = szene[lampenGruppe]; //log("gesetztes Delay: " + delay); if (timer[lampenGruppe][lampe]) clearTimeout(timer[lampenGruppe][lampe]); timer[lampenGruppe][lampe] = setTimeout(function() { timer[lampenGruppe][lampe] = null; berechneDelay(lampenGruppe,lampe); switch (aktuelleSzene) { case "strobo": stroboskop(lampenGruppe,lampe); break; default: szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]); break; } //log("Delay = " + nextDelay[lampenGruppe][lampe] + " # Lampe: " + lampen[lampenGruppe][lampe]); szeneTimer(lampenGruppe,lampe); // ruft den Timer nach Ablauf wieder auf },delay); } function check254(check) { if (check !== 0) if (!check) check = 254; check = parseInt(check); if (check > 254) check =254; if (check <= 0 ) check = 0; return check; } function setBri(lampenGruppe,aktiveSzene,bri) { if (szenen[aktiveSzene].bri) bri = szenen[aktiveSzene].bri; bri = check254(bri); setState(hueSzenenApapterPfad + lampenGruppe+".bri", bri); } function setSat(lampenGruppe,aktiveSzene,sat) { if (szenen[aktiveSzene].sat) sat = szenen[aktiveSzene].sat; sat = check254(sat); setState(hueSzenenApapterPfad + lampenGruppe+".sat", sat); } function szeneStart(lampenGruppe,aktiveSzene,bri,sat) { if (!szenen[aktiveSzene]) { // undefinierte Szenen abfangen log("# hue Szenen Script: undefinierte Szene wurde versucht aufzurufen: " + aktiveSzene,"error"); return; } szene[lampenGruppe] = aktiveSzene; setBri(lampenGruppe,aktiveSzene,bri); setSat(lampenGruppe,aktiveSzene,sat); if (!szeneAktiv[lampenGruppe]) { szeneAktiv[lampenGruppe] = true; for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen den timer starten nextDelay[lampenGruppe][i] = 0; szeneTimer(lampenGruppe,i); } } } function szeneStop(lampenGruppe) { // alle aktiven timer löschen for (var i = 0; i < lampen[lampenGruppe].length; i++) { clearTimeout(timer[lampenGruppe][i]); log("Timer: " + lampen[lampenGruppe][i] + " gestoppt"); } szeneAktiv[lampenGruppe] = false; szene[lampenGruppe] = null; } function lampenAus(lampenGruppe) { for (var i = 0; i < lampen[lampenGruppe].length; i++) { setState(lampen[lampenGruppe][i]+".command",'{"on":false}'); } } function setBriSat(com,wert,lampenGruppe) { if (wert != check254(wert)) { wert = check254(wert); setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //korrigiert bri/sat und ruft diese on() Funktion direkt wieder auf } else { //log("Lampengruppe: " + lampenGruppe + " # " + com + ": " + wert + " empfangen","warn"); if (szeneAktiv[lampenGruppe]) { // wenn die Szene in der Gruppe aktiv ist: for (var i = 0; i < lampen[lampenGruppe].length; i++) { // fĂŒr alle Lampen der Gruppe setState(lampen[lampenGruppe][i] + "." + com, wert); // die Helligkeit/Saturation direkt Ă€ndern //log(com + ": " + wert + " # " + lampen[lampenGruppe][i] + " gesetzt","warn"); } } } } function changeBriSat (com, wert, lampenGruppe) { com = com.replace("_inc", ""); var alterWert = getState(hueSzenenApapterPfad + lampenGruppe + "." + com).val; wert = parseInt(wert) + alterWert; setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert); //setzt bri/sat neu. Dies ruft die on() Funktion direkt wieder auf, diesmal mit bri/sat } // ##### Ăberwachte Datenpunkte ##### // Ănderung der Helligkeit (.bri) oder FarbsĂ€ttigung (.sat) wĂ€hrend der Laufzeit ĂŒber einen Datenpunkt var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat|bri)"); on({"id":reg , "change": "ne"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(bri|sat)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; setBriSat (com, wert, lampenGruppe); }); // Ănderung der Helligkeit oder FarbsĂ€ttignung als adaptiver Wert (.bri_inc, .sat_inc) var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat_inc|bri_inc)"); on({"id":reg , "change": "any"}, function (obj) { var com = obj.id.split('.').pop(); var str = obj.id.replace(/\.(sat_inc|bri_inc)$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var wert = obj.newState.val; changeBriSat (com, wert, lampenGruppe); }); // Ănderung einer Szene wĂ€hrend der Laufzeit, z.B. ĂŒber VIS var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.szene"); on(reg , function (obj) { var str = obj.id.replace(/\.szene$/, ""); var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.')); var lampenGruppe = str.replace(reg2, ""); var neueSzene = obj.newState.val; log("Lampengruppe: " + lampenGruppe + " # Szene: " + neueSzene + " empfangen"); switch (neueSzene) { case "aus": szeneStop(lampenGruppe); lampenAus(lampenGruppe); log(lampenGruppe + " Szene deaktiviert"); break; case "stop": szeneStop(lampenGruppe); log(lampenGruppe + " Szene angehalten"); break; default: if (szenen[neueSzene]) { // TODO: bri nur ermitteln, wenn in der Szene kein eigener bri festgelegt ist var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val; bri = check254(bri); if (bri == 0) bri = 254; szeneStart(lampenGruppe,neueSzene,bri); setState(hueSzenenApapterPfad + lampenGruppe+".infoAktiveSzene", neueSzene); log(lampenGruppe + " Szene: " + neueSzene + " gestartet"); break; } log("### unbekannte Szene: " + neueSzene,"error"); break; } }); // ##### Scriptstart ##### dpAnlegen(); // je einen Datenpunkt pro Lampengruppe anlegen varsAnlegen(); // die fĂŒr das Script notwendigen Variablen erstellen // warte bis alle States und Objekte angelegt werden. // 500ms und dann starte main(); function main() { // ##### Scriptstart main() ##### restoreSzenen(); // aktiviert zuletzt eingestellte Szenen } setTimeout(main, 500); -
@Stormbringer vielen Dank. Bayern passt schon mal. ;-)
Ich schaue mir die Umwandlung nochmal an evtl habe ich da was falsch gemacht und es klappt bei dem einen nur per Zufall. :D
@foxriver76 Top danke, funktioniert :o)
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