Temperatur in Farbe umsetzen

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

Vorheriges Thema - Nächstes Thema

betateilchen

die nächste Funktion, die ich irgendwann zum Einchecken vorschlage, wird "guenther" heissen... mal schauen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

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

betateilchen

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.
-----------------------
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

@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

betateilchen

Zitat von: Prof. Dr. Peter Henning am 17 Februar 2015, 04:32:54
@justme1968: Welche Version der Parameter ist denn jetzt eingecheckt ?

Die erste.
-----------------------
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

Meine Chefin steht auf blau. Darum läuft bei mir nur noch die dritte...

LG

pah

betateilchen

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

betateilchen

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

}

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

frank

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
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

ich bin gerade dabei das einzubauen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

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

betateilchen

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.
-----------------------
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

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

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html