Meine Lösung für "Human Centric Lighting"

Begonnen von The Grue, 12 Februar 2021, 19:01:19

Vorheriges Thema - Nächstes Thema

The Grue

Servus!

In meinem Heimbüro habe ich mir eine schöne Leuchte mit einem warm- und einem kaltweissen LED-Streifen gebaut. Ich wollte per FHEM die Leuchte so ansteuern, daß etwas HCL-ähnliches dabei rauskommt, also morgens warmweisses Licht, mittags kaltweiss, abends wieder warmweiss. Sollte jetzt nicht wissenschaftlich korrekt werden, aber schon ordentlich. Das ist mein Lösungsansatz und ich hoffe, ich kann den mit Euch diskutrieren um ihn zu verbessern. Vielleich hat ja auch jemand außer mir was davon :)

Mit dieser Funktion in 99_myUtils.pm berechne ich die HCL-Kurve:


# from: start time of curve (warm)
# to: end time of curve (warm again)
# now: "current" time / time to get warm/cold part for
# returns: warm, cold : warm and cold part of the light
sub hclCurve($$$) {
    my ($from,$to,$now) = @_;
my $cold = 255;

if($now<$from or $now>$to){
$cold = 0;
}
else
{
$cold = int( $cold * sin(($now-$from) / ($to-$from)*pi)**2 + 0.5);
}
my $warm = 255 - $cold;
return( $warm, $cold );
}


from, to und now gebe ich in Minuten seit Mitternacht an und verwende dieser Hilfsfunktion:


sub minutesSinceMidnight {
   my @time = localtime();
   my $minutes = ($time[2] * 60) + ($time[1]);

   return $minutes;
}


Die Leuchte steuere ich mit einem at an:

Internals:
   CFGFN     
   COMMAND    {my($w, $c) = hclCurve(7*60, 19*60, minutesSinceMidnight()); fhem( "set Office.Lightbar.* wcrgb " . $w . " " . $c . " 0 0 0")}
   DEF        +*00:15:00 {my($w, $c) = hclCurve(7*60, 19*60, minutesSinceMidnight()); fhem( "set Office.Lightbar.* wcrgb " . $w . " " . $c . " 0 0 0")}
   FUUID      60073565-f33f-39ae-b735-c259575b044370a3
   NAME       hcl.at
   NR         8813
   NTM        18:48:19
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      inactive
   TIMESPEC   00:15:00
   TRIGGERTIME 1613152099.49071
   TRIGGERTIME_FMT 2021-02-12 18:48:19
   TYPE       at
   READINGS:
     2021-02-12 18:33:19   state           inactive
Attributes:
   alias      At: Run HCL curve
   room       Maschinenraum
   userattr   lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0


hcl.at en- bzw. disable ich in einer lightscene, damit der Wert auch nur gesetzt wird, wenn die Leuchte an ist. Ich bin mir nicht sicher, ob der controller nicht jedes Mal in den Flash schreibt, wenn ein set wcrgb kommt und so bald das Flash stirbt :/

So habe ich einen sin²(x)-Verlauf für das kalte Licht (warm entsprechend...).

Das würde ich gerne noch verbessern:
- An den Stellen mit höchster Steigung sind die Schritte etwas grob. Ich möchte das vielleicht mal verbessern, in dem ich ausrechne, wann die nächste Schaltzeit kommt und so jeden Wert der Kurve verwende. Hat aber sehr niedrige Prio
- Die Konfiguration des Sonnenauf- und Untergangs ist hardcoded in hcl.at (07:00 und 19:00). Schöner wäre es, wenn das irgendwie konfigurierbar wäre
- Der Code ist irgendwie unschön verteilt. Ginge es, daraus ein ordentliches Modul zu erstellen? Hab' leider gar keine Ahnung, wie...
  Vielleicht etwas wie 
define office.hcl HCL office.light  07:00 19:00 15

Um eine hcl Steuerung für die Leuchte office.light mit "Sonnenaufgang" um 07:00, "Sonnenuntergang" um 19:00 und Update alle 15 Minuten zu erstellen. Oder so ähnlich :p



Ich würde mich sehr freuen, wenn Ihr etwas (idealerweise konstruktive) Kritik üben könntet. Super wär's natürlich, wenn das auch außer mir jemand brauchen könnte.

Schönes Wochenende,
--
Markus