Voici un tuto pour construire un calendrier de bureau à l'aide d'un écran de 7.5 pouces basse consommation (e-paper ou e-ink).
Le calendrier va se mettre à jour automatiquement par une connexion WIFI et s'allumera lorsqu'une liaison bluetooth sera détectée (comme sur un téléphone par exemple).
Le cadre sera découpé dans une planche de bois de 18mm d'épaisseur à la fraiseuse numérique (CNC).
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
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
Le HAT Raspberry permet de brancher l'écran Waveshare sans difficulté grâce à son connecteur dédié.
Si toute fois, vous n'avez pas de HAT, voici le câblage à faire.
e-Paper | Raspberry Pi | |
BCM2835 | Board | |
VCC | 3.3V | 3.3V |
GND | GND | GND |
DIN | MOSI | 19 |
CLK | SCLK | 23 |
CS | CE0 | 24 |
DC | 25 | 22 |
RST | 17 | 11 |
BUSY | 24 | 18 |
Il faut ensuite autoriser l'interface SPI de la raspberry :
sudo raspi-config
Choisir Interfacing Options -> SPI -> Yes to enable SPI interface
Vous devez posséder un compte Google Développeur pour pouvoir accéder à l'API Google et récupérer votre Google Agenda.
Afin de préparer l'environnement de production il est nécessaire d'installer les librairies suivantes :
Installation de PIP et PIL :
sudo apt-get install python-pip python-pil
Pour google Calendar API :
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Installation de chrome (pour pouvoir autoriser l'API Google sur la machine) :
sudo apt-get install chromium-browser
Pour l'écran :
pip install spidev
A partir d'un terminal SSH Lancer le navigateur Chromium en tache de fond avec la commande :
chromium-browser &
puis executer le script python testGoogleAgenda.py :
cd calendar2
python testGoogleAgenda.py
Lorsqu'une URL s'affiche si elle ne se lance pas dans le navigateur, il faut la copier-coller dans la barre de navigation.
L'authentification se passe en suite dans la fenêtre du navigateur. Une fois que c'est fait, le script python doit continuer son exécution
Afin de ne pas surcharger le serveur Openweather, nous allons utiliser un cache dans lequel nous mettrons le résultat des requètes faites.
pip install requests-cache
sudo apt-get -y install libopenjp2-7 python3-rpi.gpio
pip3 install spidev
Nous aurons besoin d'aller chercher des repository sur le serveur de partage de code Github, nous alloons donc installer l'outil git :
sudo apt-get install git
Nous allons voir comment détecter la présence d'un smartphone en utilisant les fonctionnalités bluetooth de la raspberry Pi
Avant de commencer la programmation Python, il nous faut récupérer l'adresse MAC de notre périphérique Bluetooth.
sudo apt-get install bluez
On a alors l'outils hcitool qui va nous permettre de récupérer l'adresse MAC de notre périphérique.
Nous allons associé un smartphone avec la raspberry PI, pour cela mettre le smartphone en appairage bluetooth et lancer la commande
hcitool scan
Vous devez alors obtenir une ligne du style :
Scanning ...
84:B5:41:XX:XX:XX <Marque Du Smartphone>
Cette ligne correspond à l'adresse MAC du périphérique bluetooth. Copiez-la, nous en aurons besoin plus loin.
J'ai rencontré beaucoup de problème lors de la gestion du bluetooth en python, c'est pourquoi je préconise l'utilisation de python3. Nous allons donc voir comment installer l'environnement et les librairies pour cette version de python.
sudo apt-get install python3-pip
sudo apt-get install libbluetooth-dev
sudo apt-get install python-dev
sudo pip3 install PyBluez
#!/usr/bin/python3
# -*- coding:utf-8 -*-'
''This programm test the bluetooth device'''
import bluetooth
bluetoothDevices = [{"name":"Test2", "mac":"84:B5:41:0B:EE:2E"}]
if __name__ == '__main__':
for bluetoothDevice in bluetoothDevices:
# Ask for the name of the bluetooth' mac adress for 5 seconds
result = bluetooth.lookup_name(bluetoothDevice['mac'], timeout=5)
# the bluetooth is alive
if (result is None):
print("Device %s detected" % bluetoothDevice['name'])
Faire en sorte que si le programme python se plante, la Raspberry Pi reboot.
Un Watchdog est un processus permettant de rebooter la raspberry lorsqu'elle ne répond plus au bout d'un certain temps.
On initialise un watchdog en lui donnant un temps à décompter. Si le temps est écoulé il reboot la Raspberry. Il est possible de remettre à 0 le décompte, on dit alors qu'on "nourri" le watchdog.
Attention, une fois le watchdog démarré, il n'est pas possible de le reconfigurer ou d'en changer la valeur.
sudo apt-get install watchdog
sudo update-rc.d watchdog defaults
sudo vi /etc/watchdog.conf
A la fin du fichier, ajouter :
# Mise en route du watchdog ************************************************
# il attend 300 secondes (5 minutes)
watchdog-device = /dev/watchdog
file = /var/log/calendar.log
change = 300
Cette configuration va faire en sorte que le watchdog va rebooter la machine s'il ne détecte pas de mise à jour du fichier /var/log/calendar.log pendant 300 secondes (5 minutes).
Attention : en cas d’arrêt manuel du script python, la Raspberry rebootera également !
Il faut que notre programme puisse écrire dans le fichier de log en ayant les bon droits. Nous allons donc créer un fichier vide et lui donner les droits pour que l'utilisateur pi puisse écrire de dans.
sudo touch /var/log/calendar.log
sudo chown pi.pi /var/log/calendar.log
sudo crontab -e
et en fin de fichier, rajouter la ligne :
@reboot /etc/python3 /home/pi/calendar2/bluetoothDevicesCheck.py
Relancer le service du watchdog :
sudo service watchdog restart
Nous allons voir comment installer la librairie graphique matplotlib de Python pour afficher une courbe montrant la vitesse du vent. La vitesse est relevée sur le site OpenWeather sur pour l'emplacement d'une ville
Un compte openweather (gratuit)
Installation de la librairie :
sudo apt-get install python-matplotlib libatlas-base-dev
forecast = session.get( "http://api.openweathermap.org/data/2.5/forecast?id=" + config.openWeatherCityName + "&units=metric&lang=fr&appid=" + config.openWeatherAPI)
weatherForcast = forecast.json()
weatherForcast = weatherForcast['list']
vitesseVent = []
labelle = []
# Keep only 9 first data
for forcast in weatherForcast[:9]:
# extract the label
letter = datetime.utcfromtimestamp(forcast['dt']).strftime('%a') # the day according to local abreviation
letter = letter[:1].upper() + "." value = datetime.utcfromtimestamp(forcast['dt']).strftime('%Hh') labelle.append(letter + str(value))
# extract the wind speed
value = float(forcast['wind']['speed']) * 3.6
vitesseVent.append(value)
# Create the graphic with wind speed ---------------------------------------------------------------
# figsize is in inch (depends of the dpi (72 by default))
fig = plt.figure(num=None, figsize=(7, 2), dpi=65, facecolor='w', edgecolor='k')
plt.plot( labelle, vitesseVent)
plt.title("Prévision vitesse vent (km/h) pour les prochaines 24h")
plt.ylabel('km/h')
plt.close()
fig.savefig(config.windSpeedPictureFile) # Save the graphique in this name's file
En cours
Une fois le boitier découpé à la fraiseuse numérique, il faut faire un trou pour passer le cables d'alimentation de la raspberry Pi.
Le montage du boitier est très simple. Il est inutile de mettre de la colle ou des vis, l'assemblage rentre en forçant un petit peu. Attention à l'écran, il est fragile !
Le boitier avec le cadre amovible pour faire tenir l'écran..
Face arrière du boitier. Remarquez le trou (à faire à la main) pour faire passer le câble d'alimentation.
Fixation de la Raspberry Pi dans le boitier avec une simple vis.
Positionnement de l'écran dans le cadre.
Fixation de la nappe au fond du cadre pour ne pas qu'elle coince lors de la fermeture du boitier.
Le calendrier une fois monté.
Face arrière du boitier du calendrier.
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