Surveillance des niveaux d'eau de la Lidoire au moulin (coordonnees 44.8759811, 0.0015091) en croisant marees, niveaux de rivieres, meteo et analyse video.
lidoire-flood-watch/
├── backend/ # API FastAPI + services de collecte
│ ├── app/
│ │ ├── api/ # Routes (realtime, timeline, risk, episodes)
│ │ ├── models/ # Schemas Pydantic
│ │ └── services/
│ │ ├── risk_v2.py # Modele de risque v3.0
│ │ ├── forecast.py # Previsions 7 jours
│ │ ├── backfill.py # Backfill historique (rivers, rain, tides, risk)
│ │ ├── episode_detector.py # Detection automatique d'episodes
│ │ ├── data_store.py # Acces InfluxDB/PostgreSQL
│ │ └── collectors/ # Collecteurs (hubeau, tide, weather, netatmo, infoclimat)
│ ├── analyze_episodes.py # Script d'analyse des episodes annotes
│ └── validate_model.py # Script de validation du modele
├── frontend/ # Application React + Vite + TailwindCSS
│ └── src/
│ ├── pages/ # Dashboard, Timeline, Episodes
│ └── components/ # RiskGauge, ForecastPanel, HydroMap, TimeMachine...
├── docker-compose.yml
└── README.md
- Backend : FastAPI (Python 3.11+)
- Frontend : React + Vite + TailwindCSS + Recharts
- Base de donnees : InfluxDB 2.7 (time-series), PostgreSQL 15 (episodes)
- Cache : Redis
- Score de risque 0-100 avec jauge visuelle et detail des facteurs
- Niveaux de 7 stations hydrometriques avec tendance et vitesse (cm/h)
- Pluviometrie multi-sources (Netatmo, Infoclimat, Open-Meteo)
- Marees (coefficient, phase, prochaine PM/BM)
- Conditions du sol (humidite, saturation, bilan hydrique)
- Carte interactive des stations (HydroMap)
- Tooltips pedagogiques sur toutes les metriques
- Previsions horaires du score de risque sur 168h
- Basees sur : pluie Open-Meteo (AROME/ARPEGE), marees predites, projection des niveaux amont
- Integrees dans le graphique de prevision ET dans la timeline
- Cache Redis (30 min TTL)
- Superposition de series : niveaux riviere, pluie, marees, score de risque, sol, vent
- Selecteur de sources (stations, types de donnees)
- Overlay des previsions 7j en pointilles sur la timeline
- Resolution configurable (15min, 1h, 6h, 1j)
- Navigation temporelle vers n'importe quelle date historique
- Reconstruction complete du dashboard a la date choisie
- Acces rapide aux episodes d'inondation connus
- 14 episodes annotes (nov 2022 - jan 2026)
- Analyse contextuelle : pluie avant, niveaux max, coefficient maree, phase
- Confirmation/rejet pour la calibration du modele
- Detection automatique par seuil de score
- Recompute complet des scores de risque sur tout l'historique
- Backfill selectif (rivers, rainfall, tides, soil, risk)
- Tache asynchrone en arriere-plan avec suivi de progression
Calibre a partir de 14 episodes annotes (5 inondations confirmees, 9 faux positifs).
Constat cle : le moulin est sur la Lidoire (affluent), PAS sur la Dordogne. Un niveau Dordogne eleve seul ne signifie pas inondation au moulin. Le signal le plus fort est la montee simultanee de plusieurs stations + pluie, OU plusieurs stations au-dessus du seuil orange (indicateur de pluie en amont).
| Facteur | Poids | Description |
|---|---|---|
| Niveaux rivieres (multi-stations) | 28% | Moyenne ponderee par distance/delai |
| Pluie 24h | 10% | Cumul precipitations dernieres 24h |
| Pluie 72h | 12% | Cumul precipitations 3 jours |
| Pluie 7j | 5% | Saturation longue duree |
| Tendance | 12% | Vitesse de montee (cm/h) |
| Momentum | 8% | Nombre de stations en hausse simultanee |
| Coefficient maree | 5% | Coefficient de la maree |
| Phase maree | 5% | Proximite de la pleine mer |
| Saturation du sol | 5% | Facteur de ruissellement |
| Vent d'ouest | 3% | Amplification surcote Gironde |
| Analyse video | 5% | Index niveau d'eau camera |
- Multiplicateur de conjonction (1.0 a 2.5x) :
- Se declenche quand plusieurs stations montent ET qu'il pleut (pattern "crue active")
- Multi-stations au-dessus du seuil (v3.2) : si ≥3 stations actives ont un score > 0.6 (au-dessus du seuil orange), le multiplicateur augmente (+0.45 si ≥1 en hausse, +0.30 sinon). Les niveaux eleves SONT le signal de pluie en amont.
- Drainage impairment (v3.1) : quand la Dordogne est haute + pluie cumulative, la Lidoire ne peut pas s'ecouler → inondation par refoulement
- Amortisseur de stabilite (0.65 a 1.0x) : reduit le score quand la riviere est haute mais stable/en baisse (piege les faux positifs). Desactive si ≥3 stations au-dessus du seuil orange ou si pluie 72h significative.
- Seuillage du momentum : gate par le niveau riviere (niveau < 0.30m → momentum × 0.2)
| Niveau | Score | Signification |
|---|---|---|
| Vert | 0-15 | Pas de risque |
| Jaune | 15-35 | Vigilance |
| Orange | 35-55 | Risque eleve |
| Rouge | 55+ | Danger imminent |
| Station | Code Hub'Eau | Riviere | Distance | Delai | Poids |
|---|---|---|---|---|---|
| Libourne | P577001001 | Dordogne | 19 km | 0h | 0% (exclue: influence maree) |
| Pessac-sur-Dordogne | P555001001 | Dordogne | 25 km | 4h | 35% (station primaire) |
| Bergerac | P514001001 | Dordogne | 60 km | 8h | 10% |
| Abzac | P726151001 | Isle | 10 km | 2h | 15% |
| Perigueux | P704151001 | Isle | 65 km | 12h | 5% |
| Coutras | P846251001 | Dronne | 21 km | 3h | 10% |
| Riberac | P816251001 | Dronne | 50 km | 10h | 5% |
Libourne est exclue du calcul de risque (poids 0%) car ses oscillations de maree ~4m masquent le signal de crue. Elle reste affichee pour reference.
- Open-Meteo Marine : API gratuite pour les donnees de niveau marin
- SHOM : API officielle (necessite cle API)
- Fallback : calcul predictif
- Hub'Eau : API nationale (7 stations, temps reel + historique depuis 1900)
- Pattern cache-through avec InfluxDB
- Netatmo : Reseau de stations meteo citoyennes (OAuth2)
- Priorite aux stations du bassin Lidoire (amont/milieu/aval)
- Moyenne ponderee par distance
- Infoclimat : Reseau StatIC (cle API requise)
- Open-Meteo : Previsions AROME/ARPEGE (gratuit)
- Open-Meteo : Humidite du sol, temperature, evapotranspiration
- Meteo Agricole : Bilan hydrique 30j, deficit 12 mois
Toutes les donnees sont stockees de maniere permanente dans InfluxDB :
| Measurement | Contenu | Volume |
|---|---|---|
river_level |
Niveaux des 7 stations | ~2000 pts/station/semaine |
tide |
Hauteur, coefficient, type PM/BM | ~100 pts/jour |
rainfall |
Precipitations mm/h par source | ~200 pts/jour |
risk_score |
Score de risque + facteurs detailles | ~24 pts/jour |
soil_conditions |
Humidite, saturation, bilan | ~24 pts/jour |
- Lecture d'abord dans InfluxDB
- Si absent → fetch depuis l'API externe
- Stockage permanent dans InfluxDB
- Les donnees historiques ne sont jamais re-fetchees
- Docker et Docker Compose
- Node.js 18+ (pour le developpement frontend)
- Python 3.11+ (pour le developpement backend)
docker compose up -dBackend :
cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadFrontend :
cd frontend
npm install
npm run dev| Service | Port |
|---|---|
| Frontend | 3100 |
| Backend API | 8100 |
| PostgreSQL | 5532 |
| InfluxDB | 8186 |
| Redis | 6479 |
Copier .env.example vers .env et configurer :
# Base de donnees (ports avec offset +100)
DATABASE_URL=postgresql://user:pass@localhost:5532/lidoire
INFLUXDB_URL=http://localhost:8186
INFLUXDB_TOKEN=your-token
INFLUXDB_ORG=lidoire
INFLUXDB_BUCKET=flood_data
# APIs externes
SHOM_API_KEY= # Optionnel - marees officielles
NETATMO_CLIENT_ID= # Requis pour precipitations Netatmo
NETATMO_CLIENT_SECRET=
NETATMO_REFRESH_TOKEN=
INFOCLIMAT_API_KEY= # Optionnel - stations Infoclimat
# Coordonnees du moulin
MOULIN_LAT=44.8759811
MOULIN_LON=0.0015091GET /api/health: HealthcheckGET /api/status: Status detaille des sources de donnees
GET /api/realtime: Toutes les donnees temps reel (risk, tide, river, rainfall, soil, wind)GET /api/realtime/at?timestamp=<iso>: Reconstruction du dashboard a une date historiqueGET /api/realtime/stations: Donnees multi-stations detailleesGET /api/realtime/netatmo: Donnees Netatmo brutesGET /api/realtime/infoclimat: Stations InfoclimatGET /api/realtime/sources: Status de chaque source de donneesGET /api/realtime/basin-rainfall: Pluviometrie aggregee bassin Lidoire
GET /api/timeline/unified: Timeline multi-sources (river, rain, tide, risk, soil, wind, forecast)GET /api/timeline/sources: Sources disponibles (stations, types)GET /api/timeline/rainfall: Timeline pluviometrique detaillee
GET /api/risk: Score de risque actuelGET /api/risk/forecast?hours=168: Previsions de risque (defaut 7 jours)POST /api/risk/simulate: Simulation avec valeurs custom
GET /api/episodes: Liste des episodes d'inondationPOST /api/episodes: Creer un episodeGET /api/episodes/{id}: Detail d'un episodePUT /api/episodes/{id}: Modifier un episodeDELETE /api/episodes/{id}: Supprimer un episodePOST /api/episodes/analyze-v2: Analyser une date d'inondationGET /api/episodes/analyze/{id}: Analyser un episode existantPOST /api/episodes/confirm/{id}: Confirmer/rejeter (calibration modele)POST /api/episodes/compare: Comparer plusieurs episodesGET /api/episodes/station-extremes: Niveaux max par station sur une periode
POST /api/episodes/backfill: Lancer un backfill historique (tache asynchrone)GET /api/episodes/backfill/status: Progression du backfill en coursPOST /api/episodes/detect: Detection automatique d'episodes par seuil
Projet prive - Usage personnel