Migration du serveur et nouvelle page « records météo »

Bonjour à tous ! Aujourd’hui, nous avons quitté notre serveur qui était virtualisé pour aller s’héberger sur un serveur entièrement dédié à fortmahon.webcam.

Il s’agit d’un serveur OVH Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (8 coeurs) avec 16Go de RAM et 2To de disque dur. Comme vous pouvez le constater sur la capture d’écran ci-dessous, nous avons de la marge au niveau des ressources !

Au passage, nous en avons profité pour revoir la page des records météo qui était « buggée » – A voir sur https://fortmahon.webcam/records.php

Fortmahon.webcam – Comment ça marche ?

Pour fonctionner, ce site utilise des équipements répartis en 3 lieux distincts :

1 – Le poste de secours

Au poste de secours situé sur l’esplanade se trouvent 3 équipements :

  1. La caméra (une axis Q6115-E)
  2. La station météo (Davis Vantage pro)
  3. Un micro ordinateur nano-pi utilisé pour le lien OpenVPN entre le poste de secours et le club informatique.

2 – Le club informatique de Fort-Mahon

Au club informatique de fort-mahon (connecté à Internet en fibre optique) se trouvent un tas de choses mais seules 2 d’entre-elles nous concernent :

  1. Un PC intel NUC
  2. Un NAS destiné au stockage des sauvegardes

3 – Un serveur hébergé chez OVH (Roubaix)

Ce serveur reçoit vos requêtes et vous sert les pages web que vous visionnez (dont celle ci!). Il traite également les données météo de la station du poste de secours ainsi que les mails d’encouragement que vous nous adressez 😉 Les principaux services utilisés pour ce sites sont :

  • Un serveur Web  (Apache)
  • Un serveur de bases de Données (MySQL)
  • Un serveur de Mail
  • Un service de traitement des données météo (Weewx)

Pour résumer, un petit dessin :

Concernant la page d’index (fortmahon.webcam/index.php)

Cette page vous présente une image fixe de la caméra qui est rafraichie automatiquement toute les minutes. C’est le serveur OVH qui exécute une requête HTTP directement à la caméra afin de récupérer l’image fixe. Cette image est  affichée sur la page d’index pendant 1 minute avant d’être écrasée et remplacée par la suivante.

Concernant la page « en live » (fortmahon.webcam/live.php)

Cette page, comme toutes les autres, est servie par le serveur OVH. Il s’agit d’une simple inclusion de la vidéo qui est diffusée par Youtube. Très bien mais comment ça marche ?

1 – Le NUC hébergé au club informatique se connecte directement à la caméra, récupère le flux vidéo, l’encode et l’envoie à Youtube qui se charge de le diffuser. Pour ce faire, nous utilisons le script suivant :

1
2
3
4
5
6
7
8
9
10
#/bin/sh

YOUTUBE_STREAM_KEY="xxxxxxxxx"
INPUT="rtsp://user:[email protected]_camera/axis-media/media.amp"
cmd='ffmpeg -f lavfi -i anullsrc -rtsp_transport tcp -i $INPUT -tune zerolatency -vcodec mpeg4 -pix_fmt + -c:v copy -f flv rtmp://a.rtmp.youtube.com/live2/$YOUTUBE_STREAM_KEY'

until $cmd ; do
echo "restarting ffmpeg command..."
sleep 2
done

2- A intervalle régulier le serveur OVH exécute un script qui utilise les API de Youtube afin de récupérer l’url de diffusion. Cette URL est automatiquement mise à jour dans la page live.php qui vous présente toujours la bonne vidéo à savoir celle de notre belle webcam !

Concernant la page « hier » (fortmahon.webcam/hier.php)

On en parle ici : http://fortmahon.webcam/blog/2017/10/11/creation-de-timelaps-automatiques/

Concernant la page « météo » (fortmahon.webcam/meteo.php)

Pour cette page, c’est un poil plus compliqué… Pour résumer, le serveur OVH se connecte directement à la station météo et récupère toutes les 2 secondes un fichier contenant l’ensemble des mesures effectuées par la stations météo. Vous pouvez avoir un aperçu de ce fichier ici : http://fortmahon.webcam/realtime.txt . Il va notamment être utilisé pour générer les cadrans « en direct » de température, vitesse du vent, direction du vent et pression atmosphérique.

En parallèle, toujours sur le serveur OVH, nous utilisons l’excellent Weewx qui se charge de maintenir une connexion permanente avec la station météo afin de traiter les données reçues de manière très structurée avant de les stocker en base de données (MySQL). C’est à partir de ces données en base  que nos scripts génèrent le tableau résumant les conditions des 5 dernières minutes ainsi que les mini/max du jour et les historiques graphiques.

Concernant la page « Horaire des marées » (fortmahon.webcam/maree.php)

Cette page présente sous forme de tableau les horaires de marées qui sont stockés en base de données. La base est renseignée manuellement une fois par an à partir des informations fournies par le Shom (service hydrographique et océanographique de la Marine.)

Concernant la page « Horaires solaires » (fortmahon.webcam/almanac.php)

Cette page utilise les fonctions astronomiques de PHP, notamment la fonction date_sun_info()

Concernant Fort-Mahon ce jour :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$today=date('Y-m-d');
$sun_info = date_sun_info(strtotime($today), 50.35, 1.5667);
var_dump($sun_info);

array(9) {
["sunrise"]=
int(1507875236)
["sunset"]=
int(1507914342)
["transit"]=
int(1507894789)
["civil_twilight_begin"]=
int(1507873276)
["civil_twilight_end"]=
int(1507916302)
["nautical_twilight_begin"]=
int(1507871017)
["nautical_twilight_end"]=
int(1507918561)
["astronomical_twilight_begin"]=
int(1507868748)
["astronomical_twilight_end"]=
int(1507920830)
}

Les valeurs retournées par la fonction sont des timestamps Unix.

 

 

Ajout de la température dans l’overlay video

La caméra Axis que nous utilisons dispose d’une API nommée Vapix qui permet d’effectuer de nombreux réglages en utilisant de simples requêtes http. Pour les personnes intéressée, la documentation complète de cette API est disponible ici (en anglais) : https://www.axis.com/fr/fr/support/developer-support/vapix

Pour ajouter un affichage de la témpérature sur l’overlay de la vidéo, nous avons écrit un tout petit script qui récupère la valeur de la température relevée par la station météo et forge la requête http destiné à l’API Vapix de la caméra. La température est le 34ème champ du fichier csv envoyé par la station météo.

1
2
3
4
5
6
$file=file('livemeteo.csv');
$line=$file[1];
$data=explode(',',$line);
$temp=round($data[34],1);
$cmd="curl --digest -u user:password 'http://ip_cam/axis-cgi/dynamicoverlay.cgi?action=settext&camera=1&text=fortmahon.webcam%20$temp%20C%20'";
exec($cmd);

Ce script est exécuté chaque minute.

Création de timelaps automatiques

Voici ci-dessous la méthode utilisée afin de générer les vidéos quotidiennes résumant en quelques secondes la journée de la veille (http://fortmahon.webcam/hier.php) :

1 – Récupération et stockage temporaire d’images fixes

Pour commencer, dans l’interface d’administration de la caméra, il faut définir un « récipient » destiné à recevoir les images…

Pour cela, il faut se rendre sur la page « admin->events->recipient » et remplir les champs suivants :

Dans notre cas, le récipient qui va recevoir les images sera une machine que nous appelons à juste titre « nuc » puisqu’il s’agit d’un Intel NUC hébergé au Club Informatique ! Reste ensuite à définir l’adresse IP ou le nom d’hôte du serveur de destination dans le champ « Network Address » et le chemin du répertoire destiné à stocker les images.

Reste ensuite à définir les paramètres d’authentification. Cette dernière utilise le protocole SSH et nécessite les identifiant d’un compte utilisateur ainsi que le hash MD5 de la clé publique du serveur. Cette dernière s’obtient de la façon suivante :

1
2
ssh-keygen -E md5 -lf/etc/ssh/ssh_host_rsa_key.pub
4096 MD5:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99 user@host (RSA)

La valeur a renseigner dans le champ « Public key MD5 » sera alors aabbccddeeff00112233445566778899.

Tester la connexion en cliquant sur le bouton « Test ». Si tout se passe bien, il faut maintenant définir les événements et les actions sur la page « admin->events->Action_rules »

Par exemple pour envoyer une image à intervalle régulier de l’esplanade sur le nuc, il faut définir la condition « Trigger->PTZ->Preset_Reached->Esplanade » et définir l’action « Type->Send_image->stream->JPG->Recipient->nuc »

Une fois ces actions effectuées, à chaque fois que la caméra atteindra le point d’intérêt enregistré Esplanade, une image sera envoyé sur le nuc. Dans notre cas, nous avons défini trois événements: esplanade, plage et digue sud.

2 – Traitement des images et création de la vidéo

Pour créer la video, nous copions les fichiers dans un répertoire temporaire en les classant par date et en ajoutant un numéro d’incrément au nom de fichier afin que les images soit traitées dans le bon ordre. Nous utilisons ensuite ffmpeg pour générer les vidéos :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
mkdir /home/xav/fmp/timelaps/$(date '+%d-%b-%Y')

#esplanade
cd /home/xav/fmp/shots
counter=1

#copie pour traitement et suppression des images reçues
ls -1tr esplanade*.jpg | while read filename; do cp $filename /home/xav/fmp/timelaps/$(date '+%d-%b-%Y')/$(printf %05d $counter)_$filename; ((counter++)); done
rm -f esplanade*

#creation de la vidéo
cd /home/xav/fmp/timelaps/$(date '+%d-%b-%Y')
ffmpeg -r 20 -pattern_type glob -i '*.jpg' -c:v copy output.avi
ffmpeg -i output.avi -c:v libx264 -preset slow -crf 15 output-final.mp4

Le même procédé est utilisé pour le timelaps de la digue sud.

3 – Upload des timelaps sur Youtube pour la diffusion et suppression des vidéos sur le Nuc.

Pour l’upload des vidéos sur Youtube, nous utilisons une librairie Python disponible ici : https://github.com/tokland/youtube-upload

Son utilisation est simple :

1
youtube-upload --client-secrets=secrets.json --title="Timelaps Plage FortMahon.Webcam $(date '+%d-%b-%Y')" --privacy="unlisted" /home/xav/fmp/timelaps/$(date '+%d-%b-%Y')/$(date '+%d-%b-%Y').mp4

Le script envoie la vidéo sur Youtube et répond son adresse de visionnage sur Youtube. Par ailleurs, l’option –privacy= »unlisted » permet d’empêcher à l’utilisateur de lister les vidéos ou de les trouver par l’intermédiaire du moteur de recherche. Les vidéos des jours précédents sont automatiquement supprimées.