Szenenscript für automatische Anpassung der Lichtfarbe je nach Tageszeit
Für Leuchten mit Kaltweiss/Warmweiss-Einstellung kann es wünschenswert sein, dass sich die Lichtfarbe automatisch je nach Tageszeit ändert.
Mit Hilfe des Szenenscripts können solche Dynamischen Szenen (also solche, bei denen sich auch nach dem Aufruf noch etwas ändert) einfach erstellt werden.
Das funktioniert mit allen Arten von Leuchten, seien es DALI (gruppierte Einzeldimmer oder DT-8 CW/WW- oder Farbleuchten), hue (Ambiance oder Farbe) an P44-DSB-DEH/D und P44-LC-DE, RGB und RGBW SmartLED-Ketten, DMX-Leuchten und PWM-Ausgänge an P44-xx-X, sowie natürlich auch als Custom Device erstellte Farb- oder Farbtemperaturleuchten.
Das folgende Beispiel passt die Lichtfarbe im Zeitraum zwischen Morgen- und Abenddämmerung zwischen warm (400 mired) bis kühl (100 mired) an - je dunkler es ist, desto wärmer das Licht. Natürlich können auch andere Verläufe programmiert werden, und die Zahlen nach Bedarf angepasst werden.
Wie ein Szenenscript eingeben?
Eine detaillierte Anleitung, wie ein Szenenscript auf einem P44-DSB oder P44-LC-Gerät erstellt wird, gibt es hier.
Das Script
Das folgende Skript kann 1:1 kopiert und in das Feld "Script to execute..." im Szenenedit-Dialog eingegeben werden, aber natürlich auch nach Bedarf angepasst werden.
var updatedelay = 0 // Beim Aufruf der Szene die erste Lichtfarbanpassung sofort vornehmen
// Ab hier soll das Script endlos im Hintergrund laufen, dennoch aber
// der Szenenaufruf abgeschlossen sein. Deshalb wird die laufende Anpassung
// mit `concurrent` in den Hintergrund verlegt.
concurrent {
// Endlos, bis eine andere Szene aufgerufen wird
while (true) {
// Wert von 0..1 für Tageslauf: 1: Abend- oder Morgendämmerung, 0: Tagesmitte
var dayarc = abs(maprange(timeofday(), dawn(), dusk(), -1, 1))
// Farbtemperatur zwischen 400 (am Tagesanfang und -Ende) und 100 (Tagesmitte) mired
var mired = maprange(dayarc,1,0.5,400,100)
// Zur Kontrolle ins Log ausgeben (ggf. auskommentieren)
log("dayarc = %f, mired = %d", dayarc, mired)
// Farbtemperatur-Kanal auf neuen Wert setzen,
// (langsamer Übergang ausser beim ersten Mal)
output.channel('colortemp', mired, updatedelay)
// Kanäle auf die Hardware anwenden
output.applychannels()
// von jetzt an alle 5 Minuten neu berechnen
updatedelay = 0:05
delay(updatedelay)
}
}
Anmerkungen
- Das
concurrent
ist wichtig für dynamische Szenen, deren Szenenscript die ganze Zeit läuft. Ein Szenenaufruf ist genaugenommen erst abgeschlossen, wenn das Szenenscript ausgeführt ist. Deshalb würde ein endlos weiterlaufenden Szenenscript weitere Szenenaufrufe u.U. blockieren (ab Firmware 2.6.5 passiert das zwar nicht mehr, dennoch sollteconcurrent
verwendet werden). Mitconcurrent
wird die endlose laufende Updateschleife in den Hintergrund (in einen eigenen Thread) verlegt, so dass das Haupt-Szenenscript zuende laufen kann, das Update aber trotzdem weitergeht. maprange()
ist für das Abbilden von zwei Zahlen-Bereichen aufeinander sehr praktisch (s. allgemeine Funktionen in der p44script Kurzreferenz). Im Prinzip handelt es sich um eine Dreisatzrechung, abermaprange
macht das bequem und einfach lesbar, und stellt auch sicher, dass der Ausgangsbereich nicht über- oder unterschritten wird, auch wenn der Eingangswert ausserhalb des angegebenen Bereichs ist.dawn()
unddusk()
geben den Zeitpunkt von Morgen- bzw. Abenddämmerung für den aktuellen Tag an der in den P44-xx-Systemeinstellungen festgelegten geographischen Lage an (ca. ohne Berücksichtigung von Hindernissen am Horizont), so dass sich die Farbanpassung auch nach der Jahreszeit richtet.- mit
abs()
wird aus einem Tagesverlauf von -1..1 eine Art "Tagesbogen" von 1..0..1 berechnet. - Die Lichtfarbe wird nur alle 5 Minuten neu berechnet - damit aber keine plötzlichen Sprünge sichtbar sind, wird bei
output.channel()
mit dem dritten Argument ein langsamer Übergang eingestellt.
Weitere Infos
- Tutorials - Weitere Schritt-für-Schritt-Anwendungs-Beispiele
- Beispiel Szenenscript für einen fortlaufenden Farbwechsel
- Funktionen (u.a.) für die Verwendung in Szenenscripts
- Allgemeine Information zu Scripten und Scriptkontexten
- Für Fragen und Austausch: Das plan44 community forum