Skip to content
Portier Vidéo Home Made - Intégration dans JEEDOM
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
files
img
README.md

README.md

d00rBell

Logo

Présentation

N'ayant qu'une confiance toute relative dans les produits vendus dans le commerce (Ring, chinoiserie...) et trouvant excessivement onéreux l'excellent Doorbird, je me suis orienté vers une réalisation maison d'un portier vidéo.

Le projet est simple : être alerté via une notification sur nos téléphones, tablettes et montres dés qu'une personne sonnera au portillon. Il sera possible de voir et d'entendre l'interlocuteur ainsi que d'interagir avec ce dernier par l'intermédiaire de nos iDevices et ce aussi bien chez nous qu'à l'extérieur. Il serait intéressant également de surveiller l'entrée de la maison. La camera devra donc détecter les mouvements et les rapporter via notification et mail (pour les captures vidéos).

Boitier

Matériel

Principalement de récupération, ou d'occasion afin de réduire le coût.

La caméra, le haut parleur et le bouton sont intégrés dans un boîtier étanche en aluminium. Le tout prenant place à proximité de l'entrée de la maison.

Boitier Boitier Boitier Boitier Boitier Une fois brossé : Boitier Boitier Boitier Boitier Boitier

Logiciels

  • Raspbian Stretch with desktop pour l'OS
  • JitsiMeet est une application libre de messagerie instantanée voix IP et vidéoconférence. Elle permet via un simple navigateur WEB de communiquer (AUDIO & VIDEO) à l'intérieur d'une salle de conférence publique. Documentation de l'API
  • Motion est un logiciel de détection vidéo pour la partie surveillance.
  • Mutt est un client mail en mode console. De pair avec Motion, il va permettre d'envoyer par mail les captures vidéos réalisées lors de détection.
  • Jeedom pour l'envoi des notifications sur les idevices et monitoring du Rpi

Principe

Lorsque le visiteur pressera le bouton, une notification sera envoyée via Jeedom (et le plugin App Mobile) sur nos portables avec l'URL de la salle de conférence Jitsi à rejoindre. Le nom de la salle sera généré aléatoirement afin d'éviter qu'une tierce personne ne se connecte en même temps et espionne la conversation. Une simple pression sur le lien et l'application Jitsi s'ouvre et rejoint la conférence. Par défaut le micro du téléphone est désactivé. Au choix il peut être réactivé et ainsi permettre un échange avec le visiteur.

N'ayant pas de Wifi ni source électrique de disponible à proximité du portillon, jai opté pour une liaison POE, assurant une connexion fiable et une alimentation électrique suffisante.

Le portier se compose de 2 boîtiers :

  • Un premier en façade avec Caméra, micro, haut parleur et bouton.
  • Un second dans ma cloture coté maison avec le Rpi et la carte son.

Les 2 sont reliés par 2 cables (un USB et un second type ethernet pour le bouton, LED et Haut parleur).

1.Préparation du Rpi

  • Installation de Raspbian Stretch with desktop sur la carte SD. lien
  • Activation du SSH en créant un fichier vierge ssh à la racine de la partition boot. lien
  • Connexion en ssh : $ ssh pi@ip.du.rpi. Le mot de passe par défaut est raspberry
  • Configuration du Raspberry : $ sudo raspi-config
    • Interfacing Options -> SSH -> Activer
    • Interfacing Options -> VNC -> Activer
  • Connexion à l'interface graphique via realVNC
  • Suivez l'assistant puis redémarrez le pi
  • En ssh, mise à jour du système et le firmware:
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo rpi-update
  • Le Raspberry Pi est prêt.

Il peut à présent être coiffé de son jolie chapeau :

poe.jpg

Le PoE Hat a quelque peu polémiqué dans sa jeunesse en particulier pour des problèmes d'alimentation USB mais le problème est définitivement résolu avec cette 3ème révision. L'inconvénient de cette carte d'extension réside dans l'accès aux pins du GPIO. J'ai dû souder directement mon bouton et sa Led au dos du Pi, m'obligeant à réhausser la carte pour l'intégré dans son (demi) boîtier.

Rpi

Raccordement du bouton sur le port GPIO

Le bouton dispose de 5 pins :

  • Le + de la LED
  • La masse de la LED
  • La masse du bouton
  • Deux pins : NO et NF pour le bouton. Nous utiliserons le NO c'est à dire que le circuit reste Normalement Ouvert sans pression sur le bouton.

Bouton

Nous utiliserons une masse commune en reliant le - de la Led avec le - du bouton (Pin 6 du GPIO).

GPIO_Schema

Coté GPIO, j'ai utilisé les Pins 7 pour le + de la LED et 3 pour le bouton. (Numérotation physique des broches sur la board et non BCM)

gpio.jpg

Petit rappel des couleurs des cables :

Cable

Intégration dans une boite étanche de dérivation accompagné de la carte son USB empreinté aux enceintes USB Gigabyte. Connexion par Wago afin de faciliter le montage/démontage. Dérivation

Cette boite sera dissimulée dans ma cloture coté maison et non rue.

2.Le Serveur WEB

  • Installation d'Apache et PHP : $ sudo apt-get install apache2 php
  • On limite l'accès qu'a Localhost : $ sudo nano /etc/apache2/sites-enabled/000-default.conf puis ajoute entre <VirtualHost>:
<Directory "/var/www/html/Doorbell" >
   order deny,allow
   deny from all
   allow from localhost
</Directory>

Et on ajouter un nouvel Host pour la partie Monitoring limité qu'a JEEDOM :

<VirtualHost *:82>
DocumentRoot /var/www/html/Monitoring
<Directory "/var/www/html/Monitoring" >
   order deny,allow
   deny from all
   allow from IP.DE.JEEDOM localhost
</Directory>
</VirtualHost>

On redémarre apache afin qu'il puisse prendre en compte les modifications : $ sudo systemctl reload apache2

3.Fichiers

/home/pi/d00rBell :

  • /home/pi/d00rBell/boot.sh -> Script assurant la connexion du disque réseau (pour la sauvegarde des captures vidéos sur un NAS) et l'execution du scrip d00rbell.py à l'ouverture de session. Vous devez renseigner un hôte si vous utilisez une connexion Wifi.
  • /home/pi/d00rBell/d00rbell.py -> Script permettant l'interactivité entre le bouton du portier et l'execution de Jitsi meet (via le navigateur Web). Il lit un fichier son (sound.wav) prévenant le visiteur que son action a bien été prise en compte (la led du bouton clignote également). Il se charge d'envoyer les demandes de notifications via Jeedom et de fermer Motion afin que Jitsi puisse avoir accès à la caméra
  • /home/pi/d00rBell/sound.wav -> fichier son joué au visiteur à la pression du bouton sur le portier.
  • /home/pi/d00rBell/send_notif.sh -> Script communiquant avec Jeedom pour l'envoi des notifications. Il sert d'intermédiaire entre Motion et Jeedom.
  • /home/pi/d00rBell/send_alert.sh -> Assure l'envoi des mails via mutt

/var/www/html :

  • /var/www/html/Doorbell/config.php -> Fichier de configuration :

    • timerInterval = délai aprés lequel la conférence se ferme si personne n'a répondu.
    • serverURL = URL du serveur JEEDOM
    • notificationScriptURL = URL du script pour Jitsi sur JEEDOM
    • nickname = Pseudonyme Jitsi
    • roomName = Nom de la room Jitsi / Si random -> génère un nom aléatoire
  • /var/www/html/Doorbell/index.php -> Jitsi

  • /var/www/html/Doorbell/main.js -> JS

  • /var/www/html/Doorbell/style.css -> CSS

  • /var/www/html/Monitoring/index.php -> Permet d'intéragir avec le Rpi directement via Jeedom (et le plugin Script).L'URL a utiliser est du type :

    • index.php?a=exec&e=actionaction peut prendre :
      • call -> Simule un appel
      • killBrowser -> Ferme Chromium
      • killMotion -> Ferme Motion
      • launchMotion -> Execute Motion
      • getStatus -> associé a &app=nomdelapplication permet de connaitre l'état d'un processus. Renvoie True ou False

Monitoring

JEEDOM

  • JEEDOM/send_notif.php -> envoi une notification lors des détections/pression du bouton. Il est nécessaire de modifier le script pour y indiquer l'ip locale du portier vidéo.

4.Navigateur Web

Chromium fonctionne parfaitement avec Jitsi. Vous pouvez désactiver les extensions pour l'alléger. Il faudra autoriser le navigateur a accéder au micro et a la caméra.

Une fois le bouton préssé, le navigateur Web s'ouvre sur cette page de contrôle :

JitsiRpi

4.Installation de la WebCam / HP USB

WebCam / Micro = OOB ; Vous pouvez tester la caméra avec cheese.

Petit problème pour les HP en USB. J'ai dû désactiver la sortie analogique dtparam=audio=off dans le fichier /boot/config.txt et configurer le périphérique de sortie en Digital Output S/PDIF via le panneau de contrôle de son Pavucontrol ($ sudo apt-get install pavucontrol). D'ailleurs le volume ne peut se régler que par cet outil.

HP

5.Installation de MOTION

  • $ sudo apt-get install motion
  • Modifier le fichier de configuration : $ sudo nano /etc/motion/motion.conf
daemon off
width 1280 #Résolution de votre caméra
height 720 #Résolution de votre caméra
framerate 15 #nombre d'images par seconde
threshold 50000 #seuil de pixel 
noise_level 32 # Tolérance du bruit sur l'image
smart_mask_speed 10
lightswitch 25 # Tolérance pour les changements de luminosité 
minimum_motion_frames 5
pre_capture 5
post_capture 5
event_gap 10
max_movie_time 30 # Durée maximale d'une video
output_pictures off # pas de photo 
ffmpeg_output_movies on
ffmpeg_video_codec mov # format parfait pour iOS
target_dir /home/pi/Partage/Captures/ # Chemin d'enregistrement des captures
movie_filename %d-%m-%Y/%v_%d-%m-%Y_%H-%M-%S
stream_localhost on
webcontrol_localhost on
on_event_start $HOME/d00rBell/send_notif.sh d00rBell Capture video en cours... # lorsqu'un événement est détecté => envoi des notifications 
on_movie_end $HOME/d00rBell/send_alert.sh -s 'Capture Vidéo' -a %f -- monadresse@monmail.com # a la fin de l'événement => envoi de la vidéo par mail

Le paramètrage est a adapter en fonction de vos besoins et configuration.

Pour le peaufinage du seuil de détection, je vous invite à visiter ce site

  • Donnez les droits aux log :
$ sudo touch /var/log/motion.log
$ sudo chown pi:pi /var/log/motion.log
$ sudo chmod 750 /var/log/motion.log
  • Création du dossier de capture : $ mkdir -p /home/pi/Partage/Captures

Watch

Source

6.Installation de Mutt

  • $ sudo apt-get install mutt
  • $ nano /home/pi/.muttrc pour la configuration
    • Pour GMAIL :
# Nom de l'expéditeur du message
set realname = "pi"

# Activer TLS si disponible sur le serveur
set ssl_starttls=yes
# Toujours utiliser SSL lors de la connexion à un serveur
set ssl_force_tls=yes

# Configuration SMTP
set smtp_url = "smtp://XXXXXXXX@gmail.com@smtp.gmail.com:587/"
set smtp_pass = "PASSWORD"
set from = "XXXXXXXX@gmail.com"
set use_envelope_from=yes
set record="/dev/null";

  • On sécurise le fichier :
$ chown pi:pi .muttrc
$ chmod 600 .muttrc

Source

7. Les Droits

  • Lorsque l'on veut executer un script en dehors d'une page Web, il faut donner le droit a www-data de le faire (pour Motion et KillAll).
  • sudo visudo puis ajouter :
www-data ALL=(pi) NOPASSWD: /usr/bin/motion,/usr/bin/killall

8.Au boot

Nous souhaitons executer boot.sh au démarrage de la session :

$ mkdir /home/pi/.config/autostart
$ nano /home/pi/.config/autostart/boot.desktop
  • Coller ceci :
[Desktop Entry]
Name=d00rBell
GenericName=Terminal
Icon=lxterminal
Type=Application
Categories=Scripts;System;TerminalEmulator;
Keywords=script;command line;execute;
Exec=lxterminal -e /bin/bash /home/pi/d00rBell/boot.sh

Source / Source

9.Intégration dans JEEDOM

  • Le plugin Monitoring me permet de surveiller à distance mon raspberry pi.

Monitoring

  • Le plugin Script m'offre la possibilité d'intéragir facilement avec le système :
    • Reboot : <?php $connection = ssh2_connect(IP.DE.DOORBELL', 22); ssh2_auth_password($connection, ‘USER', ‘MOTDEPASSE'); $stream = ssh2_exec($connection,'sudo reboot >/dev/null & reboot >/dev/null’); ?>
    • Shutdown : <?php $connection = ssh2_connect(IP.DE.DOORBELL', 22); ssh2_auth_password($connection, ‘USER', ‘MOTDEPASSE'); $stream = ssh2_exec($connection,'sudo shutdown -h now >/dev/null & shutdown -h now >/dev/null’); ?>
    • Arrêt/Démarrage des processus : http://IP.DE.DOORBELL:82/index.php?a=exec&e=killBrowser ou killMotion ou launchMotion
    • Status des processus : http://IP.DE.DOORBELL:82/index.php?a=exec&e=getStatusValue&app=application où application peut être motion, python, chromium

Script

  • Il manque la possibilité d'accéder au Stream de la caméra. (même si la fonction call permet de simuler un appel)
  • Historique des actions/Log à venir

10.Fonctionnement

  • Au démarrage de la machine boot.sh s'execute :

    • => Ping sur le NAS pour vérifier la connexion réseau
    • => Montage du disque réseau (NAS)
    • => Execution de Motion
    • => Execution de d00rbell.py

    Capture

  • d00rbell.py attend que le bouton soit pressé :

    • => Ferme Motion
    • => Récupère le nom de la Room et envoie la requête a Jeedom pour l'envoi des notifications

    Capture

    • => Alerte sonore pour prévenir le visiteur que l'action est prise en compte / Alerte visuelle en faisant clignoter la Led en façade
    • => Ouverture de Chromium et connexion a Jitsi

    Capture

  • Ouverture de l'interface Web DoorBell

    • => Chargement du fichier config.php et connexion à la conférence Jitsi Meet générée précédemment

    Capture

    • => Si pas de réponse pendant le timerInterval => Fermeture de Chromium
    • => Si le contact raccroche / Si participant = 0 => Fermeture de Chromium
    • => Si Fermeture de Chromium => Execution de Motion

Bonus

  • Montage du disque réseau au démarrage : $ sudo nano /etc/fstab
    //IP.DU.NAS/Partage     /home/pi/Partage     cifs     rw,uid=pi,_netdev,credentials=/home/pi/.smbcredentials     0     0
    
    On créé le fichier .smbcredentials : $ nano /home/pi/.smbcredentials :
    username=pi
    password=password
    
    On sécurise le fichier : chmod 600 .smbcredentials

Evolution

  • Vision nocturne
  • Permettre l'ouverture d'une gâche magnétique
  • Virtualiser un serveur Jitsi Meet perso
You can’t perform that action at this time.