salut à tous,
Les cameras ESPCAM programmées avec ESPHOME sont supers simples à mettre en place avec un cout de quelques € (inferieur à 10€), et supers simples à rendre accessibles sur votre lovelace d’Home Assistant ! ca OK ! c’est déjà génial !
MAIS, quand vous souhaitez effectuer l’enregistrement de flux vidéo, faire de la détection de mouvements, même de la reconnaissance faciale ou d’objets (voiture, camion, ect) et lecture de plaques d’immatriculation ect… vous ne trouverez pas beaucoup d’information, voir pas du tout. vous ne trouvez rien sur les forums US…rien…
que ce soit sur lovelace ou motion eye, rien de rien…
Le gros probleme avec les espcam sous esphone est que le token du flux video de la cam change à chaque requete et/ou toutes les x minutes… donc l’url change en permanence.
On voit ici l’attribut d’état de la camera access_token et entity_picture
Pour lovelace, cela ne pose pas de probleme puisque c’est lovelace qui demande à HA l’autorisation d’afficher le flux video :
.
Pour ma part, je veux des espcam32 (sou esphome et pas arduino), je souhaites les avoir en live sur lovelace (ca OK je reviendrais pas là dessus) ET pouvoir enregistrer les flux vidéos en cas de détection de mouvement.
De quoi vais je avoir besoin?
- HA
- d’une ESPCAM32 sous esphome fonctionnelle sous HA
- Node Red
- un host pour heberger Zoneminder (ou Blueiris par exemple ou un autre logiciel de video surveillance)
En fin de tuto, vous trouverez ce qu’il faut pour faire de la reconnaissance faciale avec ces limites, reconnaissance de véhicule et lecture de plaques d’immatriculation en fonction de votre installation. Vous aurez ainsi la possibilité de faire plein de choses selon vos envies et vos besoins avec zoneminder comme aussi définir des zone de surveillance sur une image)
J’utilise donc, vous l’aurez compris, ZoneMinder qui est gratuit, en installant sur une SD de 32Gio et un RPI3b 2020-02-13-raspbian-buster-zoneminder-1.34-0.1.img.bz2 , donc un fichier img déployé sur une SD via balena etcher ou autre et hop, zoneminder est déjà installé.
Donc à ce stade, vous avez votre espcam qui fonctionne sur HA et Zoneminder.
Nous allons nous servir de notre copain Nodered :
I. Le premier noeud est le noeud Http in :
Le champ URL sera la nouvelle adresse de votre caméra, vous l’inventez ! faites quelque chose de facile à retenir.
Ma camera sera donc accessible http://ipd’HA:1880/endpoint/camera.parking
ok?
donc nous sommes d’accord, lorsque j’utiliserai cette nouvelle url, je serais ainsi redirigé vers l’url de ma camera avec son token qui change tout le temps.
http://ipd’ha:1880/endpoint/camera.parking affichera le contenu de la page http://ipd’ha:8123/api/camera_proxy_stream/camera.camera_parking?token=1999ca807ee3829354e4848cfd11f3ed82c189c7dc37a71c9a4fae31011221c1
Pour ce faire, il faut continuer avec les prochains noeuds :
II. Le current state:
Alors vous allez demander comment ai je fait pour avoir un sensor.camera_parking_url_token ? eh bien j’ai créé un sensor à partir de l’attribut d’une entité ! tout simplement !
rappeler vous ce tuto : [TUTO] créer une entité à partir de l’attribue d’une entité - Tutoriels Home Assistant - HACF
et de ceci :
Je veux donc créer une entité, un sensor, à partir de l’attribut entity_picture de l’entité camera.camera_parking
et pour créer ce sensor il vous suffira de rajouter ces lignes dans votre partie sensor du fichier de configuration.yaml ou votre fichier sensors.yaml en fonction de vote situation :
################################ sensor token cameras ESPHOME #######################
#camera_parking_url_token
- platform: template
sensors:
camera_parking_url_token:
friendly_name: 'camera_parking_url_token'
value_template: "http://192.168.x.xxx:8123/api/camera_proxy_stream/camera.camera_parking?token={{ state_attr('camera.camera_parking','access_token') }}" #ici, on indique que la valeur de cette entité correspond à la valeur de l'attribut de l'entité
ce sensor sensor.camera_parking_url_token donnera donc l’état suivant :
et son état, qui est donc l’url de la camera, changera automatiquement lorsque le token changera ! c’est glop !!
III. La fonction :
Alors au début, avec mon @fredarro préféré, nous étions parti pour stocker la valeur en global, experience tres enrichissante mais nous avons préféré partir sur cette fonction. Donc rajouter le noeud Function et copier / coller ceci :
msg.statusCode = 303;
msg.headers = {
Location: msg.data.state
}
delete msg.payload;
return msg;
IV. HTTP Reponse:
là encore, super simple, il faut rajouter simplement le noeud HTTP RPONSE :
V. Résumé :
donc maintenant mon url http://ipd’HA:1880/endpoint/camera.parking me redirigera vers l’url de la camera parking avec son TOKEN à jour !
/!\ si votre node red est hebergé en dehors d’HA, ce sera l’ip de nodered qu’il faudra utiliser mais finissant toujours par :1880/endpoint/camera.xxxx
Votre camera à donc un flux video diffusé en HTTP avec une url fixe !
VI. Test avec zoneminder :
ajouter une camera avec les parametrage suivant :
ne pas oublier de définir le % fusion image de référence !
et dans l’onglet Source :
voila !
alors vous pourrez donc définir vs zone de detection, vos alarmes, lecture de plaque numeraolgique, définir la methode d’enregistrement :
Aucun : la caméra est désactivée
Monitor : la camera affiche juste son flux temps-réel
Modect : Enregistre que si un mouvement est détecté
Record : enregistre juste son flux 24h/24 / pas de détection
Mocord : enregistre son flux 24h/24 ET détecte les mouvements
Nodect : n’enregistre pas tant qu’un élément externe à zm ne lui dit pas de le faire via la fonction zmtrigger
voici quelques infos sur l’utilisation de ZM :
voici le flow utilisé et à personnaliser avec votre environnement :
[{"id":"71ea81a8.735a9","type":"http in","z":"36a01081.2eb61","name":"","url":"camera","method":"get","upload":false,"swaggerDoc":"","x":180,"y":500,"wires":[["1252f167.7ae52f"]]},{"id":"cd25c5f6.302598","type":"http response","z":"36a01081.2eb61","name":"","statusCode":"","headers":{},"x":350,"y":660,"wires":[]},{"id":"1252f167.7ae52f","type":"api-current-state","z":"36a01081.2eb61","name":"","server":"df03acce.f940b","version":1,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"sensor.camera_parking_url_token","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":260,"y":580,"wires":[["29a1a441.4a63dc"]]},{"id":"29a1a441.4a63dc","type":"function","z":"36a01081.2eb61","name":"","func":"msg.statusCode = 303;\nmsg.headers = {\n Location: msg.data.state\n}\ndelete msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":140,"y":660,"wires":[["cd25c5f6.302598"]]},{"id":"df03acce.f940b","type":"server","name":"Home Assistant","legacy":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
un grand MERCI à @fredarro pour ce travail d’équipe !