Come impostare una registrazione ‘live’ con pywws

Introduzione

Ci sono due abbastanza differenti modalità di funzionamento con pywws. Tradizionalmente con Hourly viene eseguito a intervalli regolari (di solito un’ora) da cron. Questo è adatto per siti Web abbastanza statici, ma aggiornamenti più frequenti possono essere utili per i siti come Weather Underground (http://www.wunderground.com/). Il più recente programma LiveLog gira continuamente e può i caricare dati ogni 48 secondi.

Guida introduttiva

Prima di tutto, è necessario installare pywws e assicurarsi che si possono ottenere i dati dalla tua stazione meteo. Vedere Come iniziare con pywws per i dettagli.

Esecuzione di prova LiveLog dalla riga di comando, con un alto livello di verbosità in modo da poter vedere ciò che sta accadendo:

python -m pywws.LiveLog -vvv ~/weather/data

Entro cinque minuti (supponendo di aver impostato un intervallo di registrazione di 5 minuti) si dovrebbe vedere un messaggio ‘live_data new ptr’, seguita dal recupero di eventuali nuovi dati dalla stazione meteo ed elaborarli. Lasciate che LiveLog funzionare per un minuto o due o più, poi fermare il processo digitando ‘<Ctrl>C’.

Percorsi dei file di configurazione

Aprire il file weather.ini con un editor di testo. Si dovrebbe avere una sezione di [paths] simile al seguente (dove xxx è il tuo nome utente):

[paths]
work = /tmp/weather
templates = /home/xxx/weather/templates/
graph_templates = /home/xxx/weather/graph_templates/
local_files = /home/xxx/weather/results/

Modificare queste per soddisfare le vostre preferenze di installazione. work è una directory temporanea utilizzata per archiviare i file intermedi, templates è la directory per i tuoi file modello di testo e graph_templates è la directory per i tuoi file grafici di modello e local_files è una directory dove viene messo l’output del modello che non è stato caricato in un sito web. Non usare le directory di esempio pywws per questi, perchè saranno sovrascritti quando si aggiorna pywws.

Copiare i modelli di testo e grafico nelle directory appropriate. Si possono trovare alcuni esempi forniti con pywws utili per iniziare. Se hai installato pywws con pip gli esempi dovrebbero essere in /usr/share/pywws o /usr/local/share/pywws o simili.

Configurazione dell’esecuzione periodica

In weather.ini si dovrebbe avere una sezione [live] simile alla seguente:

[live]
services = []
plot = []
text = []

Questa sezione specifica cosa pywws dovrebbe fare ogni volta che ottiene una nuova lettura dalla stazione meteo, cioè ogni 48 secondi. La voce services è un elenco di servizi meteo online dove caricare dati, ad esempio ['underground_rf']. Le voci plot e text sono elenchi di file di modello grafici e file di testo che devono essere elaborati e, opzionalmente, caricati sul tuo sito web. Probabilmente si dovrebbe lasciare tutto questo vuoto tranne che per i servizi services.

Se si utilizza YoWindow (http://yowindow.com/) si può aggiungere una voce alla sezione [live] per specificare il file di YoWindow, ad esempio:

[live]
services = ['underground_rf']
text = [('yowindow.xml', 'L')]
...

Si noti l’uso del flag 'L' – questo dice a pywws si inviare il risultato alla directory “local files” invece di caricarlo sul tuo sito ftp.

Se non li hai già, create quattro altre sezioni nel file weather.ini: [logged], [hourly], [12 hourly] e [daily]. Queste sezioni dovrebbero avere voci simili alla sezione [live] e specificare cosa fare ogni volta i dati vengono registrati (5-30 minuti, a seconda l’intervallo di registrazione), ogni ora, due volte al giorno e una volta al giorno. Aggiungere i nomi dei file di modello alle voci appropriate, ad esempio:

[logged]
services = ['underground', 'metoffice']
plot = []
text = []

[hourly]
services = []
plot = ['7days.png.xml', '24hrs.png.xml', 'rose_24hrs.png.xml']
text = [('tweet.txt', 'T'), '24hrs.txt', '6hrs.txt', '7days.txt']

[12 hourly]
services = []
plot = []
text = []

[daily]
services = []
plot = ['28days.png.xml']
text = [('forecast.txt', 'T'), 'allmonths.txt']

Si noti l’uso del flag 'T' – questo dice a pywws si inviare il risultato a Twitter invece di caricarlo sul proprio sito ftp.

Cambiato nella versione 13.06_r1015: Aggiunto il flag 'T'. Precedentemente i modelli Twitter sono stati indicati separatamente in voci twitter in [hourly] e di altre sezioni. La sintassi precedente funziona ancora, ma è obsoleta.

Cambiato nella versione 13.05_r1013: aggiunto il modello 'yowindow.xml'. Precedentemente il file yowindow era generato da un modulo separato, richiamato dalla voce yowindow nella sezione [live]. La sintassi precedente funziona ancora, ma è obsoleta.

Upload asincrono

Nuovo nella versione 13.09_r1057.

Il caricamento dei dati in siti web o ‘services’ a volte può richiedere del tempo, in particolare se un sito è andato off line e i tempi di caricamento sono lunghi. In condizioni di normale funzionamento pywws attende che tutti i caricamenti siano elaborati prima di scaricare ulteriori dati dalla stazione meteo. Questo può portare alcune volte a dati di essere mancanti.

L’elemento asynchronous nella sezione [config] di weather.ini può essere impostato su True per dire a LiveLog per fare questi caricamenti in un processo separato. Questa funzionalità è ancora un po’ sperimentale – provatelo a vostro rischio.

Utilizzare gli script di utilità

L’installazione di pywws include un breve script pywws-livelog.py che viene installato in /usr/bin o /usr/local/bin o simili. Si dovrebbe essere in grado di utilizzare questo script per eseguire LiveLog:

pywws-livelog.py -v ~/weather/data

Esecuzione in background

Al fine di avere :py:mod: LiveLog in esecuzione dopo aver terminato di utilizzare il computer deve essere eseguito come un processo in background. Nella maggior parte dei sistemi Linux/UNIX è possibile farlo mettendo una e commerciale (‘&’) alla fine della riga di comando. Per esempio:

pywws-livelog.py ~/weather/data &

Tuttavia, sarebbe utile sapere cosa è andato storto se il programma si blocca per qualsiasi motivo. Con LiveLog è possibile memorizzare i messaggi in un file di log specificato con il opzione -l:

pywws-livelog.py -v -l ~/weather/data/pywws.log ~/weather/data &

Riavvio automatico

Ci sono diversi modi per configurare un sistema Linux per avviare un programma quando la macchina si avvia. In genere, questi comportano di mettere un file in /etc/init.d/, che richiede i privilegi di root. Il problema è leggermente più difficile da garantire se un programma si riavvia quando si blocca. La mia soluzione per entrambi i problemi è quello di eseguire il seguente script da cron, ogni ora.

#!/bin/sh

pidfile=/var/run/pywws.pid
datadir=/data/weather
logfile=$datadir/live_logger.log

# exit if process is running
[ -f $pidfile ] && kill -0 `cat $pidfile` && exit

# email last few lines of the logfile to see why it died
if [ -f $logfile ]; then
  log=/var/log/log-weather
  tail -40 $logfile >$log
  /home/jim/scripts/email-log.sh $log "weather log"
  rm $log
  fi

# restart process
pywws-livelog.py -v -l $logfile $datadir &
echo $! >$pidfile

Questo memorizza l’id di processo del LiveLog del pidfile. Se il processo è in esecuzione, lo script non serve a nulla. Se il processo si è bloccato, mi invia un e-mail con le ultime 40 righe del file di log (usando uno script che crea un messaggio e lo passa al sendmail) e poi si riavvia LiveLog. Avrete bisogno di modificare molto questo per soddisfare le posizioni dei file e così via, ma dà un’idea di cosa fare.


Commenti o domande? Si prega di iscriversi per al mailing list pywws http://groups.google.com/group/pywws e facci sapere.