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.

raspberry433

Platines Tx et Rx 433 MHz

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 :

raspberry alarme off

Interface de gestion de l’alarme

Voici à quoi ressemble le prototype actuellement en fonctionnement :

raspberry alarme proto

Raspi Alarme : protoype

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 :

raspberry 433 remote

Télécommande 433 MHz

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 :

raspberry alarme ouverture

Prototype détecteur d’ouverture 433 MHz

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)