Détecter une ou plusieurs ouvertures de porte, détecter des codes 433 MHz, capturer l’image d’une ou plusieurs caméras IP (via leurs flux RTSP), alerter par SMS ou email, voici autant de fonctionnalités que nous pourrions demander à un Raspberry Pi utilisé en alarme.
C’est avec toutes ces fonctionnalités que j’ai débuté la programmation en Python 3, cherché comment articuler tout ce petit monde sans bugs.
J’ai réutilisé mon précédent travail sur la réception 433 MHz, en la faisant fonctionner en tâche de fond, cf ce billet pour les détails. Ainsi, il ne me reste plus qu’à aller lire le fichier recu.txt et vérifier le code qu’il contient.
La mise en route ou l’arrêt de l’alarme est possible de deux façons :
- une télécommande 433 MHz
- le serveur web intégré au Raspberry
Si j’arrive chez moi, je coupe l’alarme avec un appui sur la télécommande : la LED d’activation s’éteint, je peux rentrer ! Si j’ai oublié d’activer l’alarme, je peux le faire à distance, via l’interface web du Raspberry, le RASPI ALARME passant de vert à rouge dans ce cas :
Voici à quoi ressemble le prototype actuellement en fonctionnement :
J’utilise un Raspberry 2, plus puissant. On voit en haut la platine du récepteur 433 MHz, suivie par celle de l’émetteur 433 MHz. Le fil jaune isolé est celui destiné à brancher une LED (mise en route ou arrêt de l’alarme). Les deux fils du bas sont destinés à un contacteur porte, ouvert ou fermé.
Pour la mise en route et l’arrêt par radio, j’utilise une simple télécommande 433 MHz, $2 environ chez ebay, pas la peine de se ruiner :
Toujours en 433 MHz, j’ai expérimenté avec un détecteur d’ouverture radio plus performant que les m… qu’on trouve chez amazon (cf ce billet pour mes essais avec ces modèles). En fait, j’ai utilisé une petite platine d’émission 433 MHz (merci ebay, environ $5), une pile 12 V miniature pour ne pas avoir à dépendre d’une alimentation 220 V, et un contacteur magnétique inversé acheté à prix d’or chez Conrad :
Oui, je sais, ça pendouille de partout, mais c’est pour mieux vous expliquer l’idée : à droite en bas, la pile 12 V, puis juste au dessus le petit émetteur 433 MHz et une antenne adaptée. Sur la gauche, au dessus de la porte, un aimant. Au dessus, un contacteur : lorsque l’aimant passe sous le contacteur, il alimente très brièvement la télécommande qui transmet alors un code, code que notre Raspberry va recevoir et traiter, ouf 😉
Pour finir, voici le script python3 principal utilisé sur le proto actuel. Chacun l’adaptera, sans oublier qu’il faut aussi un php pour venir gérer l’interface web, installer le serveur Apache 2, etc. Ce billet n’est pas un tuto, il vous donne juste quelques pistes de réflexion si vous vous lancez dans le même bricolage.
START.PY : le script principal, détection des codes radio, de l’ouverture, etc. zero.txt contiendra un simple 0 (zero), sans retour de ligne. alarme_on.txt contient 1, toujours sans retour de ligne, et son pendant alarme_off.txt contient lui 0 (zero).
#!/usr/bin/python3
#
# Lecture du code de telecommande recu par RFSniffer (version modifiee, en tache de fond)
# le code reçu se trouve dans /home/pi/recu.txt
#
import os
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
#
# Broche 7 GPIO4 out sur la LED
#
GPIO.setup(4, GPIO.OUT)
#
# Broche 15 GPIO22 in interrupteur porte
#
GPIO.setup(22, GPIO.IN)
#
# Boucle de detection sans fin
#
while True:
#
# Ouverture et lecture de temp.txt
#
f = open('/home/pi/recu.txt', encoding='utf-8')
alarme = open('/home/pi/alarme.txt', encoding='utf-8')
a = int(alarme.read())
#
# Detectons si le fichier est vide (0) ou pas
# et inscrivons le code recu dans la variable g
#
statinfo = os.stat('/home/pi/recu.txt').st_size
if statinfo > 0 :
g = int(f.read())
#
# Lecture contacteur porte
#
entree = GPIO.input(22)
#
# ALARME DETECTEE
#
if entree == 1 and a == 1 :
print ("alarme contacteur entree !!!!!")
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')
#
# Capture image depuis le flux rtsp d une camera ip en lancant un script sh
#
os.system("sudo sh /home/pi/snapshot.sh")
#
# Detection du code radio
# puis remise a zero de recu.txt en copiant le contenu de zero.txt a sa place
# (zero.txt contient un simple 12345)
#
#
# Telecommande cle voiture
#
#
# Bouton A
#
if g == 5592512:
print ("alarme on")
#
# On active la LED d'alarme
#
GPIO.output(4, GPIO.HIGH)
#
# Remise a zero du code recu
#
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')
#
# on copie 1 dans alarme.txt car l alarme est activee
#
os.system('sudo cp /home/pi/alarme_on.txt /home/pi/alarme.txt')
#
# Bouton B
#
if g == 5592368:
print ("alarme off")
#
# On desactive la LED d'alarme
#
GPIO.output(4, GPIO.LOW)
#
# Remisee a zero du code recu
#
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')
#
# on copie 0 dans alarme.txt car alarme desactivee
#
os.system('sudo cp /home/pi/alarme_off.txt /home/pi/alarme.txt')
else:
time.sleep(.1)
bonjour pouvez m’envoyer un schéma de branchement du contact de porte sur l’émetteur 433 mhz svp
désolé non, il n’en existe aucun.
pouvez vous me dire ou vous avez brancher les 2 fil du contact de porte sur l’emetteur
non, c’était un projet en labo, abandonné depuis désolé.