Ok, le titre sonnait mieux en anglais : Low-cost centralized wireless dashboard multicasting with Raspberry Pi, dashkiosk and Chromecast. Mais la ligne éditoriale de ce blog est en Français...

Les équipes informatiques sont friandes des écrans sur les murs qui diffusent toutes sortes de tableaux de bord, que ce soit l'état de la chaine d'intégration continue, le taux de passage des tests ou les métriques de supervision de la production. Ces dernières années ont vu fleurir les écrans sur les murs des open-spaces. Généralement contrôlés par des SOC (Raspberry Pi, Odroid, ...). Cette solution peu onéreuse a toutefois quelques inconvénients. Notamment, cela fait un OS de plus à administrer pour chaque écran, la fiabilité est moyenne (combien de prise de main à distance sur le Raspberry Pi par an et par écran ?) et surtout, chaque solution d'affichage est autonome, avec ses avantages, mais aussi ses inconvénients.

La solution que je vous propose aujourd'hui a pour objectif :

  • De diffuser vos tableaux de bord (accessibles en HTTP/HTTPS) sur plusieurs écrans
  • De diffuser du contenu sans fil (via Wi-Fi)
  • D'être gérée de manière centralisée
  • D'être d'une fiabilité déconcertante
  • De pouvoir ajouter un écran très facilement, rapidement, sans connaissances particulière de l'administration système
  • De couter moins cher qu'un Raspberry Pi pour chaque écran

Elle peut également servir dans d'autres contextes, par exemple gérer les différents écrans publicitaires d'une boutique pour de la signalétique numérique

Tour d'horizon

Je vous propose donc d'utiliser un Raspberry Pi pour gérer vos affichages de manière centralisée (c'est à dire pouvoir simplement choisir quel(s) tableau(x) de bord seront affichés sur quels écrans) en utilisant le logiciel dashkiosk et d'utiliser des Chromecast pour la diffusion.

dashkiosk peut être installé sur n'importe quelle machine, mais le Raspberry est l'une des moins cher. Ce logiciel en nodejs permet de gérer chaque écran et de décider ce qui sera affiché dessus (quelles URL), de gérer l'affichage en fonction de l'heure ou du jour, de réaliser un cycle entre différentes URL, etc...

img1

Un kit de démarrage Raspberry Pi 3 coute environ 55€ TTC (Raspberry Pi + boitier + alimentation + sdcard). On trouve des Chromecast de première génération sur ebay pour environ 10€ port compris. c'est amplement suffisant.

Cela nous fait donc un cout total d'environ 55€ + 10€ * (nombre d'écran).

Dashkiosk

Dashkiosk est une solution de gestion d'affichage multi-écrans. La video ci-dessous vous présente en détail son fonctionnement :

Installation

Nous allons commencer par installer nodejs. Comme dashkiosk s'attend à avoir nodejs accessible par la commande node, nous demandons aussi à alternatives de gérer un lien symbolique pour nous. Nous installons également les prérequis à dashkiosk.

$ aptitude install nodejs npm
$ update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
$ aptitude install git libavahi-compat-libdnssd-dev libsqlite3-dev libjpeg-progs optipng gifsicle autoconf dh-autoreconf

Téléchargez dashkiosk depuis github et configurez le tout.

$ curl -sL -o - 'https://github.com/vincentbernat/dashkiosk/archive/master.tar.gz' | tar -C /opt -zxvf -
$ mv /opt/dashkiosk-master /opt/dashkiosk
$ cd /opt/dashkiosk
$ npm install -g bower grunt-cli
$ npm install
$ grunt
$ cd dist && npm install --production

Troll mode : oui oui, on utilise un gestionnaire de paquets (aptitude) pour installer un gestionnaire de paquets (npm) qui nous permet d'installer un gestionnaire de paquets (bower). C'est trop cool, en fait, NodeJS ;)

Démarrons dashkiosk et testons avec un navigateur si cela fonctionne :

$ cd /opt/dashkiosk/dist
$ node server.js --environment production

Vous pouvez ensuite avec un navigateur vous rendre à l'URL http://<IP de votre raspberry>:9400/admin pour accéder à l'interface d'administration et avec un autre onglet à l'adresse http://<IP de votre raspberry>:9400/receiver pour en faire un écran d'affichage.

Une fois votre test effectué, vous pouvez quitter dashkiosk (CTRL-C)

Démarrage automatique

Bon, c'est chouette de pouvoir lancer à la main dashkiosk, mais ce serait mieux qu'il se lance tout seul comme tous les autres démons. systemd va gérer cela pour nous.

Créez un utilisateur dashkiosk qui sera dédié au lancement de dashkiosk:

$ adduser --home /opt/dashkiosk/ --shell /usr/sbin/nologin --no-create-home --disabled-login --gecos "" dashkiosk
$ chown -R dashkiosk: /opt/dashkiosk/dist/

Puis créez un fichier /etc/systemd/system/dashkiosk.service avec le contenu suivant :

[Unit]
Description=Dashkiosk dashboard admin

[Service]
ExecStart=/usr/bin/nodejs server.js --environment production
StandardOutput=null
StandardError=syslog
Restart=always
User=dashkiosk
Group=dashkiosk
WorkingDirectory=/opt/dashkiosk/dist/

[Install]
WantedBy=multi-user.target

Vous aurez remarqué qu'on supprime la sortie standard. En effet, dashkiosk est très verbeux et j'ai rempli un disque de 15Go en moins d'une semaine en l'envoyant dans syslog. Il est toujours possible de remplacer null par syslog temporairement pour débugguer ultérieurement.

Il ne reste plus ensuite qu'à demander à systemd de prendre en compte ce fichier et à lancer dashkiosk :

$ systemctl enable dashkiosk
$ systemctl start dashkiosk

Chromecast

Nous allons supposer ici que votre chromecast est déjà configurée et fonctionnelle, c'est un jeu d'enfant en suivant les instructions à l'écran.

Comme la Chromecast est découverte en utilisant le protocole DNS multicast (mDNS), le Raspberry Pi et la Chromecast doivent obligatoirement être dans le même réseau pour que cela fonctionne.

Nous allons configurer notre Raspberry Pi pour qu'il fasse de la résolution DNS multicast (ZeroConf/Apple Bonjour/Microsoft LLMNR).

D'abord, installez les packages nécessaires :

$ aptitude install avahi-utils libnss-mdns

puis éditez le fichier /etc/nsswitch.conf et remplacez la ligne qui commence par hosts par ce contenu :

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

Il n'y a plus qu'à tester manuellement que cela fonctionne. Nous lançons d'abord une recherche de chromecast :

$ avahi-browse -r _googlecast._tcp
+  wlan0 IPv4 Chromecast-Ultra-7f532001624a95c2f74e7b44d690c056 _googlecast._tcp     local
=  wlan0 IPv4 Chromecast-Ultra-7f532001624a95c2f74e7b44d690c056 _googlecast._tcp     local
   hostname = [7f532001-624a-95c2-f74e-7b44d690c056.local]
   address = [192.168.1.2]
   port = [8009]
   txt = ["rs=" "nf=1" "bs=FA8FCA7ED164" "st=0" "ca=4101" "fn=Chromecast" "ic=/setup/icon.png" "md=Chromecast Ultra" "ve=05" "rm=BE1C2E8914AAF2BB" "cd=D7FBF1741973D5D9085B37B99AF75FE1" "id=7f532001624a95c2f74e7b44d690c056"]

avahi-browse découvre bien une chromecast. Relevez le contenu de hostname (ici 7f532001-624a-95c2-f74e-7b44d690c056.local) puis essayez de récupérer son adresse IP :

$ getent hosts 7f532001-624a-95c2-f74e-7b44d690c056.local
192.168.1.2     7f532001-624a-95c2-f74e-7b44d690c056.local

Si vous obtenez bien l'adresse IP de votre Chromecast, c'est que tout fonctionne, votre Raspberry Pi peut découvrir votre Chromecast et communiquer avec.

Editez ensuite le fichier /opt/dashkiosk/dist/lib/config.js et modifiez la section chromecast comme ceci :

// Chromecast
chromecast: {
  enabled: true,
  receiver: 'http://<IP de votre raspberry>:9400/receiver',
  app: '5E7A2C2C'
},

en remplaçant <IP de votre raspberry> par l'IP de votre Raspberry Pi. Cela permet d'indiquer aux clients Chromecast l'URL à charger.

Il suffit ensuite de relancer dashkiosk :

$ systemctl restart dashkiosk

Vous devriez alors voir aparaitre votre Chromecast comme nouvel écran dans l'interface d'administration de dashkiosk. Il suffit de le placer dans un groupe pour qu'il charge les dashboard sélectionnés

Ajout d'un écran

Ajouter un écran à la solution est d'une simplicité enfantine. Il suffit de configurer la Chromecast et de la connecter au même réseau que le Raspberry Pi, dashkiosk la reconnait alors automatiquement et il n'y a plus qu'à l'ajouter dans le bon groupe pour que l'écran commence à diffuser son contenu.

Et la sécurité dans tout ça ?

Contrôle d'accès

à l'administration de dashkiosk

Comme on ne veut pas que n'importe qui sur le réseau puisse modifier l'affichage sur nos écrans, nous devons protéger l'accès à l'interface d'administration de dashkiosk.

Pour ajouter du contrôle d'accès à dashkiosk, il suffit d'éditer le fichier /opt/dashkiosk/dist/lib/config.js et de modifier la section auth pour ajouter un utilisateur et un mot de passe d'accès à l'administration de dashkiosk :

// Auth
auth: {
  enabled: true,
  realm: 'Dashkiosk',
  username: 'myuser',
  password: 'mypasswd'
},

Il faut ensuite relancer dashkiosk pour la prise en compte de ces nouveaux paramètres :

$ systemctl restart dashkiosk

Cependant, cette approche présente un inconvénient : l'URL de visualisation est également protégée, il faut donc modifier l'URL des clients sous la forme http://user@password:<IP de votre raspberry>:9400/receiver. C'est moche d'abord parce qu'on véhicule un mot de passe sur une session non chiffrée (HTTP) et d'autre part parce que la chromecast affiche l'url lors du chargement. bof bof.

Une meilleure solution serait d'installer un serveur web en frontal de dashkiosk qui ne protège que la partie administration de dashkiosk. Je vous laisse cette partie en exercice.

aux Chromecast

Il est préférable, pour éviter que tout le monde joue avec les chromecast de les protéger.

Dans les paramètres de votre Chromecast (contrôlable par l'application Google Home sur un téléphone android), assurez vous que le paramètre suivant est décoché :

img1

Vous pouvez également utiliser un réseau dédié pour connecter vos Chromecast. Ainsi, personne ne pourra prendre la main dessus. Le Raspberry Pi pourra alors se connecter à ce réseau avec son interface Wi-Fi et au réseau de l'entreprise grâce à son interface RJ45 pour l'administration de la solution.

Je vous laisse aussi en exercice ce point ;)

Disponibilité

Cette solution a l'avantage de la robustesse. Si un écran plante, il suffit de relancer la Chromecast (débrancher/rebrancher). Dashkiosk la redécouvre et reconnecte les chromecast automatiquement.

On peut même avoir en stock une Chromecast supplémentaire pour effectuer un remplacement ultra rapide en cas de défaillance. c'est beaucoup plus simple à configurer que de réinstaller un Raspberry Pi pour le coller derrière un écran...

Conclusion

Voilà une solution à moindre cout, fiable, qui sera utile aussi bien pour la gestion de multiples écrans à partir d'un point central que pour la gestion d'un seul écran lorsque l'unité "intelligente" doit être déportée loin de l'affichage.


Comments

comments powered by Disqus