NEWS
[Blockly] Sonnenaufgang mit Tradfri
-
Ich versuchs mal so in der Art:
var Timersteps
Trigger: Wenn Uhrzeit = 06:30
timeout Intervall: alle Minute
steuere Helligkeit = Helligkeit +1
steuere Timersteps = Timersteps +1
Mit den Timersteps will ich eine Formel für die Farben umsetzen. Im MOment ist beides noch identisch. Dann bräuchte ich nur eine var, das kann sich aber später ändern.
Gruß
Rainer
-
Kriegen wir hin.
Aber nicht mehr heute.
Gehe gleich auf "Rolle"
-
Der erste Test läuft!
Trigger ist der Lichtschalter (ich will nicht immer bis 06:45 warten ) und tempo sind Sekunden; die werden später auch noch angepasst.
! ````
javascript.0 2018-01-26 18:11:41.260 info script.js.Sonnenaufgang: Die Helligkeit ist 72%
javascript.0 2018-01-26 18:11:40.256 info script.js.Sonnenaufgang: Die Helligkeit ist 71%
javascript.0 2018-01-26 18:11:39.254 info script.js.Sonnenaufgang: Die Helligkeit ist 70%
javascript.0 2018-01-26 18:11:38.251 info script.js.Sonnenaufgang: Die Helligkeit ist 69%
javascript.0 2018-01-26 18:11:37.248 info script.js.Sonnenaufgang: Die Helligkeit ist 68%
javascript.0 2018-01-26 18:11:36.246 info script.js.Sonnenaufgang: Die Helligkeit ist 67%
javascript.0 2018-01-26 18:11:35.243 info script.js.Sonnenaufgang: Die Helligkeit ist 66%
javascript.0 2018-01-26 18:11:34.240 info script.js.Sonnenaufgang: Die Helligkeit ist 65%
javascript.0 2018-01-26 18:11:33.235 info script.js.Sonnenaufgang: Die Helligkeit ist 64%
javascript.0 2018-01-26 18:11:32.233 info script.js.Sonnenaufgang: Die Helligkeit ist 63%
javascript.0 2018-01-26 18:11:31.230 info script.js.Sonnenaufgang: Die Helligkeit ist 62%
javascript.0 2018-01-26 18:11:30.227 info script.js.Sonnenaufgang: Die Helligkeit ist 61%
javascript.0 2018-01-26 18:11:29.224 info script.js.Sonnenaufgang: Die Helligkeit ist 60%
javascript.0 2018-01-26 18:11:28.222 info script.js.Sonnenaufgang: Die Helligkeit ist 59%…und schon ein Fehler zum korrigieren. Helligkeit ist jetzt 335% ;-) ~~@rantanplan:~~ > Gehe gleich auf "Rolle" ` Viel Spaß! Gruß Rainer
-
So,
ich hab mein Script mal auf "Trigger by Timer" umgebaut.
Export:
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="schedule" id="dxUTBqgrkFKZ]~k5IBBn" x="37" y="14"><field name="SCHEDULE">* * * * </field>
<statement name="STATEMENT"><block type="controls_if" id="xTBHY%{rxf9+eGe!V+dV"><mutation elseif="1"></mutation>
<value name="IF0"><block type="time_compare" id="Swj{fYmoBc1)_OMD0zCC"><mutation end_time="false"></mutation>
<field name="OPTION">>=</field>
<field name="START_TIME">06:30</field></block></value>
<statement name="DO0"><block type="controls_if" id="mZ3DcMgfulL4h}~Xh8."><value name="IF0"><block type="logic_compare" id="Pnd|S|xJKjmf9p[1H%@"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="kH^tzc
B|x-=oHB/
O^"><field name="ATTR">val</field>
<field name="OID">javascript.0.SysVar.SV_Anwesenheit_Gerhard</field></block></value>
<value name="B"><block type="logic_boolean" id="bBM2616pU1CV2OITas8P"><field name="BOOL">TRUE</field></block></value></block></value>
<statement name="DO0"><block type="variables_set" id=")0+[:0OUzQO%hy#weso"><field name="VAR">Level</field> <value name="VALUE"><block type="math_arithmetic" id="QR|/N}C|z6,iA,fB)36|"><field name="OP">MINUS</field> <value name="A"><shadow type="math_number" id="|_*jOh}pjCIOT.N,gW#p"><field name="NUM">1</field></shadow> <block type="math_arithmetic" id="r]{hc/J~PL#Z8DFnll^l"><field name="OP">MULTIPLY</field> <value name="A"><shadow type="math_number" id=";u#12~
+(|F@GpGKv1z"><field name="NUM">-2.5</field></shadow> <block type="time_get" id="4j|R#D*0w2qN,tpauBiX"><mutation format="false" language="false"></mutation> <field name="OPTION">mid</field></block></value> <value name="B"><shadow type="math_number" id="ZBPrfBpqKeP4B3=eW4iB"><field name="NUM">1.6667</field></shadow></value></block></value> <value name="B"><shadow type="math_number" id="jpiM!Kd1Niy
qzZugVUY"><field name="NUM">650</field></shadow></value></block></value>
<next><block type="control" id="6=(~l;}%6PNSIf6VW3IL"><mutation delay_input="false"></mutation>
<field name="OID">hue.0.Philips_hue.Couch_Boden.level</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE"><block type="variables_get" id="n7Mo4EhAkk^yy39w[Rpu"><field name="VAR">Level</field></block></value></block></next></block></statement></block></statement>
<value name="IF1"><block type="time_compare" id="._Y2MEEw^XB(?i0j(P#l"><mutation end_time="false"></mutation>
<field name="OPTION">>=</field>
<field name="START_TIME">07:30</field></block></value>
<statement name="DO1"><block type="control" id="(SGd}elcZLUYo,x=xY2F"><mutation delay_input="false"></mutation>
<field name="OID">hue.0.Philips_hue.Couch_Boden.level</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE"><block type="math_number" id="2H2:1}!ZdBGKxx[he*d)"><field name="NUM">0</field></block></value></block></statement></block></statement></block></xml>Die lineare Gleichung basiert auf: Zeit Level 06:30 0 07:30 100
-
Ich steuere bei meinen die Farbtemperatur abhängig von Sonnenaufgang und Sonnenuntergang. Ist aber JavaScript und nicht blockly. Kann dir den Code morgen gerne Posten wenn ich daheim bin.
Gesendet von unterwegs
-
Kann dir den Code morgen gerne Posten wenn ich daheim bin. `
DankeBin mit dem Sonnenaufgang auch schon weiter. Ich wollte mit Hue und Sat arbeiten, das hat aber nur geflackert, wenn die Änderungen zu oft kamen. Dann kam noch ein coap Error dazu.
Muss mal mit der Transition Time und ggf. Mit virtuellen Gruppen versuchen, wenn ich wieder Zeit habe.
Abgesehen davon ändert sich je nach Farbe auch die Helligkeit bei der RGB birne enorm.
Ich darf also nur in einem bestimmten Spektrum bkeiben.
Gruß Rainer
-
Ich aktualisiere jede Minute den Wert mit einer transitiontime von 10s. Das reicht für einen unmerkbaren Übergang. Was für einen coap Fehler meinst du?
Gesendet von unterwegs
-
Was für einen coap Fehler meinst du? `
:oops: Wusste ich nicht mehr auswendig.Habe die logdatei von gestern durchsucht:
`2018-01-26 19:57:32.127 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.127 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.127 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.127 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset 2018-01-26 19:57:32.128 - [31merror[39m: tradfri.0 unhandled promise rejection: CoapClient was reset[/code]` Allerdings hatte ich zum Testen den Turbo aktiviert -> alle 200msec! Habe es jetzt wieder runtergesetzt - muss wie oben schon gesagt nochmal mit der transition Time versuchen: ![144_sonnenaufgang011.jpg](/assets/uploads/files/144_sonnenaufgang011.jpg) Gruß Rainer
-
Ah, das kommt bei nem verbindungsabbruch. Vermutlich wollte das Gateway nicht mehr deine Spielchen mitmachen [emoji23]
Gesendet von unterwegs
-
Vermutlich wollte das Gateway nicht mehr deine Spielchen mitmachen `
Meinst du? Kann ich gar nicht verstehenAber das wird es sein.
`2018-01-26 19:56:46.427 - [31merror[39m: tradfri.0 > stack: Error: Retransmit counter exceeded[/code]` Gruß Rainer
-
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.