Pagine

Webcam meteo

Realizziamo una webcam meteo con una fotocamera digitale, un raspberry e alcuni semplici script.

Ad oggi ne ho costruite un paio. La fotocamera utilizzata è la nikon L20, ma è possibile usarne tante altre, la lista dei modelli e marche é davvero lunga.



I software utilizzati per la realizzazione sono essenzialmente tre. Gphoto2 scatta la foto, imagemagick inserisce le piccole icone nell'immagine con i dati e wview gestisce la stazione meteo generando grafici e quant'altro.

I dati meteo visualizzati nell'immagine, del primo link, provengono da una stazione meteo Davis vantage pro 2, collegata in rete lan tramite datalogger ip. Per lo scopo va comunque bene anche il più economico datalogger usb.

Wview è personalizzabile sotto diversi aspetti. Dico questo perchè bisognerà modificare un paio di file per generare le pagine html con i dati da inserire successivamente nell'immagine. Sarà poi cura di uno script, avviato ad intervalli regolari, tramite crontab (in questo caso due minuti) generare l'immagine e caricarla successivamente su uno spazio web via ftp.

La fotocamera va collegata via usb al raspberry. Se la distanza dalla fotocamera al raspberry è superiore alla lunghezza del cavo in dotazione, sarà possibile utilizzare prolunghe attive usb, oppure adattatori usb rj45 per cavo rete utp. Con questi ultimi sarà possibile raggiungere distanze di cinquanta metri circa.

Cominciamo:
Creiamo un file con il nome scatto.sh

  • nano scatto.sh

Copiamo queste righe di codice:

  • #!/bin/bash
  • gphoto2 --capture-image-and-download --force-overwrite --filename image.jpg

La riga precedente invia il comando di scatto alla fotocamera, scarica l'immagine sul raspberry e la cancella dalla memoria sd della fotocamera.

Il comando successivo controlla se il file esiste e toglie i 100 pixel nella parte bassa della foto. La seconda riga, utile al taglio dei 100px nella parte bassa dell'immagine, è necessaria in questo caso per motivi di privacy, potete ometterla se non serve.


  • if [ -f image.jpg ]; then
  • convert image.jpg -crop 1024x768+0-100 -quality 80 crop.jpg

Scriviamo nella parte alta della foto i dati che identificano posizione, orario e quant'altro. Copiate il codice seguente e incollatelo nel file senza modificare i ritorni a capo:


  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 12 -stroke black -strokewidth 2 -annotate 0 'messinameteo.it Stretto di Messina webcam Mili S. Marco Puntamento S-SE '"$(date "+%A %d %B %Y %H:%M")" \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 12 -stroke none -fill white -annotate 0 'messinameteo.it Stretto di Messina webcam Mili S. Marco Puntamento S-SE '"$(date "+%A %d %B %Y %H:%M")" \
  • crop.jpg +swap -gravity north -geometry +5+0 \
  • -composite img.jpg

Adesso estrapoliamo dalla stringa contenuta nel file dati.html, generato da wview, (spiegherò come generare questa pagina in un altro post nella sezione wview) i dati da inserire nell'immagine:

  • dati=/var/lib/wview/img/dati.htm
  • temp=`cat $dati | cut -d \; -f4`
  • hum=`cat $dati | cut -d \; -f6`
  • bar=`cat $dati | cut -d \; -f5`
  • wind=`cat $dati | cut -d \; -f7`
  • windgust=`cat $dati | cut -d \; -f9` 
  • windir=`cat $dati | cut -d \; -f8`
  • rainrate=`cat $dati | cut -d \; -f10`
  • dailyrain=`cat $dati | cut -d \; -f11`
  • baromtrend=`cat $dati | cut -d \; -f19`
  • hiwindspeed=`cat $dati | cut -d \; -f20`
  • hiwindtime=`cat $dati | cut -d \; -f21`
  • beaufort=`cat $dati | cut -d \; -f22`

Convertiamo in lingua italiana i dati della scala di Beaufort:


  • case $beaufort in
  • Calm) beaufortit="0 - Calma";;
  • Light\ Air) beaufortit="1 - Bava di vento";;
  • Light\ Breeze) beaufortit="2 - Brezza leggera";;
  • Gentle\ Breeze) beaufortit="3 - Brezza tesa";;
  • Moderate\ Breeze) beaufortit="4 - Vento moderato";;
  • Fresh\ Breeze) beaufortit="5 - Vento teso";;
  • Strong\ Breeze) beaufortit="6 - Vento fresco";;
  • Near\ Gale) beaufortit="7 - Vento forte";;
  • Gale) beaufortit="8 - Burrasca moderata";;
  • Strong\ Gale) beaufortit="9 - Burrasca forte";;
  • Storm) beaufortit="10 - Tempesta";;
  • Violent\ Storm) beaufortit="11 - Tempesta violenta";;
  • Hurricane) beaufortit="12 - Uragano";;
  • esac

Proseguiamo:

Assegniamo un valore in lingua italiana per pioggia assente e intensità. Sostituiamo i valori barometrici  aumento e diminuzione + e - con due immagini up e down. Sostituiamo il tilde per pressione costante con un simbolo più appropriato:


  • if [[ "$rainrate" = "0.00" ]]; then
  • rainonoff='Pioggia assente'
  • else
  • rainonoff='Intensità '$rainrate' mm/h'
  • fi
  • if [ "$baromtrend" = "+" ]; then
  • composite -geometry +270+634 up.png img.jpg img.jpg
  • fi
  • if [ "$baromtrend" = "-" ]; then
  • composite -geometry +270+634 down.png img.jpg img.jpg
  • fi
  • if [ "$baromtrend" = "~" ]; then
  • baromstable="<>"
  • fi

Inseriamo le piccole icone che identificano temperatura, pressione, vento e pioggia:


  • composite -geometry +0+625 term.png img.jpg img.jpg
  • composite -geometry +165+625 bar.png img.jpg img.jpg
  • composite -geometry +295+625 wind.png img.jpg img.jpg
  • composite -geometry +580+627 rain.png img.jpg img.jpg

Inseriamo adesso i valori:



  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 $temp'°C - '$hum'\%'' UR' \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 $temp'°C - '$hum'\%'' UR' \
  • img.jpg +swap -gravity south -geometry +30+12 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 $bar' hpa'"$baromstable" \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 $bar' hpa'"$baromstable" \
  • img.jpg +swap -gravity south -geometry +198+12 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 $wind' km/h - '$windir \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 $wind' km/h - '$windir \
  • img.jpg +swap -gravity south -geometry +335+18 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 'Raffica '"$windgust"' km/h' \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 'Raffica '"$windgust"' km/h' \
  • img.jpg +swap -gravity south -geometry +442+18 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 'Raffica max '$hiwindspeed' km/h alle '"$hiwindtime" \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 'Raffica max '$hiwindspeed' km/h alle '"$hiwindtime" \
  • img.jpg +swap -gravity south -geometry +335+0 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 $dailyrain' mm - '"$rainonoff" \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 $dailyrain' mm - '"$rainonoff" \
  • img.jpg +swap -gravity south -geometry +620+12 \
  • -composite img.jpg
  • convert -size 1024x20 xc:none -gravity west \
  • -pointsize 14 -stroke black -strokewidth 2 -annotate 0 'Scala di Beaufort: '"$beaufortit" \
  • -background none -shadow 100x1+0+0 +repage \
  • -pointsize 14 -stroke none -fill white -annotate 0 'Scala di Beaufort: '"$beaufortit" \
  • img.jpg +swap -gravity north -geometry +740+0 \
  • -composite cam2_web.jpg

A questo punto l'immagine è pronta per essere caricata via ftp su uno spazio web. Spiegherò, più in la, come effettuare l'upload, la cancellazione del file appena creato, il controllo del corretto funzionamento della fotocamera e il reset dello slot usb. Spiegherò anche come creare un'immagine, offline.jpg, da caricare via ftp nel caso la fotocamera andasse in blocco.

In questa guida, nella parte finale, mancano i controlli sopracitati e la chiusura dell'if iniziale, utile proprio alla verifica del corretto funzionamento della fotocamere.

Sarà possibile ottenere lo stesso risultato, se non migliore, percorrendo strade diverse e altri linguaggi, ma lo script da me pensato va bene per un uso casalingo e amatoriale.

1 commento:

pbitto ha detto...

Biagio sei un grande !