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