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