Farbe anhand Zahlenwertes

Begonnen von satprofi, 19 Mai 2025, 12:34:34

Vorheriges Thema - Nächstes Thema

satprofi

Hallo.
Möchte die stündlichen Strompreise in einer Tabelle darstellen. Das ist das schon mal passiert.
Aber wie schaffe ich es die Farben so einzustellen, das , wenn Wert grösser , gleich oder kleiner als "reading durchschnitt" , sich die in rot,weiss,grün färben?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Sailor

Moin satprofi

Das Forum kann dir nicht helfen, wenn du nicht ein paar Infos bereitstellst.

  • Wie hast du die Tabelle denn bisher dargestellt?
  • Woher kommen die Daten?
  • Was willst Du erreichen?
  • Wie lautet der "list" der entsprechenden Devices?

Gruss
    Sailor
******************************
Man wird immer besser...

satprofi

#2

Auszug aus Tabelle
<ftui-grid-tile row="1" col="2" height="1" width="1.5" [color]="Strompreis_heute:Durchschnitt | step('10:danger, 5:orange, -30:ok') ">
        <ftui-row>
          <ftui-label text="00-01h" size="1"></ftui-label>
          </ftui-row>
        <ftui-row>
          <ftui-label [text]="Strompreis_heute:00-01h" size="1" bold>
            <span slot="unit" class="size--1"></span>
          </ftui-label>
        </ftui-row>
        <ftui-row>
          <ftui-cell width="80%">
            <ftui-row align-items="center">
              <ftui-label text="cent/kWh" size="1" color="white"></ftui-label>
            </ftui-row>
      </ftui-grid-tile>

List von Device das readings liefert, will die color, wenn über Durchschnitt in rot, unter minimum in grün und dazwischen orange, darstellen

READINGS:
     2025-05-20 00:01:00   00-01h          15.479
     2025-05-20 00:01:00   01-02h          14.635
     2025-05-20 00:01:00   02-03h          14.179
     2025-05-20 00:01:00   03-04h          14.203
     2025-05-20 00:01:00   04-05h          14.537
     2025-05-20 00:01:00   05-06h          15.715
     2025-05-20 00:01:00   06-07h          18.907
     2025-05-20 00:01:00   07-08h          17.672
     2025-05-20 00:01:00   08-09h          13.217
     2025-05-20 00:01:00   09-10h          11.707
     2025-05-20 00:01:00   10-11h          9.166
     2025-05-20 00:01:00   11-12h          3.361
     2025-05-20 00:01:00   12-13h          2.099
     2025-05-20 00:01:00   13-14h          2.632
     2025-05-20 00:01:00   14-15h          2.706
     2025-05-20 00:01:00   15-16h          4.835
     2025-05-20 00:01:00   16-17h          9.846
     2025-05-20 00:01:00   17-18h          13.747
     2025-05-20 00:01:00   18-19h          14.92
     2025-05-20 00:01:00   19-20h          17.062
     2025-05-20 00:01:00   20-21h          19.513
     2025-05-20 00:01:00   21-22h          17.587
     2025-05-20 00:01:00   22-23h          15.208
     2025-03-29 00:09:00   23-04h          9.822
     2025-05-20 00:01:00   23-24h          14.874
     2025-05-20 08:01:00   Durchschnitt    12.30516
     2025-05-20 08:01:00   Now             13.2
     2025-05-20 00:03:00   halfprice       9.7565
     2025-05-20 08:01:00   max             19.513
     2025-05-20 00:03:00   middle          12.868452
     2025-05-20 08:01:00   min             2.099
     2025-05-20 00:03:00   minimum         7.2537
     2025-05-20 08:01:00   now             13.217
Attributes:
   event-on-change-reading .*
   group      JsonMod,dummy
   interval   1 0 * * *
   readingList single((jsonPath('$.data.0.value') + 1.44 ), '00-01h', 'date_00');
single((jsonPath('$.data.4.value') + 1.44 ), '01-02h', '');
single((jsonPath('$.data.8.value') + 1.44 ), '02-03h', '');
single((jsonPath('$.data.12.value') + 1.44), '03-04h', '');
single((jsonPath('$.data.16.value') + 1.44 ), '04-05h', '');
single((jsonPath('$.data.20.value') + 1.44 ), '05-06h', '');
single((jsonPath('$.data.24.value') + 1.44 ), '06-07h', '');
single((jsonPath('$.data.28.value') + 1.44 ), '07-08h', '');
single((jsonPath('$.data.32.value') + 1.44 ), '08-09h', '');
single((jsonPath('$.data.36.value') + 1.44 ), '09-10h', '');
single((jsonPath('$.data.40.value') + 1.44 ), '10-11h', '');
single((jsonPath('$.data.44.value') + 1.44 ), '11-12h', '');
single((jsonPath('$.data.48.value') + 1.44), '12-13h', '');
single((jsonPath('$.data.52.value') + 1.44 ), '13-14h', '');
single((jsonPath('$.data.56.value') + 1.44 ), '14-15h', '');
single((jsonPath('$.data.60.value') + 1.44 ), '15-16h', '');
single((jsonPath('$.data.64.value') + 1.44 ), '16-17h', '');
single((jsonPath('$.data.68.value') + 1.44 ), '17-18h', '');
single((jsonPath('$.data.72.value') + 1.44 ), '18-19h', '');
single((jsonPath('$.data.76.value') + 1.44 ), '19-20h', '');
single((jsonPath('$.data.80.value') + 1.44 ), '20-21h', '');
single((jsonPath('$.data.84.value') + 1.44 ), '21-22h', '');
single((jsonPath('$.data.88.value') + 1.44 ), '22-23h', '');
single((jsonPath('$.data.92.value') + 1.44 ), '23-24h', '');

   room       HTTPMOD,SolarEdge,Stromkosten
   stateFormat {sprintf("%0.2f", ReadingsVal($name,"now",0))}
   userReadings Durchschnitt:13-14h:.* {(ReadingsNum("$name","00-01h",0) + ReadingsNum("$name","01-02h",0) + ReadingsNum("$name","02-03h",0) + ReadingsNum("$name","03-04h",0) + ReadingsNum("$name","04-05h",0) + ReadingsNum("$name","05-06h",0) + ReadingsNum("$name","06-07h",0) + ReadingsNum("$name","07-08h",0) + ReadingsNum("$name","08-09h",0) + ReadingsNum("$name","09-10h",0) + ReadingsNum("$name","10-11h",0) + ReadingsNum("$name","11-12h",0) + ReadingsNum("$name","12-13h",0) + ReadingsNum("$name","13-14h",0) + ReadingsNum("$name","14-15h",0) + ReadingsNum("$name","15-16h",0) + ReadingsNum("$name","16-17h",0) + ReadingsNum("$name","17-18h",0) + ReadingsNum("$name","18-19h",0) + ReadingsNum("$name","19-20h",0) + ReadingsNum("$name","20-21h",0) + ReadingsNum("$name","21-22h",0) + ReadingsNum("$name","22-23h",0) + ReadingsNum("$name","23-24h",0) )/24},
Now {sprintf("%.1f",ReadingsNum("Strompreis_heute","now","???"))}
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Guybrush

steht doch alles im wiki

https://wiki.fhem.de/wiki/FTUI3_F%C3%BCllstand_Zisterne

nimm den modifier step und setz das bei [color]. statt zisterne_00 etc dann halt die farbcodes


Sailor

Zitat von: satprofi am 20 Mai 2025, 08:49:33Auszug aus Tabelle

Wir reden also über eine Tabelle innerhalb von ftui3.
Was möchtest du denn jetzt werteabhängig färben?

  • den Zelleninhalt
  • den Zellenhintergrund
  • den ganzen Tabellenrahmen


Dieser Code ist schon mal richtig,
[color]="Strompreis_heute:Durchschnitt | step('10:danger, 5:orange, -30:ok') "aber ich fürchte der steht an der falschen Stelle.
Sollte dieser nicht als Teil des "label" stehen?

Gruss
    Sailor
******************************
Man wird immer besser...

satprofi

Zitat von: Guybrush am 20 Mai 2025, 09:30:15steht doch alles im wiki

https://wiki.fhem.de/wiki/FTUI3_F%C3%BCllstand_Zisterne

nimm den modifier step und setz das bei [color]. statt zisterne_00 etc dann halt die farbcodes



hallo.
das hab ich ja jetzt auch. will es aber so:

Durchschnitt 10 , zelle 1 hat wert 15 , also rot färben
Minimum hat 2 , zelle 6 hat 1 , grün färben
zellen mit werten zwischen Durchschnitt und minimum orange färben
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

#6
Zitat von: Sailor am 20 Mai 2025, 09:43:15
Zitat von: satprofi am 20 Mai 2025, 08:49:33Auszug aus Tabelle

Wir reden also über eine Tabelle innerhalb von ftui3.
Was möchtest du denn jetzt werteabhängig färben?

  • den Zelleninhalt
  • den Zellenhintergrund
  • den ganzen Tabellenrahmen


Gruss
    Sailor


Zellenhintergrund , und jede zelle einzeln .
z.b.:
Durchschnitt 10 , zelle 1 hat wert 15 , also rot färben
Minimum hat 2 , zelle 6 hat 1 , grün färben
zellen mit werten zwischen Durchschnitt und minimum orange färben
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

tobi01001

Deine Herausforderung besteht also darin, dass die Werte für Step bzw Map dynamisch (abhängig vom Tagesdurchschnitt) und nicht fix sind?

Ich würde dafür (user)Readings definieren, die genau das abbilden.
Bei mir sieht das so aus (content file):
<ftui-label
[text]="n_EVU_Tibber_2:tb_price_next_{{tb_hour}}"
size=1
[color]="n_EVU_Tibber_2:tb_pLevel_next_{{tb_hour}} | map('VERY_CHEAP:green, CHEAP:yellow, NORMAL:orange, EXPENSIVE|VERY_EXPENSIVE:red')"
[class-name]="n_EVU_Tibber_2:tb_pLevel_next_{{tb_hour}} {{tb_class}}"
>
</ftui-label>
In tb_pLevel_next_xx steht dann eben die Zuordnung CHEAP berechnet aus den Tageswerten für die jeweilige Stunde (bzw 12 Stunden in die Zukunft) etc...
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

satprofi

Hmmm, ich habe ja 24 userreadings. Ich müsste ja nur den Vergleich mappen.

[color]="n_EVU_Tibber_2:tb_pLevel_next_{{tb_hour}} | map('Strompreis_heute:00-01h<Strompreis_heute:minimum:green,')"

Nur wie mach ich das?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

yersinia

Zitat von: satprofi am 20 Mai 2025, 22:23:53Nur wie mach ich das?
Jdfs nicht im FTUI3 innerhalb einer pipe, die Fragestellung hatten wir in letzter Zeit öfters; siehe auch #3798 - #3803.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Prof. Dr. Peter Henning

Perl-Funktion, die ein userReading befüllt, das wiederum von FTUI3 gelesen wird.

LG

pah

satprofi

#11
So, wenns nicht anders geht, dann die umständlichere Methode.
24 dummys angelegt, jeder bekam das "stateFormat"
{ my $c=ReadingsVal("Strompreis_heute","00-01h","");
  my $ca=ReadingsVal("Strompreis_heute","Durchschnitt","");
  my $ch=ReadingsVal("Strompreis_heute","minimum","");
  my $ret;
  if($c > $ca){ $ret="teuer";
  }elsif($c < $ch){ $ret=sprintf("billig");
  }elsif($c < $ca and $c > $ch){$ret=sprintf("normal");
} $ret}

das dann im FTUI 24x ausgewertet wird

<ftui-grid-tile row="2" col="2" height="1" width="1.5" [color]="1:STATE | map('billig: green, normal: orange, teuer: red') ">
        <ftui-row>
          <ftui-label text="00-01h" size="1"></ftui-label>
          </ftui-row>
        <ftui-row>
          <ftui-label [text]="Strompreis_heute:00-01h" size="4" bold>
            <span slot="unit" class="size--1"></span>
          </ftui-label>
        </ftui-row>
<ftui-row>
          <ftui-cell width="80%">
           
      </ftui-grid-tile>

im Anhang das Ergebnis.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Prof. Dr. Peter Henning

#12
Hmmm. Warum nicht _ein_ Dummy mit 24 entsprechenden Readings?

Wenn man diese nach der Start-Uhrzeit des Preises benennt, kann man problemlos in einem Algorithmus das passende Herausholen.

Und die Anzeige in einem Rechteck ist auch nicht sehr ergonomisch.

LG

pah

Edit: In Deinem Code wundert mich ein wenig, wieso der aktuelle Preis $c kleiner als das Minimum $ch sein kann.

Ich halte für sinnvoller, mir die 4-Stunden-Periode mit dem geringsten Strompreis anzeigen zu lassen:

###############################################################################
#
#  aWATTar get lowest 4 hours
#
###############################################################################

sub aWATTl4(){
  my $i;
  my %daylist1=();
  my %daylist2=();
  for($i=1;$i<25;$i++){
    #-- careful - data01_price is valid starting at midnight
    my $dm=sprintf("%02d",$i-1);
    my $dn=sprintf("%02d",$i);
    $daylist1{$dm}=ReadingsVal("aWATTar","data".$dn."_price",0);
  }
  $i=0;
  foreach my $h (sort { $daylist1{$a} <=> $daylist1{$b} } keys %daylist1) {
    $daylist2{$h}=$daylist1{$h};
    $i++;
    last
      if($i==4)
  }
  my $keymin = min(keys(%daylist2),24);
  my $keymax = max(keys(%daylist2),0);
  return sprintf("%s:00 - %s:00",$keymin,$keymax+1);
}

satprofi

Zitat von: Prof. Dr. Peter Henning am 03 Januar 1970, 01:33:36Edit: In Deinem Code wundert mich ein wenig, wieso der aktuelle Preis $c kleiner als das Minimum $ch sein kann


Hallo. Minimum ist nicht mindest, sondern Durchschnitt von mindest und durchschnitt
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Prof. Dr. Peter Henning

#14
Zitat von: satprofi am 25 Mai 2025, 19:22:26Hallo. Minimum ist nicht mindest, sondern Durchschnitt von mindest und durchschnitt
Äh - ernsthaft? Scheint mir etwas fragwürdig, weil Du in dieser Rechnung einen Wert überproportional gewichtest. Was möchtest Du denn genau damit aussagen, was ist das Ziel der Anzeige?

LG

pah

Edit: Ich habe jetzt mal selbst mit einer solchen Anzeige herumgespielt.
1. Jeweils kurz vor Mitternacht hole ich mir die aWATTar-Strompreise des folgenden Tages == dataxx_price als einzelne Readings.
2. Mit einem kurzen Perl-Code (siehe unten) wird der Mittelwert berechnet.
3. Mit ein paar weiteren Zeilen werden 24 weitere Readings angelegt (noch nicht mal als userreading, sondern einfach per "setreading ..." -Befehl) ==> dataxx_cmp.
  Der Inhalt ist ein String: "high", "average", "low", berechnet mit
$sig=($cur > $av)?"high":(($cur < $av)?"low":"average");4. Für die Anzeige nehme ich 24 ftui-columns in 3 Zeilen
<ftui-row>
            <ftui-column shape="round" [color]="aWATTar:data01_cmp | map('high:alert,average:warning,low:ok')">
            <ftui-label [text]="aWATTar:data01_price">
            </ftui-label>
            </ftui-column>
            <ftui-column shape="round" [color]="aWATTar:data02_cmp | map('high:alert,average:warning,low:ok')">
                <ftui-label [text]="aWATTar:data02_price">
                </ftui-label>
            </ftui-column>...

Ergebnis: Siehe Bild unten.