stateformat farbiges State

Begonnen von Kai-Alfonso, 09 Oktober 2017, 13:16:18

Vorheriges Thema - Nächstes Thema

Tueftler1983

#15
Hallo zusammen, hoffe ich darf vier Mal mit rein grätschen.

Ich würde gerne die Daten meiner USB abhängig vom Zustand (OL Online und OB On Battery) in Grün bzw Rot darstellen.

Hatte es dazu so versucht was aber mit einer Fehlermeldung und fehlerhaften Darstellung scheitert.
{
  if (ReadingsVal("$name", "state", "") eq "OL") {
    return '<font color="green">'.ReadingsVal("$name", "state", "") .'</b>';
  } elsif (ReadingsVal("$name", "state", "") eq "OB") {
        return '<font color="red">'.ReadingsVal("$name", "state", "") .'</b>';
  } else {
        return '<font color="lightgrey">'. ReadingsVal("$name", "state", "")
  }
}
An ei Screenshots der Meldung und der Darstellung
LG holgerDu darfst diesen Dateianhang nicht ansehen.Du darfst diesen Dateianhang nicht ansehen. 


Es liegt wohl an meinem stateFormat das sieht ohne den Farbteil so aus

1:state
<br>
Batteriespannung battery.voltage V
<br>
Eingangsspannung input.voltage V
<br>
USV Load ups.load %
<br>
USV Temperatur ups.temperature °C

Otto123

Du kannst entweder Deine bisherige Variante nehmen oder alles komplett durch Perlcode ersetzen. Was Du jetzt gemacht hast ist nur Code und Text zusammenkopiert - auch noch eine schlechte Variante aus allen bisherigen Antworten.  :o
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tueftler1983

Ja, aber wie mache ich das?
Ich möchte halt die Darstellung wie ich sie habe aber halt zusätzlich das die Werte der Readings in Rot bzw Grün sind je nach State der USV.

Kannst du mir da helfen, ich verstehe den Aufbau nicht wirklich. Hoffe das ich es dann nachher auch noch für andere Sachen nehmen kann wie z.b. den Stromzähler

LG holger

Otto123

#18
Ich habe zur Veranschaulichung mal Christophs Vorschlag in einem kompletten Beispiel umgesetzt (Raw Definition):
defmod Battery dummy
attr Battery readingList Battery_charge
attr Battery setList Battery_charge
attr Battery stateFormat battery_formatted
attr Battery userReadings battery_formatted:Battery_charge:.+ {\
    my $battery = ::ReadingsVal($name, q(Battery_charge), undef);;\
    my @values = ($battery)  ?  ($battery >= 26)\
        ?  qw(green Ok)\
        :  qw(red Wechseln)\
        :  qw(red Unbekannt);;\
\
    return sprintf q(<span style="color: %s";;>%s</span>), @values;;\
}
Vorschlag: Du baust Dir nach dem Schema ein userReadings in deinem Device und schreibst den Namen des Readings einfach in dein stateFormat.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Christoph Morrison

Und wenn du ganz faul bist, legst du dir das als Subroutine in deine 99_MyUtils an und hast dann überall die Möglichkeit, einfach einen farbig formatierten State zu haben.

Tueftler1983

Zitat von: Christoph Morrison am 10 September 2023, 11:38:27Und wenn du ganz faul bist, legst du dir das als Subroutine in deine 99_MyUtils an und hast dann überall die Möglichkeit, einfach einen farbig formatierten State zu haben.

und davon verstehe ich noch weniger,
aber ich versuche heute noch Ottos Vorschlag um zu setzen

lieben dank an euch

TomLee

#21
Richtig ungern (weil ich die negative Eigenschaft hab nachtragend zu sein), anbei ein Beispiel es mit einem devstateicon (statt Text) und regulären Ausdrücken umzusetzen:

defmod Battery dummy
attr Battery devStateIcon ([0-9]{1}|1[0-9]{1}|2[0-5]{1}):10px-kreis-rot (2[6-9]{1}|[3-9][0-9]{1}|100):10px-kreis-gruen
attr Battery readingList Battery_charge
attr Battery setList Battery_charge:slider,1,1,100,1
attr Battery stateFormat Battery_charge

setstate Battery 8
setstate Battery 2023-09-10 12:05:46 Battery_charge 8

Tueftler1983

Zitat von: TomLee am 10 September 2023, 12:16:32Richtig ungern (weil ich die negative Eigenschaft hab nachtragend zu sein),
Oh oh das hört sich so an als hätte ich da mal Mist gebaut.
Weiß jetzt Grade nicht wo aber ich räume Fehler gerne ein und stehe dazu.
Wenn ich dir irgendwo auf die Füße getreten bin tut es mir leid

Tueftler1983

Bei deinem Beispiel verstehe ich nicht warum der grüne Punkt ab 25 angezeigt wird bis 30 dann zahlen Werte bis 59 und ab 60 wieder der grüne punkt

TomLee

Weil ich mein Beispiel im nachhinein falsch korrigiert habe  ::) , habs gerade angepasst.

Tueftler1983

Ahh moment
(2[4-9]{1}|[6-9][0-9]{1}|100) zerlegt ist:
Erster Bereich: 24-29
Zweiter Bereich 60-99
Dritter Bereich 100
In diesen soll der grüne Punkt erscheinen.

Beim Roten
0-9
10-19
20-24

Jetzt wird ein Schuh draus

TomLee

Ja fast, weil ich es nochmal korrigieren musste, jetzt sollte es passen.

Tueftler1983

Okay das würde mir eventuell bei meinem Zähler Problem helfen der je nach Leistung der Solaranlage auch mal negative Werte anzeigt.
Aber verstehe nicht wie ich daraus abhängig davon ob die USV und darin das Reading state OL oder OB ist alle Daten Grün oder Rot einfärbe.
Das DevStateIcon soll ja auch erhalten bleiben

Tueftler1983

Zitat von: TomLee am 10 September 2023, 12:58:01Ja fast, weil ich es nochmal korrigieren musste, jetzt sollte es passen.

Vielen lieben dank... irgendwie will das nicht mehr so einfach in meinen kopf wie vor 10 Jahren noch.
bin dann immer dankbar wenn mich jemand an die Hand nimmt

TomLee

ZitatAber verstehe nicht wie ich daraus abhängig davon ob die USV und darin das Reading state OL oder OB ist alle Daten Grün oder Rot einfärbe.
Das DevStateIcon soll ja auch erhalten bleiben

Stimmt, hatte mich von Ottos Beispiel verleiten lassen und nicht auf die eigentliche Fragestellung eingegangen.

Ganz verstehen tu ich es aber trotzdem noch nicht.
Soll nur state eingefärbt werden oder der ganze Text in der Deviceoverview ?

Hier nochmal ein Beispiel für in das Attribut devstateicon, welches nur state einfärbt, alles einzufärben bekommst auch selbst hin.

{my %val2color = (
'OL' => 'green',
'OB' => 'red',);
my $color = $val2color{ReadingsVal("$name", 'state', 'error')};
$color = 'lightgrey' if !$val2color{ReadingsVal("$name", 'state', 'error')};

return "<span style='color: ".$color."'>".ReadingsVal($name,'state',0)."</span><br>
<span>Batteriespannung ".ReadingsNum($name,'battery.voltage',0)." A</span><br>
    <span>Eingangsspannung ".ReadingsNum($name,'input.voltage',0)."</span><br>
    <span>USV Load ".ReadingsNum($name,'ups.load',0)."</span><br>
    <span>Temperatur ".ReadingsNum($name,'ups.temperature',0)."</span>"
}

Zu beachten ist, sollte STATE in deinem Device mehrzeilig sein, wegen deinem bisher mehrzeiligen stateformat, dann wird mein Code mehrfach angezeigt (je Zeile in STATE einmal), um das zu beheben/bereinigen müsstest du das Internal STATE löschen -> mit {delete($defs{USV}{STATE})} in der Kommandozeile, oben, ginge das.