[Module Camera] Améliorations du module

Bonjour à tous,
Je vais me lancer dans la modification du module caméra pour ajouter des fonctionnalités et avant de commencer j’ai quelques questions :

  • j’ai vu dans les articles de blogs qui parlent de la V4 que Gladys supporte les caméras USB, j’ai vu nul part dans l’interface ou la doc comment procéder, c’est vraiment pris en compte ?
  • j’aimerais ajouter un bouton sur la box camera du dashboard qui nous enverrai vers le flux en temps reel de la caméra, il y a un moyen de créer des pages supplémentaire dans gladys? (si il y a un exemple de module qui le fait je suis preneur :slight_smile:)

Je vais également ajouter en natif le support du module photo/caméra officiel de la raspberry, pour l’instant je vois différentes façon de le faire mais je n’ai pas encore étudier en détail ces possibilités :

  • un container docker qui lance (à la manière du container mqtt) un serveur rtsp avec le flux de la camera, l’avantage est qu’on récupère simplement le flux video de /dev/video0 donc on pourrait utiliser d’autres caméra (usb, CSI, …)
  • essayer de trouver un module nodejs qui accède directement à la caméra (exemple : https://www.npmjs.com/package/pi-camera-connect)

Si vous avez d’autres idées sur le module caméra n’hésitez pas à les donner, une fois que je connaitrai bien ce module ça ira plus vite :slight_smile:

ps: je risque d’être assez lent pour faire ces modifications, je fais seulement du python depuis maintenant 2ans et j’ai par moment des grosses périodes d’indisponibilité à cause de mon doctorat.

Bonjour @Exilon62,
Dans la doc, j’ai mis ça il y a quelque temps :
Caméra USB
Finalement j’ai débranché ma caméra USB Logitech car Gladys plantait régulièrement.
Avec l’aide de la communauté, on a trouvé que le problème venait de la caméra qui devait demander trop de courant à mon Raspi. Depuis qu’elle est débranchée, ça tourne sans problème.
Je voulais tester avec un hub USB alimenté en 220V, mais je ne l’ai pas encore fait.

merci pour ta réponse je n’avais pas vu :slight_smile: J’ai fais quelques tests avec la lib nodejs et elle fonctionne plutot pas mal, je vais sans doute partir sur ça

Oui oui ça tourne bien :slight_smile:

Euh tu veux faire comment ça ? je suis preneur de ton astuce technique :smiley: C’est un sujet très technique, à discuter avant implémentation.

Il faut savoir que dans Gladys on veut forcément que tout transite via Gladys sur le Pi, on ne se connecte jamais depuis le navigateur aux périphériques en direct, car on veut que tout le matériel domotique ne soit pas ouvert sur internet (pour rester sécurisé), et que Gladys soit le proxy entre le navigateur de l’utilisateur et la caméra.

J’ai quelques idées en tête de mon côté mais ça demande beaucoup de testing (c’est très très gourmand en ressource le temps réel).

Je privilégierais plutôt cette option, pas besoin de faire pop un container docker qui fait exactement ce que cette lib fait :slight_smile:

je t’avoue que j’ai pas encore fini de tester donc niveau ressource j’en ai aucune idée :sweat_smile:
Je pensais donc récupérer le flux de la caméra avec le module pi-camera-connect et les envoyer côté client avec du web-RTC au lieu de MJPEG qui semble beaucoup plus couteux en ressource si j’ai bien compris. Le problème de web-RTC c’est qu’il faut un navigateur récent il me semble

Je suis pas fan de faire une solution propre juste à la caméra pi. Si on veut rajoute du live aux caméras dans Gladys, autant le rajouter à toute les caméras :slight_smile: Dans Gladys 4 la gestion de chaque “type d’objet” est native, on évite de faire des tambouilles propre à chaque périphérique. ça permet d’avoir une intégration profonde (dans les discussions, le dashboard)

En fait le mécanisme qu’on utilise actuellement pour les caméras pourraient fonctionner en mode live ( on utilise des websockets, connexion permanente donc c’est performant )

Il faut juste tweaker un peu tout le process pour être sur que le process de capture d’une image soit inférieur à 100ms/50ms (pour avoir du 10/20 fps). Le transport en websockets fonctionne nickel avec ces latences là, le problème est plus côté capture.

Après, de ce que j’ai vu dans la lib pi-caméra-connect, ils sont dans ces temps avec ce code:

import { StreamCamera, Codec } from "pi-camera-connect";
import * as fs from "fs";
 
const runApp = async () => {
 
    const streamCamera = new StreamCamera({
        codec: Codec.H264
    });
 
    const videoStream = streamCamera.createStream();
 
    const writeStream = fs.createWriteStream("video-stream.h264");
 
    // Pipe the video stream to our video file
    videoStream.pipe(writeStream);
 
    await streamCamera.startCapture();
 
    // We can also listen to data events as they arrive
    videoStream.on("data", data => console.log("New data", data));
    videoStream.on("end", data => console.log("Video stream has ended"));
 
    // Wait for 5 seconds
    await new Promise(resolve => setTimeout(() => resolve(), 5000));
 
    await streamCamera.stopCapture();
};
 
runApp();

Dans cet exemple, tu as juste à envoyer la data du videoStream.on(‘data’) au front via les fonctions Gladys de capture de nouvelle image. ça sera propagé au front.

Et tout cela fonctionnera via le Gladys Gateway aussi !