Bonjour à tous,
j’ai acheté il y a quelques temps deux caméra Camera xiaomi 360 1080P (Modèle MJSXJ05CM) chez Leroy Merlin. Pas cher et fonctionne bien.
Seul soucis, cette camera ne diffuse pas de flux RTSP (ni aucun flux accessible autrement que par l’application Xiaomi).
Je sais qu’il existe un hack, mais il ne fonctionne que pour le modèle MJSXJ02CM (j’ai testé).
Du coup j’étais coincé.
Pour rappel, j’avais déjà fait un post pour expliquer comment utiliser les remonté d’info des capteurs fourni dans le Xiaomi Mi Smart Sensor Set (vendu chez Leroy Merlin) quand on à pas de Zigate.
Le principe consistait à récupérer les notifications de l’application android et de les envoyer à Jeedom. Ca fonctionne trés bien, sauf pour les Cameras, les notifications de détection de personnes sont franchement aléatoire.
Mais je n’ai pas abandonné ma methode pour autant.
Rappel, je dispose d’un serveur qui peut faire tourner des machines virtuelles H24 (mais ça fonctionne si vous avez un vieux smartphone que vous n’utilisez plus).
Le principe est simple. Je ne peux pas récupérer le flux videos de la caméra, mais est-ce que je peux récupérer « un » flux video d’un appareil android quelconque ? La réponse est oui.
Methode:
Sur mon périphérique android (machine virtuelle qui emule un smartphone, ou sur un smartphone), on installe le logiciel " Screen Stream over HTTP". Ce petit logiciel gratuit est capable de streamer le contenu de l’écran de votre smartphone en mjpeg. (Attention, il n’y pas d’audio en mjpeg).
Je lance donc l’application " Screen Stream over HTTP", puis je lance l’application Xiaomi et j’affiche la video de la caméra en full screen.
vous pouvez donc vous connecter sur « http://adresse_ip_du_smartphone:8080/stream.mjpeg » et voir le flux video de la camera.
Deux petits soucis.
- Le plugin Camera Jeedom ne sais pas traiter le mjpeg.
- je n’ai toujours pas de notification en cas de de detection de mouvement.
Solutions:
Le plugin de Jeedom à besoin d’une URL qui renvoit UNE image jpg. J’ai donc installé un serveur web apache + php sur une autre VM (qui peut etre la même qui héberge Jeedom).
Et j’ai créé une page PHP qui va récupérer UNE image du flux mjpeg via ffmpeg et la renvoyer chaque fois qu’on l’appelle.
Voici le contenu de mon script php
<?php
$name = './img/do.jpg';
exec ('ffmpeg -y -i http://192.168.0.133:8080/stream.mjpeg -vframes 1 /var/www/html/img/do.jpg');
$fp = fopen($name, 'rb');
header("Content-Type: image/jpg");
header("Content-Length: " . filesize($name));
fpassthru($fp);
Ainsi, chaque fois qu’on appelle l’URL http://ip_de_mon_serveur_web/snap.php, ça renvois la dernière image du flux.
Dans la configuration du plugin Camera, je met donc
IP: ip du serveur web
Port : 80
URL de snaphot : /snap.php
Ca fonctionne en ce moment même chez moi.
Ps: je suis en réseau local, derrière deux routeur et un firewall, donc pas besoin de sécuriser le flux entre mes machines/softs, donc pas de https.
Pour la detection de mouvement:
Sur la même VM qui héberge le serveur web et/ou jeedom, j’utilise le logiciel motion.
Ce logiciel prend en paramètre un flux video, de globalement n’importe quel format (rtsp/mjpeg ou autre). Il va ensuite exécuter un script s’il detecte un mouvement sur ce flux (et/ou enregistrer un bout de videos, et/ou une image).
Je créer un donc un script qui sera lancé à chaque detection de mouvement et qui va appeler l’URL de l’API Jeedom pour lancer un scenario. Et voila, j’ai mon Jeedom qui recoit les notifications en cas de detection de mouvement de la camera Xiaomi.
Bonus:
Le plugin camera de jeedom peut afficher un flux RTSP (pour voir le flux de la camera en temps reel). Problème, notre flux est en mjpeg.
Pas de soucis, vous pouvez le convertir et le restreamer en temps reel avec vlc (ou plutot cvlc pour etre en ligne de commande sur la VM).
La commande à lancer est
cvlc http://ip_du_smartphone:8080/stream.mjpeg --sout ‹ #transcode{vcodec=h264,vb=800,acodec=none}:rtp{sdp=rtsp://:8554/} ›
8554 est le port sur lequel il faudra se connecter pour recevoir le flux en RTSP.
dans la configuration du plugin Camera de jeedom, dans URL du flux, vous n’aurez qu’à mettre
rtsp://ip_de_la_vm_qui_fait_tourner_cvlc:8554
Et vous aurez le flux en live sur le dashboard Jeedom.
ps: l’utilisation de cvlc qui va transcoder le mjpeg en h264 en temps reel mange un peu de ressource CPU, donc il faut une VM pechue (gros doute sur le fait que ca fonctionne sur raspberry pi par exemple)