Le miniguide di UbaWeb

Conky: colore in base a valore della temperatura

Premessa Torna su

17 giugno 2015 - Ubuntu 14.04.2 LTS, mate, kernel: 3.16.0-40-generic, Bash: 4.3.11(1) - Questa pagina serve per spiegare il funzionamento di uno script che ho fatto per stampare le varie temperature rilevate da Sensors;
il colore dei valori delle temperature cambia in base ai valori di soglia delle temperature:
normale: verde, alta: arancione, critica: rosso
La discussione sul forum Ubuntu inizia da questo post, (dopo le prime versioni dello script) c'è un intermezzo dove si spiega come controllare la posta da conky (riassunto qui) e si finisce con l'ultimo script, spiegato in questa miniguida.

Aggiornamento: 23 marzo 2016

Temperature colorate: metodo senza script esterno, più semplice ed efficiente

Questo metodo l'avevo trovato molto tempo fa ma poi l'avevo dimenticato!
Porto come esempio il mio caso.

Ho tre temperature, rilevabili, che normalmente visualizzo con il codice:

CPU:${hwmon temp 1 }- ${hwmon temp 2 }- ${hwmon temp 3 }°C

Per avere le temperature colorate in base alle fasce di temperatura:
Prima della sezione TEXT inserisco questo codice:

template2 ${color2}${if_match ${hwmon \1 temp \2}>39}${color orange}${if_match \
${hwmon \1 temp \2}>42}${color red}${endif}${endif}${hwmon \1 temp \2}${color1}

Solo per provare, ho inserito le temperature limite molto basse (39 e 42) e molto vicine;
una volta fatte le prove, inserire i valori reali (es. 80 e 100).

(Va messo su una sola riga! Levare l'escape '\' alla fine della prima riga).

All'interno della sezione TEXT, nel punto dove voglio stampare le temperature inserisco:

(°C) ${template2 0 1}- ${template2 0 2}- ${template2 0 3}

Tips: Individuare gli "hwmon" funzionanti

Per vedere quali "hwmon" funzionano, inserire in punto qualsiasi (nella sezione TEXT):

mon_0:${hwmon 0 temp 1 }- ${hwmon 0 temp 2 }- ${hwmon 0 temp 3 }- ${hwmon 0 temp 4 }- ${hwmon 0 temp 5 }- ${hwmon 0 temp 6 }°C mon_1:${hwmon 1 temp 1 }- ${hwmon 1 temp 2 }- ${hwmon 1 temp 3 }- ${hwmon 1 temp 4 }- ${hwmon 1 temp 5 }- ${hwmon 1 temp 6 }°C mon_2:${hwmon 2 temp 1 }- ${hwmon 2 temp 2 }- ${hwmon 2 temp 3 }- ${hwmon 2 temp 4 }- ${hwmon 2 temp 5 }- ${hwmon 2 temp 6 }°C mon_3:${hwmon 3 temp 1 }- ${hwmon 3 temp 2 }- ${hwmon 3 temp 3 }- ${hwmon 3 temp 4 }- ${hwmon 3 temp 5 }- ${hwmon 3 temp 6 }°C mon_4:${hwmon 4 temp 1 }- ${hwmon 4 temp 2 }- ${hwmon 4 temp 3 }- ${hwmon 4 temp 4 }- ${hwmon 4 temp 5 }- ${hwmon 4 temp 6 }°C
In questo modo si individuano i numeri giusti da inserire nei vari ${template2 X Y}, quelli non validi non stamperanno le temperature.

Non si deve modificare la parte prima di TEXT ma si può modificare a piacere la parte che stampa le temperature: testo, formattazione (font, spazi e colori); naturalmente si può fare riferimento a tutti gli "hwmon" disponibili.
Ciaux 8-)

Requisiti per il corretto funzionamento dello script:

- Bash, sed, awk e una versione di "grep" che supporti le espressioni regolari Perl compatibili;

( sono programmi, normalmente, già installati in Ubuntu).

- Sensors (installabile in Ubuntu con 'sudo apt-get install lm-sensors').

- Strutture di output di Sensors del tipo seguente:

atk0110-acpi-0 Adapter: ACPI interface Vcore Voltage: +1.14 V (min = +0.85 V, max = +1.60 V) +3.3 Voltage: +3.25 V (min = +2.97 V, max = +3.63 V) +5 Voltage: +5.07 V (min = +4.50 V, max = +5.50 V) +12 Voltage: +11.86 V (min = +10.20 V, max = +13.80 V) CPU FAN Speed: 1363 RPM (min = 600 RPM, max = 7200 RPM) CHASSIS FAN Speed: 0 RPM (min = 600 RPM, max = 7200 RPM) POWER FAN Speed: 2537 RPM (min = 600 RPM, max = 7200 RPM) CPU Temperature: +32.0°C (high = +60.0°C, crit = +95.0°C) MB Temperature: +46.0°C (high = +45.0°C, crit = +95.0°C) k8temp-pci-00c3 Adapter: PCI adapter Core0 Temp: +24.0°C Core0 Temp: +29.0°C Core1 Temp: +22.0°C Core1 Temp: +25.0°C

(In rosso il contenuto "estratto" dalle variabili.)
Se il formato è diverso si devono adeguare le espressioni regolari! Fatemi pure un fischio sul forum di Ubuntu. 8-)

Richieste Torna su

Si vogliono stampare le temperature di: scheda madre, della CPU e dei vari core, è anche richiesto di colorare i numeri (indicanti i gradi di temperatura) in base ai loro valori, per individuare facilmente temperature alte e/o critiche.
Il tutto con una sola chiamata a Sensors.
L'output di Sensors (nel caso specifico) indica le soglie alta e critica per temperature di MB e CPU ma per i core indica solo la temperatura corrente.
Ho deciso allora di impostare due soglie predefinite (alta: 65 e critica: 95) che saranno utilizzate per i core.
Le soglie presenti per MB e CPU saranno estratte da Sensors e utilizzate automaticamente.

Uso Torna su

Scaricare lo script, scompattarlo e renderlo eseguibile.
Per semplicità conviene spostare lo script nella stessa directory contenente il file di configurazione di conky.
Per richiamarlo dal file di configurazione di conky (per esempio da "conkyrc"), si deve inserire nella sezione "TEXT" una riga di questo tipo:
${color 1e90ff}Temperature: ${execpi 4 ./conky_temp_color.sh }
Il "4" in execpi 4 significa che lo script, indicato subito dopo, sarà eseguito ogni 4 secondi; questo valore può essere variato a piacimento.

Personalizzazioni

Le variabili personalizzabili sono visibili all'inizio dello script.
... # impostazioni alta_pre=60 critica_pre=95 col_testo="\${color #0000ff}" # blu col_norm="\${color #00FF00}" # verde col_alta="\${color #FFA500}" # arancio col_critica="\${color #FF0000}" # rosso ...
Normalmente l'unica cosa da modificare è il colore predefinito del testo, cioè il codice colore (esadecimale rrggbb) della variabile col_testo, impostato inizialmente a blu;
per farlo, basta sostituire il codice (qui in rosso) con quello voluto.
Si può usare anche un colore già impostato in conkyrc, per esempio:
se, in conkyrc, è presente una riga di questo tipo color1 0077ff e volete usare quel colore, impostare la variabile così:
col_testo="\${color1}"
È importante usare i doppi apici e l'esacape del dollaro "\$"!

Il testo
Tutto il testo stampato dipende dalle righe che iniziano con echo.
Nessuno vieta di inserire altre righe con il testo che vogliamo, dove vogliamo.
Come regole generali; usare i doppi apici intorno a testo e variabili e fare l'escape del dollaro nelle stringhe di formato che devono essere interpretate da conky.

Contenuto delle variabili stampabili
${arr_adapter_rid[0]} (il primo elemento dell'array $arr_adapter_rid)
contiene il testo (qui in rosso) della riga di output di Sensors:
atk0110-acpi-0
${arr_adapter_rid[1]} (il secondo elemento dell'array $arr_adapter_rid)
k8temp-pci-00c3
$core non viene stampato direttamente ma per completezza... contiene:
Core0 Temp: +24.0°C
Core0 Temp: +29.0°C
Core1 Temp: +22.0°C
Core1 Temp: +25.0°C

Per altre informazioni vedere la sezione FAQ.

FAQ Torna su

- Lo script non parte!

Soluzione: Le cause possono essere due: il file dello script non è stato reso eseguibile oppure non è stato richiamato correttamente in Conky.

Nel primo caso, basta rendere il file conky_temp_color.sh eseguibile: aprire un terminale nella directory contenente lo script ed eseguire:
chmod +x conky_temp_color.sh
Per vedere se lo script funziona basta eseguirlo direttamente da terminale, eseguendo:
./conky_temp_color.sh
Se funziona sarà stampato nel terminale del testo simile a questo:
${color #0000ff}CPU (atk0110)${color #00FF00}32 °C ${color #0000ff}MB (atk0110)${color #FFA500}46 °C ${color #0000ff}k8temp ${color #0000ff}core_1:${color #00FF00}24 °C ${color #0000ff}core_2:${color #00FF00}29 °C ${color #0000ff}core_3:${color #00FF00}22 °C ${color #0000ff}core_4:${color #00FF00}25 °C


Nel secondo caso si deve essere sicuri di aver indicato correttamente il percorso (path) allo script conky_temp_color.sh.
Per esempio così:
${color 1e90ff}Temperature: ${execpi 4 /home/giovanni/script/conky_temp_color.sh }
Se non si vuole indicare il path conviene inserire lo script nella stessa directory del file di configurazione di conky (generalmente chiamato conkyrc (o .conkyrc se nascosto).

- Lo script non stampa come dovrebbe!

Soluzione: Lo script non funziona a dovere se i dati di uscita di Sensors sono strutturati in modo diverso da quanto indicato sopra.
In questo caso si deve adeguare l'espressione regolare di questa riga:
core="$(grep -Pio 'Core[0-9]* Temp:.*?\+\K[0-9]+' <<< "$dati")"
Potrebbe essere necessario modificare anche le stringhe colorate in queste righe: cpu_atk0110=$(sed -e 's/[^0-9.]//g' -e 's/\.0/ /g' < <(sed -n '/CPU Temp/p' <<< "$dati"))
mb_atk0110=$(sed -e 's/[^0-9.]//g' -e 's/\.0/ /g' < <(sed -n '/MB Temp/p' <<< "$dati"))

- In conky vengono stampate le stringe di formattazione del testo!

Soluzione: Molto probabilmente lo script è stato richiamato con exceci invece che con excecpi.
Per far interpretare a conky le stringhe di formattazione si deve utilizzare excecpi

- Stampa le temperature dei core una per riga, io vorrei che fossero stampate tutte su un'unica riga.

Soluzione: Per stampare le temperature dei core tutte su una sola riga ho predisposto (sotto la riga predefinita), una riga commentata, basta decommentarla e commentare la riga predefinita.
da così:
... # stampa dati k8temp while read d; do ((i++)) echo "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su righe separate #echo -n "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su una riga done <<< "$core" ...
a così:
... # stampa dati k8temp while read d; do ((i++)) #echo "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su righe separate echo -n "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su una riga done <<< "$core" ...

- Non voglio la stampa di "core_1, core_2... core_N"; vorrei solo le temperature.

Soluzione: basta cancellare la parte che non si vuole stampare, modificare la riga:
echo "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su righe separate
così:
echo "$(ColoreTemp $d) °C " # temp su righe separate

- Come visualizzare un mio testo nelle righe sopra/sotto alle temperature?

Soluzione: Per capire come fare, provare ad inserire le righe scritte in rosso e guardare l'output
... echo "\${col_testo}prima riga" echo "${col_testo}CPU (${arr_adapter_rid[0]})$(ColoreTemp $cpu_atk0110) °C" echo "\${col_testo}terza riga" echo "${col_testo}MB (${arr_adapter_rid[0]})$(ColoreTemp $mb_atk0110) °C" echo "\${col_testo}quinta riga" echo "${col_testo}${arr_adapter_rid[1]}" echo "\${col_testo}settima riga" while read d; do ((i++)) echo "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su righe separate #echo -n "${col_testo}core_${i}:$(ColoreTemp $d) °C " # temp su una riga done <<< "$core" # echo # se serve un 'a capo' finale, decommentare echo "\${col_testo}ultima riga" exit

DownloadTorna su

Lo script è utilizzabile, modificabile e ridistribuibile e liberamente, mantenendo però la stessa licenza (Creative Commons BY SA 4.0)

Scaricare il file conky_temp_color.sh.tar.gz (1,2KB), scompattarlo e se non lo fosse già rendere eseguibile lo script.



Per il momento è tutto!
Bye 8-)

Torna su
Sito realizzato da: UbaWeb di Giovanni Ubaldi

Licenza Creative Commons Tutto il contenuto di questo sito se non diversamente dichiarato è di Giovanni Ubaldi ed è distribuito con Licenza:

Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.