Stufenloses Colormapping in Readingsgroup und Anderswo

Begonnen von peterk_de, 25 August 2014, 00:25:15

Vorheriges Thema - Nächstes Thema

peterk_de

Hallo Gemeinde,

ich habe mir für meine Tablet-PC-Raumübersicht einmal eine Mapping-Funktion von beliebigen Werten auf Farben gebaut. Die Idee war, nicht nur diskrete Zustände zu haben (schlecht = rot; gut = grün), sondern beliebige Zwischenwerte. Das ganze könnte beispielsweise wie im angehängten Bild aussehen (siehe vor allem Spalte "Ist" oder "Luftf.").

Hierzu fügt ihr in Eure 99_myUtils.pm folgende 2 Funktionen ein:


sub val2col($$) {
my ($val,$colormap) = @_;
       
        my %colormaps = (
             'temp_indoor' =>  { 19 => [0,0,255],
                                 20 => [255,255,255],
                                 21 => [255,255,255],
                                 22 => [255,128,0],
                                 23 => [255,0,0]},
             'temp_outdoor' => {  0 => [0,0,255],
                                 10 => [128,128,128],
                                 20 => [128,128,128],
                                 25 => [255,255,0],
                                 27 => [255,0,0]},
             'ppm_co2'    =>    { 750 => [128,255,255],
                                 1000 => [255,128,0],
                                 1500 => [255,0,0]},
             'humidity' =>     { 40 => [255,255,0],
                                 45 => [128,128,128],
                                 55 => [128,128,128],
                                 60 => [255,128,0],
                                 70 => [255,0,0]},
        );
       
        my %colmap = %{%colormaps->{$colormap}};
        my $num_cols = scalar keys %colmap; 

        my @col1;
        my @col2;

my $val1;
        my $val2;

        my $i = 0;
        foreach my $v (sort {$a<=>$b} keys %colmap)
        {
           if ((($val < $v) && ($i == 0)) || (($val > $v) && ($i == ($num_cols-1)))) {
             #Log 1, "val2col - Value: $val Return v: $v i: $i num_cols: $num_cols";
             return @{%colmap->{$v}};
             last;
           } elsif ($val >= $v) {
               $val1 = $v;
               @col1 = @{%colmap->{$v}};
           } else {
               $val2 = $v;
               @col2 = @{%colmap->{$v}};
               last;
           }
           $i++;
        }

        my $pct = ($val - $val1) / ($val2 - $val1);
        $pct = ($pct>1?1:($pct<0?0:$pct));

        my @result_col_rgb = (int($col1[0]*(1-$pct)+$col2[0]*$pct),
                              int($col1[1]*(1-$pct)+$col2[1]*$pct),
                              int($col1[2]*(1-$pct)+$col2[2]*$pct));

        return @result_col_rgb;
}


sub val2col_css($$) {
  my ($r,$g,$b) = val2col($_[0],$_[1]);
  return ("color:rgb($r,$g,$b)");
}


In eurer Readingsgroup setzt ihr dann das Valuestyle-Attribut z.B. folgendermaßen:


{ if($READING eq "humidity") { 'style="'.val2col_css($VALUE,"humidity").';font-weight:bold"'} elsif($READING eq "measured-temp" || $READING eq "temperature") {'style="'.val2col_css($VALUE,"temp_indoor").';"'} elsif($READING eq "voc") { 'style="'.val2col_css($VALUE,"ppm_co2").';font-weight:bold"'}}


Entscheidend ist hierbei der Funktionsaufruf a la val2col_css($VALUE,"temp_indoor"). Hiermit wählt ihr eine von den in der my_Utils definierten "Mapping-Tabellen" aus. In diesem Fall also:


             'temp_indoor' =>  { 19 => [0,0,255],
                                 20 => [255,255,255],
                                 21 => [255,255,255],
                                 22 => [255,128,0],
                                 23 => [255,0,0]},


Das ganze ist damit komplett flexibel: Vorne steht der Wert (z.B. 18 Grad), dahinter in eckigen Klammern die Farbe als RGB-Wert. Zwischen den einzelnen Stufen  (also z.B. zwischen 18 und 20 Grad) wird die Farbe linear interpoliert (das verbessere ich ggf. noch auf eine schönere Farbinterpolation im HSV-Raum). Unter dem kleinsten bzw. über dem größten Wert wird die jeweilige Farbe pur verwendet.

Kann natürlich auch ohne Readingsgroup direkt in der GUI verwendet werden - oder auch sogar zur Ansteuerung von Farb-LEDs. Anregungen, Wünsche, Fragen oder auch eigene Beispiele und jemand der es ins Wiki stellt sind willkommen. Viel Spaß :-)

Edit: Besserer Screenshot / gleiche Mapping-Tabellen im Code wie für Screenshot verwendet
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

justme1968

ich würde das gerne nach Color.pm übernehmen und dann auch dort auf der wiki seite beschreiben.

wenn du magst erinnere mich bitte noch mal per pm daran. dann schaue ich es mir an wenn ich zurück bin

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

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

peterk_de

Ah das klingt cool! Da müsste man dann evtl. bloß noch die Farbmapping-Regeln aus der Funktion auslagern, so dass man sich selbst weiterhin welche anlegen kann (und nicht in der Color.pm herumeditieren muss).

Ich bau derweil mal noch die HSV-Interpolation. Dazu wollte ich die rgb2hsv() aus der Color.pm nutzen, war aber dran gescheitert, ich glaub da ist n Bug drin, da hab ich nur murks zurückbekommen. hsv2rgb() ging jedoch wie ichs erwartete. Könnte aber auch an der späten Stunde gelegen haben.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

fh168

Hallo,

ich habe mal in meinen Logs geschaut und es werden Fehler geworfen für jeden meiner TX-29 DT-H Sensoren.


2014.11.28 08:58:39 5: Triggering rg_Temperaturen (1 changes)
2014.11.28 08:58:39 5: Notify loop for rg_Temperaturen solarThermo.humidity: 38.0 %
2014.11.28 08:58:44 4: remoterpi: JeeLink jeelinkcross OK 9 40 1 4 194 106
2014.11.28 08:58:44 5: jeelinkcross dispatch OK 9 40 1 4 194 106
2014.11.28 08:58:44 5: Triggering 06Thermo (2 changes)
2014.11.28 08:58:44 5: Notify loop for 06Thermo temperature: 21.8
2014.11.28 08:58:44 5: Triggering rg_Temperaturen (1 changes)
2014.11.28 08:58:44 5: Notify loop for rg_Temperaturen 06Thermo.temperature: <div style="color:rgb(255,153,50);">21.8°C</div>
2014.11.28 08:58:44 4: WohnzimmerTemperatur: LaCrosse WohnzimmerTemperatur temperature: 21.8
2014.11.28 08:58:44 5: Triggering WohnzimmerTemperatur (1 changes)
2014.11.28 08:58:44 5: Notify loop for WohnzimmerTemperatur temperature: 21.8
2014.11.28 08:58:45 4: WohnzimmerTemperatur: LaCrosse WohnzimmerTemperatur battery: ok
2014.11.28 08:58:45 5: Triggering WohnzimmerTemperatur (1 changes)
2014.11.28 08:58:45 5: Notify loop for WohnzimmerTemperatur battery: ok
2014.11.28 08:58:47 4: remoterpi: JeeLink jeelinkcross OK 9 20 1 4 196 40
2014.11.28 08:58:47 5: jeelinkcross dispatch OK 9 20 1 4 196 40
2014.11.28 08:58:47 5: Triggering 04Thermo (3 changes)
2014.11.28 08:58:47 5: Notify loop for 04Thermo temperature: 22
2014.11.28 08:58:47 5: Triggering rg_Temperaturen (1 changes)
2014.11.28 08:58:47 5: Notify loop for rg_Temperaturen 04Thermo.temperature: <div style="color:rgb(255,128,0);">22.0°C</div>
2014.11.28 08:58:47 2: Can't use an undefined value as a HASH reference at ./FHEM/99_myUtils.pm line 203.

Im Frontend sieht alles takko aus

Küche
22.8°C
40.0 %
Keller
15.4°C
58.0 %
Büro
22.0°C
40.2 %
Wohnzimmer gross
22.7°C
51.0 %
Entertainment-Room
21.9°C
Schreibtisch TFA
20.3°C
44.0 %
Balkon
5.7°C
78.8 %
Kühlschrank
-19.9°C
74.4 %
Badezimmer
24.3°C
47.1 %
YahooWetter
4.0°C
95.0 %
Solar
22.9°C
38.0 %

LG
/robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

peterk_de

Erst etwas spät bemerkt, sorry: Soweit ich das erkennen kann, hat das aber nichts mit der val2col-Funktion zu tun, sondern mit deinen Notifys. Kannst ja ggf. mal deren Definition posten, dann guck ich mal drüber.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...