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.
Sommaire
- 1 Pourquoi une caméra MQTT pour Home Assistant ?
- 2 Matériel nécessaire
- 3 Quelle caméra choisir pour le Raspberry Pi Zero W ?
- 4 Préparer le Raspberry Pi Zero W
- 5 Installer la librairie Python Picamera
- 6 Installer le module node-red-contrib-camerapi
- 7 Capture vidéo (snapshot) avec Node-RED
- 8 Publier (envoyer) l’image de surveillance par MQTT
- 9 Code du Flow
- 10 Inclure la caméra MQTT à Home Assistant
- 11 En cas de problème avec le module camerapi
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€.
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)
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.
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- ESP32-CAM. Broches et équipements ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- ESP32-CAM. Quel modèle choisir ? ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Home Assistant. Installer le snap sur NAS Synology sur une machine virtuelle Ubuntu
- ESP32-CAM. Souder l’antenne externe pour améliorer la portée et la stabilité du flux vidéo
Avez-vous aimé cet article ?