Ecco come promesso una miniguida per importare i dati di WeatherLink in un database MySQL in modo semplice e veloce.
E' una guida di livello medio, cioè considera tutto il software richiesto già installato e configurato correttamente e che l'utente sia abbastanza esperto in sviluppo di web-applications.
In questa guida è presente anche un sistema per l'integrazione dei dati passati (esportando manualmente tutto il database da Weatherlink)
Cominciamo!
In questa guida useremo:- Il compilatore PHP (dalla 5.x in su)
- Il server MySQL attivo e funzionante
- WeatherLink (5.7 in su)
- Un sistema di cron (cron su linux o pycron su windows)
1) Creiamo il database
Creiamoci il database (via terminale o via phpmyadmin). In questa guida la chiamiamo "meteo".
Creiamo una tabella con i seguenti campi, tipo di dato e grandezza del dato. In questa guida viene chiamata "data":
Campo Tipo Null Predefinito
datetime datetime No
temp decimal(4,1) Sì
NULL
tempmax decimal(4,1) Sì
NULL
tempmin decimal(4,1) Sì
NULL
hum decimal(3,0) Sì
NULL
dp decimal(4,1) Sì
NULL
wspeed decimal(5,1) Sì
NULL
wdir varchar(3) Sì
NULL
wrun decimal(6,2) Sì
NULL
whi decimal(5,1) Sì
NULL
whidir varchar(3) Sì
NULL
wchill decimal(4,1) Sì
NULL
heati decimal(4,1) Sì
NULL
thwi decimal(4,1) Sì
NULL
bar decimal(6,1) Sì
NULL
rain decimal(7,2) Sì
NULL
rr decimal(7,2) Sì
NULL
cooldd decimal(8,3) Sì
NULL
Per rendervi la vita più facile vi incollo lo script SQL che ve la crea...
Codice:
CREATE TABLE `data` (
`datetime` datetime NOT NULL,
`temp` decimal(4,1) default NULL,
`tempmax` decimal(4,1) default NULL,
`tempmin` decimal(4,1) default NULL,
`hum` decimal(3,0) default NULL,
`dp` decimal(4,1) default NULL,
`wspeed` decimal(5,1) default NULL,
`wdir` varchar(3) default NULL,
`wrun` decimal(6,2) default NULL,
`whi` decimal(5,1) default NULL,
`whidir` varchar(3) default NULL,
`wchill` decimal(4,1) default NULL,
`heati` decimal(4,1) default NULL,
`thwi` decimal(4,1) default NULL,
`bar` decimal(6,1) default NULL,
`rain` decimal(7,2) default NULL,
`rr` decimal(7,2) default NULL,
`cooldd` decimal(8,3) default NULL,
PRIMARY KEY (`datetime`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Impostiamo infine datetime come chiave primaria. Ho integrato tutti i dati utili, escludendo i sensori interni, la ricezione della console e i campi dell'UV (in quando non dispongo dei sensori
)
2) Scriviamo lo script php di prelievo ed elaborazione dati.
Codice PHP:
<?php
// Definizioni utente per la connessione a MySQL
$dbUser = "miousername";
$dbPwd = "miapassword";
$conn_my = mysql_connect("localhost", $dbUser, $dbPwd) ;
mysql_select_db ("meteo");
//Nome del file di weatherlink
$file='downld02.txt';
//Apro il file
$handle = fopen("$file", 'r');
if (!$handle) die ('Impossibile aprire il file di testo!');
//Indice che mi indica la riga
$i = 1;
while ( !feof ($handle) ) {
$riga = fgets($handle,4096);
//Condizione che esclude dalle operazioni seguenti le tot righe d'intestazione eventualmente iniziali presenti nel file
$riga = trim(preg_replace("/[\s,]+/", " ", $riga));
//Escludo le prime 3 righe
if($i > 3):
// Le variabili della lista seguente devono rispecchiare i campi che compaiono nel file di testo
list($date, $time, $temp, $tempmax, $tempmin, $hum, $dp, $wspeed, $wdir, $wrun, $whi, $whidir, $wchill, $heati, $thwi, $bar, $rain, $rr, $inutile1, $cooldd) = explode(" ",$riga);
//Formattazione e validazione dati
//Cambio la data in formato americano
list($giorno, $mese, $anno) = explode("/",$date);
//Aggiungo all'anno il '20' -> 2007
$anno = '20' . $anno;
//Ricompongo la data
$date = $anno . "/" . $mese . "/" . $giorno;
//Raggruppo la data e l'orario in quanto il campo nel db è datetime
$datetime = $date . ' ' . $time;
//Escludo eventualmente il campo della dir del vento se non soffia vento ('---' -> NULL)
if($wdir == '---'):
$wdir = '';
endif;
if($whidir == '---'):
$whidir = '';
endif;
// Archiviazione di $riga su DB
$queryi= "insert into data values ('$datetime', $temp, $tempmax, $tempmin, $hum, $dp, $wspeed, '$wdir', $wrun, $whi, '$whidir', $wchill, $heati, $thwi, $bar, $rain, $rr, $cooldd)";
$resulti = mysql_query($queryi);
if($resulti == 1):
echo "Inserito il valore del $datetime con la query $queryi\n";
else:
echo("La query $queryi non è andata a buon fine!!!");
endif;
endif;
//Incremento l'indice della riga
$i++;
}
//Chiudo il file
fclose ($handle);
//Chiudo il db
mysql_close ($conn_my);
?>
Salviamolo e mettiamolo nella stessa cartella dove viene prodotto il file dei dati di WeatherLink.
3) Aprimo il terminale e scriviamo:
Codice:
$ cd /mia/dir/di/weatherlink/stazione
$ php mioscript.php
Se abbiamo configurato correttamente il php e lo script, dovrebbe darci come output una serie di "Inserito il valore del ********"
Su windows è possibile avere dei problemi, proviamo quindi con:
Codice:
$ cd C:\mia\dir\di\weatherlink\stazione
$ C:\php\php mioscript.php > miolog.log
(dove " > miolog.log" ci crea un file di log che possiamo leggere tranquillamente se ci verificano errori).
4) Verifichiamo l'inserimento corretto dei dati con un SELECT (o più comodamente da phpmyadmin)
Codice:
SELECT * FROM data ORDER BY datetime DESC LIMIT 50
5) Se sono presenti i dati, tutto è andato a buon fine, altrimenti abbiamo sbagliato qualcosa..... 
6) Possiamo inserire il tutto nel cron.
Creiamo un bat (o script sh su linux)
Codice:
cd C:\Weatherlink\stazione\
php mioscript.php
7) Aggiungiamo questa riga con un crontab
Codice:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * "C:\percorso_allo_script\meteo_data.bat"
8) Riavviamo il servizio di cron e ogni 5 minuti vedremo il nostro script che inserisce i dati da solo!!!!! 
Inserimento dei dati antecedenti
Possiamo inserire i dati meno recenti con una piccola modifica allo script.
1) Andiamo in WeatherLink e esportiamo tutti i dati desiderati (andando nell'elenco dei dati ed esportando dal menu)
2) Salviamo tutto in un file (utile metterlo nella cartella di prima
3) Salviamo (con lo stesso metodo di prima) questo codice:
Codice PHP:
<?php
// Definizioni utente per la connessione a MySQL
$dbUser = "miauser";
$dbPwd = "miapassword";
$conn_my = mysql_connect("localhost", $dbUser, $dbPwd) ;
mysql_select_db ("meteo");
//Nome del file di weatherlink
$file='data1.txt';
//Apro il file
$handle = fopen("$file", 'r');
if (!$handle) die ('Impossibile aprire il file di testo!');
//Indice che mi indica la riga
$i = 1;
while ( !feof ($handle) ) {
$riga = fgets($handle,4096);
//Condizione che esclude dalle operazioni seguenti le tot righe d'intestazione eventualmente iniziali presenti nel file
$riga = trim(preg_replace("/[\s,]+/", "\t", $riga));
//Escludo le prime 3 righe
if($i > 2):
// Le variabili della lista seguente devono rispecchiare i campi che compaiono nel file di testo
list($date, $time, $temp, $tempmax, $tempmin, $hum, $dp, $wspeed, $wdir, $wrun, $whi, $whidir, $wchill, $heati, $thwi, $bar, $rain, $rr, $inutile1, $cooldd) = explode("\t",$riga);
//Formattazione e validazione dati
//Cambio la data in formato americano
list($giorno, $mese, $anno) = explode("/",$date);
//Aggiungo all'anno il '20' -> 2007
$anno = '20' . $anno;
//Ricompongo la data
$date = $anno . "/" . $mese . "/" . $giorno;
//Raggruppo la data e l'orario in quanto il campo nel db è datetime
$datetime = $date . ' ' . $time;
//Escludo eventualmente il campo della dir del vento se non soffia vento ('---' -> NULL)
if($wdir == '---'):
$wdir = '';
endif;
if($whidir == '---'):
$whidir = '';
endif;
// Archiviazione di $riga su DB
$queryi= "insert into data values ('$datetime', $temp, $tempmax, $tempmin, $hum, $dp, $wspeed, '$wdir', $wrun, $whi, '$whidir', $wchill, $heati, $thwi, $bar, $rain, $rr, $cooldd)";
$resulti = mysql_query($queryi);
if($resulti == 1):
echo "Inserito il valore del $datetime con la query $queryi\n";
else:
echo("La query $queryi non è andata a buon fine!!!\n");
endif;
endif;
//Incremento l'indice della riga
$i++;
}
//Chiudo il file
fclose ($handle);
//Chiudo il db
mysql_close ($conn_my);
?>
Il nome del file che abbiamo salvato da weatherlink è modificabile, in questo caso lo abbiamo chiamato data1.txt
L'inserimento di un file di testo annuale (circa 14 mega per dati ogni 5 minuti) comporta una elaborazione di circa 3 minuti su un server a 800 mhz e 320 mb di ram.
L'elaborazione del file giornaliero invece dura circa 3 o 4 secondi
NOTE:
Se un certo dato è già stato inserito, la query di inserimento fallisce (trovando giustamente una chiave primaria doppia). E' così possibile inserire i dati senza preoccuparsi di doppioni).
Il database (con DBMS di tipo MyISAM), contenente circa 185.000 righe di dati (circa 2 anni) occupa 13 mb.
Ringrazio Bio per lo spunto del codice, senza di lui non ce l'avrei mai fatta
Segnalibri