Sources
Le but est d'afficher :
L'affichage sera fait sur un écran très basse consommation : un e-paper. J'ai choisi un waveshare de 7.5 pouces avec son contrôleur HAT pour qu'il soit facilement pilotable par une Raspberry Pi.
Je pars du principe que vous avez un serveur Domoticz installé et fonctionnel. Cette partie ne sera pas abordée dans ce présent tutoriel. Si vous n'avez pas de serveur Domoticz, vous pouvez passer cette section (elle n'est pas forcément nécessaire).
Les programmes sont écrits en Python. Je pars du principe que vous avez des notions de la programmation en Python car il vous faudra configurer les agendas Google à afficher en éditant 2 fichiers.
Télécharger la dernière version de Raspian en allant sur le site officiel :
https://www.raspberrypi.org/downloads/raspbian/
Dans notre cas, nous n'avons pas besoin de la version Desktop car nous utiliserons la Raspberry par une conection distante, une connection SSH. Nous avons donc besoin de la version allégée de Raspbian, la version " Lite "
Téléchargez et décompressez le fichier dans un répertoire temporaire, on obtient une image du système d'exploitation.
Le fichier au format img n'est pas copiable en tant que tel sur la carte SD, il faut utiliser un utilitaire comme par exemple Etcher (sous windows).
Une fois Etcher installé :
Le système d'exploitation est prêt, mais il faut encore configurer l'accès distant.
Par défaut, SSH est installé sur la Raspberry Pi, mais est désactivé pour des raisons de sécurité. La première chose à faire sera donc d’activer SSH sur votre Raspberry Pi.
Pour cela, il vous suffit de brancher la carte MicroSD de votre Raspberry Pi sur votre ordinateur, de vous rendre sur la carte, et de créer un fichier vide nommé ssh dans la partition boot.
Au prochain boot sur la carte SD, il sera possible de faire une connexion SSH en utilisant un client comme Putty (sous windows) par exemple.
Veillez à bien changer le mot de passe par défaut de l'utilisateur pi ("raspberry" par défaut) quand vous vous logez pour la première fois.
Voila, la carte SD est maintenant prête à être insérée dans la Raspberry.
La commande ifconfig vous permet de connaitre l'adresse IP que votre Raspberry vient d'avoir en se connectant sur votre réseau.
pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet
192.168.0.102
netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::d9f:c7ba:c902:d0c prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:83:ec:c2 txqueuelen 1000 (Ethernet)
RX packets 284 bytes 39200 (38.2 KiB)
RX errors 0 dropped 10 overruns 0 frame 0
TX packets 110 bytes 16465 (16.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Nous allons ensuite configurer la Raspberry en lançant la commande : raspi-config
Changer le mot de passe par défaut (de l'utilisateur "pi") en choisissant :
1 - Change User Password
4 - Localisation Options
I1 - Change Locale (Supprimer : UK et cocher : fr_FR.UTF-8 UTF-8 )
5 - Interfacing options
P4 - SPI
7 - Advanced options
A1 - Expand Filesystem
Finish, Reboot = yes
L'avantage du HAT est qu'il a des connecteurs bien distincts sur lesquels on peut lire ce à quoi correspond quel fils. Il faut donc câbler de la façon suivante :
Les boutons vont permettre de changer d'écran à la demande.
Câblage de la Raspberry Pi et des boutons
a faire
La construction nécessite plusieurs épaisseurs différentes de bois. J'ai utilisé du PMMA diffusant car on peut le découper à la découpeuse laser (comme le bois).
Le dessus est en 3mm (la même épaisseur que le PMMA diffusant) et le reste est en 10mm.
Sur le plan on voit des ronds, il s'agit des emplacements des boutons. Vérifiez bien que le diamètre des boutons correspond au diamètre des trous :-).
Afin de faciliter l'assemblage, j'ai numéroté les planches. Les numéros (en noir) sont à graver et non à découper (comme tout ce qui est en rouge).
Les fichiers de découpes sont au format SVG. Ce format devrait vous permettre de faire les découpes avec une découpeuse laser dans n'importe quel FabLab.
Les plans sont disponibles sur la page :
https://git.alex-design.fr/root/epaper/blob/master/Laser%20cuts/Boite.svg
Le fichier svg est ouvrable avec Inkscape (logiciel Gratuit open source).
Chaque calque est nommé avec l'épaisseur du bois à utiliser.
L'usinage est à faire avec une découpeuse laser, en prenant soin à ce que :
Empiler les différents morceaux. Le numéro le plus grand va devant et la face n'en ayant pas est la face avant.
Les Google agenda sont accessibles en utilisant l'API Google prévue à cet effet, il est nécessaire d'installer :
pip install --upgrade google-api-python-client oauth2client
L'accès à votre calendrier Google nécessite une authentification. Cette authentification doit être sauvée dans un fichier nommé credentials.json .
A partir de votre console de gestion d'API et services Google , nous allons créer un nouveau projet qui aura accès en lecture seule aux Calendrier Google.
A partir de la page d'accueil de Google APIs :
Maintenant que nous avons un projet, nous pouvons lui attribuer une clé d'accès.
A partir de la page d'accueil de Google APIs,
Le token est un jeton d'authentification sécurisant la connexion entre l'API Google et la machine l'appelant. Il est créé lors de la première connexion et ne sera plus demandé par la suite.
Pour le générer, il faut lancer une première demande en exécutant la ligne de commande :
cd calendar2
python test-GoogleAgenda2.py --noauth_local_webserver
Une URL est alors générée et le programme attend un code de vérification. Copier-coller cette URL dans un navigateur (chrome, firefox, safari, ...) pour récupérer un code de la forme 4/Bgo9RqwRyXnLvM3Hb1_pYTzf22KqjbB3OkJEIRe_pX30RI. Coller ce code de vérification dans la ligne de commande pour continuer l'exécution du programme.
Votre calendrier doit s'afficher (dans un format JSON) dans la fenêtre de la ligne de commande et un fichier "token.json" vient d'être écrit dans le répertoire où vous avez lancé la ligne de commande.
Le fichier token.json doit être dans le répertoire epaper , déplacez le si besoin.
Vous pouvez maintenant relancer la commande :
python test-GoogleAgenda2.py
Elle doit vous afficher votre calendrier sans plus demander d'authentification.
Rendez-vous sur la page : https://home.openweathermap.org/api_keys
Remplissez les champs et validez.
Vous avez à présent un compte chez OpenWeather, voyons maintenant comment récupérer les prévisions météo.
Les prévisions météo ne sont accessibles qu'en utilisant une clé d'accès à l'API (une clé d'API).
Pour générer votre clé d'API Open Weather :
Vous avez à présent une clé d'accès à l'API pour les prévisions météo d'Open Weather.
Copiez cette clé et collez là dans le fichier config.py dans la section Open Wearther API
Il est nécessaire d'installer les librairies Python suivantes :
Vous devez posséder un compte Google Développeur pour pouvoir accéder à l'API Google et récupérer votre Google Agenda.
Le dépôt des codes sources étant sur un serveur GIT, il est nécessaire d'installer les outils GIT par la commande :
sudo apt-get update
sudo apt-get install git
Afin de faciliter les installation des librairies de Python nous allons installer l'utilitaire pip avec la commande :
sudo apt-get install python-pip python3-pip
Installation de PIL pour la version Jessie de Raspbian (Python Image Librarie) :
sudo apt-get install python-pil
Installation des autres librairies :
pip install bleach spidev requests_cache
Ils sont disponibles sur le dépôt GIT suivant :
https://github.com/AlexDesign-Fr/epaper
Le fichier config.py contient les identifiants de calendrier Google à afficher. Il est nécessaire de le modifier avec les identifiants de vos calendriers, voici comment faire :
Afin d'indiquer au programme quels calendriers afficher, il vous faut l'initialiser avec les IDs de vos Google agenda.
En allant sur la page Google Agenda, vous pouvez trouver les IDs de vos calendriers en cliquant sur l'icône de paramétrage (l'engrenage en haut à droite de la fenêtre). Puis en sélectionnant le calendrier que vous voulez utiliser (colonne de gauche) vous aller trouver l'ID de l'agenda dans la section "Intégrer l'agenda". C'est un identifiant de la forme :
ouae3po7sbgtpfmeja5o6b4@group.calendar.google.com
Copiez-collez cet ID dans le fichier de configuration config.py dans le tableau de la variable CalendarsID.
Il est possible de paramétrer autant de calendrier que l'on veut.
Les librairies utilisées pour l'allumage des LEDs sont en Python3 et nécessitent les droits root, il faut donc les installer avec :
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel psutil
Il existe plusieurs façon d'avoir la météo de votre ville dans Open Weather (voir https://openweathermap.org/current ). Mon programme utilise les identifiants de ville (les IDs) car ils sont uniques et sans équivoque quant aux résultats.
Le plus simple pour trouver l'ID de votre ville est de vous rendre sur la page d'accueil d'Open Weather et de saisir le nom de votre ville (suivie d'une virgule et de son code internationale de pays) et d'en afficher la carte météo.
Par exemple :
Plabennec,FR
Il y a alors une liste de proposition qui s'affiche. Choisissez votre ville en cliquant sur son nom : le temps actuel s'affiche ?
L'URL de openweather contient maintenant l'ID de votre ville, par exemple :
https://openweathermap.org/city/2986991
l'ID de Plabenec,FR est donc 2986991
Copiez-collez cet ID dans le fichier config.py derrière la variable : openWeatherCityName
Domoticz ( https://www.domoticz.com/wiki/Main_Page ) permet de mettre en place un serveur domotique. Il peut surtout regrouper des données de température provenant de vos différents capteurs. Ce tutoriel n'a pas pour vocation de vous indiquer comment installer un tel serveur. Dans le cas du projet epaper, Domoticz est utilisé pour renvoyer les températures collectées.
epaper permet d'afficher les valeur de 5 thermomètres connectés à Domoticz. Si vous en avez un en extérieur, c'est cette température qui sera affiché à la place de celle retournée par Open Weather. Vous devez alors définir dans le fichier config.py l'IDx du thermomètre extérieur.
Modifiez le fichier config.py en fonction de votre configuration Domoticz.
Si vous n'avez pas de serveur Domoticz, la température extérieur affichée sera celle trouvée par l'API Open Weather et les température des thermomètres internes ne s'affichera pas.
Il y a plusieurs programmes Python qui sont utilisés. Ils sont soient lancés par le programme principal soit par une tâche cron, soit par un événement extérieur.
Le programme principal ( main.py) est lancé au démarrage de la raspberry. Il tourne en boucle et appel les programmes d'affichage en fonctions des appuies sur les boutons.
Toutes les heures une tâche cron va lancer un rafraîchissement du calendrier.
Certaines heures une tache cron va aller vérifier si on a une image à afficher. Le calendrier étant situé dans ma cuisine, je lance la tâche cron aux heures des repas.
Voici à quoi sert chaque programme :
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project
Ceci est la vue non overridée de l'objet project en mode listitem
Code à rajouter dans l'override.ini.append.php :
[line_project] Source=node/view/listitem.tpl MatchFile=listitem/project.tpl Subdir=templates Match[class_identifier]=project