Mettez votre réfrigérateur sous surveillance !

Ou comment résoudre vos problèmes concrets d'ingénierie ou d'électronique avec votre Raspberry Pi et l'aide d'un hacker et auteur renommé, Simon Monk

Simon Monk

Traducteur

f-leb

Les maisons sont infestées de petites fées profitant de votre inattention pour envahir votre réfrigérateur et engloutir de considérables parts de fromage à votre insu. Dans ce projet, toute ouverture de porte du réfrigérateur vous sera instantanément notifiée par un e-mail, un tweet ou une mise à jour Facebook selon vos préférences, et vous informera de l'heure de l'intrusion suspecte.

Cette application peut sembler triviale au premier abord, mais elle permet aussi de montrer comment il est facile, simplement en branchant un capteur, de programmer le Raspberry Pi de façon à vous notifier d'événements, et ceci de plusieurs façons grâce au service en ligne IF This Then That.

Commentez

- Titre : Mettez votre réfrigérateur sous surveillance !

- Auteur : Simon Monk

- Traducteur : f-leb

- Parution : 4 novembre 2015

- Public visé :

- Licence : Le contenu de cet article est rédigé par Simon Monk et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Voir également :

- Raspberry Pi - Déballage et installation

- Raspberry Pi - Python et le port GPIO

- Raspberry Pi : Construire son propre système de détection d'obstacles au stationnement, par Simon Monk

- Raspberry Pi : Construire son propre système web de verrouillage de porte, par Simon Monk

- Utiliser des capteurs avec le port GPIO - Partie 1 - Détection de mouvement

- Utiliser des capteurs avec le port GPIO - Partie 2 - Capteur de température 1-Wire

- Utiliser des capteurs avec le port GPIO - Partie 3 - Télémètre à ultrasons

Sommaire

- I. Configuration matérielle

- II. Détection de l'obscurité

- III. If This Then That (IFTTT)

- IV. Comment le code fonctionne-t-il ?

- V. Mettre en œuvre son système de surveillance

- VI. Notes de la Rédaction de Developpez.com

I - Configuration matérielle

(*) Fils de connexion Femelle-Femelle - (**) Photorésistance entre les broches GPIO GND et 18

Matériel nécessaire

- Une photorésistance (n'importe laquelle devrait suffire pour ce projet). NDLR : photorésistance qui capte la quantité de lumière incidente, celle produite par la lumière de votre réfrigérateur quand vous ouvrez sa porte par exemple.

- Deux fils de connexion femelle-femelle.

- Une clé USB WiFi (à moins que votre réfrigérateur soit à proximité d'une prise Ethernet).

Comme vous pouvez le constater d'après la liste de matériels requis, ce projet utilise une photorésistance connectée au port GPIO du Raspberry Pi grâce aux deux fils femelle-femelle.

II - Détection de l'obscurité

Contrairement à l'Arduino, par exemple, le Raspberry Pi ne possède pas d'entrées analogiques pour mesurer des tensions. Par contre, il possède des entrées numériques. Si la tension à une entrée numérique dépasse les 1,65 V environ (la moitié de 3,3 V), l'entrée sera lue et considérée par le Raspberry Pi à l'état logique haut (HIGH), sinon à l'état logique bas (LOW). Bien qu'on ne puisse pas utiliser la photorésistance avec un Raspberry Pi pour mesurer le niveau de luminosité (pas sans composants supplémentaires en tout cas, comme un convertisseur analogique-numérique (NDLR)), on peut toujours l'utiliser pour évaluer s'il fait jour ou s'il fait nuit.

L'entrée numérique de la broche (GPIO n° 18) a une résistance pull-up interne qui peut être activée. Tandis que la résistance pull-up tend à « tirer » la broche n° 18 vers le niveau logique haut (HIGH), la photorésistance au contraire tend à la « tirer » vers le niveau logique bas (LOW). Il se produit alors une lutte acharnée entre les deux résistances et si la résistance pull-up gagne, l'entrée sera au niveau logique haut (HIGH) alors que si c'est la photorésistance qui gagne, elle sera au niveau logique bas (LOW).

Détecter l'obscurité avec une photorésistance

Plus la luminosité détectée par la photorésistance est élevée, et plus sa résistance diminue et la broche 18 est alors « tirée » à la référence électrique 0 V. Typiquement, une photorésistance a une résistance de quelques centaines à quelques milliers d'ohms quand elle est éclairée. Dans l'obscurité (celle d'un réfrigérateur fermé dans notre cas), sa résistance monte à plusieurs mégaohms (millions d'ohms). À ce niveau, la résistance pull-up interne du Pi (50 à 100 kiloohms) l'emportera facilement et l'entrée sera au niveau logique haut (HIGH).

III - If This Then That (IFTTT)

NDT : « If This Then That » ou IFTTT, que l'on peut traduire par « Si ceci, alors fais cela ». Autrement dit, chaque condition (If this) génère une action (then that).

IFTTT est un service Web qui permet de configurer des déclencheurs (triggers) qui génèrent des actions. Par exemple, vous pouvez créer un recipe IFTTT (NDT : un recipe ou une « recette » met en relation une condition et une action entre différents outils web et réseaux sociaux) qui vous envoie un e-mail (action) quand quelqu'un vous mentionne sur Twitter (trigger). Prévu pour gérer les actions et les triggers à partir de n'importe quels médias sociaux ou services e-mail, IFTTT peut être également configuré pour agir en réaction à des événements physiques, comme l'ouverture de la porte du réfrigérateur qui va nous concerner ici.

Le principe consiste à faire envoyer une requête Web par le Raspberry Pi au service IFTTT, requête Web qui agira comme un déclencheur (trigger). IFTTT réagira alors selon l'action que vous lui avez spécifiée, c'est-à-dire envoyer un e-mail dans notre cas précis.

Les différentes chaînes (channels) disponibles sur IFTTT requièrent leur propre identifiant et IFTTT, de temps en temps, vous demandera d'entrer un identifiant et un mot de passe pour accéder aux chaînes.

Préparation du montage

C'est un projet vraiment simple à réaliser en prototype. Il n'y a aucune soudure à effectuer et seulement deux fils à brancher. Le plus gros du travail est dans la configuration du service IFTTT.

Étape 1 : branchez la photorésistance

Connectez les deux pattes de la photorésistance aux deux fils femelle-femelle. Peu importe le sens de connexion de la photorésistance. Reliez les autres extrémités des fils aux broches GND et 18 du port GPIO du Raspberry Pi. S'il y a un peu de jeu dans le connecteur avec une patte de photorésistance, faites des zigzags en pliant la patte jusqu'à ce qu'elle soit suffisamment maintenue dans le connecteur. Si vous craignez que les deux pattes se touchent, vous pouvez les raccourcir avec une petite pince coupante.

Étape 2 : créez un nouveau recipe IFTTT

Si ce n'est pas encore fait, créez un compte sur IFTTT (ifttt.com). Puis cliquez sur le bouton Create a Recipe).

Étape 3 : créez un trigger dans la chaîne Maker

Cliquez sur la partie This du nouveau recipe et sélectionnez la chaîne Maker dans la liste des chaînes disponibles. Sélectionnez l'unique déclencheur disponible (Receive a web request) et entrez le texte « fridge_alert » dans le champ Event Name.

Étape 4 : choisissez une action

Maintenant, cliquez sur la partie That d'IFTTT. Choisissez la chaîne d'action Email, puis sélectionnez Send me an email.

Étape 5 : complétez les champs de l'action

Vous devez maintenant compléter les champs de l'action. Le champ Subject deviendra l'objet de l'e-mail, tandis que le champ body contiendra le corps du texte de l'e-mail. Notez l'utilisation des noms spéciaux entre {{ et }}. Ces noms sont appelés ingredients et permettent de personnaliser le texte. Dans notre cas, le nom OccuredAt est un marqueur qui sera rempli avec la date et l'heure du déclenchement de l'événement.

Étape 6 : validez le recipe

Après avoir renseigné l'action, on tombe sur le récapitulatif du recipe. Cliquez sur le bouton Create Recipe pour créer le recipe et le rendre actif.

Étape 7 : récupérez la clé secrète

Il serait fâcheux que n'importe qui soit autorisé à déclencher l'envoi d'e-mails avec IFTTT. Pour éviter cela, quand la requête Web est envoyée en Python pour déclencher l'envoi d'un e-mail, elle devra être accompagnée d'une clé secrète.
Pour trouver cette clé, cliquez sur Channels tout en haut de la page, et sélectionnez à nouveau la chaîne Maker. Récupérez la valeur de la clé, elle devra être copiée et collée plus tard dans le code Python.

Maintenant que le matériel est prêt et IFTTT configuré, on doit se préoccuper du programme Python qui enverra la requête Web de déclenchement du service IFTTT.

Téléchargez le programme Python de ce projet en utilisant les commandes suivantes :

cd /home/pi
git clone https://github.com/simonmonk/pi_magazine.git

En fait, cette dernière commande va télécharger le code de tous les projets de la série publiés par l'auteur dans le magazine TheMagPi. Si vous avez déjà tapé cette commande pour un précédent projet, allez dans le répertoire pi_magazine et tapez la commande suivante pour mettre le répertoire à jour avec ce nouveau projet (07_fridge_monitor) :

git pull

IV - Comment le code fonctionne-t-il ?

Le code Python de ce projet de surveillance de réfrigérateur est assez simple. Si vous êtes intéressés par le fonctionnement du code, le mieux est de l'ouvrir dans un éditeur pendant que nous le parcourons.

fridge_monitor.py

# Download : Github.com/simonmonk/pi_magazine/tree/master/07_fridge_monitor

import time
import RPi.GPIO as GPIO
import urllib2

LIGHT_PIN = 18    # photoresistor pin
EVENT = 'fridge_alert'
BASE_URL = 'https://maker.ifttt.com/trigger/'
KEY = 'cyR3vPNFlP9K32W4NZB9cd'

# Configure the GPIO pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(LIGHT_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)

def send_event():
response = urllib2.urlopen(BASE_URL + EVENT + '/with/key/' + KEY)
print(response.read())

try:
while True:
if GPIO.input(LIGHT_PIN) == 0:
# Its light (door open)
send_event()
# Do nothing until the door is closed again
while GPIO.input(LIGHT_PIN) == 0:
time.sleep(0.1)
# Do nothing for a further minute anyway
print("Wait a minute")
time.sleep(60)
print("Monitoring again")
finally:
print('Cleaning up GPIO')
GPIO.cleanup()

Dans la première partie du code, on importe les bibliothèques dont on a besoin. Cela comprend la bibliothèque RPi.GPIO, nécessaire pour faire l'interface avec la photorésistance, puis la bibliothèque urllib2 qui sera utilisée pour envoyer une requête Web au service IFTTT.

Le code qui suit comprend la déclaration de variables de configuration. La variable EVENT doit correspondre au texte que vous avez saisi dans le champ Event Name quand vous avez créé le déclencheur sur le site d'IFTTT. Il faut remplacer la valeur de la clé de la variable KEY avec celle créée lors de l'étape 7 vue précédemment.

La fonction send_event sera appelée à partir du corps du programme principal, quand IFTTT doit être notifié. La réponse à la requête Web est affichée à l'écran, seulement à titre d'information pendant la mise au point du projet.

La boucle du programme principal est à l'intérieur d'un bloc try/finally, de façon à ce que le port GPIO soit libéré et mis en sécurité quand le programme est interrompu. La boucle principale while True: exécute le programme jusqu'à ce qu'il soit interrompu avec un CTRL+C.

Dans la boucle principale, on interroge l'état de l'entrée de la broche LIGHT_PIN et si elle est à zéro, cela signifie que la porte du réfrigérateur a été ouverte. Afin d'éviter l'envoi d'une série rapprochée de mails à chaque fois que la porte du réfrigérateur est détectée comme étant ouverte, deux précautions sont prises. Premièrement, quand une ouverture de porte est détectée, on maintient le programme dans une boucle while tant que la porte reste ouverte, ceci afin d'éviter une série de déclenchements à chaque interrogation de la broche reliée à la photorésistance dans la boucle principale. Deuxièmement, quand la porte est finalement refermée, le programme temporise pendant une minute, là aussi pour éviter des déclenchements trop rapprochés dans le temps.

V - Mettre en œuvre son système de surveillance

Si vous voulez mettre le système en œuvre en condition réelle de fonctionnement, vous pouvez coller la photorésistance sur la paroi intérieure du réfrigérateur, plutôt que de la laisser suspendue comme nous l'avons fait.

Avant d'exécuter le programme Python, on peut tester son recipe en ligne de commande avec l'utilitaire wget. Tapez la commande suivante dans un terminal LXTerminal en remplaçant la clé par celle que vous avez obtenue.

curl https://maker.ifttt.com/trigger/fridge_alert/with/key/cyR3vPNFlP9K32W4NZB9cd

Vous devriez voir apparaître le message, « Congratulations! You've fired the fridge_alert event ».

Consultez votre boîte mail et vous devriez avoir un nouvel e-mail provenant d'IFTTT. Si quelque chose a mal tourné, vous devriez avoir un message d'erreur à la place des félicitations. Vous pouvez alors consulter les logs de votre recipe sur le site d'IFTTT en sélectionnant le recipe puis en cliquant sur l'icône avec une série de points.

Démarrez l'exécution du programme de surveillance avec la commande suivante :

sudo python fridge_monitor.py

IFTTT est un service très puissant, et vous voudriez sans doute expérimenter ses possibilités en éditant le recipe puis en changeant l'action déclenchée de façon à tweeter ou encore changer son statut Facebook plutôt que d'envoyer un e-mail.

Avoir un clavier, une souris et un écran connecté au Pi de votre réfrigérateur est certainement très utile pendant la phase de mise au point (NDLR : une connexion SSH à partir d'un poste distant connecté peut aussi très bien dépanner), mais il serait bien plus pratique d'avoir le Pi autonome et qui démarre automatiquement son programme à chaque mise sous tension. Pour cela, tapez la commande suivante pour rendre le fichier exécutable :

sudo chmod +x fridge_monitor.py

Puis éditez le fichier /etc/rc.local avec la commande suivante :

sudo nano /etc/rc.local

NDLR : le script /etc/rc.local, utilisé par les administrateurs système, est exécuté en dernier après le démarrage des autres services. On peut donc l'utiliser pour démarrer des services personnalisés.

Ajoutez la ligne suivante après le premier bloc de commentaires commençant par # :

sudo /home/pi/pi_magazine/07_fridge_monitor/fridge_monitor.py &

Redémarrez votre Raspberry Pi et cette fois, votre programme de surveillance devrait démarrer automatiquement.

VI - Notes de la Rédaction de Developpez.com

Cet article est une traduction de l'article écrit par Simon Monk et paru dans le n° 37 du magazine TheMagPi, sous le titre Fridge monitor.

Retrouvez les projets de l'auteur publiés dans le magazine TheMagPi sur la plateforme GitHub.

Nous remercions les membres de la Rédaction de Developpez pour le travail de traduction et de relecture qu'ils ont effectué, en particulier :

- f-leb

- deusyss

Merci également à Claude Leloup pour sa relecture orthographique.