Temperatur in Farbe umsetzen

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

Vorheriges Thema - Nächstes Thema

Icinger

Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

betateilchen

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

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

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

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

betateilchen

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

justme1968

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

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

betateilchen

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

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

betateilchen

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

justme1968

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

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

Prof. Dr. Peter Henning

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

oliverk


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




Fhem: 5.7 auf RaspPi / Fhem: 5.7 auf Cubie
ca. 80 net4home Buskomponenten
zum Spielen diverse FS20, HomeMatic, EnOcean, hue Geräte, Fritz!Box 7490, Fritz!Dect 200, netatmo, eve

frank

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

Icinger

ZitatCopy&Paste

Dachte, das kommt in die color.pm? Wozu brauchts dann nochmal ein Copy&Paste **duckundwegrenn**
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

justme1968

#59
substr(...,0,6)

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

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

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