Camille Huot

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".