Wie kann ich in Conky Farben dynamisch basierend auf Wertgrenzen ändern?
- Einleitung
- Grundprinzip der dynamischen Farbwechsel
- Beispiel anhand der CPU-Auslastung
- Verwendung von ${if_match} und ${if_gt}/${if_lt}
- Multiplikation und Vergleich mit Variablen
- Alternativen: Lua-Scripting für komplexere Logik
- Zusammenfassung und Tipps
Einleitung
Conky ist ein beliebtes Systemmonitoring-Tool für Linux, das sehr flexibel konfigurierbar ist. Eine häufige Anforderung ist es, Farben dynamisch zu ändern, um Werte visuell hervorzuheben. Beispielsweise möchte man eine CPU-Auslastung oder Temperatur in Grün anzeigen, wenn der Wert niedrig ist, Gelb bei Mittelwerten und Rot bei kritischen Werten. Im Folgenden wird erklärt, wie man dies direkt in der .conkyrc-Konfigurationsdatei bzw. in einem Conky-Konfigurationsblock realisieren kann.
Grundprinzip der dynamischen Farbwechsel
Conky bietet keine direkte if-else-Syntax, wie man es aus Programmiersprachen kennt. Die dynamische Farbwahl erfolgt durch Kombination von Variablen und bedingten Operatoren, die Conky unterstützt. Diese werden mit sogenannten ${if ...} Konstrukten umgesetzt. Außerdem kann man verschiedene Farben als Hex-Codes oder HTML-Farbnamen angeben. Durch geschachtelte oder mehrere Bedingungen lässt sich festlegen, welche Farbe bei welchen Wert angezeigt wird.
Beispiel anhand der CPU-Auslastung
Ein einfaches Beispiel ist, die CPU-Auslastung einzulesen und abhängig vom Wert verschiedene Farben einzustellen. Folgender Ausschnitt zeigt, wie du dich bei niedriger Auslastung (unter 50%) für Grün, bei mittlerer Auslastung (zwischen 50% und 80%) für Gelb und bei hoher Auslastung (über 80%) für Rot entscheidest.
${if_match ${cpu cpu0} < 50} ${color green}${cpu cpu0}%${else} ${if_match ${cpu cpu0} < 80} ${color yellow}${cpu cpu0}% ${else} ${color red}${cpu cpu0}% ${endif}${endif}${color}Hier analysiert Conky den CPU-Wert und wählt anhand der verschachtelten Bedingungen die Farbe. Wichtig ist, dass man am Ende mit ${color} die Rücksetzung zur Standardfarbe vornimmt.
Verwendung von ${if_match} und ${if_gt}/${if_lt}
Die Konstrukte ${if_match}, ${if_gt} (greater than = größer als) und ${if_lt} (less than = kleiner als) können für Bedingungen genutzt werden. Damit kann man alle denkbaren Wertgrenzen abfragen. ${if_match} ist im Prinzip ein Gleichheits-Test, kann aber auch mit relationalen Operatoren genutzt werden, wenn man < und > als HTML-Ersatz für < und > verwendet.
Für einen klaren, leicht lesbaren Code bietet sich an, verschachtelte oder mehrere if-Blöcke zu nutzen. Ein Beispiel könnte so aussehen:
${if_lt ${battery_percent} 20} ${color red}${battery_percent}%${else} ${if_lt ${battery_percent} 50} ${color yellow}${battery_percent}% ${else} ${color green}${battery_percent}% ${endif}${endif}${color}Multiplikation und Vergleich mit Variablen
Da Conky Variablen ausgeben kann, aber mit ihnen keine komplexen Berechnungen erlaubt sind, gilt es, die Werte direkt zu vergleichen. Beispielsweise kann man mit ${cpu cpu0} direkt auf die CPU-Auslastung zugreifen und mit ${if_match} vergleichen, aber Berechnungen wie Addition oder Multiplikation sind ohne Lua-Scripting eingeschränkt.
Alternativen: Lua-Scripting für komplexere Logik
Wenn die Logik der Farbwahl sehr komplex wird, z.B. mit mehreren Wertbereichen oder unterschiedlichen Typen von Werten, bietet sich Lua-Scripting an. In Conky können Lua-Skripte eingebunden werden, die den Wert auslesen, verarbeiten und die passende Farbe ausgeben. Das macht die Konfiguration flexibler und lesbarer. Nachstehend ein sehr einfaches Beispiel einer Lua-Funktion, die eine Farbe abhängig vom Wert zurückgibt:
function colorize(value) if value < 50 then return "<span color=green>" .. value .. "%</span>" elseif value < 80 then return "<span color=yellow>" .. value .. "%</span>" else return "<span color=red>" .. value .. "%</span>" endendDu musst dann im Conky-Text den Lua-Ausdruck einbinden:
${lua_parse colorize(${cpu cpu0})}Zusammenfassung und Tipps
Die einfachste Methode, um Farben basierend auf Wertgrenzen dynamisch zu ändern, ist die Verwendung von ${if_match}, ${if_lt}, ${if_gt}-Konstrukten innerhalb der Conky-Konfiguration. Diese ermöglichen bedingtes Anzeigen von Farb-Codes. Für einfachere Anwendungsfälle sind sie vollkommen ausreichend und leicht umzusetzen. Bei komplexeren Bedingungen oder wenn Du viele Werte und Farben verwalten möchtest, lohnt sich das Einbinden von Lua-Skripten, die voll programmierbare Logik bieten.
Wichtig ist außerdem, immer mit ${color} ohne Parameter die Farbe am Ende zurückzusetzen, damit die nachfolgende Ausgabe wieder standardmäßig erscheint und nicht dauerhaft farbig bleibt.
