Scénario pour réaliser Timelapse sur un NAS

Bonjour
J’ai des caméras Blink qui remonte via le plugin-blink_camera
Il y a une commande pour prendre une capture photo
Du coup je souhaite l’utiliser pour réaliser un Timelapse de mes vues
Réaliser le scénario pour faire la prise de vue ne devrait pas être compliqué, par contre je ne sais pas comment faire pour transférer cette ou ces images capturées en Externe de Jeedom sur un de mes NAS (Synology ou Freebox) qui sont sur le même réseau local que Jeedom

Pouvez vous m’aider sur ce dernier point afin que les photos soient automatiquement transférées sur un de mes NAS tout en étant supprimé de Jeedom ?

Je vous remercie par avance

Yoyouri

Hello,

J’ai fait un timelaps d’un chantier en février 2021, à l’aide du plugin-camera et de Jeedom :

Un simple scenario demande au plugin de prendre une capture toutes les minutes (de 4h à 23h).
Puis un autre scénario lance un script bash tous les jours à 23h30 pour construire la vidéo horodatée du jour (plugin script /var/www/html/plugins/script/data/timelapse_chantier.sh &> /dev/null).


Voici le script /var/www/html/plugins/script/data/timelapse_chantier.sh (qui lance le script plus bas) :

Il prend des images individuelles et les transforment en vidéo :

  • force l’écriture toutes les sorties dans un fichier de log,
  • déplace toutes les images de la camera (eqId 585) dans le répertoire du jour,
  • le répertoire est passé en paramètre du second script pour construire les sous-titres (horodatage),
  • toutes les images sont concaténées avec ffmpeg (25 image par seconde => ~46s de video),
  • une archive est créée avec toutes les photos et les sous-titres (peuvent être supprimés),
  • reste à récupérer ou juste lire la vidéo depuis Jeedom.
#!/bin/sh
exec 1> /var/www/html/log/ffmpeg_timelapse 2>&1
echo -n "### BEGIN at " ; date '+%Y/%m/%d %X'

CHDATE=Chantier_$(date '+%Y-%m-%d')

cd /var/www/html/plugins/camera/data/records/585
[ -n "$(ls -A ${CHDATE}_*.jpg 2> /dev/null)" ] || exit 0

echo "### Starting"
mkdir ${CHDATE}
mv ${CHDATE}_*.jpg ${CHDATE}/
echo "### Generating subs"
/var/www/html/plugins/script/data/mdate2srt.py ${CHDATE} > ${CHDATE}.srt
echo -n "### Creating Timelapse at " ; date '+%Y/%m/%d %X'
nice -n 10 ffmpeg -nostdin -y -hide_banner -framerate 25 -pattern_type glob -i "${CHDATE}/*.jpg" -s:v 1024x768 -c:v libx264 -crf 17 -pix_fmt yuv420p -vf subtitles=${CHDATE}.srt ${CHDATE}.mp4
echo "### Tarring"
tar --remove-files -zcf ${CHDATE}.tgz ${CHDATE}/
echo -n "### DONE at " ; date '+%Y/%m/%d %X'

Le second script Python /var/www/html/plugins/script/data/mdate2srt.py, s’occupe de la génération des sous titres pour l’horodatage :

  • récupères tous les noms de fichier et la date de création de chaque fichier,
  • construit (affiche sur la sortie standard) les sous-titres en anticipant le temps de chaque image,
  • le format du sous-titre est YYYY-mm-dd HH:MM, je n’avais pas jugé utile de mettre les secondes.
#!/usr/bin/python3

import glob, os, sys, datetime, time

def sec2ts(h):
    # seconds to 'nn:nn:nn,nnn' format
    s = h % 60
    ms = (s - int(s)) * 1000
    s = int(s)
    h -= s
    h /= 60
    m = h % 60
    h -= m
    h /= 60
    return "%02d:%02d:%02d,%03d"%(h, m, s, ms)

def main():
    dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
    files = list(filter(os.path.isfile, glob.glob(dirpath + "/*")))
    entries = ((os.path.getmtime(f), f) for f in files)

    # 1
    # 00:00:01,000 --> 00:00:01,999
    # TEST 1

    fps=25
    framed=1/fps
    frame = 0
    frameid = 1
    # sep='#'
    sep="\r\n"

    # for (mdate, path) in entries:
    for mdate, path in sorted(entries):
        # print(datetime.datetime.fromtimestamp(mdate).strftime("%Y-%m-%d %H:%M"), os.path.basename(path))

        line = str(frameid)+sep
        frameid += 1
        line += sec2ts(frame)
        frame += framed
        line += " --> "+sec2ts(frame)+sep
        line += datetime.datetime.fromtimestamp(mdate).strftime("%Y-%m-%d %H:%M")+sep
        print(line+"\r")


if __name__ == "__main__":
    # execute only if run as a script
    main()

Y’a probablement des choses à adapter et peut-être besoin d’ajouter des transferts de fichiers entre machines, mais c’est probablement une bonne base de travail :wink:

Pour le transfert vers ton NAS, tu peux utiliser SAMBA, NFS, ou (le plus simple) SCP

Pour SCP :

  • Crée un partage sur ton NAS pour tes vidéos/photos,
  • Crée un utilisateur qui n’a le droit d’accéder qu’à ce dossier,
  • Vérifie avec WinSCP que tu as bien le droit avec cet utilisateur de transférer un fichier dans le dossier et que tu peux bien le lire avec ton utilisateur habituel sur le NAS,
  • Dans le script Bash plus haut, rajoute à la fin quelque chose du style :
scp <user>@<IP NAS>:/var/www/html/plugins/camera/data/records/585/${CHDATE}.* /volume1/partage/

Ou il faut adapter , et les chemins. (Pour éviter les problèmes de certificat, tu peux ajouter
-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null entre scp et <user>).

Hope it helps,
Bad

4 « J'aime »

Bonjour

Wahoo, merci pour ces explications
Mais pour l’instant je n’ai pas besoin d’un truc si complexe
Je veux faire un Timelapse juste du paysage et du coup je pensais à une photo par jour
Ensuite, je n’ai pas besoin de construire la vidéo avec Jeedom

Par contre je veux transférer la photo sur mon NAS en la supprimant au passage de Jeedom pour garder de la mémoire

Y a t’il quelques chose de un peut plus simple à mettre en place ?

Merci

Mais de rien :wink:

La dernière partie est celle qui t’intéresse pour le transfert.

Non il n’y a pas d’opération magique qui copie des fichiers sur un espace de stockage.

Tu peux peut-être regarder du côté des plugins de stockage cloud, comme Dropbox, et mettre le pendant sur ton NAS, mais c’est certainement encore plus complexe.

Autre piste : faire un cron sur le NAS qui fait un wget des images des caméras sur Jeedom à heure fixe. Ça doit pouvoir répondre à ta demande et c’est le plus simple que je vois : tirer les images depuis le NAS, plutôt que de les pousser depuis Jeedom vers le NAS.

Bad

Cette idée me tente bien, mais comment on fait pour accéder aux fichiers de Jeedom en local ?

Bonjour
J’aurais choisi une autre voie :
Plutot que faire prendre la photo par jeedom puis l’exporter dans le NAS, pourquoi ne pas prendre la photo avec le NAS directement ?

Ps : si tu n’as pas surveillance station sur ton Synology, ça serait une excellente raison !
:slight_smile:
Sinon… pas certain de voir l’intérêt ??

Bonjour

En effet, j’y avais pas pensé, mais pas sûr que ce soit réalisable

Il me semblait avoir lu que Surveillance Station était compatible qu’avec certaines caméras !!

Oui, mais c’est TRÈS large (voir leur liste a ralonge)
De plus, toutes caméra avec ONVIF ou RTSP sera visible : flux video + capture d’image (la reconnaissance d’un modèle permettant simplement d’automatiser le parametrage et voir les spécificités comme les détections speciales ex : franchissement de ligne / entrée de zone / detection d’humain / etc…)

Depuis juillet dernier (Surveillance station v. 9.1.2), on peut déclencher des règles via des Webhook / commande API, ce qui fait que Jeedom peux les déclencher.
Tu pourras avoir un scénario jeedom qui contrôle quand les images sont prises et qui donnera l’ordre au NAS.

Les regles de Surveillance S. permettant de faire plein de choses dont des captures d’images…

Merci pour ces informations

Faut que je regarde car c’est peut-être une possibilité alternative

(si tu as un logiciel sympa pour transformer une série d’images en vidéo pour faire un Timelapse, ça m’intéresse ! J’ai pas encore cherché, mais je sais que je m’y mettrai un jour :slight_smile: )

C’est noté, mais ça ne sera pas de suite car j’ai besoin de plusieurs semaines de captures pour commencer à faire un truc sympa

Et merci pour le lien

Hello,

Tout simplement la commande ffmpeg, efficacité garantie (cf mon 1er script plus haut) !

Bad

Merci bad pour ce retour
Mais si je le fais, ca sera plutot en mode 1 année de mon jardin en 5 minutes (environ 6000 photos)
Et j’ai un peu peur que ça soit trop lourd pour ma petite box Jeedom… ou pas ?
Je pensais plutôt accumuler les photos sur le nas, importer tout cela sur ordinateur et lui faire faire le travail…
De plus pour un premier essais, je pensais prendre une photo toutes les 30 minutes et jouer sur le nombre d’images par seconde de la video pour gérer sa durée.
Je ne sais pas ce qui se cache comme paramètrage dans ta commande (ni d’ailleurs comment l’utiliser = au dessus de mes compétences actuelles…)
:frowning:

Mais…. Je la garde sous le coude !
:slight_smile:

(Pour comprehension : Certaine caméra, comme reolink, permettent déjà cela, mais avec jeedom je pouvais gérer l’heure de début et de fin des périodes où seront prises les photos en fonction de l’heure de lever / coucher du soleil. Ce que la caméra ne fera pas … :slight_smile: )

Oui la command est un peut cryptique, mais complètement automatisable, c’est l’avantage.

Si tu as « besoin » de 5 minutes à 25 images/s, il va te falloir de 7500 photos, soit ~20,5 images par jour !
C’est beaucoup trop, si tu les prends trop tôt ou trop tard dans la journée, tu vas avoir un effet de vas avoir un effet de scintillement, car 1j durera moins d’une seconde et la vidéo passera très vite du sombre au clair.

Je te recommandais de réduire à ~45s et de prendre 3 photos par jour, une quand le soleil est au zénith, les 2 autres 2h avant et après (soit un total 1095 photos), afin de minimiser les différences de luminosité entre les jours et le scintillement jour/nuit.

Tu peux effectivement faire le test avec une photo toutes les 30 mins sur 5j et regarder ce que ça donne, c’est un bon test pour identifier si tes cameras s’adaptent correctement en luminosité.

Pour ce qui est du traitement, à l’époque ffmpeg tournait sur un rpi3B+ (ou était Jeedom), il traitait les images du jour en ~5 minutes, sans impacter le reste du système.

Bad

Salut Bad, je suis en train de mettre en place tes supers scripts pour faire un timelapse, et pour le moment j’ai une seule interrogation : pour le scénario qui prend la capture toutes les minutes, tu es parti sur quoi?
J’hésite entre un scénario déclenché à l’heure de début souhaitée avec une boucle ”capture + pause de 60s”, ou un scénario récurrent toutes les minutes qui fait juste la capture mais qui nécessite un autre scénario pour s’activer/désactiver quand on le souhaite.

Hello @rom.jou,

Il n’est pas forcement recommandé d’avoir un scenario avec un temps d’execution trop long.
La prise de capture chez moi se faisait simplement avec un scenario lancé toutes les minutes.

Rien ne t’empèche dans ce scenario de vérifier certain paramètres avant de lancer la capture (état d’un virtuel, luminosité de la scène à photographier, heure, etc) pas besoin d’un second scenario selon moi.

Si tu veux faire les captures en dehors de toute adhérence à Jeedom, tu peux aussi créer une tâche dans crontab.d avec tout le shell qu’il faut.

Bad

1 « J'aime »

Ok merci pour ton retour rapide, c’est ce qu’il me semblait cote optimisation de scénario.
Je suis en train de faire des essais et pour le moment le sous-titrage a l’air de planter. Est-ce-que c’est a cause de la « permission denied » de la ligne 0003?

0000|### BEGIN at 2024/03/16 11:10:33
0001|### Starting
0002|### Generating subs
0003|/var/www/html/plugins/script/data/start_timelapse.sh: 14: /var/www/html/plugins/script/data/start_timelapse.sh: /var/www/html/plugins/script/data/mdate2srt.py: Permission denied
0004|### Creating Timelapse at 2024/03/16 11:10:33
0005|Input #0, image2, from 'Camera_2024-03-16/*.jpg':
0006|Duration: 00:00:17.00, start: 0.000000, bitrate: N/A
0007|Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 1 fps, 1 tbr, 1 tbn, 1 tbc
0008|Stream mapping:
0009|Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
0010|[Parsed_subtitles_0 @ 0xaaaae1bfdb00] Shaper: FriBidi 0.19.7 (SIMPLE) HarfBuzz-ng 2.3.1 (COMPLEX)
0011|[Parsed_subtitles_0 @ 0xaaaae1bfdb00] Unable to open Camera_2024-03-16.srt
0012|[AVFilterGraph @ 0xaaaae1c23500] Error initializing filter 'subtitles' with args 'Camera_2024-03-16.srt'
0013|Error reinitializing filters!
0014|Failed to inject frame into filter network: Invalid data found when processing input
0015|Error while processing the decoded data for stream #0:0
0016|Conversion failed!
0017|### Tarring
0018|### DONE at 2024/03/16 11:10:33

Oui, je pense que le fichier n’est pas executable.
Essaye un chmod +x /var/www/html/plugins/script/data/mdate2srt.py pour corriger

A noter que la génération du timelaps est conçue pour tourner 1x par jour et les images sont ensuite compressées dans un .tgz et supprimées.

1 « J'aime »