[gelöst] Tintenstand: ausgabe mit Farbe und Füllstand

Begonnen von caldir65, 24 Oktober 2021, 13:03:45

Vorheriges Thema - Nächstes Thema

caldir65

Moin,

ich habe einen Drucker in der Überwachung in fhem, bei dem ich die Werte über cups/ipp abhole (siehe auch hier). Diese Werte habe ich jetzt mittels stateformat in einer Minitabelle aufbereitet, daß ich jede Patrone gleich in der Auflistung sehen kann. Ist es jetzt auch vielleicht noch möglich, z.B. ab Tintenstand von 10% die jeweilige Patrone im state auf Gelb, und z.B. ab 1% auf rot zu setzen, sonst mit Grün anzuzeigen? (Ich habe mal ein Screenshot angehängt, wie ich mir es etwa vorstelle ...)

Bei meiner Suche habe ich wohl gefunden, wie man stateformat komplett einfärben kann, jedoch nicht, ob es auch mit einem Teilwert funktionieren würde.

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

MadMax-FHEM

#1
Zitat von: caldir65 am 24 Oktober 2021, 13:03:45
Bei meiner Suche habe ich wohl gefunden, wie man stateformat komplett einfärben kann, jedoch nicht, ob es auch mit einem Teilwert funktionieren würde.

Ja geht ;)

In stateFormat kannst du so ziemlich "alles" machen: Perl, html, ...
Siehe (wie so oft ;)  ) commandref:
Zitat von: commandref
stateFormat
Ändert den Gerätestatus, dies ist z.Bsp. in der Ausgabe des list Kommandos zu sehen, oder in der Raumübersicht von FHEMWEB. Falls nicht gesetzt, dann wird das state Reading übernommen. Sonst werden alle Wörter im Wert des Attributes durch das entsprechende Reading des Gerätes ersetzt (soweit vorhanden). Falls der Wert in {} eingeschlossen ist, dann wird es als Perl Ausdruck ausgewertet. Die Auswertung passiert bei jeder Änderung eines Readings.
Die hier beschriebene "set magic" wird auch angewendet.

Hier ein Beispiel mit Perl und html:
Zitat von: commandref
stateFormat
Es dient zur Formatierung des Wertes state
Beispiel: { ReadingsTimestamp($name, "state", 0) ." - ". ReadingsVal($name, "state", "none");}
               - wird zur formatieren Ausgabe: 2019-09-19 17:51:44 - Timer_04 saved

Hier ein Ausschnitt was bei dir passen könnte:

{
# color code https://html-color-codes.info/
# https://www.computerhope.com/htmcolor.htm  my $TempHour = ReadingsNum($name,"statTemperatureHourAvg",0);
  my $TempDay = ReadingsNum($name,"statTemperatureDayAvg",0);
  my $TempHour = ReadingsNum($name,"statTemperatureHourAvg",0);
  my $Style = "hour: ";
 
  if($TempHour < 7.0)
  {
    # blue
    $Style .= "<span style='color:#0000FF'>$TempHour °C</span>";
  }
  elsif($TempHour < 9.0)
  {
    # orange
    $Style .= "<span style='color:#FFA500'>$TempHour °C</span>";
  }
  elsif($TempHour >= 9.0)
  {
    # red
    $Style .= "<span style='color:#FF0000'>$TempHour °C</span>";
  }
 
  $Style .= " day: ";
 
  if($TempDay < 7.0)
  {
    # blue
    $Style .= "<span style='color:#0000FF'>$TempDay °C</span>";
  }
  elsif($TempDay < 9.0)
  {
    # orange
    $Style .= "<span style='color:#FFA500'>$TempDay °C</span>";
  }
  elsif($TempDay >= 9.0)
  {
    # red
    $Style .= "<span style='color:#FF0000'>$TempDay °C</span>";
  }
  return $Style;
}

EDIT: kleinen copy&paste Fehler korrigiert ;)

Zitat von: caldir65 am 24 Oktober 2021, 13:03:45
Diese Werte habe ich jetzt mittels stateformat in einer Minitabelle aufbereitet, daß ich jede Patrone gleich in der Auflistung sehen kann.

Aha und wo ist das stateFormat?
Bzw. besser gleich ein list des Devices?

Siehe: https://forum.fhem.de/index.php/topic,71806.0.html

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

caldir65

Oops, das List habe ich glatt vergessen ... sorry, kommt hier:
Internals:
   CFGFN     
   FUUID      6172658d-f33f-378b-dd82-3733fccff5d314ea
   NAME       ipp_EPSON_XP7100
   NR         49177
   STATE      14% Cyan33C
7% Magenta33M
15% Yellow33Y
89% Black33B
26% Photo-Black33PB
   TYPE       dummy
   READINGS:
     2021-10-24 17:30:01   Black           89
     2021-10-24 17:30:01   Cyan            14
     2021-10-24 17:30:01   Magenta         7
     2021-10-24 17:30:01   Photo_Black     26
     2021-10-24 17:30:01   Yellow          15
     2021-10-24 17:30:01   attributes-charset utf-8
     2021-10-24 17:30:01   attributes-natural-language en
     2021-10-24 17:30:01   marker-levels   26,14,7,15,89
     2021-10-24 17:30:01   marker-names    Photo Black ink,Cyan ink,Magenta ink,Yellow ink,Black ink
     2021-10-24 17:30:01   printer-uri     ipp://192.168.1.121:631/
     2021-10-24 17:30:01   requested-attributes marker-names,marker-levels
     2021-10-24 17:30:01   status-code     successful-ok (successful-ok)
Attributes:
   DbLogExclude .*
   alias      Epson XP-7100 im Büro
   group      Drucker
   icon       it_printer
   room       Arbeitszimmer
   stateFormat Cyan% Cyan33C
Magenta% Magenta33M
Yellow% Yellow33Y
Black% Black33B
Photo_Black% Photo-Black33PB


Tabelle ist etwas hochtrabend ausgedrückt - letztlich habe ich jeden Wert für sich in einer Zeile (im Device selber, in der Raumübersicht alles in einer Zeile - aber insbes. dafür sollen ja die Farben her ...

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

MadMax-FHEM

#3
Und mein Code-Beispiel schon angeschaut?

Lässt sich doch einfach auf deinen Fall umbauen und erweitern auf weitere Readings.
Wenn du die Einträge untereinander haben willst, dann eben die <span>...</span> mit </br> umbrechen...

Hier kurz "angerissen":


{
  my $Black = ReadingsNum($name,"Black",0);
  my $Cyan = ReadingsNum($name,"Cyan",0);
  my $Style = "<span style='color:#00FF00'>$Black Black33B</span></br>";

  if($Black < 1)
  {
    # red
    $Style = "<span style='color:#FF0000'>$Black Black33B</span></br>";
  }
  elsif($Black < 10)
  {
    # orange
    $Style = "<span style='color:#FFA500'>$Black Black33B</span></br>";
  }

  if($Cyan < 1)
  {
    # red
    $Style .= "<span style='color:#FF0000'>$Cyan Cyan33C</span></br>";
  }
  elsif($Cyan < 10)
  {
    # orange
    $Style .= "<span style='color:#FFA500'>$Cyan Cyan33C</span></br>";
  }
  else
  {
    $Style .= "<span style='color:#00FF00'>$Cyan Cyan33C</span></br>";
  }

# usw.

  return $Style;
}


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

#4
Ein weiteres Beispiel es mit pahcolor umzusetzen:

defmod Demo dummy
attr Demo readingList Test
attr Demo room Test
attr Demo setList Test:slider,0,1,100
attr Demo stateFormat { my $s = ReadingsNum($name,"Test",0);;\
my $sc ='#'.substr(Color::pahColor(0,50,100,ReadingsNum($name,"Test",0),0),0,6);;\
"<span style='color:$sc'>$s</span>\
<span style='color:Magenta'>Magenta</span>"}

setstate Demo <span style='color:#06E0FD'>5</span>\
<span style='color:Magenta'>Magenta</span>
setstate Demo 2021-10-24 18:30:28 Test 5


Kann mir aber gut vorstellen das es dafür eine coole DOIF/uiTable Lösung gibt, hab ich mich aber bisher zu wenig mit befasst.

caldir65

H
Hallo Zusammen,

danke für Eure Hinweise, ich werde sie in den nächsten Tagen mal austreten...

Gruß Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

Damian

Ich würde es grafisch lösen - sieht ansprechender aus:

defmod drucker DOIF {}
attr drucker uiState {package ui_Table;;}\
\
ring([ipp_EPSON_XP7100:Magenta],0,100,0,120,'magenta',"100,1",undef,0,1)|ring([ipp_EPSON_XP7100:Cyan],0,100,0,120,'cyan',"100,1",undef,0,1)|\
ring([ipp_EPSON_XP7100:Yellow],0,100,0,120,'yellow',"100,1",undef,0,1)|ring([ipp_EPSON_XP7100:Black],0,100,0,120,'black',"100,1",undef,0,1)\


oder direkt beim Drucker mit devStateIcon

attr ipp_EPSON_XP7100 devStateIcon {package ui_Table;;ring(::ReadingsVal("ipp_EPSON_XP7100","Magenta",0),0,100,0,120,'magenta',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Cyan",0),0,100,0,120,'cyan',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Yellow",0),0,100,0,120,'yellow',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Black",0),0,100,0,120,'black',"100,1",undef,0,1)}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

caldir65

Moin,

ich habe jetzt einmal den Vorschlag von Daiman getestet - nachdem ich das stateformat-Attribut geändert habe, damit keine Tintenwerte mehr drin stehen, funktioniert es (vorher kamen erst die "normalen" Readings, und dann nochmal aus dem state ...)

Mein einziges Problem ist jetzt noch, die Farbe für Orange anzupassen, da in der derzeitigen Ausprägung fast wie Rot aussieht - vielleicht eher (dunkel-) Gelb nehmen...

Internals:
   CFGFN     
   FUUID      61759765-f33f-378b-a345-a82c9c612eac82de
   NAME       ipp_EPSON_XP7100
   NR         78725
   STATE      ipp://192.168.1.121:631/
   TYPE       dummy
   READINGS:
     2021-10-25 09:10:04   Black           88
     2021-10-25 09:10:04   Cyan            14
     2021-10-25 09:10:04   Magenta         7
     2021-10-25 09:10:03   Photo_Black     25
     2021-10-25 09:10:04   Yellow          15
     2021-10-25 09:10:03   attributes-charset utf-8
     2021-10-25 09:10:03   attributes-natural-language en
     2021-10-25 09:10:03   marker-levels   25,14,7,15,88
     2021-10-25 09:10:03   marker-names    Photo Black ink,Cyan ink,Magenta ink,Yellow ink,Black ink
     2021-10-25 09:10:03   printer-uri     ipp://192.168.1.121:631/
     2021-10-25 09:10:03   requested-attributes marker-names,marker-levels
     2021-10-25 09:10:03   status-code     successful-ok (successful-ok)
Attributes:
   DbLogExclude .*
   alias      Epson XP-7100 im Büro (Test)
   devStateIcon {package ui_Table;ring(::ReadingsVal("ipp_EPSON_XP7100","Magenta",0),0,100,0,120,'magenta',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Cyan",0),0,100,0,120,'cyan',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Yellow",0),0,100,0,120,'yellow',"100,1",undef,0,1).ring(::ReadingsVal("ipp_EPSON_XP7100","Black",0),0,100,0,120,'black',"100,1",undef,0,1)}
   group      Drucker
   icon       it_printer
   room       Arbeitszimmer
   stateFormat printer-uri


Leider hat sich mir noch nicht erschlossen, wo ich an der Farbe drehen kann ... ist aber für heute früh zu umfangreich in der Doku, werde ich mich später noch einmal näher mit beschäftigen.

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

Damian

Ich habe einfach den Bereich von 0 - 100 % auf die Farben 0 (rot) bis 120 (grün) abgebildet. Die Farbgebung richtet sich nach dem Wert.

ring(::ReadingsVal("ipp_EPSON_XP7100","Magenta",0),0,100,0,120,'magenta',"100,1",undef,0,1)

Man könnte auch z. B. bei Magenta einen festen HSV-Wert 330,330 statt 0,120 nehmen und beiden anderen Farben die entsprechenden anderen HSV-Werte. Dann wäre die Farbzuordnung intuitiver und der Verbrauch in Prozent würde nicht über die Farbe, sondern über die Zahl und den Ausschlag visualisiert werden.

HSV-Wert kann man gut bestimmen mit: https://www.google.com/search?q=color+picker

Doku zur ring-Funktion: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Farbskalierte_Anzeige_eines_Zahlenwertes_mit_Hilfe_der_universellen_SVG-Funktion_ring
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Und so sieht es aus mit fester Farbzuordnung - schwarz auf schwarz ist schlecht, daher weiß.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

caldir65

Zitat von: Damian am 25 Oktober 2021, 15:20:23
Und so sieht es aus mit fester Farbzuordnung - schwarz auf schwarz ist schlecht, daher weiß.

Moin,

ich habe das jetzt auch mit fester Farbzuordnung gelöst. Das einzige, was ich noch nicht hin bekomme, sind die beiden schwarzen Anzeigen in Weiß wie bei Dir darzustellen ...

Gruß, Christoph
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

Damian

Zitat von: caldir65 am 29 Oktober 2021, 20:33:01
Moin,

ich habe das jetzt auch mit fester Farbzuordnung gelöst. Das einzige, was ich noch nicht hin bekomme, sind die beiden schwarzen Anzeigen in Weiß wie bei Dir darzustellen ...

Gruß, Christoph

Das habe ich über die Helligkeit realisiert, siehe letzter Parameter beim letzten ring:

ring(17,0,100,330,330,'magenta',"100,1",undef,0,1)|ring(45,0,100,180,180,'cyan',"100,1",undef,0,1)|
ring(99,0,100,60,60,'yellow',"100,1",undef,0,1)|ring(60,0,100,0,0,'black',"100,1",undef,0,1,"100,100,100,100,100")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

caldir65

Moin,

super, danke, jetzt ist es so, wie ich es mir vorgestellt habe ;)

Gruß, Christoph

PS: ich habe den Betreff auch im Startpost einmal geändert - diese Lösung betrifft ja eigentlich nicht mehr das Attribut Stateformat ...
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 64GB SSD, Lubuntu 22.04LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

Damian

#13
Man kann die Einheit "black" auch, wie bei den anderen Einheit-Texten, etwas abdunkeln hier mit: fill:silver:

ring(60,0,100,0,0,'black',"100,1",undef,"0,,fill:silver",1,"100,100,100,100,100")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF