stateformat farbiges State

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

Vorheriges Thema - Nächstes Thema

Kai-Alfonso

Hi,

ich habe auf meinem Dashboard diverse Devices und Schnittstellen zu Fhem, die ich überwache, ob Sie laufen oder ob es Probleme damit geht. Ich habe dazu habe keine Dashboard Gruppen definiert, sondern die Geräte einzeln hinzugefügt. Soweit so gut.

Ich vermute, das ich nicht den Hintergrund der einzelnen Container abhängig vom Status ändern kann, oder? Ansonsten würde es mir reichen, den state auch farbig zu ändern (Beispiel: disconnected, dann state == rot). Das müsste ja mit stateformat und ReadingVal gehen, oder?

Steh grad auf dem Schlauch, vielleicht kann mal jemand nen Schubs geben ;-)

Danke und Gruß

Kai
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

ComputerZOO

#1
z.B. so:

stateFormat
stateFormat
{
  if (ReadingsVal("$name", "state", "") eq "disconnected") {
    return '<font color="red">'.ReadingsVal("$name", "state", "") .'</b>';
  } else {
    return ReadingsVal("$name", "state", "");
  }
}

Kai-Alfonso

Hey - danke - fehlt da nicht noch ein ) hinter disconnected?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

ComputerZOO

Zitat von: Kai-Alfonso am 10 Oktober 2017, 17:59:04
Hey - danke - fehlt da nicht noch ein ) hinter disconnected?

Jupp, hattest Recht, habe es oben gleich geändert.

Astralsen

Hallo liebe Fhem Gemeinde,

ich habe folgendes Problem... oder einen Wunsch: Ich möchte ein Dummy mit drei verschiedenen Werten füllen... aber jeder Text soll eine andere Farbe bekommen. Mit diesem Beispiel schaffe ich ja schon einmal zwei Farben. Aber wie bekomme ich es hin drei verschiedene  (oder mehr) Farben zu erstellen?

Hier meine Grundeinstellung:
{
  if (ReadingsVal("$name", "state", "") eq "Rasenmäher mäht!") {
    return '<font color="green">'.ReadingsVal("$name", "state", "") .'</b>';
  }else {
    return '<font color="lightgrey">'. ReadingsVal("$name", "state", "")
  }
}


jetzt möchte ich noch in Rot angezeigt bekommen wenn ein Fehler auftritt.
Ich habe keine Ahnung wie ich das erweitern kann? Und mich auch schon Stundenlang hier durch das Forum gelesen... Bei Werten die Zahlenabhängig sind funktioniert es seit Jahren bei mir...
Wer kann mir auf die Sprünge helfen??

Danke und Grüße

Christoph



FHEM auf Raspberrypi 1 B, CUL 868 SlowRF, CUL 868 Max, HM-LGW,Sender und Aktoren von FHT, FS20, S300, HM, IT, Dect 200,Max, Dashbuttons

Otto123

Hi,

Du meinst sowas?
{
  if (ReadingsVal("$name", "state", "") eq "Rasenmäher mäht!") {
    return '<font color="green">'.ReadingsVal("$name", "state", "") .'</b>';
  } elsif (ReadingsVal("$name", "state", "") eq "Rasenmäher error!") {
        return '<font color="red">'.ReadingsVal("$name", "state", "") .'</b>';
  } else {
        return '<font color="lightgrey">'. ReadingsVal("$name", "state", "")
  }
}


Geht sicher alles eleganter - ich habe nur versucht Deine Frage zu verstehen. Den "Wurm" kannst Du auch verlängern ...

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

Jamo

Das </b> (bold) muss aber durch </font> ersetzt werden.

{
  if (ReadingsVal("$name", "state", "") eq "Rasenmäher mäht!") {
    return '<font color="green">'.ReadingsVal("$name", "state", "") .'</font>';
  } elsif (ReadingsVal("$name", "state", "") eq "disconnected")) {
    return '<font color="red">'.ReadingsVal("$name", "state", "") .'</font>';
  } else {
    return '<font color="lightgrey">'. ReadingsVal("$name", "state", "").'</font>';
  }
}

Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

Christoph Morrison

Hallo Christoph,

Zitat von: Astralsen am 04 März 2021, 22:12:04
ich habe folgendes Problem... oder einen Wunsch: Ich möchte ein Dummy mit drei verschiedenen Werten füllen... aber jeder Text soll eine andere Farbe bekommen. Mit diesem Beispiel schaffe ich ja schon einmal zwei Farben. Aber wie bekomme ich es hin drei verschiedene  (oder mehr) Farben zu erstellen?

Hier meine Grundeinstellung:
{
  if (ReadingsVal("$name", "state", "") eq "Rasenmäher mäht!") {
    return '<font color="green">'.ReadingsVal("$name", "state", "") .'</b>';
  }else {
    return '<font color="lightgrey">'. ReadingsVal("$name", "state", "")
  }
}


jetzt möchte ich noch in Rot angezeigt bekommen wenn ein Fehler auftritt.
Ich habe keine Ahnung wie ich das erweitern kann? Und mich auch schon Stundenlang hier durch das Forum gelesen... Bei Werten die Zahlenabhängig sind funktioniert es seit Jahren bei mir...
Wer kann mir auf die Sprünge helfen??

Was sind denn die Status, die du wie formatieren willst? Ansonsten heißt das Stichwort elsif.

(Beim von dir geschriebenen Perl und HTML krauselt es aber auch die Fußnägel hoch ;-))

Astralsen

Super vielen Dank !

Das mit elsif hatte ich auch probiert aber ich hatte es aber "else if" geschrieben.... :-[
Die Lösung von Otto123 funktioniert am besten für mich.

Ich wollte eine Art Ampel Text machen: Normale Farbe wenn der Mäher in der Station steht -->also weiß.
Der Text wird grün wenn der Mäher arbeitet, und rot wenn der Mäher ein Problem hat.
Aber ich habe auch noch andere Einsatzmöglichkeiten "gefunden" ;-)

hier zB für unsere Balkontür:

{
  if (ReadingsVal("$name", "state", "") eq "Balkontür Kipp") {
    return '<font color="orange">'.ReadingsVal("$name", "state", "") .'</b>';
  } elsif (ReadingsVal("$name", "state", "") eq "Balkontür Auf") {
        return '<font color="red">'.ReadingsVal("$name", "state", "") .'</b>';
  } else {
        return '<font color="lightgrey">'. ReadingsVal("$name", "state", "")
  }
}


Besten Dank Euch für den Anschubser!

Grüße aus Hamburg
Christoph
FHEM auf Raspberrypi 1 B, CUL 868 SlowRF, CUL 868 Max, HM-LGW,Sender und Aktoren von FHT, FS20, S300, HM, IT, Dect 200,Max, Dashbuttons

Christoph Morrison

Guck mal, ich mach das so:


reachable_formatted:activity:.+ {
    my $reachable = ::ReadingsVal($name, q(activity), undef);
    my @values = ($reachable)
        ?   ($reachable eq q(alive))
            ?   qw(green Erreichbar)
            :   (q(red), q(Nicht erreichbar))
        :   qw(red Unbekannt);

    return sprintf q(<span style="color: %s";>%s</span>), @values;
}


Vorteil: Man spart sich die Wiederholung des HTML-Teils und man muss nicht mehrfach ReadingsVal aufrufen.

Otto123

ZitatDie Lösung von Otto123 funktioniert am besten für mich.
Ich hatte nur Deinen Code "hochinterpoliert"
@Astralsen Deine HTML Tags sind dabei wirklich bedenklich, das musst Du ändern. Das die am Ende funktionieren ist wahrscheinlich der Gutmütigkeit eines Webinterfaces und der Browserinterpretation zu verdanken. :)
Die Lösung Deines Namenvetters ist weitaus eleganter. Falls die für dich nicht nachvollziehbar ist, dann frag einfach - aber ändere wenigstens Deine Tags so, dass es "vorn und hinten" passt! Siehe Post von Jamo.
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

Astralsen

Danke für die Hinweise.
Ich habe Jamo´s Tipp mit "reingearbeitet" und es funktioniert noch ;-)
Leider habe ich absolut kein Ahnung von Perl oder HTML deswegen bastle ich immer bis das Ergebnis passt... ::)

Ich werde aber auch noch einmal die Variante von Christoph Morrison versuchen....

FHEM auf Raspberrypi 1 B, CUL 868 SlowRF, CUL 868 Max, HM-LGW,Sender und Aktoren von FHT, FS20, S300, HM, IT, Dect 200,Max, Dashbuttons

Otto123

Zitat von: Astralsen am 05 März 2021, 11:15:42
Leider habe ich absolut kein Ahnung von Perl oder HTML deswegen bastle ich immer bis das Ergebnis passt... ::)
Ist ja auch in Ordnung. Was mir immer hilft
https://www.w3schools.com/html/default.asp
https://perldoc.perl.org/index
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

fhem@supergut

Zitat von: Christoph Morrison am 05 März 2021, 10:37:47Guck mal, ich mach das so:

reachable_formatted:activity:.+ {
    my $reachable = ::ReadingsVal($name, q(activity), undef);
    my @values = ($reachable)
        ?   ($reachable eq q(alive))
            ?   qw(green Erreichbar)
            :   (q(red), q(Nicht erreichbar))
        :   qw(red Unbekannt);

    return sprintf q(<span style="color: %s";>%s</span>), @values;
}

Vorteil: Man spart sich die Wiederholung des HTML-Teils und man muss nicht mehrfach ReadingsVal aufrufen.

Äh, wie bitte? Kannst du das mal erklären? Als Beispeil vielleicht: Readname "Battery_charge" und als Wert grösser 25 -> grün, kleiner 26 -> rot?

Christoph Morrison

Im Prinzip ist das ein doppeltes Ternär-Operator-Statement, das statt einer Variable eine Liste benutzt.

@values is gleich grün/Erreichbar, wenn $reachable existiert und alive ist, wenn es existiert und nicht alive ist, dann rot/Nicht erreichbar. Wenn ReadingsVal() keinen Wert lieft, wird rot/Unbekannt zurückgegeben.

sprintf macht aus der Liste dann einen String mit zwei ersetzten Werten, einmal für Text-Status und einmal für  die Textfarbe.

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;
}