NEWS
Zigbee - Licht und Lichtwecker...
-
Hallo zusammen,
ich versuche seit einiger Zeit verzweifelt meine Lichtsteuerung in den Griff zu bekommen. Irgendwie scheine ich etwas grundlegendes falsch zu machen. Daher hier meine Probleme und Fragen. Ich nutze den Sonoff Stick mit dem Zigbee Adapter.
Aktuelle Situation
Ich habe einige Zigbee FoH Schalter mit denen ich weiße und farbige Zigbee Birnen von Philips und Tint mit Javascript schalte. D.h. wenn Schalter gedrückt wird, dann schalte das Licht an oder setze eine andere Lichtfarbe. Zusätzlich habe ich einen Lichtwecker, der über 10 Minuten die Zigbee Birnen langsam heller werden lassen. Schön wäre es, wenn der Übergang für das An- bzw. Ausschalten, dem Farbwechsel oder dem Wechsel von Farbe zu Weiß etwa 1 Sekunde braucht.
Technische Umsetzung
Beim Ein- bzw. Ausschalten prüfe ich am Anfang
transition_time
und setze es auf1
falls notwendig.Einschalten
Falls es sich um eine farbige Birne handelt, setze ich bei weißem Licht als erstescolortemp
sonstcolor
mit der übergebenen Lichttemperatur bzw. -farbe. Mit dem Setzen vonbrightness
auf100
, schalte ich die Birne an.Ausschalten
Um die Birne auszuschalten, setze ichbrightness
einfach auf0
.Lichtwecker
Für den Lichtwecker setze ich zuersttransition_time
, danncolortemp
und zuletztbrightness
.Probleme
Beim Einschalten kommt es ab und zu vor, dass das Licht nicht von farbig zu weiß bzw. umgekehrt wechselt. Auch wird beim Einschalten die
transition_time
nicht berücksichtigt, d.h. es springt an.
Da ich die Vermutung hatte, bei den zwei oder drei "Aktionen" persetState
eins verschluckt wird, habe ich versucht mitpayload
die Werte zu setzen. Beibrightness
handelt es sich auf einmal um einen absoluten Wert und die Werte im Objektbaum werden nicht aktualisiert. Dies ist gerade beim Lichtwecker unschön, da ich in Abhängigkeit vom Licht andere Aktionen durchführen möchte, hier diese nicht aktualisiert wurden.Hat jemand die ähnliche Erfahrungen? Wie habt ihr sie gelöst? Wie schaltet Ihr Euer Licht?
-
@macpo sagte in Zigbee - Licht und Lichtwecker...:
mit Javascript schalte
ohne dieses unbekannte Skript kann man leider nur schlecht helfen
-
@djmarc75 Ich hatte mir es noch überlegt...
const transitionLicht = 1; on({id: "javascript.0.loxone.lichtSchreibtisch", change: "ne", ack: false}, function (obj){ licht(String(obj.id), 'zigbee.0.00158d0001234567', obj.state.val); }); /** * Setzt das Licht und setze AKN für das * @param {string} javascriptObjekt Objekt Id in ioBroker für das Aknowledge * @param {string} zigbeeObjekt Zigbee-Objekt mit dem Licht * @param {object} lichtWert Lichtwert */ function licht(javascriptObjekt, zigbeeObjekt, lichtWert) { //Setze die allgemeine Transitionszeit für Licht. var aktuelleTransitionszeit = getState(zigbeeObjekt + '.transition_time').val; if (aktuelleTransitionszeit != transitionLicht) { setState(zigbeeObjekt + '.transition_time', transitionLicht); } var istFarbe = String(Array.prototype.slice.apply($(zigbeeObjekt + ".color"))).length != 0; if (istFarbe) { lichtRgb(zigbeeObjekt, String(lichtWert)); } else { lichtSw(zigbeeObjekt, String(lichtWert)); } setState(javascriptObjekt, lichtWert, true); } /** * Setzt das Licht für eine weiße Birne * @param {string} zigbeeObjekt ZigbeeObjektId * @param {string} wert Lichtwert */ function lichtSw(zigbeeObjekt, wert) { var loxStr = String(wert); if (loxStr.length == 0) { logs('debug', 'Übergebender Wert leer - Abbruch'); return; } //Loxone Lichtlevel 0% bis 100% var lichtLevel = parseInt(loxStr) || 0; setState(zigbeeObjekt + '.brightness', lichtLevel); } /** * Setzt das Licht für eine farbige Birne * @param {string} zigbeeObjekt ZigbeeObjektId * @param {string} wert Lichtwert (bei 2xxxxxxxx weiß, sonst RGB) */ function lichtRgb(zigbeeObjekt, wert) { logs('trace', 'Start'); var loxStr = String(wert); var loxStrLen = loxStr.length; if (loxStrLen == 0) { logs('debug', 'Übergebender Wert leer - Abbruch'); return; } else { logs('debug', 'Übergebender Wert: ' + loxStr); } if (loxStr.substring(0, 1) == '2' && loxStrLen == 9) { //Weiss var lichtLevel = parseInt(loxStr.substring(2, 5)) || 0; var lichtTemp = parseInt(loxStr.substring(5, 9)) || 0; if (lichtLevel == 0) { logs('debug', 'LichtRgb - Weiss: ' + zigbeeObjekt + ' ausschalten'); setState(zigbeeObjekt + '.brightness', lichtLevel); } else { //Loxone Lichttemperatur: 6500 Kelvin kalt bis 2700 Kelvin warm //Zigbee Lichttemperatur: 150 bis 500 //Umrechnung: 665 - ((Kelvin / 10) - 120) -> 785 - (Kelvin / 10) lichtTemp = Math.round(785 - (lichtTemp / 10)); setState(zigbeeObjekt + '.colortemp', lichtTemp); setState(zigbeeObjekt + '.brightness', lichtLevel); } } else { //RGB var colorRedParse = 0; var colorGreenParse = 0; var colorBlueParse = 0; if (loxStrLen <= 3) { colorRedParse = parseInt(loxStr.substring(0, 3)) || 0; } else if (loxStrLen <= 6) { colorRedParse = parseInt(loxStr.substring(loxStrLen - 3, loxStrLen)) || 0; colorGreenParse = parseInt(loxStr.substring(0, loxStrLen - 3)) || 0; } else if (loxStrLen <= 9) { colorRedParse = parseInt(loxStr.substring(loxStrLen - 3, loxStrLen)) || 0; colorGreenParse = parseInt(loxStr.substring(loxStrLen - 6, loxStrLen - 3)) || 0; colorBlueParse = parseInt(loxStr.substring(0, loxStrLen - 6)) || 0; } else { logs('error', 'LichtRgb - Rgb: ' + zigbeeObjekt + ': Unerwartet Länge übergebender Wert - Abbruch'); return; } // Loxone liefert Rot, Grün und Blau als 0 bis 100% var colorRed = Math.round(255 / 100 * colorRedParse); var colorGreen = Math.round(255 / 100 * colorGreenParse); var colorBlue = Math.round(255 / 100 * colorBlueParse); var level = Math.round(Math.max(colorRed, colorGreen, colorBlue)) / 2.55; var red = colorRed / 255; var green = colorGreen / 255; var blue = colorBlue / 255; red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92); green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92); blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92); logs('debug', 'red: ' + red + ' / green: ' + green + ' / blue: ' + blue + ' / level: ' + level); var X = red * 0.664511 + green * 0.154324 + blue * 0.162028; var Y = red * 0.283881 + green * 0.668433 + blue * 0.047685; var Z = red * 0.000088 + green * 0.072310 + blue * 0.986039; var divisor = colorRed + colorGreen + colorBlue; if (divisor == 0) { logs('debug', 'LichtRgb - Rgb: ' + zigbeeObjekt + ' ausschalten'); setState(zigbeeObjekt + '.brightness', 0); } else { var x = X / divisor; var y = Y / divisor; var zigbeeColor = '#' + ('0' + colorRed.toString(16)).slice(-2) + ('0' + colorGreen.toString(16)).slice(-2) + ('0' + colorBlue.toString(16)).slice(-2); setState(zigbeeObjekt + '.color', zigbeeColor); setState(zigbeeObjekt + '.brightness', level); } } }
-
Nun komme ich endlich dazu, ein paar Infos von meinem aktuellen Zwischenstand zu schreiben:
Wenn man die Eigenschaftsend_payload
nutzen möchte, muss man die speziellen Wertebereiche von den Zigbee-Objekte berücksichtigen. Die anderen Eigenschaften wiebrightness
haben neutrale Werte wie hier zum Beispiel in Prozent.
Es sollte nicht gleichzeitigbrightness
undstate
gesetzt werden, dass hat bei mir zu unerwarteten Verhalten geführt. Für das Ausschalten reicht es aus, wenn man die Helligkeit auf 0 setzt. Beim Einschalten oder ändern des Lichts kann man die Eigenschaftencolor
,colortemp
undbrightness
direkt nacheinander setzen, ohne dass es zu Problemen kommt.
Dennoch wird beim Ein-/Ausschalten die Schaltzeit nur je nach Model (auch vom gleichen Hersteller) berücksichtigt. Bei Änderungen des Lichts hingegen immer.
Allgemein werden andere Eigenschaften nicht implizit aktualisiert, so dass zum Beispielbrightness_move
mit -10 am Ende zu einem sehr schwachen Licht führt, aber die Eigenschaftbrightness
immer noch bei 100 steht.device_query
habe ich aktiviert. -
Hat jemand ähnliche Erfahrungen? Ich bin über jeden Tipp dankbar, wie z.B. beim Ein-/Ausschalten immer die
transition_time
berücksichtigt wird... -
@macpo die eigenschaften werden dirke von dem Gerät gepflegt.. und da verhalten sich die unterschieldichen Hersteller demäntsprechend..
aber die transition_time sollte immer mit brightess zusammen hängen.. ich nutze es nicht so wie du aber meine Bürolampe (ist eine HUE) macht immer was die soll..
ausser wenn du transition_time auf unplausble werte setzt >10 -
@arteck Aktuell verwende ich transition_time mit 3.600 (10min) für meinen Lichtwecker...
Ich werde nochmal andere Birnen testen.