Nuevo LCD para mi ordenador principal

LCD Crystalfontz

No es ningún secreto que soy un apasionado de las pantallas LCD de caracteres, y la hemeroteca de mi blog ofrece una buena muestra de ello. Igual que hace unos meses desempolvé mi viejo LCD Crystalfontz para proporcionar feedback a mi servidor de render, este mes he decidido que ya es hora de que mi PC de escritorio, que es con el que trabajo a diario, tenga un LCD también.

Mi juguete nuevo va a mostrar una información bastante variada, pero algunas funciones van a ser particularmente útiles en este ordenador, como  el indicador de actividad en red, que me permite saber si una descarga está en curso o el monitor de carga del procesador me permite conocer si algunas tareas como el renderizado están en curso o han terminado.

La elección en este caso ha sido un Crystalfontz CFA634 de 20×4 caracteres igual que el que ya tenía mi servidor de render, pero en color verde/negro invertido. Y tal y como llevo haciendo casi desde mi primer LCD, estoy usando lcd4linux para hacerlo funcionar.

Configuración de los monitores

A continuación me voy a centrar en el proceso individual que he seguido para configurar cada uno de los monitores. Ya he explicado en otras entradas cómo se estructura el archivo lcd4linux.conf, de modo que voy a detallar solamente cómo crear los widgets.

Reproductor de audio: canción en curso

La primera línea está dedicada íntegramente mostrar el típico now playing que muestra la canción que se está reproduciendo en cada momento. Ya que yo uso Audacious, he configurado el widget para que funcione con él usando la herramienta audtool.

El primer problema surge de que audtool no funciona como root (y lcd4linux ejecuta los comandos como root), sino que debe ejecutarse como usuario normal . Por tanto, tendremos que forzar que se ejecuten como usuario normal con este comando de ejemplo:

su -c "audtool current-song" nombreusuario

Con este comando mostramos la canción actual ejecutandolo bajo el nombre de usuario elegido.

Widget AudTitle {
class 'Text'
expression exec('su -c "audtool current-song" nombreusuario', 4000)
width 20
align 'PC'
speed '1000'
}

Dado que audtool no permite desglosar artista y título, la cadena “artista – título” se muestra siempre en un mismo renglón, por lo que he definido el modo de alineación en pingpong-scroll, que produce un efecto marquesina en dos direcciones. Existen tres modos: PL, PC y PR, que solo se diferencian en la alineación cuando la cadena no sobrepasa el ancho.

Por último, le añadí el parámetro speed para poner 1000ms en lugar de los 500 por defecto, ya que mi LCD no tiene una tasa de refresco muy buena y un scroll demasiado rápido dificultaba la lectura

Ejecutando audtool --help podemos ver otras opciones para mostrar.

Indicador de tiempo de encendido

Para mostrar el uptime uso el plugin que tiene lcd4linux al efecto, prácticamente sin modificar.

Widget Uptime {
class 'Text'
expression uptime('%H:%M')
width 6
align 'L'
update 1000
}

Ya que el espacio es limitado y es laborioso encajar toda la información, decidí mostrar solamente la hora y los minutos porque este no es el indicador más importante, y con este ordenador raramente superaré las 99 horas encendido para que necesite 6 caracteres en lugar de 5.

Espacio libre en discos

Para extraer la información sobre el uso del espacio uso una combinación de comandos para extraer información del clásico df -h:

df -h | grep /dev/sda1 | awk '{ print $4 }'

Este comando consta de tres partes:

  • En primer lugar, df muestra una tabla con estadísticas de uso de todas las unidades de almacenamiento
  • En segundo lugar, uso grep para filtrar la línea correspondiente a la unidad de disco que quiero analizar
  • En tercer lugar, uso awk para filtrar el cuarto bloque de la línea, que es el que muestra el espacio libre

Dado que esta cadena contiene caracteres especiales que entran en conflicto con la sintaxis de lcd4linux.conf, primero creo el script /usr/local/bin/ssdfree y le aplico permisos de ejecución con chmod +x, de modo que ya puedo iniciarlo con solo ejecutar ssdfree.

Con esta cadena de comandos, ya puedo configurar el siguiente widget:

Widget SSDfree {
class 'Text'
expression exec('ssdfree', 5000)
width 5
align 'R'
}

Monitor de tráfico en red

Para este efecto, el plugin netdev que incluye por defecto lcd4linux ya funciona bastante bien, así que con unos pequeños retoques. Así quedaron mis widgets:

Widget NetDown {
class 'Text'
expression (netdev('eth0', 'Rx_bytes', 500))/1024
width 5
precision 0
align 'L'
update tick
}

Widget NetUp {
class 'Text'
expression (netdev('eth0', 'Tx_bytes', 500))/1024
width 5
precision 0
align 'L'
update tick
}

La división final por 1024 se realiza para convertir el valor a Kilobytes, pero se puede cambiar este número si queremos el resultado en otra unidad.

Importante cerciorirarse del nombre del dispositivo de red. Lo normal es que sea algo como eth0 en conexiones por cable o wlan0 en inalámbricas, pero esto depende mucho del driver de la tarjeta. En mi caso, por ejemplo, la interfaz de cable se llama enp3s0. Para salir de dudas, basta con ejecutar ifconfig.

Temperatura del disco duro

El plugin HDDtemp que incluye por defecto funciona bastante bien, aunque previamente tuve que reconfigurar el paquete hddtemp en Debian para que aceptara solicitudes. El widget quedó así:

Widget HDDTemp {
class 'Text'
expression hddtemp('/dev/sdX')
width 3
postfix 'C'
precision 0
align 'R'
update tick
}

Opcionalmente, podemos usar directamente el comando hddtemp con el plugin de ejecución, ya que nos bastaría con usar hddtemp -n /dev/dispositivo para obtener el valor de la temperatura sin decimales ni sufijos.

Solamente estoy midiendo la temperatura de mi disco duro mecánico. No he podido extraer la temperatura de mi otro disco duro SSD, a pesar de que teóricamente se puede con la herramienta smartctl.

Temperatura del procesador

Para extraer el valor de la temperatura, uso directamente una combinación de comandos, ya que el plugin i2c, a pesar de que funciona bien, me muestra decimales y sufijos que ocupan demasiado espacio.

Lo primero que hago es crear un script al que llamaré cputemp, que contiene lo siguiente, y que obtiene el valor de la temperatura con un método distinto. Lo guardo en /usr/local/bin y le doy permisos de ejecución con chmod +x.

temp=$(cat /sys/class/thermal/thermal_zone2/temp)
resultado=$(($temp/1000))
echo "$resultado"

Después, basta con usar el plugin de ejecución y el widget queda así:

Widget CPUTemp {
class 'Text'
expression exec('cputemp', 5000)
postfix 'C'
width 3
align 'R'
}

Carga de trabajo del procesador

Para mostrar la carga del procesador uso el plugin incluido, y que funciona bastante bien, por lo que el widget queda así:

Widget Carga {
class 'Text'
expression proc_stat::cpu('busy', 500)
postfix '%'
width 4
precision 0
align 'R'
update tick
}

Le doy 4 caracteres de largo para darle capacidad a un posible 100% ocasional, y no uso prefijo ni sufijo ya que es el único indicador porcentual, por lo que no cabe confusión sobre su significado.

Mostrar la dirección IP local

Para obtener la dirección IP local uso un nuevo método simplificado que se limita a ejecutar el comando hostname --all-ip-addresses. Me funciona porque solo estoy conectado a una red local, como también es la inmensa mayoría de los casos, pero de lo contrario imagino que este método no valdría, o habría que filtrar la salida del comando.

Widget DirIP {
class 'Text'
expression exec('hostname --all-ip-addresses', 10000)
width 16
align 'L'
}

También uso este nuevo método porque el método que usé con netstat para mi servidor de render no terminó de funcionar del todo bien.

Algunos extras

Diseñando iconos

Los iconos, más allá de elementos estéticos, son también muy útiles para mostrar leyendas usando un solo carácter. Por ejemplo, en lugar de malgastar cuatro caracteres para mostrar la leyenda “Temp”, podemos gastar solamente uno, que muestre el icono de un termómetro.

Conociendo los puntos de ancho y alto (en mi caso 5×6) podemos usar GIMP y líneas guía para prediseñar los iconos de una manera visual, antes de trasladarlos manualmente para crear el widget.

Aquí estoy diseñando un icono que pone HD para la temperatura del disco duro. Y una vez diseñado, el widget queda así:

Widget HDIcon {
    class 'icon'
    bitmap {
        row1 '.*..*.'
        row2 '.****.'
        row3 '.*..*.'
        row4 '......'
        row5 '.***..'
        row6 '.*..*.'
        row7 '.*..*.'
        row8 '.***..'
    }
}

Extra – contador de tiempo parcial/total de la música en reproducción

Al igual que con el título, es para Audacious y usa la herramienta audtool. Estos son los dos widgets, que hay que poner de manera consecutiva:

Widget AudTotal {
class 'Text'
expression exec('su -c "audtool current-song-length" nombreusuario', 4000)
width 5
align 'R'
prefix '/'
}

Widget AudPartial {
class 'Text'
expression exec('su -c "audtool current-song-output-length" nombreusuario', 1000)
width 5
align 'R'
}

Y finalmente, aquí está el archivo lcd4linux.conf íntegro que uso en este ejemplo. Se puede bajar para estudiarlo y personalizarlo para cada caso particular.

Previous Post Next Post

You Might Also Like

1 Comment

  • Reply Rescatando mi viejo LCD para mejorar el servidor de render – Giingo 4 noviembre, 2018 at 13:37

    […] unas veces se mostraba la IP y otras no. Si tienes problemas con este método, quizás te interese este otro método que he seguido con un nuevo […]

  • Leave a Reply

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.