FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Prof. Dr. Peter Henning am 07 Dezember 2014, 22:18:23

Titel: Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 07 Dezember 2014, 22:18:23
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)





Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 08 Dezember 2014, 11:03:26
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 08 Dezember 2014, 11:15:07
Wer ist denn Maintainer von Color.pm ?

LG

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 08 Dezember 2014, 11:28:54
ich würde es gerne in Color.pm aufnehmen.

gruß
  andre
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Hauswart am 08 Dezember 2014, 11:30:15
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 08 Dezember 2014, 14:47:21
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 05 Februar 2015, 11:48:10
Hat sich denn in dieser Sache in den vergangenen zwei Monaten etwas ergeben?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 05 Februar 2015, 12:00:28
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 05 Februar 2015, 12:10:11
Schade...

Würdest Du eventuell Deinen aktuell verwendeten Codeschnipsel kundtun?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 07 Februar 2015, 21:14:49
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);
}

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: hexenmeister am 07 Februar 2015, 22:22:50
wirklich schöner Verlauf. Kann man das irgendwo für "die Allgemeinheit" aufnehmen. Color.pm oder so...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 07 Februar 2015, 23:10:28
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: MadCat am 07 Februar 2015, 23:41:50
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 08 Februar 2015, 10:51:11
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;
}

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 08 Februar 2015, 11:30:39
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;
}

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 09 Februar 2015, 09:22:23
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 13 Februar 2015, 13:22:09
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)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 13 Februar 2015, 16:20:27
fertsch...

(http://debian.fhem.de/grafik/pahcolor.png)

Die Funktion wird mit maximal fünf Parametern aufgerufen:

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

}
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: P.A.Trick am 13 Februar 2015, 17:17:50
Cool! Wie erstellst du denn die Grafik?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 13 Februar 2015, 17:21:50
Mittels eines InfoPanels.

Aber wieso musst Du für eine solche simple Frage einen kompletten Beitrag zitieren?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: P.A.Trick am 13 Februar 2015, 17:22:39
Besser?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 13 Februar 2015, 17:23:33
ja, danke. Denn nicht jeder arbeitet mit einem 27" Monitor ;)

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: P.A.Trick am 13 Februar 2015, 17:24:42
Nicht? Ich dachte das ist heute Standard?  :)
Nun aber BTT!
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 13 Februar 2015, 19:21:42
@betateilchen: Prima. Ist das dann schon in Color.pm drin ?

LG

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 13 Februar 2015, 19:32:38
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)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 14 Februar 2015, 06:55:06
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 14 Februar 2015, 13:23:19
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.

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 14 Februar 2015, 18:25:01
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 16 Februar 2015, 23:49:38
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 :)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 00:11:30
ist eingecheckt als Color::pahColor
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 00:20:25
die nächste Funktion, die ich irgendwann zum Einchecken vorschlage, wird "guenther" heissen... mal schauen...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 00:29:02
use utf8;
sub günter{}
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 00:29:49
mir kommen keine Umlaute in Funktionsnamen...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 01:01:28
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 04:32:54
@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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 08:17:19
Zitat von: Prof. Dr. Peter Henning am 17 Februar 2015, 04:32:54
@justme1968: Welche Version der Parameter ist denn jetzt eingecheckt ?

Die erste.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 08:34:06
Meine Chefin steht auf blau. Darum läuft bei mir nur noch die dritte...

LG

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 08:40:16
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".
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 09:22:53
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);
   }

}

Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 17 Februar 2015, 11:15:29
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 11:16:42
ich bin gerade dabei das einzubauen.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 11:28:11
oje...  :(
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 11:35:03
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 11:51:47
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 17 Februar 2015, 11:56:54
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Icinger am 17 Februar 2015, 11:58:44
http://perldoc.perl.org/perlop.html#Logical-Defined-Or (http://perldoc.perl.org/perlop.html#Logical-Defined-Or)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 11:59:45
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 17 Februar 2015, 12:38:44
merci  ;)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 14:01:05
anbei ein etwas überarbeiteter vorschlag: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);
  }   
}
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 16:12:17
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 16:21:31
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?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 16:36:20
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 16:39:21
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 17 Februar 2015, 16:43:04
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...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 16:51:07
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 16:54:25
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: oliverk am 17 Februar 2015, 17:23:10

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 :


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




Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 17 Februar 2015, 17:36:31
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Icinger am 17 Februar 2015, 17:46:55
ZitatCopy&Paste

Dachte, das kommt in die color.pm? Wozu brauchts dann nochmal ein Copy&Paste **duckundwegrenn**
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 18:10:52
substr(...,0,6)

also so etwas:{return "style=\"color:#".substr(Color::pahColor(0,50,100,$VALUE,0),0,6)."\""}

gruß
  andre
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 17 Februar 2015, 18:23:06
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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 17 Februar 2015, 19:10:07
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 18 Februar 2015, 09:55:42
gibt es noch sachliche anmerkungen oder einwände gegen die oben vorgeschlagene neue version ?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 18 Februar 2015, 12:13:37
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)."\""}
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 18 Februar 2015, 13:49:03
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: oliverk am 18 Februar 2015, 20:06:25
Ich sag ja....Beispiele
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 18 Februar 2015, 20:39:21
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.  ;)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag 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.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 19 Februar 2015, 01:13:26
Besten Dank!

Gruß Holgi
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag 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", 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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: betateilchen am 19 Februar 2015, 08:21:57
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)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Icinger am 19 Februar 2015, 08:26:42
Zitatguenther()

Aufpassen, dass es keine Patentverletzungen oder so gibt......Immerhin gibts ja zB in Excel auch eine Funktion mit dem Namen Kurt() :D
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 19 Februar 2015, 11:10:02
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag 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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: RoBra81 am 21 Februar 2015, 14:58:46
Dann füge doch das Leerzeichen in deinem Code zwischen rgb und " ein...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 23 Februar 2015, 15:30:33
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: RoBra81 am 23 Februar 2015, 15:40:58
attr disable?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 23 Februar 2015, 15:49:22
Hm, du meinst über ein 2. Notify welches von meinem dummyschalter getriggert wird das Notify disablen bzw enable ?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: RoBra81 am 23 Februar 2015, 15:50:57
Oder du nimmst IF und fragst im Notify den Status des Dummy ab.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 23 Februar 2015, 15:57:21
Das hatte ich gerade erfolglos versucht.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: RoBra81 am 23 Februar 2015, 15:58:51
Wie sah denn dein Versuch aus?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 23 Februar 2015, 16:04:48
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 23 Februar 2015, 21:09:41
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 24 Februar 2015, 00:10:02
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 24 Februar 2015, 08:02:24
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: The-Holgi am 24 Februar 2015, 14:15:17
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: justme1968 am 24 Februar 2015, 14:16:23
aber nicht das leerzeichen hinter rgb...
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: RoBra81 am 24 Februar 2015, 14:21:16
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: vbs am 27 Februar 2015, 23:40:22
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?
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 04 März 2015, 13:41:22
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 04 März 2015, 19:18:51
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 05 März 2015, 12:33:53
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: mbfhem am 09 September 2015, 22:53:36
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 10 September 2015, 05:36:38
Falscher Thread.

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Elektrolurch am 10 September 2015, 08:35:01
Zitat:
Falscher Thread.

"Tret" meint er, er will ja nur helfen.
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 10 September 2015, 12:46:10
Achtung, Trollgefahr.

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: frank am 10 September 2015, 13:33:53
ihr seit aber auch zwei "raufbolde".  :)
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: MichlB am 22 August 2018, 08:03:42
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
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: Prof. Dr. Peter Henning am 22 August 2018, 09:13:38
Natürlich. Einfach den HTML-Code für den "Wert" durch ein Perl-Programm erzeugen, das die Farbe dynamisch anpasst.


LG

pah
Titel: Antw:Temperatur in Farbe umsetzen
Beitrag von: MichlB am 22 August 2018, 13:11:41
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 ;-)