Ajouter un écran LCD sur son Syno

Un petit truc que je trouve dommage sur les Syno, c’est qu’on ne peut pas voir d’un seul coup d’oeil quelques infos sur la machine, comme l’activité CPU, le remplissage des disques, sans devoir se connecter via son ordinateur ou son mobile.
C’est pour cette raison que je me suis penché sur la possibilité d’ajouter un petit écran lcd et de chercher comment y afficher les informations que j’aimerais avoir.Quelques recherches plus tard, j’ai trouvé à la fois le logiciel que j’utiliserais (lcd4linux) et aussi l’écran (un écran USB 4×20 caractères piloté par un contrôleur HD44780 payé 25€ sur Ebay). D’ailleurs, je ne peux résister à mettre une photo du joli colis reçu pour l’occasion:Le colis reçu de Hiong-Kong
Et une photo de l’écran, en pleine action:L'écran LCD en pleine action
Pour arriver à cela, il n’y a rien de vraiment sorcier, c’est ce que je vais expliquer maintenant.Installation du logicielOn a de la chance ce ce côté: le package lcd4linux est disponible avec ipkg (à installer si ce n’est déjà fait, comme expliqué dans l’article sur la supervision perso). Il n’y a donc qu’à taper la commande suivante en tant qu’utilisateur root:ipkg install lcd4linux

Il faut ensuite changer les droits du fichier de conf car lcd4linux ne fonctionne pas si les autres utilisateurs que root ont trop de droit:
chmod 600 /opt/etc/lcd4linux.conf
1er exemple : affichage de la charge CPUIl n’y a qu’un fichier de conf pour cela: /opt/etc/lcd4linux.conf (le fichier dont on a modifié les droits juste au dessus). On va commencer en affichant la charge CPU en haut à gauche de l’écran.
Pour commencer, dans le fichier /opt/etc/lcd4linu.conf, il faut définir un écran lcd sur lequel on va faire l’affichage, en indiquant le driver utilisé (dans mon cas LCD2USB pour le contrôleur HD4478), la taillede l’écran (20×4 pour le nombre de caractères hauteur x largeur), le contraste et la luminosité (maximum 250 chacun: valeurs que j’ai choisi après tâtonnement):

Display MonEcranLCD { Driver 'LCD2USB' Size '20x4' Contrast 250 Brightness 125 } 

Ensuite, on définit la façon dont on veut afficher notre charge CPU. Pour cela, on crée un « widget », en lui indiquant le type données à afficher (Text dans notre cas, mais ça pourrait être une barre par exemple), la valeur à récupérer (il y a des valeurs prédéfinies comme c’est le cas ici, mais on pourrait très bien utiliser une valeur retournée par un script shell), le préfixe, le postfixe, la largeur de l’affichage, la précision (0 indique aucun chiffre après la virgule), l’alignemen (R pour droite) et le temps de raffraîchissement (500 ms dans ce cas):

 Widget CPU { class 'Text' expression proc_stat::cpu('busy', 500) prefix 'CPU: ' postfix '% | ' width 11 precision 0 align 'R' update 500 } 

Ensuite, on définit à quel endroit on veut afficher nos widget, en précisant la ligne et la colonne:

Layout Default { Row1 { Col1 'CPU' } Row2 { } Row3 { } Row4 { } } 

Pour terminer, on choisit l’affichage qui sera utilisé ainsi que l’écran (car il est possible de définir plusieurs écrans, plusieurs affichages et plusieurs widget):

 Display 'MonEcranLCD' Layout 'Default'

Pour tester cela et le lancer lcd4linux en tâche de fond,  il suffit de lancer la commande suivante:

lcd4linux -f /opt/etc/lcd4linux.conf

Pour stopper le processus (à chaque fois qu’on modifier le fichier et qu’on veut tester la nouvelle conf):

killall lcd4linux

On continue: on ajoute le % de RAM utilisé

Pour ajouter le % de RAM utilisé, il suffit de rajouter une section Widget. La différence ici, c’est qu’on doive effectuer des calculs pour obtenir la mémoire utilisée (une bête règle de trois):

 Widget MEMOIRE { class 'Text' expression meminfo('MemFree')/meminfo('MemTotal')*100 prefix 'RAM: ' postfix '%' width 8 precision 0 align 'R' update 500 } 

On rajoute dans l’affichage ce qu’on vient de créer, à la colonne 12 de la ligne 1:

 Layout Default { Row1 { Col1 'CPU' Col12 'MEMOIRE'  } Row2 { } Row3 { } Row4 { } } 

Et maintenant, on utilise le retour d’un script shell

On crée un nouveau widget qui retournera le pourcentage d’espace disque libre du volume1. La commande Unix permettant de renvoyer cela (df -k /volume1 | tail -1 | cut -b22- | cut -d »  » -f5 ) doit être appelée avec la commande exec. Par contre, on ne va pas rafraichir toutes les 500ms, toutes les 10mn est largement suffisant:

Widget ESPACEDISQUE1 { class 'Text' expression exec('df -k /volume1 | tail -1 | cut -b22- | cut -d" " -f5',1000') prefix 'HD1: ' postfix ' |' width 10 align 'L' update 60000 } 

Pour finir, on met l’affichage de l’espace disque sur la 2ème ligne, colonne 1:

 Layout Default { Row1 { Col1 'CPU' Col12 'MEMOIRE'  } Row2 { Col1 'ESPACEDISQUE1'  } Row3 { } Row4 { } } 

Exemple complet

Ci dessous l'exemple complet qui permet d'afficher ce qu'il y a sur la photo du début de l'article. J'ai ajouté l'uptime et j'ai aussi ajouté une section Variable qui permet d'intégrer des variables dans les différentes sections (utilisées ici pour le temps de raffraichissement):

Display MonEcranLCD { Driver 'LCD2USB' Size '20x4' Contrast 250 Brightness 125 } Widget ESPACEDISQUE1 { class 'Text' expression exec('df -k /volume1 | tail -1 | cut -b22- | cut -d" " -f5',1000') prefix 'HD1: ' postfix ' |' width 10 align 'L' update minute } Widget ESPACEDISQUE2 { class 'Text' expression exec('df -k /volume2 | tail -1 | cut -b22- | cut -d" " -f5',1000') prefix 'HD2: ' postfix ' |' width 10 align 'L' update minute } Widget MEMOIRE { class 'Text' expression meminfo('MemFree')/meminfo('MemTotal')*100 prefix 'RAM: ' postfix '%' width 8 precision 0 align 'R' update tick } Widget CPU { class 'Text' expression proc_stat::cpu('busy', 500) prefix 'CPU: ' postfix '% | ' width 11 precision 0 align 'R' update tick } Widget UPTIME { class 'Text' expression uptime('%d days %H:%M:%S') width 20 align 'R' prefix 'Up ' update 1000 } Layout Default { Row1 { Col1 'CPU' Col12 'MEMOIRE' } Row2 { Col1 'ESPACEDISQUE1' Col12 'ESPACEDISQUE2' } Row3 { } Row4 { Col1 'UPTIME' } } Variables { tick 500 minute 60000 } Display 'MonEcranLCD' Layout 'Default' 

Lancement automatique

Si maintenant on veut lancer lcd4linux au démarrage du Syno, il suffit de créer le fichier /opt/etc/init.d/S99lcd4linux avec le contenu suivant:

#! /bin/sh
#
# lcd4linux
#
PATH=/opt/bin/:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
DAEMON=/opt/bin/lcd4linux
NAME=lcd4linux
DESC=lcd4linux
test -f $DAEMON || exit 0
set -e
case "$1" in
  start)
	echo -n "Starting $DESC: "
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	start-stop-daemon --oknodo --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
	echo "$NAME."
	;;
  reload)
	start-stop-daemon --stop --signal 1 --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
  	;;
  restart|force-reload)
	echo -n "Restarting $DESC: "
	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
	sleep 1
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
	echo "$NAME."
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
	exit 1
	;;
esac
exit 0 

Conclusion

Je suis content de ce que j’ai réalisé, mais j’aurais aimé avoir la possibilité d’avoir plusieurs « layout » qui se succèdent. Par exemple, avoir pendant 15 secondes le layout suivant:
Exemple 1 LCDpuis celui-là pendant  5 secondes:
Exemple 2 LCDpuis celui-là pendant 10 secondes:

Exemple 3 LCDet revenir ensuite au premier.Je vais donc me pencher sur le programme lcdproc qui pourrait me permettre de réaliser ça, mais de manière un peu plus complexe.

Liens que j’ai utilisé pour rédiger cet article
Site web de lcd4linux:
Manuel:
Conf:
Howto:


Laisser un commentaire