Raspberry PI ~ 23 : Créer une porte domotique (Partie 2)

Ce post est le vingt troisième d’une liste de tutoriels sur le raspberry PI et l’arduino, cliquez ici pour accéder au sommaire ! :D

Salut bande de bras cassés syndiqués !!

Vu le temps j’espère que vous glandez sur les plages de rio (ou au minimum dans un petit bar à tapas de lacanau) mais je vais quand même tenter ma chance d’attraper un ou deux lecteurs désœuvrés pour la lecture de ce 23em tuto.

Aujourd’hui nous allons reprendre notre porte bluetooth du tuto 22 et en faire une vrai porte domotique.

Pour cela il vas nous falloir faire communiquer l’arduino de la porte et le raspberry pi de manière simple, rapide et sécurisée (on parles d’une porte, donc évitons qu’elle ne s’ouvre trop souvent ou pour de mauvaises raisons).

Une fois la porte relié à yana, tout devient possible :

  • Génération de clés par utilisateur sur l’interface yana (et non une clé unique en dur dans le code de l’ardui)
  • Génération d’un historique des entrées sur l’interface yana
  • Création de code limités dans le temps ou le nombre d’utilisation ou utilisable uniquement certains jours (par exemple pour la femme de ménage ou le voisin qui viens nourrir les poissons)
  • Déclenchements de scénarios en fonction de la personne qui entre
  • etc..etc… tout deviens possible c’est une simple question de code de plugins.

Commençons par le traditionnel quart d’heure de honte (8 min en fait).

Dans la vidéo je suis un peu vague sur le « pourquoi ça marche dans un sens pas dans l’autre » il faut dire que c’est assez vague pour moi également (et aussi que je m’en fou un peu tant que j’arrive à mes fins :) ).

Le rpi accepte au maximum du 3.3v sur ses pins, or l’ardui envoi du 5v, pour faire communiquer les deux il faudrait donc normalement utiliser un convertisseur i2c (qu’on peux voir sur ma vidéo mais qui n’est pas obligatoire grâce a notre montage) mais une histoire de résistance de pull up manquante d’un côté permet de faire communiquer du rpi vers l’arduino sans qu’il n’y ai de dégâts (j’ai testé pour vous :p)

Je parle également vite fait de « channels » j’ignore si c’est le terme en vogue, en gros c’est une adresse de communication choisie (dans ce tuto 0x12) qui permet de superposer plusieurs communications sur des adresse différentes, le rpi peut ainsi communiquer avec plusieurs portes en communiquant sur le canal de chacune.

Le matériel

Le matériel est le même que pour le tuto précédent, il vous faut bien entendu votre porte (avec son atmega328 ou son arduino inclus) un rpi à brancher à votre porte et trois fils électriques standard (de préférence un bleu, un vert et un noir), c’est tout.

Le montage

Encore une fois, le branchement est similaire au tuto précédent, il vous faudra simplement relier le port I2C du raspberry PI au port I2C de l’arduino.

Comme je suis une grosse quiche, il se peut que j’ai inversé le sda et le scl sur le rpi, si c’est le cas, n’hésitez pas à intervertir (ça n’explosera pas dans tout les cas, au pire ça ne communiquera pas)

Pour cela suivez le schéma suivant :

Untitled Sketch 2_bb_faux

Le code du raspberry PI

Avant de mettre en place le code pour le rpi, il y a quelques manipulation à faire pour « activer »
la gestion i2c sur le rpi (désactivée par défaut, certainement pour un gain de perfs).

Ouvrez le fichier /etc/modprobe.d/raspi-blacklist.conf en édition

nano /etc/modprobe.d/raspi-blacklist.conf
commentez la ligne
blacklist i2c-bcm2708
en placant un # devant

Enregistrez et fermez ce fichier, puis ouvrez le fichier /etc/modules
nano /etc/modules
ajoutez y la ligne
i2c-dev

Fermez et enregistrez, installez ensuite l’utilitaire i2c
apt-get install i2c-tools
et enfin relancer votre rpi avec la commande
reboot

Mettez a jour votre yana, le plugin se trouve en natif dans le script

Puis dans l’interface web yana, allez dans configurations–>pluging–>activez le plugin

Le code de l’arduino

Comme d’habitude, branchez l’arduino (ou l’atmega) au pc et transférez via l’IDE arduino le code suivant sur la puce.

L’application android

L’application android est un peu excessivement merdoyante, c’est toujours la même et je n’ai pas eu le temps de la débugger,
elle est dispo ici :
http://idleman.fr/ressources/ANDROID/YanaBluetooth.apk

L’utilisation :

Dans votre application androïde, allez dans « configuration », mettez un code à 4 chiffres/lettres de votre choix
Vérifiez que le nom du périphérique correspond bien a celui de la carte bluetooth votre porte
Vérifiez que la carte bluetooth de votre porte (normalement « bolutek » est bien enregistrée dans vos périphériques bluetooth
(si la première fois la carte vous demande un code, c’est généralement 1234 ou 0000).

Ouvrez le plugin domodoor dans le menu des configurations, et ajoutez un utilisateur à la porte (si vous voulez ajouter un autre utilisateur a la porte, il faudra d’abord l’ajouter aux utilisateurs généraux de yana)
et attribuez le même code à 4 chiffre à l’utilisateur que celui que vous avez sur votre téléphone.

Vérifiez que votre montage est bon et qu’il est sous tension

lancez la commande :
sudo python /var/www/yana-server/plugins/domodoor/i2c.py

Testez en lançant l’application android.

Par la suite, il peux être bon de lancer automatiquement le programme /var/www/yana-server/plugins/domodoor/i2c.py en tache de fond au démarrage, pour cela vous pouvez utiliser les CRON (taches planifiées) de linux, ou encore créer un petit script dans /etc/init.d
(cf la doc d’ubuntu par exemple).

Comme je suis un type fichtrement cool je vous donne même le script pour lancer ça au démarrage

tapez

sudo nano /etc/init.d/domodoor

Dedans, ecrivez votre commande :

#!/bin/sh
python /var/www/yana-server/plugins/domodoor/i2c.py

Enregistrez/fermez (ctrl+x puis « y »)

Rendez le script executable

sudo chmod +x /etc/init.d/domodoor

Ajoutez le script au boot

sudo update-rc.d domodoor defaults 80

Le programme se lancera maintenant à chaque démarrage.

Notez bien que seul l’utilisateur « root » a le droit d’utiliser l’i2c, vous devrez donc lancer le programme i2c.py avec l’utilisateur root au démarrage.

Explications sur le fonctionnement

Lors de son lancement, le programme (en python car il existe une très bonne librairie sous ce langage pour gérer l’i2c et aussi parce que je me suis fait engueuler par les pro-python comme quoi j’était un sale sectaire de communiste droggué du PHP :D ) i2c.py lance une boucle qui, toutes les 0.5 secondes vas interroger l’arduino en lui envoyant le texte « ping », si il reçoit un numero de badge, il lance un fichier php du plugin yana.

Le fichier php  vas verifier dans la base de donnée si le code existe pour un utilisateur, si c’est le cas il vas tracer l’entrée dans le log, puis ils retourne la réponse (code coorecte ou pas) au script python.

De son coté l’arduino interroge en temps réel le capteur blutooth,  si un téléphone se connecte au capteur et lui envois un code, l’arduino vas stoquer ce code dans une file d’attente de « badge a verifier » et retournera ce code lors du prochain « ping » du script python.

Si le script python lui retourne une commande d’ouverture, l’arduino vas ouvrir un certain temps (2/3 secondes) son pin relié au relais (qui vas donc s’ouvrir aussi) ce qui coupe l’alimentation de la gâche électrique et qui déverrouille la porte.

Les améliorations

L’essentiel des améliorations a faire maintenant se situe du coté de l’appli android, celle ci étant un peu bugguée et pas encore très pertinente.

L’idéal serait qu’elle inclue un « timer » qui se connecte au bluetooth une fois par minute, cherche sur le périphérique de la porte est disponible, et ouvre la porte automatiquement si c’est le cas.

On ouvre qu’une fois la porte afin d’éviter qu’elle s’ouvre non stop qu’on on est dans l’appart, mais on continue a checker toutes les minutes la présence de la porte.

Si la porte est indisponible pendant plus de 3 min, on part du principe qu’on est sortis de l’appart, la prochaine détection de porte l’ouvrira donc de nouveau.

Le must du must sera aussi d’ajouter une serrure RFID a la porte en cas de perte du portable ou de portable déchargé, je ferais peut être une troisième
partie la dessus un de ces 4.

Article rédigé par Idleman

27 réflexions au sujet de « Raspberry PI ~ 23 : Créer une porte domotique (Partie 2) »

  1. kiff

    Salut,

    Ben y a eu du boulot ces derniers jours !!

    Bravo ! :D

    Répondre
  2. EricWM

    Merci BEAUCOUP !!!

    Je suis avec intérêt tes aventures dans le monde RPi Arduino.
    YANA tourne chez moi formidablement bien.

    Encore merci !! :)

    Répondre
  3. Jovial

    Hello
    Un digicode peut être intéressant.
    -Pas besoin de clé ou de badge magnétique.
    -Au quotidien on combiné code + détection bluetooth dés fois qu’un petit malin aurai matté le code, dans ce cas 2 chiffres et c’est ouvert
    -On peut gérer des plages horaires sur certains code: ex femme de ménage.
    -Un code genre superutilisateur en cas de d’urgence ou de téléphone hs
    -Un code à usage unique, par exemple pour le livreur de bière.
    Jluc

    Répondre
    1. Idleman Auteur de l’article

      Le digicode comprends aussi quelques inconvénient :
      Pas de possibilité d’utiliser le mode free hand
      Obligation de fixer un boitier de l’autre coté de la porte (dans un immeuble ou en location c’est interdit) et ça nécessite de faire au moins un trou dans le mur.
      Il est beaucoup moins sécurisé pour deux raisons :
      – Le cadran est visible de l’extérieur, on sait donc tout de suite quel système est utilisé pour l’ouverture de la porte
      – Les touches les plus usées, les plus sales etc… peuvent être interprétées comme faisant partie du code (a juste titre)

      Répondre
  4. tromax

    Hey voila la suite.
    C’est génial mais pour ma part je reste bloquer à installation de Yana Bluetooth.
    Il me met application non installé.
    Wiko Cink Five avec Android 4.1.2 tester également sur nexus 5 même symptôme.

    Concernant la vidéo j’ai une petite critique quand à la phase de test.
    Habituellement ces toujours bien expliqué la je trouve çà, fait un peu à la va vite.
    Le reste est parfait par contre.
    Ou alors mon cerveau ne suis plus.
    Ça doit être surement ça.
    Ce qui veut dire que j’ai besoin de vacances.

    Répondre
  5. lilian76

    Intéressant :) , j’ai une gâche électrique, mais elle appartient a la copro …
    Je me vois mal briser le mur pour choper les fils du système.
    Pourquoi pas mettre une caméra sur le Raspberry avec OpenCV pour la reconnaissance facial en + de la détection de smarphone.
    Dommage que je ne puisse pas tester pour le moment, mon coucou tourne encore sous Bada :)
    Bonne continuation :D

    Répondre
  6. Yohann

    Très très bien ce tutoriel, vraiment très intéressant! Et vraiment drole cette vidéo, ça me manquait.
    Merci et bonne continuation

    Répondre
  7. Geo

    I2C pour une communication entre seulement 2 appareils? Feignasse! C’était trop chiant à configurer l’UART ou la SPI ? :p

    Répondre
    1. Idleman Auteur de l’article

      Je trouve l’i2c bien plus puissant, plus rapide et plus simple a utiliser. J’utilise un seul périphériue dessous pour l’exemple et pour le moment, mais je compte bien passer par là pour tous mes prochains périphériques filaires :)

      Répondre
      1. Michel

        L’UART ça permettrait d’utiliser des transmetteurs RF! :D
        Cela permettrait aussi de laisser l’arduino gérer la connexion car le RPI ne peut pas être esclave en mode I2C (Linux est rebelle! :) ), le RPI n’aurait plus qu’à traiter ce qui entrerait dans une FIFO (pour les amoureux des économies de ressources CPU, il y a la magie du DMA qui permet de prendre ce qui se passe sur un périph –genre I2C, SPI, UART, etc– et de le ranger dans un fichier).

        Répondre
        1. Idleman Auteur de l’article

          ?? pas compris le rapport entre l’uart et le kit rf ^^, peux tu détailler ?
          Pour le mode esclave en uart, j’ignorais que le pi l’autorisait , effectivement c’est intéressant :)

          Répondre
          1. Mimi, encore lui.

            Le trip RF c’est que j’ai quelques modules RF (et plus encore!) en UART (de récup’, j’avoue :siffle: ). Mais il est vrai que généralement c’est par GPIO libre.
            Le Pi ne se comporte pas tout à fait « en esclave », car on ne peut pas multiplier (sans bricole) les périph’ sur la ligne; le « mode esclave » est alors purement logiciel (perso je suis partisan de la parité).
            Par contre pour de ma domotique je préfère confier la totalité du système à l’arduino/PIC qui se comporte alors en master sur l’I2C et occupe un minimum le Raspberry (qui plus est comme je n’utilise l’UART que pour le Pi, je peux donc gérer les interruptions/DMA comme bon me semble pour la jouer « dans les règles de l’art » des deux côtés).
            Par contre je suis d’accord sur le fait que l’I2C, c’est cool :)

  8. Laurent

    Arduino c’est pas encore pour moi, mais je remarque dans la vidéo des changement dans l’interface de Yana :) ..

    Répondre
  9. Florian

    Salut Idle !
    J’aurais une question, dans tes tutos, tu utilises quel diamètre de fil électrique pour tes soudures ?
    Car il y a une infinité de diamètre et je ne sais pas quoi prendre, pourrais-tu m’éclairer stp ?

    Répondre
    1. Idleman Auteur de l’article

      Le diametre importe peu tant que tu reste dans du petit gabarit du type 1mm de diametre :)

      Répondre
  10. ravin

    J’attendais avec impatience la suite de ton tuto ;)

    Répondre
    1. Idleman Auteur de l’article

      Je sais je suis un peu long ^^, mais c’est la faute d’ebay et ses delais d’un mois de livraison pour se rendre compte que le composant acheté n’est pas le bon :D

      Répondre
  11. Kaelman

    Ah.Un nouveau tuto :D .
    Cool!Des nouveautés.

    Merci! :)

    Répondre
  12. JeanJ

    Génial ! J’avais peur que cette magnifique série de tutos ait été abandonnée…
    Dans le code le l’ardui, le temps d’ouverture est initialisé à 50s et non à 5s, rien de grave !
    Je suis en plein aménagement d’un loft, et je crois que ce sera un véritable nid à microcontrôleurs, c’est tellement puissant pour seulement quelques € que ça me donne le vertige :D

    Répondre
  13. Julien

    Salut Idleman !
    Déjà bravo pour ton travail que je suis de prêt :)
    Je voulais savoir quelle distrib’ tu utilises pour tout tes projets ? Il me semble que c’est Raspbian mais tu l’utilises tel quel à l’installation ou tu as remodifié ? (Genre suppression de l’interface graphique …)
    Si un jour tu peux nous faire un petit truc sur Archlinux ça m’intéresse :)
    Voilà merci d’avance de ta réponse :)

    Répondre
    1. Idleman Auteur de l’article

      C’est raspian oui :), et je passe par un client ssh n’ayant pas d’écran alloué a mon pi, d’ou le manque d’interface graphique sur mes screenshots :), celà dit c’est vrai qu’on pourrait carrément la dégager pour l’utilité qu’on en a ^^.

      Répondre
  14. Unterberger Samuel

    Hey Idle,
    Je suis ton blog depuis longtemps et je m’intéresse tout particulièrement au R-Pi, je retape une maison et je souhaite la domotiser. Je suis un gros bricoleur, mais je ne code pas super bien … Par contre si tu veux un conseil sur cette porte domotique, moi j’ai choisi le mode secure pour éviter les cambriolage par coupure électrique mais j’ai rajouté une clenche à l’intérieur, comme ça on peut quand même sortir. En fait je me suis inspiré de ce qui se fait sur les portes d’immeubles.

    Répondre
    1. Idleman Auteur de l’article

      Oui je me suis fait la même reflexion quelques jours après le tuto ^^, seule faille de ce système : si tu as le feu et que tu es bloqué (mourant, évanoui etc..) a l’intérieur, les pompiers ne peuvent pas intervenir sans défoncer ta porte (ce qui te laisse quelques minutes de plus au chaud)

      Répondre
  15. Charles

    Fais gaffe, ton IP publique est visible sur la vidéo …
    Sinon super tuto, comme d’hab !

    Répondre
  16. syrus77

    salut idle :)

    petite question d’un zéro en programmation…

    est ce que tu pense que si j’utilise une carte de type Gertboard (ATmega328 embarqué)
    j’arriverai au même résultat sans grosse modification des fichiers ou c’est une illusion totale ?? ^^

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Xo ^_^ :siffle: :p :-( :evil: oO :) T_T <3 :D more »