[GELÖST] Kann man die Farbe von stateFormat Werte-abhängig ändern?

Begonnen von Gisbert, 06 Mai 2018, 17:49:29

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Mehrzeilig, damit man es einfacher lesen kann, den Wert bitte in FHEMWEB eingeben, oder Zeilenende mit \ versehen.
attr Device stateFormat {
  ReadingsVal($name,'Summe','') <= 0 ?
    "<span style='color:#0000FF'>".ReadingsVal($name,'Summe',0)."</span>" :
    "<span style='color:#FF0000'>".ReadingsVal($name,'Summe',0)."</span>"
}


Doppelte Schreibweise vermeidend:
attr Device stateFormat {
  sprintf("<span style='color:#%s'>%s</span>",
      ReadingsVal($name,'Summe','') <= 0 ? "0000FF":"FF0000",
      ReadingsVal($name,'Summe',0))
}


Mit der FHEM SetMagic, kuerzer aber kryptischer:
attr Device stateFormat <span style='color:{(ReadingsVal("$name",'Summe','')<=0 ? "blue":"red")}'>[$name:Summe]</span>

Gisbert

Hallo Rudi,

:) :) :) Vielen herzlichen lieben Dank. Ich habe nur die dritte Variante getestet, diese funktioniert !  :) :) :)

Eine Ergänzung:
Wenn man weitere Readings in stateFormat darstellen will, dann muss man das anscheindend im folgenden Format machen.
Nur den Namen des Readings anzugeben, führt zur Ausgabe des Readingsnamens, nicht aber zum Wert des Readings.
Beispiel  mit Zeilenumbruch:
attr Device stateFormat <span style='color:{(ReadingsVal("$name",'Summe','')<=0 ? "blue":"red")}'>[$name:Summe]</span><br/>[$name:Readings]
Diese erscheinen dann in der Standardfarbe.
Will man das weitere Readings in einer anderen Farbe haben, dann funktioniert es genauso wie für das 1. Reading.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

Hallo Gisbert,

jetzt war ich auch gerade fertig und Rudi war schneller.
So geht es auch (im FHEMWEB ins attr eintragen):
{
my $val = ReadingsVal("$name",'Summe',''
if ($val <= 0) {
return "<span style='color:#FF0000'>$val</span>";
}
else {
return "<span style='color:#00FF00'>$val</span>";
}
}

Oder mit falls die Farbe noch flexibler werden soll  ;)
{
my $val = ReadingsVal("SensorAussen","temperature",0);
my $col = "red";
if (ReadingsVal($name,"state","") eq "off") {
$col = "red";
}
else {
$col = "blue";
}
return "<span style='color:".$col."'>".$val."</span>";
}


Gruß Otto
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

mimue

Hallo Leute,

ich hatte mal vor Jahren das gleiche Bedürfnis, Rudi hat damals ein eigenes Attribut dafür eingeführt: devStateStyle

Das kann man vergleichsweise leicht programmatisch verändern. Ich nutze es als Indikator für kritische Readings (rot, gelb, grün).

Wäre das was für Euch ?

mimue
Gigabyte Brix, Arch Linux, CUL_MAX, TCM310, HM-Lan, LevelJET, VIERA, Fritz AHA, Fritz RC, FBDECT, NetIO, Alexa, Netatmo Presence

Shadow3561

Moin,
bevor ich einen neuen Thread aufmache frage ich hier noch einmal die Profis unter euch.

Ich habe ein HTTPMOD Device in dem ich auch Readings von anderen Devices anzeigen lasse.

Jetzt schaffe ich es einfach nicht einige Readings im State farbig dar zu stellen.

Hier mein Stateformat:
{return "
PV aktuell: ".sprintf("%.0f",ReadingsVal($name,"Produktion_P_Generate",0))." W <br/>
PV Eigenverbrauch: ".sprintf("%.0f",ReadingsVal($name,"PV_Eigenverbrauch_Aktuell_in_Watt",0))." W  <br/>
PV Einspeisung: ".sprintf("%.0f",ReadingsVal($name,"PV_Einspeisung_Aktuell_in_Watt",0))." W <br/>
Netzbezug: ".sprintf("%.0f",ReadingsVal($name,"Strombezug_Aktuell_in_Watt",0))." W <br/>
Stromverbrauch: ".sprintf("%.0f",ReadingsVal($name,"Strom_Gesamtverbrauch_Aktuell_in_Watt",0))." W<br/>
Autarkiegrad: ".sprintf("%.1f",ReadingsVal($name,"Relative_Current_Autonomy",0))." % <br/>
PV-Tagesertrag: ".sprintf(ReadingsVal("WR_Fronius","Energy_Day__kWh",0))." kWh<br/>
PV-Peak-Heute: ".sprintf("%.0f",ReadingsVal("Solar","Body_Data_DAY_PMAX_Value",0))." W<br/>
PV-Eigenverbrauch: ".sprintf("%.1f",ReadingsVal($name,"Eigenverbrauch_Current_SelfConsumption",0))." %<br/>
String-Spannung: ".sprintf("%.0f",ReadingsVal("WR_Fronius_MPPT","Voltage_String1__V",0))." V<br/>
String-Strom: ".sprintf("%.2f",ReadingsVal("WR_Fronius_MPPT","Current_String1__A",0))." A
";}


Wie schaffe ich es jetzt das vorltzte Reading(String-Spannung:) farbig zu gestalten?
Es soll zwischen 0 und 100 rot sein, zwischen 100 und 150 gelb, zwischen 150 und 200 grün und danach wieder gelb.

Für einen Denkanstoss wäre ich sehr dankbar.

MfG

Otto123

Hi,

schau Dir doch mal dies hier an: https://wiki.fhem.de/wiki/HomeMatic_Firmware_Update

Da werden bestimmte Sachen farbig gestaltet im stateFormat.

Gruß Otto
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

TomLee

Zitat von: Gisbert am 08 Mai 2018, 22:48:36

könnte man auch statt "Auswertung der Bedingung ist wahr" ein Reading reinschreiben, welches numerisch ist und sich entsprechend ändern kann?


Hallo,

da würd ich gerne nochmal anknüpfen, statt einen neuen Thread aufzumachen, die Frage ist ja eigentlich noch offen.

Mit pahcolor hab ich mir in den Kopf gesetzt das irgendwie umzusetzen. Habs jetzt soweit nach etlichen Versuchen das ich keine Fehlermeldung mehr bekomme, nix mehr im LogFile steht aber der Wert weiterhin schwarz dargestellt wird.

Wie macht mans den richtig:

<span style='color:{substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}>[$name:1_Vorlauf]</span>


Gruß

Thomas


edit:

Ups, jetzt hab ich ja ganz den # vergessen, da muss ich nochmal ran

edit 2:

ändert auch nix
<span style='color:{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>

TomLee

Hallo nochmal,

Mit
{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}
aus der Befehlszeile bekomme ich #B9770C zurück und das ist auch korrekt würd ich sagen

Mit
Zitat<span style='color:{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_ba'i,'1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>
in stateformat wird aber scheinbar #B9770C nicht in das Html übergeben, ob color in einfachen oder doppelten Hochkommas ist egal, die Schriftfarbe bleibt schwarz.




Mit
{"style=\"color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0),0,6)."\""}
aus der Befehlszeile bekomme ich style="color:#B9770C" zurück, auch das ist korrekt bin ich der Meinung.

Mit
Zitat<span {"style=\"color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal($name,'1_Vorlauf',0),0),0,6)."\""}>[$name:1_Vorlauf]</span>
in stateformat wird auch nix nach Html übergeben, zumindest bleibt die Schriftfarbe auch hier schwarz, ob in einfachen oder doppelten Hochkommas ist auch hier egal.


Mit diesen Feststellungen bin ich als Nicht-Programmierer erstmal am Ende angelangt und weiß nicht mehr weiter.

Gruß

Thomas

mumpitzstuff

Was steht denn letztendlich im HTML Code drin? Schau dir den mal an und poste die Zeile.

TomLee

Danke für die Rückmeldung.

Wenn ich wüsste wo ich sehe was letztendlich im HTML-Code drin steht würd ich vlt. selbst auf die Lösung kommen, darum schreib ich "scheinbar" im 1. Beispiel und im 2. Beispiel "auch nix", weil ich einfach nicht weiss was das Ergebnis genau ist / was übergeben wird / was wo steht, wenn du so fragst.

Wie gesagt es kommen keine Meldungen mehr im FileLog und letztendlich bei attr stateformat ... drücken wird auch kein Fehler mehr moniert.

mumpitzstuff

Du lässt dir das Device in deinem Browser anzeigen und schaust dir dort den HTML Code der Webseite an.

https://www.google.com/search?q=firefox+show+html+code

TomLee

Bei dem 1. Beispiel

<span style='{"color:#".substr(Color::pahColor(0,40,80,ReadingsVal($name,'1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>

werden diese Fehler beim öffnen der Konsole direkt angezeigt

HTML1423: Falsch formatierte Startmarkierung. Attribute sollten durch Leerzeichen getrennt werden.
HTML1409: Ungültiges Attributnamenzeichen. Attributnamen sollten nicht ("),('),() oder (=) enthalten.

Weiß sie aber (noch) nicht zu deuten

Im HTML-Code steht:

["MQTT2_ebusd_bai","<span style='{\u0022color:#\u0022.substr(Color::pahColor(0,40,80,ReadingsVal(MQTT2_ebusd_bai,'1_Vorlauf',...(426)

Ich denke der Fehler ist das die Funktion selbst zurückgegeben wird und nicht der Rückgabewert ?




Beim 2. Beispiel

<span '{"style=\'color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal($name,'1_Vorlauf',0),0),0,6)."\'"}'>[$name:1_Vorlauf]</span>


werden diese Fehler beim öffnen der Konsole direkt angezeigt

HTML1409: Ungültiges Attributnamenzeichen. Attributnamen sollten nicht ("),('),() oder (=) enthalten.
HTML1410: Ungültiger Attributwert ohne Anführungszeichen. Die Attributwerte ohne Anführungszeichen sollten nicht ("), ('), (), (=) oder (`) enthalten.


Im HTML-Code steht:

["MQTT2_ebusd_bai","<span '{\u0022style=\u005c'color:\u005cx23\u0022.substr(Color::pahColor(0,15,30,ReadingsVal(MQTT2_ebusd_bai,'1_V...(478)

Auch hier, die Funktion selbst wird übergeben und nicht das was sie zurückgeben soll ?






rudolfkoenig

Ich gehe davon aus, dass Ihr die Dokumentation (https://fhem.de/commandref_modular.html#stateFormat) "If the value of this attribute is enclosed in {}, then it is evaluated." als "if there is {} somewhere in the attribute, then it will be evaluated" interpretiert. Das ist leider nicht der Fall.

TomLee

Mit Sicherheit steh ich auf dem Schlauch: bei deinem kryptischen  Beispiel ist doch {} somewhere in the attribute too   ???

Jamo

Hier mal mein Beispiel für ein Stateformat, in dem in Abhängigkeit von der Regenmenge der State in verschiedenen Farben angezeigt wird.

{ my $Amount = ReadingsNum($name,"rainAmount",0);
    my $string  = sprintf("Amnt:%.1fl/m² ",$Amount);
  if ($Amount > 1 && $Amount < 7) {
    return '<font color="teal"><b>' . $string . '</b></font>'}
  elsif ($Amount >= 7 && $Amount < 20 ) {
    return '<font color="DeepSkyBlue"> <b>' . $string . '</b></font>'}
  elsif ($Amount >= 20 && $Amount < 25 ) {
    return '<font color="MediumVioletRed"><b>' . $string . '</b></font>'}
  elsif ($Amount >= 25 || $Max >= 2.5) {
    return '<font color="BlueViolet"><b>' . $string . '</b></font>'}
  else {return $string }
}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack