6.0 KiB
6.0 KiB
Consigne — Collecte météo Open‑Meteo (Prévisions + Historique)
1. Objectif
Mettre en place une collecte automatique des données Open‑Meteo pour alimenter :
- une vue calendrier météo (agrégat journalier),
- une vue détail horaire.
Le système doit :
- récupérer les prévisions sur horizon configurable (
7,10,16jours), - stocker un cache JSON brut (debug/audit),
- upserter en SQLite sans duplication,
- gérer
Europe/Parissans décalage de date, - permettre un mode historique (
archive) optionnel.
2. Source de données
- API prévisions :
https://api.open-meteo.com/v1/forecast - API historique :
https://api.open-meteo.com/v1/archive - Doc :
https://open-meteo.com/en/docs
Toujours envoyer :
timezone=Europe/Paristimeformat=iso8601
3. Configuration
Créer config.yml (et config.yml.example) :
open_meteo:
latitude: 45.05
longitude: 3.48
timezone: Europe/Paris
forecast_days: 14
cache_dir: data/cache
db_path: data/jardin.db
wind_strong_kmh: 40
4. Requête prévisions (obligatoire)
Variables demandées :
hourly:temperature_2m,precipitation_probability,precipitation,relative_humidity_2m,wind_speed_10m,wind_direction_10m,cloud_cover,weather_codedaily:temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,sunrise,sunset,weather_code
Exemple :
curl -s "https://api.open-meteo.com/v1/forecast?latitude=45.05&longitude=3.48&hourly=temperature_2m,precipitation_probability,precipitation,relative_humidity_2m,wind_speed_10m,wind_direction_10m,cloud_cover,weather_code&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,sunrise,sunset,weather_code&timezone=Europe/Paris&timeformat=iso8601&forecast_days=14"
Règles :
forecast_daysdoit toujours être explicite.- Lire et logger
hourly_unitsetdaily_units.
5. Requête archive (optionnelle)
Exemple :
curl -s "https://api.open-meteo.com/v1/archive?latitude=45.05&longitude=3.48&start_date=2026-01-01&end_date=2026-01-31&daily=temperature_2m_max,temperature_2m_min,precipitation_sum&hourly=temperature_2m,precipitation,weather_code&timezone=Europe/Paris&timeformat=iso8601"
Règles :
- exécuter par tranche (mensuelle recommandée),
- source marquée
archive.
6. Stockage
6.1 Cache JSON brut
Fichiers à écrire à chaque run :
data/cache/openmeteo_forecast_<YYYY-MM-DDTHHMMSS>.jsondata/cache/openmeteo_archive_<YYYY-MM-DDTHHMMSS>.json(si archive)
Purge :
- conserver les
30derniers fichiers par type.
6.2 SQLite normalisée
Table meteo_daily :
date TEXT NOT NULLsource TEXT NOT NULL(forecast|archive)tmin_c REALtmax_c REALprecip_mm REALprecip_prob_max_pct REALwind_max_kmh REALsunrise_local TEXTsunset_local TEXTweather_code INTEGERfetched_at TEXT NOT NULLlat REAL NOT NULLlon REAL NOT NULLelevation REALPRIMARY KEY (date, source)
Table meteo_hourly :
datetime_local TEXT NOT NULL(YYYY-MM-DDTHH:MM)source TEXT NOT NULL(forecast|archive)temp_c REALprecip_mm REALprecip_prob_pct REALhumidity_pct REALwind_kmh REALwind_dir_deg REALcloud_pct REALweather_code INTEGERfetched_at TEXT NOT NULLlat REAL NOT NULLlon REAL NOT NULLelevation REALPRIMARY KEY (datetime_local, source)
Index recommandés :
idx_meteo_daily_date ON meteo_daily(date)idx_meteo_hourly_dt ON meteo_hourly(datetime_local)
7. Règles d’upsert
forecast:INSERT ... ON CONFLICT (...) DO UPDATE(les prévisions évoluent).archive:INSERT ... ON CONFLICT (...) DO NOTHING(on fige l’observé).
Conflits :
meteo_daily:(date, source)meteo_hourly:(datetime_local, source)
8. Contrôles qualité obligatoires
Après récupération JSON :
daily.timecontient au moins7jours,- longueurs cohérentes des tableaux
hourly, - pour chaque jour :
tmin_c <= tmax_c, - présence de
timezone == Europe/Paris.
En cas d’échec :
- logger erreur explicite,
- conserver le JSON brut,
- sortie non fatale avec code d’erreur contrôlé.
9. Champs attendus pour l’UI
Vue calendrier (jour)
datetmin_c,tmax_cprecip_mmprecip_prob_max_pctweather_codesunrise_local,sunset_local- badges calculés :
gelsitmin_c <= 0pluiesiprecip_mm > 0vent_fortsiwind_max_kmh >= wind_strong_kmh
Vue détail (horaire)
datetime_localtemp_cprecip_prob_pctprecip_mmwind_kmh,wind_dir_deghumidity_pctcloud_pctweather_code
10. Livrables
prevision meteo/scripts/fetch_openmeteo_forecast.pyprevision meteo/scripts/fetch_openmeteo_archive.py(optionnel)prevision meteo/db/schema.sqlprevision meteo/config.yml.example
11. Exécution planifiée
- Prévisions : tous les jours à
06:10Europe/Paris. - Archive (optionnel) : tous les jours à
06:20pourJ-1.
Exemple cron :
10 6 * * * /usr/bin/python3 /path/prevision\ meteo/scripts/fetch_openmeteo_forecast.py
20 6 * * * /usr/bin/python3 /path/prevision\ meteo/scripts/fetch_openmeteo_archive.py --yesterday
12. Critères d’acceptation
- Une exécution quotidienne met à jour
forecastsans duplication. - Le calendrier UI affiche au minimum : Tmin/Tmax, pluie, probabilité pluie, weather code.
- Le détail horaire est consultable pour un jour donné.
- Les dates/heures sont correctes en
Europe/Paris. - Les caches JSON sont présents et exploitables pour debug.