Hallo Liste,
ich habe heute nachmittag ein wenig gespielt.
Erste Anforderung: Ich möchte eine Temperatur in einer Übersichtsdarstellung meines Hauses als Farbe codieren. Das hat nichts mit der Farbtemperatur zu tun - sondern ist im Prinzip eine Falschfarbendarstellung.
Idee: 3 Temperaturwerte als "Eckwerte"
Wenn T < starttemp, dann immer Farbe startcolor
Wenn starttemp < T < midtemp2, irgendeine Interpolation zwischen startcolor und midcolor2
Wenn midtemp2 < T <endtemp, irgendeine Interpolation zwischen midcolor2 und endcolor
Wenn endcolor < T, dann immer Farbe endcolor
Zuerst habe ich eine Bezier-Approximation 4. Ordnung ausprobiert, das Ergebnis war nicht überzeugend.
Stattdessen habe ich zwei Bezier-Segmente 2. Ordnung aneinander geklebt. In Pseudocode, für jedes Segment:
color(t)= color1*(1-u)^2 + color2*2*(1-u)*u + color3*u^2
Das führt mit den Parametern
startcolor={0,255,255};
midcolor1={30,80,255};
midcolor2={40,255,60};
midcolor3={160,128,10};
endcolor={255,69,0};
starttemp=15;
midtemp2=21;
endtemp=27;
auf eine Farbskala zwischen 14 und 28 Grad Celsius, die durch das Farbband aus der anliegenden Datei wiedergegeben wird.
Die entsprechende Darstellung meines Hauses wird durch ein Shellscript erzeugt, siehe zweiten Anhang. Darin sind die Fraben etwas blasser, weil ich sie nur mit 70%iger Deckung auf die Skizze des Hauses auftragen lassen. Die Skizze des Hauses wird dann natürlich in einem digitalen Bilderrahmen einmal pro Minute aktualisiert.
Mich würde interessieren, wie groß das Interesse an einer solchen Falschfarbendarstellung ist. Das kann als ganz nettes Hilfsmodul eingesetzt werden, um z.B. Floorplan oder andere Darstellungen etwas aufzupeppen.
LG
pah
(edit: war die falsche Beispieldatei - das ist die richtige, mit 21 Grad Celsius =Grün im Wohnbereich)
Lustig... genau für die gleiche Aufgabenstellung hatte ich Freitag/Samstag auch eine Lösung gesucht und nicht gefunden.
Ich finde Deine Umsetzung super und würde eine entsprechende Funktion entweder in Color.pm oder in der 99_Utils.pm begrüßen.
Wer ist denn Maintainer von Color.pm ?
LG
pah
ich würde es gerne in Color.pm aufnehmen.
gruß
andre
Zitat von: Prof. Dr. Peter Henning am 08 Dezember 2014, 11:15:07
Wer ist denn Maintainer von Color.pm ?
LG
pah
Maintainer ist justme1968 (hat eben geantwortet)
Link: http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/FHEM/Color.pm
OK, ich mache einen Vorschlag als Perl-Code, und Du kannst es einbauen.
Dauert aber bis Freitag, weil ich ab morgen für 3 Tage in ein Review Meeting meines Projektes verschwinde.
LG
pah
Hat sich denn in dieser Sache in den vergangenen zwei Monaten etwas ergeben?
Abgesehen davon, dass es bei mir im produktiven Einsatz ist, nicht. Liegt daran, dass von meinen 4 Assistenten 3 ausgefallen sind und ich darum extrem viel um die Ohren hatte.
LG
pah
Schade...
Würdest Du eventuell Deinen aktuell verwendeten Codeschnipsel kundtun?
Hier mal meine Umsetzung:
(http://debian.fhem.de/farbskala.png)
Erzeugt in 1° Schritten von -20 bis +20 mit folgender Funktion
temp2RGB(-20,20,$temp)
sub temp2RGB {
my ($min, $max, $float) = @_;
my ($rot,$gruen,$blau);
$float = $float - $min;
my $faktor = 1020 / ($max - $min);
my $farbe = round($faktor * $float, 0);
if ($farbe < 1)
{ $farbe = 0; }
if ($farbe > 1020)
{ $farbe = 1020; }
if ($farbe <= 510)
{
$rot = 0;
if ($farbe <= 255)
{
$gruen = 0 + $farbe;
$blau = 255;
}
if ($farbe > 255)
{
$farbe = $farbe - 255;
$blau = 255 - $farbe;
$gruen = 255;
}
if ($farbe > 255)
{
$farbe = $farbe - 255;
$blau = 255 - $farbe;
$gruen = 255;
}
}
if ($farbe > 510)
{
$farbe = $farbe - 510;
$blau = 0;
if ($farbe <= 255)
{
$rot = 0 + $farbe;
$gruen = 255;
}
if ($farbe > 255)
{
$farbe = $farbe - 255;
$gruen = 255 - $farbe;
$rot = 255;
}
}
return sprintf("%02X%02X%02X", $rot,$gruen,$blau);
}
wirklich schöner Verlauf. Kann man das irgendwo für "die Allgemeinheit" aufnehmen. Color.pm oder so...
ja. das kommt auf jeden fall in Color.pm.
es gibt bis jetzt vier prinzipielle varianten:
- die allgemeine hue -> rgb umrechnung die es schon gibt und die man um 90 grad verschieben und auf einen bestimmten
temperaturbereich abbilden kann um einen ähnlichen farbverlauf zu bekommen,
- die von hier: http://forum.fhem.de/index.php/topic,26470.0/topicseen.html (http://forum.fhem.de/index.php/topic,26470.0/topicseen.html) die parametrisierbar ist,
- die von betateilchen oben
- und die von pah die noch nicht veröffentlich ist
ich möchte gerne so viel wie möglich davon unter einen hut bringen.
Schöne Sache, könnte man das auch als Zustandsbalken im Dashboard und Floorplan verwenden, dann könnte man auf einen Blick den Ladezustand von Puffer oder Temperatur vom Kessel sehen.
Zitat von: justme1968 am 07 Februar 2015, 23:10:28
- die von hier: die parametrisierbar ist,
Meine ist auch insofern parametrierbar, dass man den Gesamtbereich (Minimalwert + Maximalwert) angeben kann, man kann also auch Temperaturen von 30-100 darstellen, dann wäre eben 30 blau und 100 rot.
Ich hab übrigens gleich noch eine sehr simple Funktion, diese ist angelehnt an die Vorlage der Klimatabellen in Wikipedia (http://de.wikipedia.org/wiki/Vorlage:Klimatabelle) und sowohl der Darstellungsbereich -15°..+30° als auch die 5° Stufen sind auch in vielen Fällen schon ausreichend.
sub wikitemp2RGB {
my ($t) =shift;
return "FF4040" if $t > 30;
return "FF6347" if 25 < $t && 30 >= $t;
return "FF8C00" if 20 < $t && 25 >= $t;
return "FFA500" if 15 < $t && 20 >= $t;
return "FFCC66" if 10 < $t && 15 >= $t;
return "FFFF99" if 5 < $t && 10 >= $t;
return "FFFFFF" if 0 < $t && 5 >= $t;
return "F0F8FF" if -5 < $t && 0 >= $t;
return "CFE8FF" if -10 < $t && -5 >= $t;
return "B9D3FF" if -15 < $t && -10 >= $t;
return "8AB0FF" if $t < -15;
return undef;
}
Apropos Color.pm:
Falls mal jemand eine Funktion sucht, um aus einem RGB Wert den Komplementärwert zu ermitteln:
sub kompRGB {
my ($farbe) = shift;
$farbe = sprintf("%06x",~hex($farbe));
$farbe = substr($farbe,length($farbe)-6,6);
return $farbe;
}
Ich bin, wie gesagt, noch nicht zu einer Umsetzung in perl gekommen. Läuft bei mir immer noch als shellscript (weil es für die Bildgerenierung mit ImageMagick benötigt wird).
# Color function
colorfunction () {
temp=$1
startcolorR=0
startcolorG=255
startcolorB=255
midcolor1R=30
midcolor1G=80
midcolor1B=255
midcolor2R=40
midcolor2G=255
midcolor2B=60
midcolor3R=160
midcolor3G=128
midcolor3B=10
endcolorR=255
endcolorG=69
endcolorB=0
starttemp=15
midtemp1=18
midtemp2=21
midtemp3=24
endtemp=27
if [ $(bc <<< "$temp <= $starttemp") -eq 1 ]
then
retval="rgba($startcolorR,$startcolorG,$startcolorB,$opacity)"
else
if [ $(bc <<< "$temp <= $midtemp2") -eq 1 ]
then
uval=`echo "scale=5;($temp - $starttemp)/($midtemp2 - $starttemp)" | bc`
rval1=`echo "scale=5;(1-$uval)^2*$startcolorR" | bc`
rval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor1R" | bc`
rval3=`echo "scale=5;$uval^2*$midcolor2R" | bc`
rval=`echo "scale=0;(100*($rval1+$rval2+$rval3)+0.5)/100" | bc`
gval1=`echo "scale=5;(1-$uval)^2*$startcolorG" | bc`
gval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor1G" | bc`
gval3=`echo "scale=5;$uval^2*$midcolor2G" | bc`
gval=`echo "scale=0;(100*($gval1+$gval2+$gval3)+0.5)/100" | bc`
bval1=`echo "scale=5;(1-$uval)^2*$startcolorB" | bc`
bval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor1B" | bc`
bval3=`echo "scale=5;$uval^2*$midcolor2B" | bc`
bval=`echo "scale=0;(100*($bval1+$bval2+$bval3)+0.5)/100" | bc`
retval="rgba($rval,$gval,$bval,$opacity)"
else
if [ $(bc <<< "$temp <= $endtemp") -eq 1 ]
then
uval=`echo "scale=5;($temp - $midtemp2)/($endtemp - $midtemp2)" | bc`
rval1=`echo "scale=5;(1-$uval)^2*$midcolor2R" | bc`
rval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor3R" | bc`
rval3=`echo "scale=5;$uval^2*$endcolorR" | bc`
rval=`echo "scale=0;(100*($rval1+$rval2+$rval3)+0.5)/100" | bc`
gval1=`echo "scale=5;(1-$uval)^2*$midcolor2G" | bc`
gval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor3G" | bc`
gval3=`echo "scale=5;$uval^2*$endcolorG" | bc`
gval=`echo "scale=0;(100*($gval1+$gval2+$gval3)+0.5)/100" | bc`
bval1=`echo "scale=5;(1-$uval)^2*$midcolor2B" | bc`
bval2=`echo "scale=5;2*(1-$uval)*$uval*$midcolor3B" | bc`
bval3=`echo "scale=5;$uval^2*$endcolorB" | bc`
bval=`echo "scale=0;(100*($bval1+$bval2+$bval3)+0.5)/100" | bc`
retval="rgba($rval,$gval,$bval,$opacity)"
else
retval="rgba($endcolorR,$endcolorG,$endcolorB,$opacity)"
fi
fi
fi
echo $retval
}
Im Unterschied zu der Version von Udo (stückweise lineare Interpolation) habe ich zwei Bezierkurven 2. Ordnung aneinandergesetzt. Das schafft einen glatteren Verlauf.
LG
pah
Hallo Peter,
Zitat von: Prof. Dr. Peter Henning am 09 Februar 2015, 09:22:23
Ich bin, wie gesagt, noch nicht zu einer Umsetzung in perl gekommen.
da bin ich grade dran.
retval="rgba($rval,$gval,$bval,$opacity)"
Woher nimmst Du $opacity und wie sieht ein output von rgba() aus - sind das 8 hex Ziffern?
Edit: Im Moment bekomme ich r/g/b Werte > 255 als Ergebnis - ist das so gewollt?Edit 2: Frage erledigt, ich bin mal wieder darauf reingefallen, dass in perl ** statt ^ zum potenzieren verwendet werden muss 8)
fertsch...
(http://debian.fhem.de/grafik/pahcolor.png)
Die Funktion wird mit maximal fünf Parametern aufgerufen:
- Starttemperatur (Minimaltemperatur)
- Mitte
- Endtemperatur (Maximaltemperatur)
- Temperatur (die dargestellt werden soll)
- Transparenz (optional, Wertebereich 0..255, wenn nicht vorhanden = 255, voll deckend)
Im Beispiel wurde der Temperaturbereich von 14°-28° (jeweils einschließlich) in einem Bereich von 15°-27° mit 1° Schritten und 21° Mittenwert dargestellt:
pahColor(15,21,27,$temp)
Da die Werte 14 und 28 ausserhalb des Darstellungsbereiches liegen, werden sie mit den jeweiligen "Grenzfarben" der Minimal/Maximaltemperatur dargestellt.
sub pahColor {
my ($starttemp,$midtemp2,$endtemp,$temp,$opacity) = @_;
$opacity //= 255;
my($uval,$rval,$rval1,$rval2,$rval3);
my($gval,$gval1,$gval2,$gval3);
my($bval,$bval1,$bval2,$bval3);
my $startcolorR = 0;
my $startcolorG = 255;
my $startcolorB = 255;
my $midcolor1R = 30;
my $midcolor1G = 80;
my $midcolor1B = 255;
my $midcolor2R = 40;
my $midcolor2G = 255;
my $midcolor2B = 60;
my $midcolor3R = 160;
my $midcolor3G = 128;
my $midcolor3B = 10;
my $endcolorR = 255;
my $endcolorG = 69;
my $endcolorB = 0;
return sprintf("%02X%02X%02X%02X",$startcolorR,$startcolorG,$startcolorB,$opacity) if ($temp <= $starttemp);
return sprintf("%02X%02X%02X%02X",$endcolorR,$endcolorG,$endcolorB,$opacity) if ($temp > $endtemp);
if ($temp <= $midtemp2) {
$uval = sprintf("%.5f",($temp - $starttemp) / ($midtemp2 - $starttemp));
$rval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorR);
$rval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1R);
$rval3 = sprintf("%.5f",$uval**2 * $midcolor2R);
$rval = sprintf("%.0f",(100*($rval1 + $rval2 + $rval3)+0.5)/100);
$gval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorG);
$gval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1G);
$gval3 = sprintf("%.5f",$uval**2 * $midcolor2G);
$gval = sprintf("%.0f",(100*($gval1 + $gval2 + $gval3)+0.5)/100);
$bval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorB);
$bval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1B);
$bval3 = sprintf("%.5f",$uval**2 * $midcolor2B);
$bval = sprintf("%.0f",(100*($bval1 + $bval2 + $bval3)+0.5)/100);
return sprintf("%02X%02X%02X%02X",$rval,$gval,$bval,$opacity);
}
if ($temp <= $endtemp) {
$uval = sprintf("%.5f",($temp - $midtemp2)/($endtemp - $midtemp2));
$rval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2R);
$rval2 = sprintf("%.5f",2 * (1-$uval) * $uval * $midcolor3R);
$rval3 = sprintf("%.5f",$uval**2 * $endcolorR);
$rval = sprintf("%.0f",(100*($rval1+$rval2+$rval3)+0.5)/100);
$gval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2G);
$gval2 = sprintf("%.5f",2 * (1-$uval) * $uval * $midcolor3G);
$gval3 = sprintf("%.5f",$uval**2 * $endcolorG);
$gval = sprintf("%.0f",(100*($gval1+$gval2+$gval3)+0.5)/100);
$bval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2B);
$bval2 = sprintf("%.5f",2*(1-$uval)*$uval*$midcolor3B);
$bval3 = sprintf("%.5f",$uval**2 *$endcolorB);
$bval = sprintf("%.0f",(100*($bval1+$bval2+$bval3)+0.5)/100);
return sprintf("%02X%02X%02X%02X",$rval,$gval,$bval,$opacity);
}
}
Cool! Wie erstellst du denn die Grafik?
Mittels eines InfoPanels.
Aber wieso musst Du für eine solche simple Frage einen kompletten Beitrag zitieren?
Besser?
ja, danke. Denn nicht jeder arbeitet mit einem 27" Monitor ;)
Nicht? Ich dachte das ist heute Standard? :)
Nun aber BTT!
@betateilchen: Prima. Ist das dann schon in Color.pm drin ?
LG
pah
Dafür bin ich nicht zuständig, Color.pm "gehört" Andre. Bei mir ist die Funktion aktuell in der 99_myUtils.pm untergebracht.
Die Berechnung gefällt mir hervorragend - tolle Idee, die Du da umgesetzt hast.
So sieht das Ganze bei einer Skala von -10..+30 mit Mitte bei 18° aus:
(http://debian.fhem.de/grafik/farbskala2.png)
Damit kann ich nun direkt die LED-Balkonbeleuchtung per LW12-Controller mit dem temperaturabhängigen rgb Wert ansteuern und sehe schon vor dem Aufstehen, wie kalt es draußen ist 8)
Das ist ein netter Use Case - den werde ich als Idee (mit Namensnennung, natürlich) gleich als Anwendungsfall in das Buch "Hacks für die Heimautomation" aufnehmen, das ich gerade schreibe. Dafür gibt es auch zwei Bonbons.
Probier mal die drei folgenden Fälle (Achtung,Mathematica-Code, muss man erst noch in Perl umsetzen):
Das ist der bisherige Fall
startcolor={0,255,255};
midcolor1={30,80,255};
midcolor2={40,255,60};
midcolor3={160,128,10};
endcolor={255,69,0};
Hier ist der eher düstere Braunton bei hohen Temperaturen etwas besser gewählt und die Spreizung bei niedrigen Temperaturen besser:
startcolor={0,255,255};
midcolor1={120,120,120};
midcolor2={40,255,60};
midcolor3={255,255,0};
endcolor={255,69,0};
Und das hier ist für diejenigen, die es richtig blau mögen
startcolor={0,69,255};
midcolor1={120,180,180};
midcolor2={40,255,60};
midcolor3={255,255,0};
endcolor={255,69,0};
Nachstehend noch die Temperaturskalen dazu, sowie Darstellungen in den drei Farbebenen des RGB-Farbmodells. Ich habe das auch dreidimensional - aber leider sind die Videoclips dazu jeweils ca. 40 MB groß und auch das animierte GIF hat immerhin noch 1.9 MB , das wollte ich dem Server hier nicht zumuten.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 14 Februar 2015, 06:55:06
auch das animierte GIF hat immerhin noch 1.9 MB , das wollte ich dem Server hier nicht zumuten.
Sowas kann ich gerne auf debian.fhem.de ablegen und hierher verlinken. Du müsstest mir das gif nur per email schicken oder in irgendeiner Cloud freigeben, damit ich es auf den Server schieben kann.
Oh, das ist keine Frage von Webspace - ich glaube, insgesamt finanziere ich aus meinem Forschungsetat inzwischen 4 externe Server...
Als Erstes habe ich mal eine Wiki-Seite aufgesetzt http://www.fhemwiki.de/wiki/Temperaturfarbe.
Und hier die drei (in zeitlicher und räumlicher Auflösung abgespeckten) Animationen dazu. Mit transparenten Würfeln als Bausteinen des RGB-Farbraums.
LG
pah
Die drehenden Würfel sind hübsch. Mehr nicht. 8)
Zitat von: Prof. Dr. Peter Henning am 13 Februar 2015, 19:21:42
Ist das dann schon in Color.pm drin ?
*schubs* damit es nicht vergessen wird :)
ist eingecheckt als Color::pahColor
die nächste Funktion, die ich irgendwann zum Einchecken vorschlage, wird "guenther" heissen... mal schauen...
use utf8;
sub günter{}
mir kommen keine Umlaute in Funktionsnamen...
Zitat von: justme1968 am 17 Februar 2015, 00:11:30
ist eingecheckt als Color::pahColor
ich glaube, wenn Du die pahColor in den Exporter steckst, sparst Du Dir eine Reihe Supportanfragen hier im Forum. Ein "use Color" kriegen die meisten ja noch hin. Alles was drüber rausgeht, könnte problematisch werden.
@betateilchen: Stimmt. Aber abgesehen davon, dass "hübsche" Visualisierungen sicher ein Selbstzweck sind - in der interaktiven Mathematica-Grafik, die man von allen Seiten ansehen kann, ist tatsächlich der 3D-Verlauf der Kurve im Farbraum ganz hilfreich. Vor allem im HSV-Farbraum, um Farbsättigung und Helligkeit über den Verlauf einigermaßen konstant zu halten.
@justme1968: Welche Version der Parameter ist denn jetzt eingecheckt ?
LG
pah
Zitat von: Prof. Dr. Peter Henning am 17 Februar 2015, 04:32:54
@justme1968: Welche Version der Parameter ist denn jetzt eingecheckt ?
Die erste.
Meine Chefin steht auf blau. Darum läuft bei mir nur noch die dritte...
LG
pah
Zitat von: Prof. Dr. Peter Henning am 17 Februar 2015, 08:34:06
läuft bei mir nur noch die dritte...
Hier gibts keine Chefin. Ausserdem wäre mir die dritte Variante zu sehr blaulastig. Und ein komplett blaues Licht auf meinem Balkon signalisiert mir "Es regnet".
Hier eine Funktionsvariante, bei der man über einen optionalen sechsten Parameter das Farbmodell auswählen kann:
Aufruf:
Color::pahColor(<start>,<mid>,<end>,<temp>,[<opacity>],[<model>])
sub pahColor {
# see: http://forum.fhem.de/index.php/topic,30128.msg261375.html#msg261375
my ($starttemp,$midtemp2,$endtemp,$temp,$opacity,$model) = @_;
$opacity //= 255; # set to 255 if no opacity provided in call
$model //= 1; # set to 1 if no model provided in call
$model = ($model < 1 || $model > 3) ? 1 : $model; # check valid model
my($uval,$rval,$rval1,$rval2,$rval3,
$gval,$gval1,$gval2,$gval3,
$bval,$bval1,$bval2,$bval3,
$startcolorR, $startcolorG, $startcolorB,
$midcolor1R,$midcolor1G,$midcolor1B,
$midcolor2R,$midcolor2G,$midcolor2B,
$midcolor3R,$midcolor3G,$midcolor3B,
$endcolorR,$endcolorG,$endcolorB);
if ($model == 1) {
($startcolorR,$startcolorG,$startcolorB) = (0,255,255);
($midcolor1R,$midcolor1G,$midcolor1B) = (30,80,255);
($midcolor2R,$midcolor2G,$midcolor2B) = (40,255,60);
($midcolor3R,$midcolor3G,$midcolor3B) = (160,128,10);
($endcolorR,$endcolorG,$endcolorB) = (255,69,0);
} elsif ($model == 2) {
($startcolorR,$startcolorG,$startcolorB) = (0,255,255);
($midcolor1R,$midcolor1G,$midcolor1B) = (120,120,120);
($midcolor2R,$midcolor2G,$midcolor2B) = (40,255,60);
($midcolor3R,$midcolor3G,$midcolor3B) = (255,255,0);
($endcolorR,$endcolorG,$endcolorB) = (255,69,0);
} else {
($startcolorR,$startcolorG,$startcolorB) = (0,69,255);
($midcolor1R,$midcolor1G,$midcolor1B) = (120,180,180);
($midcolor2R,$midcolor2G,$midcolor2B) = (40,255,60);
($midcolor3R,$midcolor3G,$midcolor3B) = (255,255,0);
($endcolorR,$endcolorG,$endcolorB) = (255,69,0);
}
return sprintf("%02X%02X%02X%02X",$startcolorR,$startcolorG,$startcolorB,$opacity) if ($temp <= $starttemp);
return sprintf("%02X%02X%02X%02X",$endcolorR,$endcolorG,$endcolorB,$opacity) if ($temp > $endtemp);
if ($temp <= $midtemp2) {
$uval = sprintf("%.5f",($temp - $starttemp) / ($midtemp2 - $starttemp));
$rval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorR);
$rval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1R);
$rval3 = sprintf("%.5f",$uval**2 * $midcolor2R);
$rval = sprintf("%.0f",(100*($rval1 + $rval2 + $rval3)+0.5)/100);
$gval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorG);
$gval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1G);
$gval3 = sprintf("%.5f",$uval**2 * $midcolor2G);
$gval = sprintf("%.0f",(100*($gval1 + $gval2 + $gval3)+0.5)/100);
$bval1 = sprintf("%.5f",(1-$uval)**2 * $startcolorB);
$bval2 = sprintf("%.5f",2*(1-$uval) * $uval * $midcolor1B);
$bval3 = sprintf("%.5f",$uval**2 * $midcolor2B);
$bval = sprintf("%.0f",(100*($bval1 + $bval2 + $bval3)+0.5)/100);
return sprintf("%02X%02X%02X%02X",$rval,$gval,$bval,$opacity);
}
if ($temp <= $endtemp) {
$uval = sprintf("%.5f",($temp - $midtemp2)/($endtemp - $midtemp2));
$rval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2R);
$rval2 = sprintf("%.5f",2 * (1-$uval) * $uval * $midcolor3R);
$rval3 = sprintf("%.5f",$uval**2 * $endcolorR);
$rval = sprintf("%.0f",(100*($rval1+$rval2+$rval3)+0.5)/100);
$gval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2G);
$gval2 = sprintf("%.5f",2 * (1-$uval) * $uval * $midcolor3G);
$gval3 = sprintf("%.5f",$uval**2 * $endcolorG);
$gval = sprintf("%.0f",(100*($gval1+$gval2+$gval3)+0.5)/100);
$bval1 = sprintf("%.5f",(1-$uval)**2 * $midcolor2B);
$bval2 = sprintf("%.5f",2*(1-$uval)*$uval*$midcolor3B);
$bval3 = sprintf("%.5f",$uval**2 *$endcolorB);
$bval = sprintf("%.0f",(100*($bval1+$bval2+$bval3)+0.5)/100);
return sprintf("%02X%02X%02X%02X",$rval,$gval,$bval,$opacity);
}
}
cooles feature. 8)
noch cooler wäre natürlich eine farbvorgabe für die 3 temperaturen.
etwa: start/0/gelb, mid/50/green, end/100/blue. das wäre dann nett für humidity. aber sicherlich nicht einfach umzusetzen.
gruss frank
ich bin gerade dabei das einzubauen.
oje... :(
Zitat von: frank am 17 Februar 2015, 11:15:29
das wäre dann nett für humidity. aber sicherlich nicht einfach umzusetzen.
das geht doch jetzt schon:
{ Color::pahColor(-100,-50,0,-$humidity) }
Du definierst einfach einen Skalenbereich von -100 bis 0 und übergibst die Luftfeuchtigkeit als negativen Wert.
Dazu bedarf es keiner Funktionsänderung.
Wieso sollte das für humidity nicht einfach umzusetzen sein ? Wir haben zwar kein blaues Wasser hier, aber Schönheit liegt im Auge des Betrachters...
Also: Farbmodell 3, starttemp=10, midtemp2=20, endtemp=30. Und als "Temperaturwert" übergeben (24-humidity/7)
LG
pah
Zitat$opacity //= 255; # set to 255 if no opacity provided in call
mal so am rande gefragt. unter welchem namen findet man diesen operator?
ZitatDu definierst einfach einen Skalenbereich von -100 bis 0 und übergibst die Luftfeuchtigkeit als negativen Wert.
Dazu bedarf es keiner Funktionsänderung.
da hast du fast recht, war ein blödes beispiel. aber ich würde in diesem fall gerne rot ganz entfernen und die mid-temp auf eine definierte farbe setzen können. die gezeigten farbverläufe enden bei mir alle bei irgendwelchen rottönen und echtes gelb kann ich hier gar nicht erkennen. ebnso würde mich in manchen fällen ein farbverlauf gelb/orange/rot interessieren, also ohne blau/grün.
ZitatFarbmodell 3, starttemp=10, midtemp2=20, endtemp=30. Und als "Temperaturwert" übergeben (24-humidity/7)
das muss ich erstmal wirken lassen.
http://perldoc.perl.org/perlop.html#Logical-Defined-Or (http://perldoc.perl.org/perlop.html#Logical-Defined-Or)
Zitat von: Prof. Dr. Peter Henning am 17 Februar 2015, 11:51:47
Wieso sollte das für humidity nicht einfach umzusetzen sein ?
Weil sich Leute, die Änderungen wollen, meistens noch nicht genug mit den bereits vorhandenen Möglichkeiten auseinandergesetzt haben. (und von dieser Regel nehme ich mich selbst ausdrücklich nicht aus!)
Man kann auch eine Skala so weit auseinander, dass ein bestimmter Farbbereich nie erreicht wird, dann bekommt man auch keine Rottöne.
merci ;)
anbei ein etwas überarbeiteter vorschlag:
- die ersten vier parameter sind wie gehabt
- der fünfte parameter kann entweder eines der drei hinterlegten modelle auswählen (0-2)
oder man kann direkt eine array ref mit den 5 farben der stützstellen übergeben - opacity ist jetzt an 6. stelle
- ich habe (fast) alles runden der zwischenergebnisse entfernt. das ist völlig unnötig.
beim vergleich aller drei modelle mit einer schrittweite von 0.0001 grad gibt es zwischen den versionen an einer einzigen stelle eine abweichung von einem bit - es gibt eine interpol routine die die eigentliche interpolation übernimmt.
hier wird noch auf 3 nachkommastellen gerundet, aber nur um die ergebnisse mit der ursprünglichen version zu vergleichen. das kann eigentlich auch raus. es gibt dann ein paar abweichungen mehr aber niemals mehr als 1 bit. also nicht zu sehen.
wenn man die ersten drei parameter passend wählt kann man auch ein array mit nur drei stützsteilen übergeben die frage ist ob man das ganze noch generalisiert und eine beliebige anzahl an stützsteilen erlaubt.
sub pahColor {
my ($starttemp,$midtemp,$endtemp,$temp,$colors,$opacity) = @_;
my @models = ([ 0,255,255 ,
30, 80,255 ,
40,255, 60 ,
160,128, 10 ,
255, 69, 0 ],
[ 0,255,255 ,
120,120,120 ,
40,255, 60 ,
255,255, 0 ,
255, 69, 0 ],
[ 0,69, 255 ,
120,180,180 ,
40,255, 60 ,
255,255, 0 ,
255, 69, 0 ],);
$opacity //= 255; # set to 255 if no opacity provided in call
if( ref($colors) ne "ARRAY" ) {
my $model = $colors // 0; # set to 0 if no model provided in call
$model = ($model < 0 || $model > int(@models)-1) ? 0 : $model; # check valid model
$colors = $models[$model];
}
my( $startcolorR, $startcolorG, $startcolorB,
$midcolor1R,$midcolor1G,$midcolor1B,
$midcolor2R,$midcolor2G,$midcolor2B,
$midcolor3R,$midcolor3G,$midcolor3B,
$endcolorR,$endcolorG,$endcolorB ) = @{$colors};
return sprintf("%02X%02X%02X%02X",$startcolorR,$startcolorG,$startcolorB,$opacity) if ($temp < $starttemp);
return sprintf("%02X%02X%02X%02X",$endcolorR,$endcolorG,$endcolorB,$opacity) if ($temp > $endtemp);
sub interpol($$$$) {
my ($u,$c1,$c2,$c3) = @_;
my $c = $c1*(1-$u)**2 + $c2*2*(1-$u)*$u + $c3*$u**2;
return (100*$c+0.5)/100;
}
if ($temp <= $midtemp) {
my $u = ($temp - $starttemp) / ($midtemp - $starttemp);
my $r = interpol($u,$startcolorR,$midcolor1R,$midcolor2R);
my $g = interpol($u,$startcolorG,$midcolor1G,$midcolor2G);
my $b = interpol($u,$startcolorB,$midcolor1B,$midcolor2B);
return sprintf("%02X%02X%02X%02X",$r+0.5,$g+0.5,$b+0.5,$opacity);
}
if ($temp <= $endtemp) {
my $u = ($temp - $midtemp) / ($endtemp - $midtemp);
my $r = interpol($u,$midcolor2R,$midcolor3R,$endcolorR);
my $g = interpol($u,$midcolor2G,$midcolor3G,$endcolorG);
my $b = interpol($u,$midcolor2B,$midcolor3B,$endcolorB);
return sprintf("%02X%02X%02X%02X",$r+0.5,$g+0.5,$b+0.5,$opacity);
}
}
q.e.d.
Ich wußte doch, dass es wieder auf eine unbenutzbare Lösung rausläuft, wenn Andre da Hand anlegt.
Sehr schade. Muss ich doch weiterhin die Funktion in meinr myUtils benutzen.
und jetzt erzähl du mir mal was unbenutzbar ist:
- die routine erwartet die gleichen parameter
- und liefert exakt die gleichen ergebnisse
wenn das bedeutet es ist unbenutzbar dann ist es deine version auch
- der code ist kürzer und leichter zu warten weil die formel mit der interpoliert wird genau
an einer stelle klar erkennbar steht nicht die gleichen zeilen x mal kopiert sind,
- das ganze ist schneller weil unnützes runden weg fällt
- es ist übersichtlicher weil nicht x unnötige printf vor kommen
- es ist leichter um ein zusätzliches modell zu erweitern weil es genau eine zentrale stelle
gibt an der die stützsteilen stehen
wenn das bedeutet es ist unbenutzbar dann haben wir sehr unterschiedliche ansichten was wartbarkeit und wiederverwendbarkeit angeht.
- ganz nebenbei gibt es mit zwei zeilen zusätzlichem code sogar noch die möglichkeit die stützstellen von aussen zu setzen
was bitte macht deine version deiner meinung nach benutzbarer?
Es ist eigentlich wie immer: Du baust aus irgendeiner Idee anderer Leute eine aus Entwicklersicht technisch sicher supertolle Lösung. Ob ein Anwender aber wirklich versteht, was da passiert, ist Dir ziemlich egal, denn Dir geht es nicht um Anwender, sondern um Dein Ego.
Grundsätzlich geht es nicht darum, ob eine Funktion das gleiche Ergebnis liefert wie vorher, sondern auch darum, einem weniger versierten Anwender eine Chance zu geben, Coding verstehen zu können. Du weisst genau, welche Wissensbandbreite auf Anwenderseite wir hier im Forum haben. Deine Lösungen sind immer nur für die oberen 10% verständlich. So bekommen wir den restlichen 90% nichts beigebracht, sondern fördern die wenig dienliche "copy&paste"-Mentalität.
Aber solche Diskussionen mit Dir zu führen, ist sinnlos. Lass uns einfach darauf verzichten.
Hm, wenn es um die Größe des Ego geht, sollte man lieber nicht auf andere deuten ...
Also lasst den unproduktiven Streit sein.
LG
pah
Hab ich doch geahnt, dass irgendwoher noch jemand mit einem noch größeren Ego kommen wird. Jetzt fehlt hier eigentlich nur noch einer. Mal abwarten...
du bist (mal wieder) der der eine sachliche diskussion abwürgt oder auf eine persönliche ebene zieht statt ein paar sachlichen fragen zu antworten.
gerade mit dem löblichen anspruch anderen etwas beizubringen und es nicht auf copy&paste hinaus laufen zu lassen sind die oben angesprochenen punkte wichtig.
zeilen die zu einem nicht unerheblichen teil aus unnützem oder mehrfach kopiertem bestehen sind genau nicht dazu geeignet. weder als beispiel gegen copy&paste noch als beispiel wie man wartbaren und auch nach ein paar tagen verständlichen code schreibt. davon das es schlicht und einfach falsch ist zwischenergebnisse mehrfach zu runden ganz zu schweigen.
die zentrale idee zwischen einer hand voll stützstellen zu interpolieren ist so gut versteckt das ganz sicher niemand daraus lernt.
also noch mal die sachliche frage: was und warum ist an deiner version verständlicher und besser? was ist an meiner version unverständlich.
Wollen wir mal ein Egometer aufstellen ?
Zurück zur Sache: Ich finde den Code von justme1968 ganz gut.
Allerdings bin ich gegen eine freie Wahl der Stützstellen - das kann nämlich dann beliebig "zackige" Verläufe produzieren.
In meinem Modell haben wir nur eine "Zacke" - nämlich bei der optimalen Temperatur midtemp2.
Will man das verallgemeinern, ohne zusätzliche Zacken hineinzubekommen, muss man dafür sorgen, dass die Verbindungslinien zwischen den Kontrollpunkten (OFF-Punkten) und den echt auf der Kurve liegenden (ON-)Punkten an der Anbindungsstelle zwischen zwei Segmenten kollinear sind. Man könnte auch auf die Angabe von ON-Punkten verzichten und stattdessen - wie bei der Truetype-Spezifikation nur die OFF-Punkte übergeben. Die Routine kann dann selbst für diese Kollinearität sorgen.
LG
pah
Egometer find ich ja cool. Kann man sich das nicht mal fix für ein neues Gadget für die nächste CES schützen lassen ;D
Mal im Ernst! Die Idee ist genial und diese Erbsenzählerei total unwichtig. Ich denke mal für einen Anwender sind Beispiele einfach notwendig. Letztendlich muss die Farbe gefallen und etwas darstellen.
Mir fallen da konkret folgende Beispiele ein :
- Temperatur (haben wir ja nun schon)
- Stromverbrauch
- Wasserverbrauch
- Luftfeuchte
- Benzinpreise
- Füllstand
- Solarertrag
Und ja, es wird auf copy&paste hinauslaufen. Ich lese seit ca. 3 Monate alles mit und versuche auch das ein oder andere Mal auszuhelfen - trotz kleiner Perl-Schwäche.
Die meisten User sind doch über überglücklich Dinge übernehmen zu können. Verbreitung bekommt man nur mit einfacher Umsetzung in die Praxis. Auch ohne es im Detail verstehen zu müssen.
Ich muss doch dem User später nur sagen. Rot bei Strom ist schlecht und grün bei Solar ist super. Wenn lila meine Lieblingsfarbe ist, mache ich lila statt grün.
Dabei ist es wohl egal, ob die interpolierte Zahl später gerundet eine Abweichung von 3 im HSK Farbraum hat.
Oliver
kurze frage zwischendurch (dann könnt ihr euch "weiterzoffen" ;)):
ich versuche gerade die 8-stellige-hex-pahColor aus andres letztem code meinem browser schmackhaft zu machen. welches zauberwort fehlt hier
{'style="color:#pahColor(0,50,100,50,0,0)"'}
hier scheinen nur 6-stellige werte zu funktionieren. das ist im übrigen das nameStyle attribut einer readingsgroup.
ZitatCopy&Paste
Dachte, das kommt in die color.pm? Wozu brauchts dann nochmal ein Copy&Paste **duckundwegrenn**
substr(...,0,6)
also so etwas:{return "style=\"color:#".substr(Color::pahColor(0,50,100,$VALUE,0),0,6)."\""}
gruß
andre
für eine freie wahl der stützstellen (inklusive deren anzahl) ist vermutlich auch ein anderer farbraum besser geeignet. in hsv statt rgb zu arbeiten liefert schon mit einer einfachen linearen interpolation 'anschaulichere' ergebnisse.
Ich hoffe mal, dass Du dabei die HSV-Umrechnung aus meinem "Taschenbuch Multimedia" benutzt - in 50% aller Quellen ist diese nämlich falsch angegeben...
LG
pah
gibt es noch sachliche anmerkungen oder einwände gegen die oben vorgeschlagene neue version ?
prima. :)
(http://forum.fhem.de/index.php?action=dlattach;topic=30128.0;attach=27833)
cellStyle {return "style=\"color:#".substr(pahColor(0,50,100,($COLUMN-1)*5,[255,255,0, 127,255,0, 0,255,0, 0,255,255, 0,127,255],0),0,6)."\""}
Hallo,
gefällt mir sehr gut.
Kann vielleicht jemand erklären wie ich das für eine Philips hue oder LW12 und einem Temperaturfühler umsetzen kann ?
Gruß Holgi
Ich sag ja....Beispiele
define n notify mytemp:temperature {fhem("set lampe ".substr(pahColor(0,15,30,$EVTPART1,0,0),0,6))}
eventuell so. mein einziges rgb-leuchtmittel ist ein monitor, daher nur als prinzip. die funktion in die 99_myUtils, oder warten. versuch macht klug. ;)
ich habe die version von oben eingecheckt und auf der Color.pm seite im wiki eine beschreibung mit beispielen angefangen.
vermutlich ist das meiste aber auf der Temperaturfarbe seite besser aufgehoben.
Besten Dank!
Gruß Holgi
Wenn Ihr mir jetzt noch den Gefallen tut und das Ganze nicht "pahColor" nennt, sondern z.B. "colorScale", bin ich auch zufrieden. So wichtig mir ordentliche Zitate sind: Als Name eines Unterprogramms muss ich nirgendwo auftauchen.
Außerdem ist das auch keine "Falschfarbendarstellung", der Begriff ist anders besetzt. Ich habe das im Wiki schon durch "Farbskala" ersetzt. Außerdem enthält die Wiki-Seite eine Referenz auf den entsprechenden Abschnitt der Color.pm-Seite.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 19 Februar 2015, 04:49:19
Wenn Ihr mir jetzt noch den Gefallen tut und das Ganze nicht "pahColor" nennt, sondern z.B. "colorScale"
oder doch guenther() ... 8)
Zitatguenther()
Aufpassen, dass es keine Patentverletzungen oder so gibt......Immerhin gibts ja zB in Excel auch eine Funktion mit dem Namen Kurt() :D
Ach, danke. Unter meinem Namen findet man schon genügend tolle und originelle Sachen, da braucht es weder eine Excel-Funktion noch eine Perl-Prozedur ;)
Betreffend das Beispiel für die Feuchte von justme1968 im Wiki: Das ist so linear, da braucht es keine Bezier-Approximation.
LG
pah
Hallo, habe es mit dem Beispiel aus dem Wiki probiert. trigger Aussen_Sensor temperature: 20.5
define <n> notify mytemp:temperature {fhem("set lampe rgb ".substr(Color::pahColor(0,15,30,$EVTPART1,0,0),0,6))}
So angepasst:
Aussen_Sensor:temperature.* {fhem("set hue2 rgb".substr(Color::pahColor(0,15,30,$EVTPART1,0,0),0,6))}
Ohne .* gab es garkeine Reaktion mit folgende Meldung im Log:
2015.02.21 13:05:07 3: set hue2 rgb7DAB1D : Unknown argument rgb7DAB1D, choose one of off:noArg on:noArg....
Es scheint als ob nur das leerzeichen zwischen rgb und 7DAB1D fehlt.
Gruß Holgi
Dann füge doch das Leerzeichen in deinem Code zwischen rgb und " ein...
OK, das hat geklappt. Wie ich gesehen habe wurde es im Wiki auch schon geändert. Jetzt beiße ich mit gerade die Zähne daran aus das notify über einen dummy-Schalter ein und aus zu schalten. Vielleicht hat jemand einen Tipp.
Gruß Holgi
attr disable?
Hm, du meinst über ein 2. Notify welches von meinem dummyschalter getriggert wird das Notify disablen bzw enable ?
Oder du nimmst IF und fragst im Notify den Status des Dummy ab.
Das hatte ich gerade erfolglos versucht.
Wie sah denn dein Versuch aus?
So:
temperature.* if((Value("Temp_Licht") eq "on"){fhem("set hue2 rgb ".substr(Color::pahColor(0,15,30,$EVTPART1,0,0),0,6))}
mit der Ausgabe im log:
temp_anzeige return value: Unknown command if((Value("Temp_Licht"), try help.
Ich muß dazu sagen das ich normalerweise fast alles mit DOIF mache, deshalb hier die Schwierigkeiten.
Gruß Holgi
Erstens wurde im Wiki gar nichts geändert - das scheint einfach ein Lesefehler gewesen zu sein.
Zweitens bitte ich darum, solche doch eher generellen Coding-Tipps nicht unter diesem Thread zu diskutieren. ::)
pah
OK, kein Problem verstehe das der Thread nicht zugemüllt werden soll. Im Wiki wurde aber definitiv was geändert, bei copy & paste sollte es eigentlich keine Lesefehler geben. Spielt aber auch keine Rolle, denke jetzt komme ich klar. Besten Dank für die Erweiterung der color.pm.
Gruß Holgi
Quatsch mit Soße. Laste gefälligst Deine eigenen Fehler nicht anderen an >:(
Die Versionsgeschichte im Wiki beweist eindeutig, dass an dieser Stelle keine Änderung erfolgt ist.
pah
Hallo pah,
es liegt mir fern hier irgendjemanden etwas an zu lasten. Ich bin froh das Leute wie du hier kräftig "coden" und entwickeln. Ohne euch gäbe es kein fhem.
Ich möchte auch nicht weiter darauf herumreiten, fakt ist aber das am 18.02.15 das hier geschrieben wurde:
Zitat von: justme1968 am 18 Februar 2015, 21:36:54
ich habe die version von oben eingecheckt und auf der Color.pm seite im wiki eine beschreibung mit beispielen angefangen.
vermutlich ist das meiste aber auf der Temperaturfarbe seite besser aufgehoben.
...und unten im coloc Wiki steht:
Diese Seite wurde zuletzt am 21. Februar 2015 um 14:10 Uhr geändert.
Das beweist für mich das doch noch was geändert wurde, oder irre ich mich ?
Gruß Holgi
aber nicht das leerzeichen hinter rgb...
Ich möchte nicht auch noch darauf rumhacken, aber vielleicht führt das zu einem Abschluss: in DEINEM Ursprünglichen Zitat aus dem Wiki ist das Leerzeichen sogar noch drin und erst durch deine Anpassung verschwunden:
Zitat von: The-Holgi am 21 Februar 2015, 13:24:24
Hallo, habe es mit dem Beispiel aus dem Wiki probiert. trigger Aussen_Sensor temperature: 20.5
define <n> notify mytemp:temperature {fhem("set lampe rgb ".substr(Color::pahColor(0,15,30,$EVTPART1,0,0),0,6))}
So angepasst:
Aussen_Sensor:temperature.* {fhem("set hue2 rgb".substr(Color::pahColor(0,15,30,$EVTPART1,0,0),0,6))}
Ohne .* gab es garkeine Reaktion mit folgende Meldung im Log:
2015.02.21 13:05:07 3: set hue2 rgb7DAB1D : Unknown argument rgb7DAB1D, choose one of off:noArg on:noArg....
Es scheint als ob nur das leerzeichen zwischen rgb und 7DAB1D fehlt.
Gruß Holgi
Mal eine Frage in die Runde: Ich hätte evtl. zwei Anwendungsfälle für die Funktion, jedoch geht es evtl. in die falsche Richtung. Vielleicht könnt ihr mir sagen, wie ihr das machen würdet.
Einerseits würde ich gerne ein Icon für Zimmer-Luftfeuchtigkeit färben. Und zwar soll es bei 50% knall-grün sein. Davon abweichend soll es langsam zu rot wechseln, und dann unterhalb von 20% und oberhalb von 80% voll-rot sein.
Ich hab das jetzt mit pahColor so versucht:
return "humidity\@" . substr(Color::pahColor(20,50,80,$value,[255,0,0, 127,127,0, 0,255,0, 127,127,0, 255,0,0]),0,6);
Jedoch bin ich mir nicht sicher, wie ich midcolor1 und midcolor3 belegen soll. Die Bezierkurve ist vielleicht auch gar nicht nötig.
Zweiter Fall:
Das Icon eines Heizungsaktuators, welches den Öffnungsgrad anzeigt, soll ebenfalls koloriert werden. Und zwar von 0% -> blau, über 50% -> gelb bis zu 100% -> rot.
Dafür habe ich im Moment das hier:
return "sani_heating_level_$value\@" . substr(Color::pahColor(0,50,100,$value,[0,0,255, 127,127,0, 255,255,0, 255,127,0, 255,0,0]),0,6);
Aber auch hier die gleichen Fragen wie davor: Wie midcolor1 und midcolor3 belegen? Und geht es nicht evtl. ganz anders noch besser?
ich habe mir mal eine farbscala für temperaturen erstellt, die von blau (<=0) über grün, gelb (15), orange, rot bis pink (>=30) verläuft. vielleicht kann es einer gebrauchen.
(http://forum.fhem.de/index.php?action=dlattach;topic=30128.0;attach=28644)
die funktion:
pahColor(0,15,30,$temp,[0,196,255, 0,255,0, 255,255,0, 255,0,0, 225,0,225],0)
Zitat von: justme1968 am 17 Februar 2015, 14:01:05
die frage ist ob man das ganze noch generalisiert und eine beliebige anzahl an stützsteilen erlaubt.
hierfür wäre natürlich eine funktion mit mehr stützstellen hervorragend, sodass ich für die farben grün, orange, rot noch bessere temperaturen festlegen könnte. ;)
@vbs
ZitatWie midcolor1 und midcolor3 belegen?
so, dass dir der farbverlauf gefällt. die sollten dann zwischen den angegebenen "temperaturen" liegen. bei dir im ersten fall bei 35 und 65.
gruss frank
Erst einmal scheint Euch nicht ganz klar zu sein, dass es sich bei midcolor 1 und midcolor3 nicht um Stützstellen, sondern um Kontrollpunkte handelt. Im Gegensatz zu einer Interpolation liegen die Zwischenwerte bei einer Bezier-Approximation eben nicht auf der Kurve, sondern steuern nur deren Steifigkeit und Steigung.
Will man also spezifizieren, dass bei bestimmten Temperaturen bestimmte Werte angenommen werden, muss man mehrere Bezier-Segmente aneinanderkleben. Diese können dann quadratischer, kubischer oder höherer Ordnung sein. Auch könnte man sie mit Knick, oder ohne Knick anordnen. In der von mir vorgeschlagenen Funktion sind zwei quadratische Bezier-Segmente mit Knick aneinander geklebt worden. Will man also mehr Werte fixieren, geht das nach genau dem gleichen Prinzip - im Prinzip könnte man auch dieselbe Funktion mit anderen Parametern aufrufen.
Alternativ könnte man auch statt einer Bezier-Approximation eine Interpolation nehmen - also z.B. Stützstellen (die auf der Kurve liegen) durch Splines o.ä. verbinden.
Zweitens scheint Euch auch nicht klar zu sein, dass das menschliche Wahrnehmungsvermögen nicht ausreicht, mehr als ca. 10 Farben hinreichend genau voneinander zu unterscheiden. Damit ist es aber vollkommen witzlos, genauere Interpolationen festzulegen - das enthält keinerlei sinnvolle Information.
LG
pah
Zitatim Prinzip könnte man auch dieselbe Funktion mit anderen Parametern aufrufen.
gute idee, danke. werde ich mal probieren.
bisher habe ich die temperaturabhängige einfärbung stufenweise für bestimmte bereiche vorgenommen. dabei gibt es folgende bereiche: < 0 (frost-blau), > 0 (ungeheizt-grün), > 15 (klimatisiert-gelb), > 18 (erwärmt-orange), > 21 (warm-rot), > 30 (heiss-pink).
auf diese weise kann ich während der heizphase gut erkennen, welche räume geheizt werden. im prinzip alles ab gelb, wobei ein höherer rotanteil dann die zu erbringende heizleistung symbolisiert. der bereich ab 30 grad ist eher für den sommer gedacht.
mit der color-funktion versuche ich nun einen kontinuierlicheren verlauf zu bekommen, um eventuell mehr infos auf einen blick zu bekommen. zb: wie weit ist die frostgrenze in ungeheizten bereichen entfernt? sind die heizungen in ungenutzten bereichen entsprechend eingestellt? etc. aber wie bereits angedeutet, kann die color-funktion auch kontrproduktiv werden, wenn die resultierenden farben zu viele zwischentöne ergeben.
gruss frank
Hallo betateilchen,
kannst Du einem Anfänger näher bringen, wie Du die wunderbaren Grafiken (Anwort#17) mit Hilfe des angesprochenen InfoPanel's erzeugst?
VG mb
Falscher Thread.
pah
Zitat:
Falscher Thread.
"Tret" meint er, er will ja nur helfen.
Achtung, Trollgefahr.
pah
ihr seit aber auch zwei "raufbolde". :)
Hallo und guten morgen..
ich hab ne frage, kann man das colorpath ding auch anwenden um die Farben von werten zu ändern? zb. je nach aussentemperatur ändert sich die Farbe des Wertes ... derzeit habe ich das mittels readingsgroup geändert aber das ist etwas mühsam.
danke
Natürlich. Einfach den HTML-Code für den "Wert" durch ein Perl-Programm erzeugen, das die Farbe dynamisch anpasst.
LG
pah
aha, interessant, aber ich versteh leider nur Bahnhof...
und wie macht ma so was?
kann ich dieses Perl-Programm dann für die anderen werte auch verwenden oder muß dieses für jeden wert erzeugt werden? ich meine, kann das so wie eine vba function verwendet werden - der wert sieht nach welche farbe er haben soll - sorry meine formulierung, tu mir mit programmieren etwas schwer....
danke schon mal fürs laien-verständnis ;-)