Petit article pour parler d’un projet qui a échappé au blog jusqu’ici : Le Magic Mirror. Le Magic Mirror (miroir magique) est un projet Raspberry Pi très populaire, qui permet de concevoir un miroir intelligent modulaire.
Petite vidéo pour vous faire une idée d’implémentation, ici le projet est couplé avec l’assistant Kalliopé, déjà couvert dans ce blog.
Le projet est modulaire, vous pouvez donc afficher toutes sortes d’informations comme :
- la date et l’heure
- la météo
- vôtre agenda
- des news
- des citations
- l’horaire de bus/train et autres moyens de transport
- une TODO list
- le trafic routier
- des informations provenant de modules connectés au Raspberry (température, humidité, pression atmosphérique, etc..)
- l’Informations liées à vos éléments domotiques
Certain module sont natif et disponible immédiatement après installation, les autres sont communautaire et à installer manuellement.
La liste des modules natifs est là. Et la liste des modules communautaire est disponible ici.
Il est bien sur possible de créer son propre module. Le projet est codé en javascript et basé sur nodejs. La documentation pour vous aider dans ce sens est ici.
Préparation du raspberry
Installation d’un gestionnaire graphique de bureau
Cette partie de l’installation est nécessaire si vous avez installé un Raspbian Lite, c’est à dire dépourvu d’interface graphique.
Installation d’un serveur graphique :
sudo apt-get install xinit xserver-xorg lxde-core lightdm
On configure le Raspberry pour qu’il utilise le gestionnaire graphique de bureau au démarrage :
sudo raspi-config
Rendez vous dans “Boot Options” et passez l’option sur “Desktop Autologin”
On installe d’autres paquets et librairies nécessaire à l’installation :
sudo apt-get install git libxss1 libnss3
Pulseaudio s’est installé en même temps que le gestionnaire de bureau. Sa suppression est recommandée afin de laisser le programme par défaut Alsa gérer le son si vous pensez coupler le système à un assistant vocal :
sudo apt-get autoremove --purge pulseaudio
On redémarre une première fois pour appliquer les changements :
sudo reboot
Vous devriez cette fois démarrer sur un environnent de bureau.
Désactiver le curseur de la souris
On ajoute un petit programme qui va se charger de cacher le curseur de la souris automatiquement :
sudo apt-get install unclutter
Incliner l’écran
Si vous voulez incliner l’écran, éditez le fichier /boot/config.txt en ajoutant le flag display_rotate selon la syntaxe suivante :
display_rotate=<numéro de config>
Ou le numéro de config est :
- display_rotate=0 Normal
- display_rotate=1 90 degrés
- display_rotate=2 180 degrés
Par exemple :
display_rotate=1
Full screen
Si vous n’êtes pas en plein écran, il est possible de le forcer en éditant le fichier /boot/config.txt :
disable_overscan=1
Timezone
Vous allez forcément utiliser le module qui permet d’afficher l’heure sur vôtre miroir. Ce module se base sur l’heure du système, il est donc préférable que ce dernier soit réglé sur une heure française.
Lancez le gestionnaire de configuration Raspbian :
sudo raspi-config
Rendez vous dans l’onglet “Timezone”, puis sélectionner “Europe”, puis “Paris” pour basculer sur l’heure Française :
Par ailleurs, être à la bonne heure est aussi plutôt appréciable.
Pour cela on utilise le protocole NTP (Network Time Protocol). C’est un protocole qui permet à un ordinateur de synchroniser son horloge sur un autre ordinateur avec une précision plus élevée via internet.
Installation du paquet qui va bien :
apt-get install ntp
Lancement du deamon :
systemctl start ntp systemctl status ntp
On édite le fichier /etc/ntp.conf et on modifie les lignes « server » pour se synchroniser sûr les serveurs français :
server 0.fr.pool.ntp.org iburst dynamic server 1.fr.pool.ntp.org iburst dynamic server 2.fr.pool.ntp.org iburst dynamic server 3.fr.pool.ntp.org iburst dynamic
On redémarre le service pour prendre en compte les changements :
systemctl restart ntp
Vérifiez que l’heure est correcte avec la commande suivante :
date
Désactiver l’écran de veille
On souhaite voir uniquement l’affichage du Magic Mirror sans interruption. Par défaut Raspbian possède un écran de veille qui se lance automatiquement après une période d’inactivité.
Éditez /etc/xdg/lxsession/LXDE/autostart et .config/lxsession/LXDE/autostart, supprimer ou commentez la ligne suivante :
@xscreensaver -no-splash
Et ajouter la ligne suivante en fin de fichier
@xset s noblank @xset s off @xset -dpms
Enfin, éditez le fichier /etc/lightdm/lightdm.conf et ajouter la ligne suivante dans la section [Seat:*] :
xserver-command=X -s 0 -dpms
Il faut redémarrer le Rpi pour prendre en compte ces changements.
Magic Mirror
Installation
L’installation est très facile, depuis un Raspbian fraîchement installé :
bash -c "$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)"
Vous avez à présent un dossier MagicMirror dans le “home” de l’utilisateur “pi”. Placez vous dans ce dossier et lancer l’installation des modules javascript. Normalement c’est une étape qui a déjà été effectuée pendant le processus d’installation mais cela ne coûte pas grand chose de vérifier que tout est bien là :
cd ~/MagicMirror npm install
On va activer la configuration par défaut, pour cela on copie juste le fichier :
cp config/config.js.sample config/config.js
Maintenant vous pouvez lancer le Magic Mirror
Si vous être en direct sur le Rpi, utilisez cette commande :
npm start
Si vous êtes en SSH, utilisez cette commande :
DISPLAY=:0 nohup npm start
Normalement vous devriez avoir un résultat comme celui-ci à l’écran :
Faite un ctl-C pour stopper le programme.
Démarrage automatique
On va faire en sorte que le projet se lance automatiquement après chaque reboot du Rpi.
Installez le packet PM2 qui est un gestionnaire de processus node :
sudo npm install -g pm2
On lance le gestionnaire depuis le dossier MagicMirror :
pm2 startup
Cette commande va vous retourner une commande à exécuter qui devrait ressembler à ceci :
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi"
Exécutez la commande comme demandé. Magic Mirror est à présent lancé automatiquement à chaque démarrage.
Pour relancer Magic Miror vous pouvez à présent faire :
systemctl restart pm2
Configuration
Vous l’avez compris, la configuration se passe dans le fichier config/config.js. Je vous recommande d’éditer ce dernier avec un IDE comme VScode afin de détecter vos erreurs de syntaxe. Le fichier est écrit en javascript.
Le bon workflow pour travailler avec ce type de projet est :
- copier le fichier avec WinSCP (via SSH) sur votre station de travail Windows
- Editer avec VScode le fichier
- Envoyer à nouveau le fichier sur le Rpi avec WinSCP
- Relancer le service Magic Mirror pour prendre en compte les changements
Dans le fichier config.js, vous pouvez commencer par mettre la langue du miroir en français :
language: "fr", timeFormat: 24, units: "metric",
Les modules
Dans ce fichier, vous aurez à jouer principalement avec la variable “modules” qui contient la liste des modules chargés sur votre miroir et leurs configurations.
Un module c’est quoi ? C’est un plugin qui va effectuer une tache et dans la plus part des cas afficher une information sur le miroir.
Une déclaration de module s’effectue avec la syntaxe suivante :
{ module: "nom_du_module", position: "nom_de_la_position", header: "nom du texte précédent le module", config: { variable_config1: "valeur 1", variable_config2: "valeur 2", } }
Par exemple :
{ module: "currentweather", position: "top_right", config: { location: "Grenoble", appid: "YOUR_OPENWEATHER_API_KEY" } },
Voici la liste des principaux éléments que compose un module :
Option | Description |
module |
Nom du module. Par example clock , calendar ,mymodule . |
position |
La position du module sur le miroir. Les valeurs possible sont :
|
header |
Optionnel: Affiche un texte au dessus du module |
disabled |
Optionnel: Mettre à true pour désactiver le module |
config |
Optionnel: Objet contenant les propriétés de configuration du module. Il faut se référer à la documentation de chaque module pour connaitre les propriétés. |
Vous pouvez trouver la liste complète sur la documentation officielle ici.
Au niveau des “positions”, cette image pourra vous aider :
top_bar
et bottom_bar
en gris
top_left
et bottom_left
en rouge
top_center
et bottom_center
are bleu
top_right
et bottom_right
are vert
upper_third
en jaune
middle_center
en cyan
lower_third
en magenta
Utilisation d’un module natif
Les modules natifs sont les modules déjà présent après installation du Magic Mirror. Vous pouvez trouver la liste complète ici.
Pour les utiliser, vous devez juste les déclarer et les configurer dans vôtre fichier config.js.
Par exemple, je souhaite afficher un simple texte à l’écran, je vais utiliser le module “HelloWorld”. Si je regarde sa documentation, je peux voir que seule la clé “text” est nécessaire dans sa configuration. Je peux donc écrire :
{ module: "helloworld", position: "middle_center", header: "Weather Forecast", config: { text: "Bienvenue sur le blog framboise314" } },
Le résultat sera le suivant :
Un exemple avec le module “newsfeed”, qui n’est autre q’un lecteur de flux RSS. Ici je le configure pour lire le flux du site “Le Monde” :
{ module: "newsfeed", position: "bottom_bar", config: { feeds: [ { title: "Le Monde", url: "https://www.lemonde.fr/rss/une.xml" } ], showSourceTitle: true, showPublishDate: true } },
Et maintenant ma page ressemble à ceci :
Installation d’un module communautaire
La force du projet réside dans sa communauté. Vous trouverez sur cette page une liste de module que vous pouvez installer sur votre miroir.
Pour installer un module c’est très simple, il suffit de :
- le télécharger et de le placer dans le dossier “modules” qui se trouve à la racine du dossier MagicMirror.
- Installer les librairies associées au module
- Ajouter la déclaration du module à vôtre config.js
Généralement, les modules sont hébergés sur Github. Le plus simple est donc d’installer Git :
sudo apt-get install git
On va maintenant pour l’exemple, installer un module communautaire: Trello Ce dernier permet d’afficher une liste de taches.
On se place dans le dossier “modules” :
cd ~/MagicMirror/modules
On clone les sources, on se place dans le module et on installe les librairies associées :
git clone git clone https://github.com/Jopyth/MMM-Trello.git cd MMM-Trello npm install
Voila à quoi ressemble maintenant le répertoire “modules” :
. ├── default ├── MMM-Trello ├── node_modules └── README.md
- default contient les modules par défauts du projet Magic Mirror
- MMM-Trello est notre nouveau module fraîchement installé
- node_modules est le répertoire qui va héberger les librairies nécessaires au fonctionnement de vos modules
Voila, le module est prêt a être utilisé. Pour l’afficher il faut mettre à jour notre fichier de configuration config.js. La documentation du module permet de savoir comment le configurer.
On y apprend qu’il faut :
- une clé d’api, que l’on obtient en allant sur ce lien: https://trello.com/app-key
- Un token via ce lien : https://trello.com/1/authorize?expiration=never&scope=read&response_type=token&name=Server%20Token&key=API_KEY. (remplacer API_KEY par la clé que vous avez obtenue au lien précédent)
- Un identifiant de liste (que l’on obtient en ajoutant .json sur l’url de du board Trello. Par exemple, si votre board se trouve à l’adresse https://trello.com/b/blabla/home, alors l’url pour trouver votre identifiant de liste est https://trello.com/b/blabla/home.json.
Je vais avoir une configuration qui ressemble à ceci :
{ module: 'MMM-Trello', position: 'top_left', config: { api_key: "ma_cle_api", token: "mon_token", list: "id_de_ma_liste" } },
Et voila le résultat :
Conception du miroir
La partie conception est totalement libre. Je ne peux que vous recommander de fouiller le forum pour y trouver des idées. Il y a également pleins de vidéo sur Youtube.
Certain travail avec le cadre avec du bois et d’autres avec du plastique via de l’impression 3D.
Au niveau matériel vous avez obligatoirement besoin :
- D’un Raspberry
- Un écran
- Un miroir sans tain (en anglais un Two Way Mirror)
Pour le miroir, vous pouvez passer par un miroitier dans vôtre région ou trouver sur internet des miroir moins chère en acrylique. La encore le forum vous sera d’une grande aide.
Bonus : relier Magic Mirror à Kalliopé
Il est possible de relier votre Magic Mirror à plusieurs modules de reconnaissance vocale. La liste complète se trouve ici. Parmi eux, vous trouverez Alexa et Google Home pour les assistants commerciaux les plus connus.
Dans cette partie je vous explique comment relier vôtre Magic Mirror à Kalliopé.
Je pars du principe que Kalliopé est déjà installée sur vôtre Raspberry. Si ce n’est pas le cas je vous invite à regarder cet article dédié.
Du coté de MM: Installation du module
Du coté du Magic Mirror, on se place dans le dossier module, on clone et on installe le module Kalliope.
cd ~/MagicMirror/modules git clone https://github.com/kalliope-project/MMM-kalliope.git cd MMM-kalliope npm install
On ajoute le module à nôtre config.js
{ module: "MMM-kalliope", position: "upper_third", config: { title: "Kalliope" } }
Voila. Le module est prêt à recevoir les phrases prononcées par Kalliopé.
Du coté de Kalliopé: Installation du neurone
On se place dans nôtre dossier kalliope (votre starter kit) et on installe le neuron :
kalliope install --git-url https://github.com/kalliope-project/kalliope_neuron_magic_mirror.git
On va créer un synapse dans notre brain.yml qui se charge d’envoyer les phrases prononcées par Kalliopé au Magic Mirror. Les phrase seront capturées par le module, qui les affichera à l’écran :
- name: "mm-say" signals: [] neurons: - magic_mirror: mm_url: "http://127.0.0.1:8080/kalliope" notification: "KALLIOPE" payload: "{{ kalliope_memory['kalliope_last_tts_message'] }}"
Ici, l’adresse mm_url est en 127.0.0.1 car Kalliopé est installée sur le même Rapsberry que Magic Mirror. Si vous avez l’installation sur deux Rapsberry différents vous devez mettre à jour cette partie. Par exemple http://192.168.0.10:8080/kalliope.
A chaque fois que kalliope parle, elle place la phrase qu’elle a prononcé dans une variable nommée “kalliope_last_tts_message”. Cette variable est placée dans la mémoire de Kalliopé, accessible via “kalliope_memory”. L’article dédié sur kalliope explique plus en détail cette partie.
Le synaspe est prêt. La dernière étape consiste à relier ce synapse au “hook” “on_start_speaking” qui va se charger le lancer le synapse “mm-say” à chaque fois que Kalliope parlera.
On édite nôtre settings.yml, dans la partie hook :
hooks: on_start_speaking: "mm-say"
C’est terminé. Apres un redémarrage du MM et de Kalliope vous devriez à présent voir afficher tout ce que cette dernière vous dit.
Vous êtes prêt à vous lancer dans votre projet de Magic Miroir !
N’hésitez pas à laisser vos commentaires, vos questions et vos retours qui permettront d’aider à améliorer l’article.
Cet article Magic Mirror avec le Raspberry Pi a été publié en premier sur Framboise 314, le Raspberry Pi à la sauce française.....