Caméra de surveillance MQTT Raspberry Pi Zero W et Node-RED pour Home Assistant • Domotique et objets connectés à faire soi-même

7zk1e42bhaocjdls3dm7-5969520
he6eoxhe9pw495o4th46-4834444
xfe5270hvnklgtrdkakn-3495914

Depuis la version 1.3, le Raspberry Pi Zero possède un connecteur caméra sur lequel on peut brancher la caméra 8MP du Raspberry Pi. Home Assistant supporte de nombreuses caméras. Dans ce projet, nous allons fabriquer – sans programmation – une mini caméra de surveillance à l’aide de Node-RED.

Projet actualisé le 1er mai 2020

Node-RED permet de développer sans avoir (quasiment) à coder. On utilisera Node-RED pour prendre un cliché à intervalle régulier. Ce cliché sera ensuite envoyé sur un broker MQTT. Home Assistant récupère automatiquement chaque nouvelle image publiées sur message MQTT pour l’afficher sur le dashboard.

Pourquoi une caméra MQTT pour Home Assistant ?

Home Assistant supporte de nombreux types de caméra (liste complète). Depuis la version 0.46, les caméras Arlo de Netgear sont partiellement supportées.

Pour fabriquer une caméra de surveillance DIY à partir d’un Raspberry Pi Zero W, on a donc plusieurs solutions à notre disposition :

Pour écrire cet article, j’ai commencé (probablement comme tout le monde !) à installer Motion sur mon Raspberry Pi Zero et intégré à Home Assistant le flux vidéo à l’aide du composant Generic MJPEG IP Camera. Mais ça ne fonctionne pas. Actuellement, (sauf erreur de ma part), Home Assistant n’affiche aucune image sur les vues (view). Il n’y a que sur la vue de détail que l’image (flux vidéo) est affichée.

Je me suis donc tourné vers MQTT. L’avantage de MQTT c’est qu’il est possible de créer une caméra de surveillance connectée intelligente. En utilisant MQTT pour communiquer avec Home assistant, on pourra ajouter d’autres fonctions à la caméra:

  • Allumer un éclairage
  • Brancher un haut parleur  et diffuser des enregistrements audio : alarme, aboiement de chien, sirène…
  • Déclencher l’ouverture d’un portail ou d’un portillon
  • Transformer la caméra en portier vidéo

Pourquoi utiliser Node-RED ?

Tout simplement parce qu’il n’y aura absolument aucune programmation à faire ! Trois nodes suffisent pour créer une caméra de surveillance connectée !

Matériel nécessaire

Pour fabriquer une caméra de surveillance DIY à l’aide du raspberry Pi Zero W, vous aurez besoin du matériel suivant

  • Raspberry Pi Zero WH (avec signifie que le GPIO est déjà soudé)
  • Une alimentation 5V 3A. Surtout pas une puissance inférieure sinon vous risquez d’avoir des redémarrages intempestifs du Raspberry Pi.
  • Un boitier imprimé en 3D. Vous trouverez plusieurs modèles STL à imprimer dans cet article. Si vous choisissez une caméra avec éclairage par LED, je vous propose ce boitier à imprimer en 3D.
  • Une caméra. Tout est expliqué au paragraphe suivant
  • Eventuellement une nappe de connexion pour déporter la caméra (ribbon)

Le Raspberry Pi Zero équipé d’une caméra NoIR (vision nocturne améliorée) installé dans un boitier imprimé en 3D.

Quelle caméra choisir pour le Raspberry Pi Zero W ?

Voici quelques modèle de caméra que vous pouvez acheter pour fabriquer une caméra de surveillance à partir d’un Raspberry Pi Zero. Le modèle NoIR est le mieux adapté car il permet avec un éclairage complémentaire (2 Led infra rouge par exemple) d’obtenir une caméra de surveillance nocturne jusqu’à 10 m environ.

Le connecteur caméra qui équipe le Raspberry Pi Zero W est différent du Raspberry Pi 3 (ou antérieur). Il existe une version spécifique au Zero. En fait, c’est la nappe de connexion qui change. Si vous avez déjà une caméra ou un clone asiatique, vous pouvez acheter un nappe compatible pour environ 2€.

za4xuuyhrhl9luceyxp1-3458603

Préparer le Raspberry Pi Zero W

Si vous venez d’acheter votre Raspberry Pi Zero W, suivez ces étapes pour préparer votre système :

Activer le bus I2C pour pouvoir utiliser la caméra

Pour pouvoir utiliser la caméra, il faut d’abord activer le bus I2C du Raspberry Pi. Par sécurité, le bus I2C est déconnecté. Le bus I2C peut être activé à l’aide de l’utilitaire raspi-config de Raspbian.

sudo raspi-config

Allez à l’option (5) Interfacing Option

Puis activez le module caméra (P1)

inhrqvmkjxvjyprwlgqd-1427690

Ceci fait, lancez la commande suivante pour changer le driver de la caméra

sudo modprobe bcm2835-v4l2

On rend permanent le chargement du driver au démarrage en exécutant

echo "bcm2835-v4l2" | sudo tee -a /etc/modules

Maintenant, relancez le système pour activer les modifications

sudo reboot

Installer la librairie Python Picamera

Pour ce projet, nous allons utiliser le flow node-red-contrib-camerapi qui permet de prendre un cliché à l’aide de la librairie Python Picamera (présentée en détail dans ce tutoriel). Exécutez cette commande pour l’installer.

sudo apt-get install python-picamera python3-picamera

Installer le module node-red-contrib-camerapi

Ouvrez le gestionnaire de palette

Saisissez camera dans le champ de recherche puis lancez l’installation du module en appuyant sur install.

Tout est prêt pour coder votre caméra de surveillance.

Capture vidéo (snapshot) avec Node-RED

Maintenant que tout fonctionne, nous allons utiliser Node-RED pour capturer une image à intervalle régulier. MQTT n’est pas conçu pour supporter un flux vidéo. D’autre part, comme les messages vont circuler sur votre réseau local et potentiellement être envoyés à votre smartphone lorsque vous quittez votre domicile, il est nécessaire de limiter la taille de l’image. C’est un peu dommage lorsqu’on possède une caméra 8MP, mais on va devoir limiter la résolution. Si vous utilisez l’application mobile pour iOS, limitez à 320 x 240 pixels. Pour un utilisation uniquement sur un réseau local, vous pouvez grimper la résolution à 640 x 480 pixels.

C’est parti pour la programmation. Déposez un node Inject. Choisissez le type repeat (répéter) et indiquez l’intervalle de prise de vue. Comme pour la résolution, inutile d’être trop gourmand. Un cliché toutes les 5 secondes, c’est suffisant pour voir ce qu’il y a dans une pièce.

Dans le champ de recherche, saisissez camera pour trouver le node de prise du vue du module

Placez le sur le flow et faites un double clic et éditer les paramètres comme ceci :

  • File Mode : buffermode. Aucun fichier ne sera stocké localement. MQTT supporte l’envoi du buffer.
  • Resolution : 320 x 240 (conseillé)
  • Vous pouvez orienter ou inverser l’image en fonction de la position de la caméra avec les option flip et rotate
  • Vous pouvez ajuster le contraste, luminosité…
  • Enfin (inutile pour une caméra de surveillance), vous pouvez ajouter un effet (négatif, flou…)

Comme vous pouvez le constater, il n’y a aucune compression. C’est aussi une raison de limiter la taille de l’image.

Pour tester que tout fonctionne bien, vous pouvez brancher un node debug et déployer le flow. Dans l’onglet debug, vous devez obtenir un objet contenant un tableau de chiffre (le buffer de l’image). Si vous obtenez une chaine vide, allez à la fin du tutoriel pour identifier et corriger le problème.

Publier (envoyer) l’image de surveillance par MQTT

MQTT est supporté nativement par Node-RED. Cherchez le flow MQTT dans la palette et placez sur le flow un node MQTT output (sortie).

Ouvrez le node pour l’éditer.

Cliquez sur le crayon pour configurer une nouvelle connexion. Sur le premier onglet, indiquez l’adresse IP (ou l’adresse internet si vous utilisez un Broker en ligne)

Si vous avez mis en place une authentification par mot de passe, allez au second onglet et remplissez les champs Username et Password

Validez la connexion en cliquant sur Add. De retour sur le panneau de configuration du node MQTT, sélectionnez la connexion dans la liste. Indiquez enfin un Topic MQTT. Ici, toutes les images seront publiées sur le Topic camera/pizerow. Comme les images sont publiées régulièrement, vous pouvez laisser le QoS sur 0 (les messages sont envoyés sans garantie de réception) et retain sur false (lorsqu’un nouveau client se connecte, il ne pourra pas récupérer les anciens messages – images). Cliquez sur Done pour terminer.

La programmation de votre caméra est terminée. Déployez le flow

Code du Flow

Collez ce code et modifiez les paramètres avant de déployer le flow

[{"id":"63d2ff76.6564e","type":"inject","z":"6f9a15f1.e2763c","name":"Every 5 secondes","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":true,"x":160.5,"y":175,"wires":[["8d852b1a.b9bdf8"]]},{"id":"8d852b1a.b9bdf8","type":"camerapi-takephoto","z":"6f9a15f1.e2763c","filemode":"0","filename":"","filedefpath":"1","filepath":"","fileformat":"jpeg","resolution":"1","rotation":"0","fliph":"0","flipv":"0","brightness":"50","contrast":"0","sharpness":"0","imageeffect":"none","name":"","x":403.5,"y":215,"wires":[["f74b1572.e5bce8","50d0f5e5.e9b3ac"]]},{"id":"f74b1572.e5bce8","type":"mqtt out","z":"6f9a15f1.e2763c","name":"","topic":"camera/pizerow","qos":"0","retain":"false","broker":"4b7f2fe2.bb49d","x":635.5,"y":252,"wires":[]},{"id":"50d0f5e5.e9b3ac","type":"debug","z":"6f9a15f1.e2763c","name":"","active":false,"console":"false","complete":"false","x":631.5,"y":165,"wires":[]},{"id":"4b7f2fe2.bb49d","type":"mqtt-broker","z":"","broker":"","port":"","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]

Inclure la caméra MQTT à Home Assistant

Ouvrez le fichier de configuration d’Home Assistant

sudo nano /home/homeassistant/.homeasssistant/configuration.yaml

Commencez par ajouter une section mqtt et indiquez les paramètres de connexion à votre broker. Si vous avez activé a protection par mot de passe, remplissez username et password, sinon supprimez les paramètres.

mqtt:
  broker: localhost
  port: 1883
  keepalive: 60
  username: 
  password: 
  protocol: 3.1.1

Ensuite, ajoutez une nouvelle section camera. Indiquez le topic sur lequel Home Assistant doit aller récupérer les images. Ici camera/pizerow

camera:
  platform: mqtt
  topic: camera/pizerow
  name: pizerow

Ajoutez la caméra à un groupe à l’aide. Ici, cela donnera camera.pizerow. Pour modifier l’étiquette affichée, ajoutez cette

Enregistrez la configuration (XTRL + X puis Y – O) et relancez Home Assistant

sudo systemctl restart home-assistant@homeassistant

Après le redémarrage, la caméra est parfaitement intégrée à Home Assistant

En cas de problème avec le module camerapi

Le module camerapi pour Node-RED est basé sur la librairie Picamera, si celle-ci n’est pas installée, vous aurez ce message

0|node-red | CameraPi (err): Error: Command failed: python /home/pi/.node-red/node_modules/node-red-contrib-camerapi/lib/python/get_photo.py pic_722dcbe7-15d6-477c-bd22-29510bbadce1.jpg /home/pi/Pictures/ jpeg 320 240 0 0 0 50 0 0 none
0|node-red | Traceback (most recent call last):
0|node-red |   File "/home/pi/.node-red/node_modules/node-red-contrib-camerapi/lib/python/get_photo.py", line 1, in 
0|node-red |     import picamera
0|node-red | ImportError: No module named picamera

Le répertoire Pictures n’existe pas par défaut sur Raspbian Jessie Lite. Vous risquez d’avoir ce message d’erreur au premier déploiement du flow Node-RED.

0|node-red | CameraPi (log): Generate - /home/pi/Pictures/pic_ee62d58d-ad4d-40ff-b403-19e1faf10902.jpg
0|node-red | 26 Jun 10:07:38 - [info] [camerapi-takephoto:7c67fe4a.f9f59] python /home/pi/.node-red/node_modules/node-red-contrib-camerapi/lib/python/get_photo.py pic_ee62d58d-ad4d-40ff-b403-19e1faf10902.jpg /home/pi/Pictures/ jpeg 320 240 0 0 0 50 0 0 none
0|node-red | CameraPi (err): Error: Command failed: python /home/pi/.node-red/node_modules/node-red-contrib-camerapi/lib/python/get_photo.py pic_ee62d58d-ad4d-40ff-b403-19e1faf10902.jpg /home/pi/Pictures/ jpeg 320 240 0 0 0 50 0 0 none
0|node-red | Traceback (most recent call last):
0|node-red |   File "/home/pi/.node-red/node_modules/node-red-contrib-camerapi/lib/python/get_photo.py", line 1, in 
0|node-red |     import picamera
0|node-red | ImportError: No module named picamera

Ouvrez un Terminal et exécutez cette commande pour créer le dossier manquant

mkdir /home/pi/Pictures

Et voilà, grâce à Node-RED et MQTT, nous venons de fabriquer un caméra de surveillance connectée 100% DIY. Vous avez une maitrise totale des images qui sont envoyées à votre serveur domotique ou sur votre smartphone lorsque vous quittez votre domicile. Dans la prochain tutoriel, nous ajouterons un détecteur de mouvement qui permettra d’envoyer (aussi simplement) une notification, un email ou déclencher un scénario sur le serveur domotique.

Avez-vous aimé cet article ?