Temperatur in Farbe umsetzen

Begonnen von Prof. Dr. Peter Henning, 07 Dezember 2014, 22:18:23

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

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)






betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Prof. Dr. Peter Henning


justme1968

ich würde es gerne in Color.pm aufnehmen.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Hauswart

1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Prof. Dr. Peter Henning

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

betateilchen

Hat sich denn in dieser Sache in den vergangenen zwei Monaten etwas ergeben?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Prof. Dr. Peter Henning

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

betateilchen

Schade...

Würdest Du eventuell Deinen aktuell verwendeten Codeschnipsel kundtun?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#9
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);
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hexenmeister

wirklich schöner Verlauf. Kann man das irgendwo für "die Allgemeinheit" aufnehmen. Color.pm oder so...

justme1968

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 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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

MadCat

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.

betateilchen

#13
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 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;
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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;
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!