Moin,
ich habe einen Drucker in der Überwachung in fhem, bei dem ich die Werte über cups/ipp abhole (siehe auch hier (https://forum.fhem.de/index.php/topic,123568.0.html)). 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
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
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
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
Ein weiteres Beispiel es mit pahcolor (https://wiki.fhem.de/wiki/Color) 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.
H
Hallo Zusammen,
danke für Eure Hinweise, ich werde sie in den nächsten Tagen mal austreten...
Gruß Christoph
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)}
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
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
Und so sieht es aus mit fester Farbzuordnung - schwarz auf schwarz ist schlecht, daher weiß.
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
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")
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 ...
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")