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 sollte concurrent verwendet werden). Mit concurrent 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, aber maprange 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() und dusk() 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