Brouillon pour réfléchir sur l'application de visualisation des données météorologiques récoltées au fil de l'année.
Pré-requis
- base postgresql (8.1 en prod mais schéma très basique pour le moment)
- python 2.4 pour les scripts
- rrdtool, plus tard, pour les graphes
Mise en place de l'application
Creation user
root# useradd -d /data/cam/meteo -u 103 -g 33 meteo postgres$ createuser meteo postgres$ createdb meteo
Permettre également a l'user meteo de se connecter a la base meteo en local dans pg_hba.conf.
Le groupe 33 est celui du serveur apache, je ne sais pas encore précisément si c'est utile ou pas...
Schéma de données
create continent/pays...
CREATE TABLE cities (
idcity serial NOT NULL,
code character varying(32) NOT NULL,
name character varying(32) NOT NULL,
continent varchar(2) NOT NULL,
);
ALTER TABLE cities
ADD CONSTRAINT validcontinent CHECK (continent IN ('NA','SA','AS','EU','AF','AU','XX')
);
CREATE TABLE weather (
idcity integer NOT NULL,
w_time character varying(32) NOT NULL,
"comment" character varying(32),
real_temp integer NOT NULL,
feel_temp integer,
humidity integer,
speed_wind integer,
direction_wind character varying(32)
);
ALTER TABLE ONLY weather
ADD CONSTRAINT nodoublon UNIQUE (idcity, w_time);
Scripts de récupération des relevés météorologiques
On se sert du feed RSS fourni par MSN Meteo.
Crontab
2,39 * * * * ~/bin/weathergrab.sh > ~/logs/crontab.log
Une prise toutes les demi heures. Ca devrait suffire à obtenir une plutôt bonne précision sans énormément spammer le fournisseur.
On lance également un script qui envoie par mail les logs d'erreurs à des fins de supervision.
1 0 * * * ~/bin/meteologs.sh
meteologs.sh
#!/bin/bash F=~/logs/weathergrab.log mail -s 'Meteo warnings' meteo < $F echo -n '' > $F
Le mail est envoyé à l'utilisateur meteo (configurer proprement son ~/.forward).
weathergrab.sh
C'est un wrapper pour lancer weathergrab.py en crontab, vérifier que son contenu est OK.
Dépendances Debian Etch : python-feedparser python-pygresql
Consolidation
une fois les données récoltées, une moulinette va les traiter pour permettre leur mise en forme visuelle. une étape sera probablement de remplir des bases RRD pour faire les graphes. une autre étape (préliminaire) sera surement de merger les contenus des éventuelles différentes sources de données. grouper les stations par zone géographique, continent, type de climat.
données disponibles pour chaque relevé d'une ville
- l'heure LOCALE de la station
- un commentaire décrivant la situation météo
- la température réelle
- la température ressentie
- le pourcentage d'humidité
- la vitesse du vent
- la direction du vent
idée de présentation, par ville
une page pour 6 mois d'activité
un graphe avec la temperature ressentie (qui au final est + intéressante) sur toute la période
données intéressantes :
- valeur minimale
- valeur maximale
- valeur moyenne
- ecart type
- certains percentiles (lesquels ?), peut-être représentés graphiquement
possibilité d'ajouter une zone colorée correspondant à un idéal recherché
pareil pour l'humidité et la vitesse du vent
commentaires
définir la liste des commentaires possibles et faire des proportions dans un graphique style camembert
moulinette
merger les données
- creer une table temporaire identique à weather (weather_final)
create temp table weather_final as select idcity,w_time,comment,real_temp,feel_temp,humidity,speed_wind from weather where w_time like '%7/%/2007' limit 10;
- la contrainte nodoublon n'est pas utilisée car elle empecher de merger les données. attention au volume occupé car beaucoup de données seront en double/triple/(cf nb de bases)
- récupérer les données des différentes sources (export/import sous un nom particulier style weather_gyronde)
insert into weather_final select * from weather_gyronde;
- puis, à la fin ou entre chaque import, supprimer les doublons
create temp table weather_uniq as select distinct * from weather_final ;
Réorganiser
Partitionner la base
faire des tables séparées : 1 par mois.
--- creation de la table mensuelle CREATE TABLE weather_200701 AS select * from weather where w_time like '% 1/%/2007'; delete from weather where w_time like '% 1/%/2007';
transformer l'heure du relevé au format timestamp natif sql
--- transformation de w_time en stamp
alter table weather_200701 add column stamp timestamp;
update weather_200701 set stamp=to_timestamp(w_time, 'HH:MI PM MM/DD/YYYY');
create index day_idx on weather_200701 (date_trunc('day', stamp));
alter table weather_200701 drop column w_time;
Et des vues pour agréger (trimestre, année, total).
CREATE VIEW weather_q20071 AS SELECT * from weather_200701 union SELECT * from weather_200702 union SELECT * from weather_200703; CREATE VIEW weather_q20072 AS SELECT * from weather_200704 union SELECT * from weather_200705 union SELECT * from weather_200706; CREATE VIEW weather_q20073 AS SELECT * from weather_200707 union SELECT * from weather_200708 union SELECT * from weather_200709; CREATE VIEW weather_q20074 AS SELECT * from weather_200710 union SELECT * from weather_200711 union SELECT * from weather_200712; CREATE VIEW weather_s20071 AS SELECT * from weather_q20071 union SELECT * from weather_q20072; CREATE VIEW weather_s20072 AS SELECT * from weather_q20073 union SELECT * from weather_q20074; CREATE VIEW weather_y2007 AS SELECT * from weather_s20071 union SELECT * from weather_s20072; -- then allow the webscripts to *read* our data grant select on table weather_q20071 to meteo_readonly; grant select on table weather_q20072 to meteo_readonly; grant select on table weather_q20073 to meteo_readonly; grant select on table weather_q20074 to meteo_readonly; grant select on table weather_s20071 to meteo_readonly; grant select on table weather_s20072 to meteo_readonly;
Le site
Utilisateur meteo_readonly pour le site web
- creer le role avec un mot de passe
- lui permettre de se connecter a la base meteo et aux différentes tables en lecture
grant connect ... grant select on table weather_200701, weather_200702, weather_200703, weather_200704, weather_200705, weather_200706, weather_200707, weather_200709, weather_200710 to meteo_readonly; -- attention a ajouter les acces aux tables au fur et a mesure...
- creer un schema camlib dans la base meteo pour les données concernant le site web (camlib)
Le graphage
On utilise le package python "matplotlib".