NEWS
[Blockly] Sonnenaufgang mit Tradfri
-
Hier das versprochene Skript:
! ````
// Tradfri-Farbtemperatur in Abhängigkeit der Uhrzeit festlegen
! const MIN_TEMP = 0; // Minimale Farbtemperatur (kaltes Licht)
const MAX_TEMP = 100; // Maximale Farbtemperatur (warmes Licht)
// wieviele Stunden vor(-)/nach(+) sunrise soll der Übergang auf kalte Farbtemperatur starten/enden?
const sunriseStartOffset = hours2ms(0);
const sunriseEndOffset = hours2ms(2);
// wieviele Stunden vor(-)/nach(+) sunset soll der Übergang auf warme Farbtemperatur starten/enden?
const sunsetStartOffset = hours2ms(-2);
const sunsetEndOffset = hours2ms(0);
! let prevTemp;
! schedule("* * * * *", colorChange); // jede Minute neue Farbtemperatur berechnen
colorChange(); // außerdem beim Skriptstart
! function colorChange() {
// aktuelle Uhrzeiten berechnen, damit wir nicht vom Datum abhängig sind
const sunrise = getAstroDate("sunrise");
const sunriseStart = new Date(sunrise.getTime() + sunriseStartOffset).getTime();
const sunriseEnd = new Date(sunrise.getTime() + sunriseEndOffset).getTime();
const sunset = getAstroDate("sunset");
const sunsetStart = new Date(sunset.getTime() + sunsetStartOffset).getTime();
const sunsetEnd = new Date(sunset.getTime() + sunsetEndOffset).getTime();
const now = new Date().getTime();// neue Farbtemperatur berechnen let targetTemp; if (now < sunriseStart || now > sunsetEnd) { // warmes Licht in der Nacht targetTemp = MAX_TEMP; } else if (now >= sunriseStart && now <= sunriseEnd) { // sanfter Übergang auf kaltes Licht am Morgen targetTemp = interpolate(now, sunriseStart, sunriseEnd, MAX_TEMP, MIN_TEMP); } else if (now > sunriseEnd && now < sunsetStart) { // kaltes Licht am Tag targetTemp = MIN_TEMP; } else if (now >= sunsetStart && now <= sunsetEnd) { // sanfter Übergang auf warmes Licht am Abend targetTemp = interpolate(now, sunsetStart, sunsetEnd, MIN_TEMP, MAX_TEMP); }
! // und diese festlegen, wenn sich etwas geändert hat
if (targetTemp !== prevTemp) {
prevTemp = targetTemp;
setState("tradfri.0.G-195804.transitionDuration", 10);
setState("tradfri.0.G-195804.colorTemperature", targetTemp);
}
}
! // interpoliert linear zwischen zwei Punkten
function interpolate(x, x1, x2, y1, y2) {
return Math.round(y1 + (y2 - y1) / (x2 - x1) * (x - x1));
}
! function hours2ms(hours) {
return hours * 3600 * 1000;
}Ich hoffe mit den Kommentaren ist es halbwegs selbsterklären, selbst wenn es kein Blockly ist. Die Idee ist, dass in einem Zeitrahmen um den Sonnenaufgang die Farbtemperatur langsam auf kalt wechselt und in einem Zeitrahmen um Sonnenuntergang wieder auf warm. Die Intervalle konfigurierst du am Anfang.
-
Servus,
ich versuch mich auch schon sehr lange an einer guten Lösung um das Aufwach angenehmer zu machen.
Gibt es denn beim Tradfri die Möglichkeit die Farbe "weich" bzw. "fadend" zu wechseln, das er also in einer bestimmbaren Zeit von blau nach rot wechselt und nicht abrupt?
Für MiLight gab es bei FHEM die "Queue"
Dort sah es als HSV so aus:
set led HSV 240,100,0; set led HSV 240,20,80 600 q; set led HSV 0,20,80 120 q; set led HSV 0,80,100 120 q; set led HSV 55,40,100 300 q; set led HSV 55,0,100 300 q
Oder als Beispiel folgende RGB Werte:
0,0,0 26,3,94 70,12,244 151,12,244 244,12,140 244,12,66 244,120,12 244,229,12 237,244,176 255,255,255
Hier zu finden: https://forum.fhem.de/index.php/topic,4 … 98113.html
Mit dem Homematic RGB (HM-LC-RGBW-WM) sind leider keinerlei Farbverläufe möglich.
Den MiLight Adapter von ioBroker hab ich noch nicht ausprobiert.
Und die Ikea Lampen hab ich (noch) nicht.
Bin gespannt wie es weiter geht....
Gruß Peer
-
Gibt es denn beim Tradfri die Möglichkeit die Farbe "weich" bzw. "fadend" zu wechseln `
Dafür ist eigentlich der Punkt "Transition Time".Ob das mit der Farbe auch geht wollte ich am Wochenende testen, bin aber nicht dazu gekommen.
Gruß
Rainer
-
Servus Rainer,
Das klingt schon mal vielversprechend.
Dann bleibt noch die Frage ob der HSV Farbkreis abgefahren wird oder der Wechsle direkt also "durch" den Farbkreis geht.
Außenrum Abfahren wäre dann ziemlich doof.
Gruß Peer
-
Dafür ist eigentlich der Punkt "Transition Time".
Ob das mit der Farbe auch geht wollte ich am Wochenende testen, bin aber nicht dazu gekommen. `
Na, ich hoffe doch. Mit Helligkeit und Farbtemperatur (Weißspektrum) gehts. Bei einer älteren Version hab ich dafür die X/Y-Farbe missbraucht, auf die für RGB auch zurück gegriffen wird.Dann bleibt noch die Frage ob der HSV Farbkreis abgefahren wird oder der Wechsle direkt also "durch" den Farbkreis geht. `
Wenn du H, S, V einzeln setzt, bin ich mir nicht sicher, wie das Gateway es handhabt. Du kannst aber H/S/V in RGB umrechnen, dann müsste alles gleichzeitig interpoliert werden.Alternativ lassen sich mit https://github.com/AlCalzone/iobroker.tradfri/#sending-custom-coap-packets mehrere Eigenschaften gleichzeitig setzen, da müsste ich daheim nochmal nachschauen wie das payload auszusehen hat.
-
Mit Helligkeit und Farbtemperatur (Weißspektrum) gehts. `
Bestätigt! Aber eben nur dasWenn du H, S, V einzeln setzt, bin ich mir nicht sicher, wie das Gateway es handhabt. `
Bescheuert! es blinkt und blitzt und ändert tlw. abrupt die Farben um sofort wieder zurückzuspringenIch dachte es sei eine gute Idee mit diesen vorhandenen Punkten zu arbeiten, aber das kommt nicht so gut bei der besseren Hälfte an.
Du meinst also mit einer längeren transition time (was ist da eigentlich das Maximum?) könnte ich sanft von FF0000 nach 0000FF wechseln?
Gruß
Rainer
-
Bescheuert! es blinkt und blitzt und ändert tlw. abrupt die Farben um sofort wieder zurückzuspringen `
Uggghhh. Ich schick dir heute Abend mal ein Code-Schnipsel. Damit bitte mal testen, ob der Übergang sanfter verläuft.Wenn das funktioniert, kann ich eine kleine Verbesserung einbauen.
Du meinst also mit einer längeren transition time (was ist da eigentlich das Maximum?) könnte ich sanft von FF0000 nach 0000FF wechseln? `
Sollte möglich sein. Ich hab nicht explizit getestet, wo das Limit liegt. Ab nem gewissen Punkt lässt es sich auch nicht wirklich feststellen wo das Ende ist. Rein theoretisch: Die maximalen Werte (u.a. bei Hue/Sat intern verwendet) scheinen 65279 zu sein (warum dieser Wert - k.A.). Das würde 6527,9 Sekunden oder 1,8h entsprechen.–-
EDIT: Kommando zurück… Hab gerade mal selbst getestet. Zwei Eigenschaften gleichzeitig lassen sich nicht animieren.
Ich sehe 2 Optionen:
1. Nur color animieren
2. Im Skript in einem Intervall meherer Werte selbst interpolieren. Dabei kleine Schritte benutzen, damit es nicht auffällt; nicht zu schnell, damit das Gateway nicht aussteigt; und transitionTime = 0!
-
Ich habe mal was probiert:
leider passiert (fast) nichts:
javascript.0 2018-01-31 16:25:30.626 info script.js.Sonnenuntergang: Die Farbe ist f5faf6% javascript.0 2018-01-31 16:25:30.625 info script.js.Sonnenuntergang: Die Helligkeit ist 100% javascript.0 2018-01-31 16:25:00.624 info script.js.Sonnenuntergang: Die Farbe ist f5faf6% javascript.0 2018-01-31 16:25:00.624 info script.js.Sonnenuntergang: Die Helligkeit ist 100% javascript.0 2018-01-31 16:24:30.624 info script.js.Sonnenuntergang: Die Farbe ist f5faf6% javascript.0 2018-01-31 16:24:30.623 info script.js.Sonnenuntergang: Die Helligkeit ist 100% javascript.0 2018-01-31 16:24:00.623 info script.js.Sonnenuntergang: Die Farbe ist f5faf6% javascript.0 2018-01-31 16:24:00.622 info script.js.Sonnenuntergang: Die Helligkeit ist 100% javascript.0 2018-01-31 16:23:30.621 info script.js.Sonnenuntergang: Die Farbe ist ffe0b5% javascript.0 2018-01-31 16:23:30.621 info script.js.Sonnenuntergang: Die Helligkeit ist 1%
nach dem ersten Umschalten bleibt es.
Habe jetzt erst dein EDIT gelesen -> siehe nächsten Post
Gruß
Rainer
-
Ich sehe 2 Optionen:
1. Nur color animieren
2. Im Skript in einem Intervall meherer Werte selbst interpolieren. Dabei kleine Schritte benutzen, damit es nicht auffällt; nicht zu schnell, damit das Gateway nicht aussteigt; und transitionTime = 0! `
Hier mein erster Versuch:
Und hier blitzt immer wieder der "Endzustand" zwischendrin auf.
Gruß
Rainer
-
Und hier blitzt immer wieder der "Endzustand" zwischendrin auf. `
Sieht erst mal logisch aus. Steuerst du eine Lampe oder Gruppen? Wenn ersteres, fürchte ich dass das Zurücksetzen der TransitionTime dir einen Strich durch die Rechnung macht. Probiers mal an einer virtuellen oder echten Gruppe. -
Im Moment ist es in beiden Fällen die Lampe (tradfri.0.L-65539)
Ich teste das jetzt mal bei dem Sonnenuntergang erst mit der G- und dann mit der VG-
Bis später
Rainer
-
Habe jetzt mit Lampe, Gruppe und virtueller Gruppe getestet:
Zur Sicherheit habe ich noch Verzögerungen eingebaut (ich hoffe das bewirkt nicht das Gegenteil des gewünschten)
Lampe:
Die color RGB geht auf -> ffbb52 und dabei bleibt es
die Helligkeit geht auf 100% und dabei bleibt es auch.
javascript.0 2018-01-31 17:38:30.054 info script.js.Sonnenuntergang: Die Farbe ist ffbb52% javascript.0 2018-01-31 17:38:30.053 info script.js.Sonnenuntergang: Die Helligkeit ist 100%
Gruppe:
es passiert gar nichts
virtuelle Gruppe:
ist identisch wie bei der Lampe
Gruß
Rainer
-
Das Skript macht so leider keinen Sinn.
Überlappende Übergänge gehen nicht, das Gateway kann immer nur einen Wert animieren. Und die Endwerte werden soweit ich mich richtig erinnere auch erst am Schluss zurück gemeldet, d.h. dein Log läuft ins Leere.
Hier mal was ich meinte mit "selbst animieren":
So geht ein "fast" flüssiger Übergang von dunkel+kalt auf hell+warm mit einer Weißspektrumlampe.
Für RGB musst du etwas mehr Logik zum Berechnen der Zwischenwerte spendieren als ("erhöhe um 1").
Edit: Holy shit, das Rumgeklicke bis so ein einfaches Skript zusammengebaut ist :shock:
-
Überlappende Übergänge gehen nicht, `
Sollte ja auch eigentlich ein Komplettpaket sein.Außerdem glaube ich mich zu erinnern, daß ich früher einmal so etwas unfreiwillig gemacht hatte.
Ich hatte damals noch geschrieben, dass das Gateway solange die Transition Time behält bis diese abgearbeitet ist.
Ich weiß leider nicht mehr ob ich die weiteren Befehle mit der Fernbedienung oder über ioBroker gemacht hatte.
Dein holy shit entspricht ja im allgemeinen dem was ich auch habe, nur dass du gerade mal 20 Sekunden generierst, ich gerne 30 bis 60 Minuten haben möchte.
Abgesehen davon habe ich den Vetdacht, dass sich die weißton lampen programmierfreundlicher verhalten als die rgb birnen.
Ich muss mir die rgb Birne wieder in mein Zimmer mit dem PC holen.
Gruß Rainer
-
Dein holy shit entspricht ja im allgemeinen dem was ich auch habe, nur dass du gerade mal 20 Sekunden generierst, ich gerne 30 bis 60 Minuten haben möchte. `
Dann musst du eigentlich "nur" das Intervall und die Inkremente je State anpassen. Ich denke den Code könnte ich in den Adapter integrieren, damit du nur noch sowas machen musst:// FUNKTIONIERT NOCH NICHT! sendTo("tradfri.0", "transition", { rgb: "#abcdef", brightness: 100, transitionTime: 3600000 });
-
damit du nur noch sowas machen musst: `
Das wäre genau das was ich hoffte ohne sendto hinzubekommen.Ich hatte jetzt meinen http://forum.iobroker.net/download/file.php?id=21408&mode=view bereits bei dem Screenshot "verlangsamt" indem ich bei HUE 0.1 eingetragen und dafür die Zyklen auf 99 erhöht hatte.
Heute morgen lief es dann auch "relativ" brauchbar, im unteren Bereich sah es fast gut aus, gegen Ende der Rampe "blitzte" aber wieder immer häufiger eine andere Farbe (Weißblau = Tageslicht) kurz auf.
Außerdem erreichte die Helligkeit keine 99% sondern lag lt. App nur bei 66.
Ich muss da nochmal intensiver ran.
Gruß
Rainer
-
Heute morgen lief es dann auch "relativ" brauchbar, im unteren Bereich sah es fast gut aus, gegen Ende der Rampe "blitzte" aber wieder immer häufiger eine andere Farbe (Weißblau = Tageslicht) kurz auf. `
Hast du noch was anderes laufen, was hier querschießen könnte?Welche Skala willst du abfahren? Kann es sein, dass du dich außerhalb des unterstützen Gamuts bewegst? Ich glaube Tradfri ist in etwa Gamut B: http://www.developers.meethue.com/sites … amut_0.png
Oder willst du nur kaltweiß bis warmweiß? Dann müssten wir mal testen, ob die RGBs jetzt auch colorTemperature unterstützen.
Bin mir auch gerade nicht sicher, ob 0.1er-Schritte gehen. Im Prinzip müsste es tun, da Tradfri intern eine deutlich feinere Skala hat, aber das ganze Runden könnte Probleme machen.
-
Hast du noch was anderes laufen, was hier querschießen könnte? `
Ich hoffe nicht, hatte zwar zuerst auf einer Testinstallation das Skript drauf, wegen Problemen dort aber deaktiviert (gestern nochmal überprüft) und ist meines Wissens nur noch einmal aktiv.Früher (insbesondere bei den ersten schnellen Tests) blitzte es noch viel häufiger.
Welche Skala willst du abfahren? Kann es sein, dass du dich außerhalb des unterstützen Gamuts bewegst? `
:shock: :? :shock:Keine Ahnung;
Ich hatte mir beim Online "https://www.bing.com/search?q=rgb+color+picker&qs=n&form=QBRE&sp=-1&pq=rgb+color+picker&sc=2-16&sk=&cvid=4303F763497047CCA6817673031C3AC0" Farben herausgesucht, die mit einem rötlichen Orange begannen und dann in einem hellen Weiß endeten.
Für meine ersten Versuche war geplant dass der Hue nur leicht unterschiedlich ist: 30->46 zusätzlich sollte die Sättigung von 100->0 und die Helligkeit von 0->100 gehen.
Wieso es da zu dem blauen Licht kommt frage ich mich sowieso.
aber das ganze Runden könnte Probleme machen. `
das war auch mein Gedanke; bei 0,2 war das Blitzen aber häufiger.Ob ich da aus dem Gamut herausrutsche kann ich mangels Wissen nicht beurteilen, das würde aber den Effekt wahrscheinlich etwas erklären.
Gruß
Rainer
-
Schaffst du es eventuell die Schaltvorgänge, bei denen es blitzt einzugrenzen auf bestimmte Parameter?
Dann könntest du mir von den blitzenden Parameter-Kombinationen mal einen Debug-Log-Auszug schicken (Zeile mit "updateResource(…) > sending payload").
-
Irgendetwas läuft da nicht sauber.
Inzwischen klappt es bis auf wenige Blitze mit der Farbe ganz gut, aber die Helligkeit kommt nicht hoch
Ich habe heute mal Verzögerungen eingebaut um die Befehle außerhalb der Standard transitiontime zu senden und außerdem einen umgekehrten Verlauf = Sonnenuntergang gebastelte, auch mit den Verzögerungen:
Ein kurzer Verlauf der Hue, bei der ich unter Objekte ganz kurz etwas aufblitzen sah:
!
value acknowledged from timestamp null true 2018-02-13T20:32:51.214Z 43 true 2018-02-13T20:32:51.218Z 43 true 2018-02-13T20:33:01.277Z 36.69999999999995 false 2018-02-13T20:33:01.618Z 43 true 2018-02-13T20:33:02.046Z 37 true 2018-02-13T20:33:02.090Z 44 true 2018-02-13T20:33:02.382Z 44 true 2018-02-13T20:33:31.541Z 36.59999999999995 false 2018-02-13T20:33:31.587Z 37 true 2018-02-13T20:33:31.637Z 43 true 2018-02-13T20:33:32.328Z 43 true 2018-02-13T20:34:01.140Z 36.49999999999995 false 2018-02-13T20:34:01.606Z 43 true 2018-02-13T20:34:01.667Z 36 true 2018-02-13T20:34:01.845Z 43 true 2018-02-13T20:34:02.399Z 43 true 2018-02-13T20:34:31.541Z 36.39999999999995 false 2018-02-13T20:34:31.702Z 36 true 2018-02-13T20:34:31.891Z 36 true 2018-02-13T20:34:32.044Z 44 true 2018-02-13T20:34:32.476Z 44 true 2018-02-13T20:35:01.179Z 36.29999999999995 false 2018-02-13T20:35:01.672Z 44 true 2018-02-13T20:35:01.697Z 36 true 2018-02-13T20:35:01.831Z 43 true 2018-02-13T20:35:02.411Z !
Nach meiner Rechnung müssten die mit ACK=false die richtigen Werte sein.
Wieso werden ansonsten nur Ganzzahlen angezeigt?
Ich probiere mal was!
Gruß
Rainer