1433 lines
59 KiB
Markdown
1433 lines
59 KiB
Markdown
# Journal de développement - Wrapper API Atmo Data
|
||
|
||
## Session du 04/07/2025
|
||
|
||
### Objectif initial
|
||
Créer un wrapper Python pour l'API d'Atmo Data à partir du fichier swagger.json fourni.
|
||
|
||
### Réalisations
|
||
|
||
#### 1. Analyse et compréhension de l'API
|
||
- ✅ Lecture et analyse complète du fichier `swagger.json`
|
||
- ✅ Identification des 6 endpoints principaux :
|
||
- `/api/login` - Authentification JWT
|
||
- `/api/v2/data/indices/atmo` - Indices de qualité de l'air ATMO
|
||
- `/api/v2/data/episodes/3jours` - Épisodes de pollution sur 3 jours
|
||
- `/api/v2/data/episodes/historique` - Épisodes de pollution historiques
|
||
- `/api/v2/data/inventaires/emissions` - Inventaires des émissions
|
||
- `/api/v2/data/indices/pollens` - Indices pollen
|
||
|
||
#### 2. Création du wrapper de base
|
||
- ✅ **Fichier créé** : `atmo_data_client.py`
|
||
- ✅ Classe `AtmoDataClient` avec authentification JWT
|
||
- ✅ Méthode `login()` pour l'authentification
|
||
- ✅ Méthode `_make_request()` pour les appels API
|
||
- ✅ Implémentation des 5 méthodes principales pour tous les endpoints
|
||
- ✅ Gestion des erreurs avec `AtmoDataException`
|
||
|
||
#### 3. Ajout des validations complètes
|
||
- ✅ **11 méthodes de validation privées** créées :
|
||
- `_validate_format()` - Formats de sortie (geojson, csv)
|
||
- `_validate_aasqa()` - Codes AASQA (01-94)
|
||
- `_validate_polluant()` - Polluants (NO2, SO2, PM10, PM2.5, O3)
|
||
- `_validate_date()` - Format et existence des dates (YYYY-MM-DD)
|
||
- `_validate_code_qualificatif_atmo()` - Indices ATMO (0-7)
|
||
- `_validate_code_qualificatif_pollen()` - Indices pollen (0-6)
|
||
- `_validate_type_episode()` - Types d'épisodes de pollution
|
||
- `_validate_echeance()` - Échéances (-1, 0, 1)
|
||
- `_validate_echelle()` - Échelles (region, epci)
|
||
- `_validate_secteur()` - Secteurs d'émission (5, 6, 7, 34, 219)
|
||
- `_validate_bounding_box()` - Format et cohérence des bounding box
|
||
|
||
#### 4. Refactorisation optimisée
|
||
- ✅ **Toutes les 5 méthodes publiques refactorisées** pour combiner :
|
||
- Validation des paramètres
|
||
- Construction du dictionnaire `params`
|
||
- ✅ Élimination de la duplication de code
|
||
- ✅ Pattern cohérent dans toutes les fonctions
|
||
|
||
#### 5. Documentation et exemples
|
||
- ✅ **Fichier créé** : `README.md` avec documentation complète
|
||
- ✅ **Fichier créé** : `example_usage.py` avec 6 exemples pratiques
|
||
- ✅ **Constantes utiles** définies :
|
||
- `AASQA_CODES` - Mapping codes/régions
|
||
- `POLLUANTS` - Liste des polluants supportés
|
||
- `SECTEURS_EMISSIONS` - Mapping secteurs d'émission
|
||
- `INDICES_ATMO` - Signification des indices ATMO
|
||
- `INDICES_POLLENS` - Signification des indices pollen
|
||
|
||
#### 6. Tests et validation
|
||
- ✅ **Fichier créé** : `test_validations.py`
|
||
- ✅ **Tests unitaires** pour toutes les validations
|
||
- ✅ **Tests d'intégration** pour les méthodes publiques
|
||
- ✅ **Tous les tests passent** avec succès
|
||
|
||
### Structure finale du projet
|
||
|
||
```
|
||
/home/mathieu/test/
|
||
├── swagger.json # Spécification API fournie
|
||
├── atmo_data_client.py # Wrapper principal (450+ lignes)
|
||
├── example_usage.py # Exemples d'utilisation
|
||
├── test_validations.py # Suite de tests
|
||
├── README.md # Documentation complète
|
||
└── JOURNAL.md # Ce journal
|
||
```
|
||
|
||
### Fonctionnalités implémentées
|
||
|
||
#### Wrapper principal (`AtmoDataClient`)
|
||
- ✅ Authentification JWT automatique
|
||
- ✅ Gestion de session HTTP persistante
|
||
- ✅ Validation complète de tous les paramètres
|
||
- ✅ Gestion d'erreurs robuste (`ValueError` + `AtmoDataException`)
|
||
- ✅ Support formats GeoJSON et CSV
|
||
- ✅ Messages d'erreur explicites avec valeurs valides
|
||
|
||
#### Méthodes publiques
|
||
1. `login(username, password)` - Authentification
|
||
2. `get_indices_atmo(...)` - Indices de qualité de l'air
|
||
3. `get_episodes_3jours(...)` - Épisodes pollution actuels
|
||
4. `get_episodes_historique(...)` - Épisodes pollution historiques
|
||
5. `get_emissions(...)` - Inventaires des émissions
|
||
6. `get_indices_pollens(...)` - Indices pollen
|
||
|
||
### Points techniques notables
|
||
|
||
#### Validations implémentées
|
||
- **Formats** : Seuls geojson/csv acceptés
|
||
- **Dates** : Validation regex + existence réelle
|
||
- **Codes AASQA** : Validation contre liste officielle
|
||
- **Polluants** : Validation contre API specs
|
||
- **Bounding box** : Validation format + cohérence géographique
|
||
- **Indices** : Validation ranges ATMO (0-7) et pollen (0-6)
|
||
|
||
#### Architecture
|
||
- **Séparation claire** : Validation / Construction params / Requête
|
||
- **DRY principle** : Pas de duplication de code
|
||
- **Error handling** : Deux types d'exceptions distinctes
|
||
- **Typing** : Type hints complets avec Optional
|
||
|
||
### État actuel
|
||
|
||
#### ✅ Terminé et fonctionnel
|
||
- Wrapper complet et opérationnel
|
||
- Toutes les validations implémentées
|
||
- Documentation complète
|
||
- Tests exhaustifs
|
||
- Code refactorisé et optimisé
|
||
|
||
#### 🎯 Prêt pour utilisation
|
||
Le wrapper est **production-ready** avec :
|
||
- Sécurité : Validation de tous les paramètres
|
||
- Robustesse : Gestion d'erreurs complète
|
||
- Facilité d'usage : API intuitive
|
||
- Documentation : Exemples et guide complet
|
||
|
||
### Pour la prochaine session
|
||
|
||
#### Améliorations possibles (optionnelles)
|
||
- [ ] Ajout de méthodes helper (ex: `get_today_indices()`)
|
||
- [ ] Cache des réponses API
|
||
- [ ] Support de pagination si nécessaire
|
||
- [ ] Méthodes de sérialisation (CSV, Excel)
|
||
- [ ] Tests d'intégration avec vraie API
|
||
- [ ] Configuration via fichier de config
|
||
- [ ] Logging des requêtes
|
||
|
||
#### État des fichiers
|
||
- `atmo_data_client.py` : **Stable et complet**
|
||
- `README.md` : **Documentation à jour**
|
||
- `example_usage.py` : **Exemples fonctionnels**
|
||
- `test_validations.py` : **Suite de tests complète**
|
||
|
||
### Commandes de test rapide
|
||
```bash
|
||
# Test des validations
|
||
python test_validations.py
|
||
|
||
# Test de syntaxe Python
|
||
python -m py_compile atmo_data_client.py
|
||
|
||
# Exemple d'utilisation (nécessite vraie auth)
|
||
python example_usage.py
|
||
```
|
||
|
||
---
|
||
|
||
**Session terminée le 04/07/2025**
|
||
**Statut : Wrapper complet et fonctionnel** ✅
|
||
|
||
---
|
||
|
||
## Session du 07/07/2025
|
||
|
||
### Objectifs
|
||
- Implémenter des classes de données typées pour faciliter l'exploitation des données
|
||
- Ajouter un système de gestion des credentials sécurisé
|
||
- Tester la connexion réelle à l'API Atmo Data
|
||
|
||
### Réalisations
|
||
|
||
#### 1. Objets typés et modèles de données ✅
|
||
- ✅ **Fichier créé** : `atmo_data_models.py`
|
||
- ✅ **Classes spécialisées** créées pour chaque type de données :
|
||
- `AtmoDataBase` - Classe de base avec coordonnées et propriétés communes
|
||
- `IndiceAtmo` - Indices de qualité de l'air avec méthodes helper
|
||
- `EpisodePollution` - Épisodes de pollution avec niveaux d'alerte
|
||
- `EmissionData` - Données d'émissions avec calculs par habitant/km²
|
||
- `IndicePollen` - Indices pollen avec détection des risques
|
||
- `AtmoDataCollection` - Gestion de collections avec filtrage et statistiques
|
||
- `Coordinates` - Classe pour coordonnées géographiques avec calcul de distance
|
||
|
||
#### 2. Méthodes helper avancées ✅
|
||
- ✅ **IndiceAtmo** :
|
||
- `get_qualificatif()` - Qualificatif textuel ("Bon", "Moyen", etc.)
|
||
- `get_color()` - Couleur hex/RGB associée à l'indice
|
||
- `is_good_quality()` / `is_poor_quality()` - Tests de qualité
|
||
- `get_worst_pollutant()` - Polluant le plus problématique
|
||
- `get_pollutants_summary()` - Résumé détaillé de tous les polluants
|
||
|
||
- ✅ **EpisodePollution** :
|
||
- `is_alert_active()` - Détection d'alertes actives
|
||
- `get_alert_level()` - Niveau d'alerte (Information/Alerte/Aucune)
|
||
- `get_polluant_code()` - Code du polluant principal
|
||
- `is_geometry_complex()` - Détection géométries MultiPolygon
|
||
|
||
- ✅ **EmissionData** :
|
||
- `get_emission_density()` - Densité d'émission par km²
|
||
- `get_emission_per_capita()` - Émission par habitant
|
||
- `get_total_emissions()` - Toutes les émissions par polluant
|
||
- `get_secteur_name()` - Nom du secteur d'émission
|
||
|
||
- ✅ **IndicePollen** :
|
||
- `is_alert_active()` - Détection alertes pollen
|
||
- `get_highest_pollen()` - Espèce avec indice le plus élevé
|
||
- `get_dangerous_pollens()` - Liste des pollens à risque élevé (4+)
|
||
- `get_pollens_summary()` - Détail par espèce avec couleurs
|
||
|
||
- ✅ **AtmoDataCollection** :
|
||
- `filter_by_aasqa()` - Filtrage par région
|
||
- `filter_by_coordinates()` - Filtrage géographique avec rayon
|
||
- `get_statistics()` - Statistiques automatiques par type de données
|
||
- `to_summary()` - Résumé textuel de la collection
|
||
|
||
#### 3. Intégration client/objets typés ✅
|
||
- ✅ **Client modifié** pour retourner objets typés :
|
||
- Format GeoJSON → `AtmoDataCollection` avec objets typés
|
||
- Format CSV → Dictionnaires bruts (rétrocompatibilité)
|
||
- ✅ **Type hints** mis à jour : `Union[Dict[str, Any], AtmoDataCollection]`
|
||
- ✅ **Détection automatique** du type de données (indices/episodes/emissions/pollens)
|
||
|
||
#### 4. Système de credentials sécurisé ✅
|
||
- ✅ **Fichiers créés** :
|
||
- `credentials.json.example` - Modèle de configuration
|
||
- `.gitignore` - Protection des credentials sensibles
|
||
- `setup_credentials.py` - Script de configuration guidée
|
||
|
||
- ✅ **Fonctionnalités client améliorées** :
|
||
- Chargement automatique depuis `credentials.json`
|
||
- URL API configurable via credentials
|
||
- Méthode `auto_login()` pour connexion simplifiée
|
||
- Validation des champs requis et format JSON
|
||
- Gestion d'erreurs explicites pour credentials manquants/invalides
|
||
|
||
- ✅ **Sécurité** :
|
||
- `credentials.json` ignoré par git automatiquement
|
||
- Validation des champs obligatoires (username, password)
|
||
- Messages d'erreur clairs sans exposer les mots de passe
|
||
|
||
#### 5. Tests et connexion réelle à l'API ✅
|
||
- ✅ **Fichiers de test créés** :
|
||
- `test_credentials_system.py` - Tests du système de credentials
|
||
- `test_typed_client.py` - Tests d'intégration objets typés
|
||
- `test_real_connection.py` - Test de connexion réelle avec prompts
|
||
- `demo_complete.py` - Démonstration complète fonctionnelle
|
||
|
||
- ✅ **URL API corrigée** : `https://admindata.atmo-france.org`
|
||
- ✅ **Connexion réelle testée** avec succès :
|
||
- Authentification JWT fonctionnelle
|
||
- Récupération de 1,288 indices ATMO pour l'Île-de-France
|
||
- Analyse de 9 épisodes de pollution (aucune alerte active)
|
||
- 6 territoires d'émissions avec calculs par habitant
|
||
- 3,801 stations pollen avec 1,630 alertes (Graminées)
|
||
|
||
#### 6. Fonctionnalité de sauvegarde étendue ✅
|
||
- ✅ **Méthode `save_to_file()`** améliorée :
|
||
- Support formats JSON, CSV, GeoJSON
|
||
- Extraction intelligente des coordonnées pour CSV
|
||
- Création automatique des dossiers parents
|
||
- Extensions de fichier automatiques
|
||
- Validation du format et compatibilité des données
|
||
|
||
- ✅ **Tests de sauvegarde** avec vraies données :
|
||
- Export JSON : 1,138,754 bytes (données réelles)
|
||
- Export CSV : 295,120 bytes avec coordonnées extraites
|
||
- Création automatique dossier `export_YYYY-MM-DD/`
|
||
|
||
#### 7. Documentation complète ✅
|
||
- ✅ **README.md mis à jour** avec :
|
||
- Section objets typés et modèles de données
|
||
- Guide de configuration des credentials
|
||
- Exemples d'utilisation avec méthodes helper
|
||
- Liste complète des classes et méthodes disponibles
|
||
|
||
- ✅ **Fichiers d'aide créés** :
|
||
- `QUICKSTART.md` - Guide de démarrage rapide
|
||
- `example_data_models.py` - Exemples avec objets typés
|
||
- Documentation des tests et scripts de validation
|
||
|
||
### Tests réels effectués
|
||
|
||
#### Données analysées (session du 07/07/2025)
|
||
- **Qualité de l'air Île-de-France** : 1,288 indices, moyenne 2.0/7 (Bonne qualité)
|
||
- **Épisodes de pollution** : 9 épisodes analysés, aucune alerte active
|
||
- **Émissions** : Île-de-France, 12M habitants, 0.18 kg NOx/hab/an
|
||
- **Pollens** : 1,630 alertes actives sur Graminées (niveau 3-4)
|
||
|
||
### Structure finale du projet
|
||
|
||
```
|
||
/home/mathieu/test/
|
||
├── atmo_data_client.py # Client principal avec credentials
|
||
├── atmo_data_models.py # Classes de données typées
|
||
├── constantes.py # Constantes et configurations
|
||
├── credentials.json.example # Modèle de credentials
|
||
├── credentials.json # Credentials utilisateur (ignoré git)
|
||
├── .gitignore # Protection des données sensibles
|
||
├── setup_credentials.py # Configuration guidée
|
||
├── example_usage.py # Exemples de base
|
||
├── example_data_models.py # Exemples objets typés
|
||
├── example_save_files.py # Exemples de sauvegarde
|
||
├── test_validations.py # Tests de validation
|
||
├── test_save_functionality.py # Tests de sauvegarde
|
||
├── test_credentials_system.py # Tests système credentials
|
||
├── test_typed_client.py # Tests intégration objets
|
||
├── test_real_connection.py # Tests connexion réelle
|
||
├── demo_complete.py # Démonstration complète
|
||
├── QUICKSTART.md # Guide démarrage rapide
|
||
├── README.md # Documentation complète
|
||
├── JOURNAL.md # Ce journal
|
||
└── swagger.json # Spécification API
|
||
```
|
||
|
||
### Fonctionnalités ajoutées
|
||
|
||
#### Objets typés
|
||
- **Classes spécialisées** pour chaque type de données API
|
||
- **Méthodes helper** pour analyse et visualisation
|
||
- **Calculs automatiques** (densités, per capita, distances)
|
||
- **Filtrage intelligent** (géographique, par région, par qualité)
|
||
- **Statistiques automatiques** par type de collection
|
||
|
||
#### Gestion des credentials
|
||
- **Configuration sécurisée** via fichier JSON
|
||
- **Chargement automatique** de l'URL et identifiants
|
||
- **Validation robuste** avec messages d'erreur clairs
|
||
- **Protection git** automatique des données sensibles
|
||
|
||
#### Connectivité réelle
|
||
- **Authentification JWT** opérationnelle
|
||
- **Tous les endpoints** testés avec succès
|
||
- **Gestion d'erreurs** serveur (500) et paramètres requis
|
||
- **Performance** validée sur gros volumes (1,288 indices)
|
||
|
||
### État actuel
|
||
|
||
#### ✅ Production-ready avec API réelle
|
||
- ✅ Connexion fonctionnelle à `https://admindata.atmo-france.org`
|
||
- ✅ Authentification JWT opérationnelle
|
||
- ✅ Tous les endpoints validés avec vraies données
|
||
- ✅ Objets typés pleinement fonctionnels
|
||
- ✅ Sauvegarde de données réelles (>1MB)
|
||
- ✅ Analyse statistique avancée
|
||
|
||
#### 🎯 Améliorations apportées
|
||
- **Facilité d'usage** : `client.auto_login()` au lieu de saisie manuelle
|
||
- **Richesse des données** : Objets avec méthodes helper vs dictionnaires bruts
|
||
- **Sécurité** : Credentials protégés, validation renforcée
|
||
- **Robustesse** : Tests réels avec gros volumes de données
|
||
|
||
### Todo List - Ajustements documentation/code ✨
|
||
|
||
Basé sur les informations ajoutées dans README.md par l'utilisateur :
|
||
|
||
#### 📝 Documentation et attribution
|
||
- [ ] **Licence et attribution** :
|
||
- [ ] Ajouter en-têtes de licence ODbL dans tous les fichiers Python
|
||
- [ ] Créer méthode `get_attribution()` retournant le texte d'attribution requis
|
||
- [ ] Intégrer attribution automatique dans les exports (JSON/CSV)
|
||
- [ ] Ajouter exemples d'attribution dans la documentation
|
||
|
||
- [ ] **Liens et références** :
|
||
- [ ] Ajouter liens vers documentation officielle dans les docstrings
|
||
- [ ] Référencer https://admindata.atmo-france.org/api/doc/v2 dans le code
|
||
- [ ] Intégrer lien vers inscription API dans les messages d'erreur d'auth
|
||
|
||
#### 🔒 Prérequis et autorisation
|
||
- [ ] **Gestion des autorisations** :
|
||
- [ ] Améliorer messages d'erreur d'authentification avec lien inscription
|
||
- [ ] Ajouter méthode `check_api_access()` pour vérifier autorisations
|
||
- [ ] Créer guide d'inscription dans documentation
|
||
- [ ] Ajouter validation du statut du compte utilisateur
|
||
|
||
#### 📊 Métadonnées et contexte
|
||
- [ ] **Informations contextuelles** :
|
||
- [ ] Ajouter propriétés `data_source` et `license` aux objets typés
|
||
- [ ] Intégrer description des 4 thèmes dans les classes de données
|
||
- [ ] Ajouter méthodes `get_data_source_info()` aux collections
|
||
- [ ] Créer constantes pour les thèmes de données (indices, épisodes, émissions, pollen)
|
||
|
||
#### 🛠️ Scripts et outils
|
||
- [ ] **Scripts d'aide améliorés** :
|
||
- [ ] Modifier `setup_credentials.py` pour inclure lien d'inscription
|
||
- [ ] Ajouter vérification des autorisations dans les tests
|
||
- [ ] Créer script `check_prerequisites.py` pour validation complète
|
||
- [ ] Intégrer guides d'inscription dans les outils de configuration
|
||
|
||
### Commandes de test
|
||
|
||
```bash
|
||
# Tests complets
|
||
python test_credentials_system.py
|
||
python test_typed_client.py
|
||
python demo_complete.py
|
||
|
||
# Configuration
|
||
python setup_credentials.py
|
||
|
||
# Test connexion réelle (nécessite credentials valides)
|
||
python test_real_connection.py
|
||
```
|
||
|
||
---
|
||
|
||
**Session terminée le 07/07/2025**
|
||
**Statut : Wrapper avec objets typés et connexion API réelle opérationnelle** ✅
|
||
**Nouvelles fonctionnalités** : Classes de données typées, credentials sécurisés, tests réels réussis
|
||
|
||
---
|
||
|
||
## Session du 09/07/2025
|
||
|
||
### Objectifs
|
||
- Corriger les erreurs dans le script `example_usage.py` après l'implémentation des objets typés
|
||
- Créer un script spécialisé pour analyser les indices pollen de Tomblaine
|
||
- Améliorer la classe `IndicePollen` avec les concentrations de pollens
|
||
|
||
### Réalisations
|
||
|
||
#### 1. Correction du script example_usage.py ✅
|
||
- ✅ **Problème identifié** : Le script utilisait encore l'ancien format dictionnaire brut
|
||
- ✅ **Erreur corrigée** : `'AtmoDataCollection' object has no attribute 'get'`
|
||
- ✅ **Migration vers objets typés** :
|
||
- `indices.get('features', [])` → `len(indices)`
|
||
- Utilisation des méthodes helper : `get_qualificatif()`, `is_alert_active()`
|
||
- Affichage des résumés avec `to_summary()`
|
||
- ✅ **Ajout paramètres requis** : Spécification d'`aasqa="11"` pour éviter erreurs serveur 500
|
||
- ✅ **Analyses enrichies** :
|
||
- Statistiques de qualité avec pourcentages
|
||
- Détection automatique des alertes
|
||
- Répartition des épisodes par polluant
|
||
- Calculs d'émissions par habitant
|
||
|
||
#### 2. Script spécialisé pour Tomblaine ✅
|
||
- ✅ **Fichier créé** : `pollen_tomblaine.py`
|
||
- ✅ **Fonctionnalités implémentées** :
|
||
- Recherche précise par code INSEE (54526) et AASQA (44 - Grand Est)
|
||
- Prévisions sur 3 jours (aujourd'hui + 2 jours suivants)
|
||
- Connexion automatique avec credentials
|
||
- Analyse détaillée par espèce de pollen
|
||
- Détection d'alertes et pollens à risque élevé
|
||
- Résumé et recommandations personnalisées
|
||
- Gestion d'erreurs robuste avec fallback régional
|
||
|
||
#### 3. Correction des problèmes d'affichage ✅
|
||
- ✅ **Problème 1 corrigé** : "Station: Zone non spécifiée"
|
||
- **Cause** : Propriété `lib_zone` non exposée dans `AtmoDataBase`
|
||
- **Solution** : Ajout de `self.lib_zone = self.properties.get('lib_zone', '')` dans `AtmoDataBase`
|
||
- **Résultat** : Affichage correct "Station: Tomblaine"
|
||
|
||
- ✅ **Problème 2 corrigé** : Qualificatifs affichés comme "Inconnu"
|
||
- **Cause** : Codes float (1.0, 2.0) non convertis en string pour le dictionnaire
|
||
- **Solution** : Correction dans `get_pollens_summary()` avec `str(int(indice))`
|
||
- **Résultat** : Affichage correct "Très faible", "Faible", "Modéré"
|
||
|
||
- ✅ **Problème 3 corrigé** : Codes courts ("Gram", "Arm") au lieu des noms complets
|
||
- **Cause** : Méthode `get_highest_pollen()` retournait les codes courts
|
||
- **Solution** : Utilisation de `CODE_TAXON.get()` pour conversion
|
||
- **Résultat** : Affichage correct "Graminées", "Armoise"
|
||
|
||
#### 4. Amélioration de la classe IndicePollen ✅
|
||
- ✅ **Propriétés de concentration ajoutées** :
|
||
- `conc_ambr`, `conc_arm`, `conc_aul`, `conc_boul`, `conc_gram`, `conc_oliv`
|
||
- Concentrations en grains/m³ pour chaque taxon
|
||
- Documentation complète avec types et unités
|
||
|
||
- ✅ **Nouvelles méthodes helper** :
|
||
- `get_concentrations()` : Retourne toutes les concentrations par espèce
|
||
- `get_highest_concentration()` : Trouve l'espèce avec la plus haute concentration
|
||
- `get_pollens_summary()` améliorée : Inclut maintenant les concentrations
|
||
|
||
- ✅ **Amélioration du script Tomblaine** :
|
||
- Affichage de la plus haute concentration : "🔬 Plus haute concentration: Graminées (33.9 grains/m³)"
|
||
- Concentrations détaillées pour chaque espèce détectée
|
||
- Données quantitatives permettant une analyse plus fine
|
||
|
||
#### 5. Enrichissement des constantes ✅
|
||
- ✅ **Constantes `AASQA_CODES` améliorées** :
|
||
- Format : 'Code': 'Région | Organisme'
|
||
- Exemple : '44': 'Grand Est | ATMO Grand-Est'
|
||
- Informations sur les organismes producteurs
|
||
|
||
- ✅ **Propriété `source` ajoutée** :
|
||
- Ajout dans `AtmoDataBase` : `self.source = self.properties.get('source', '')`
|
||
- Méthode `get_source()` : Retourne le nom public de l'AASQA
|
||
|
||
### Tests réels effectués avec Tomblaine
|
||
|
||
#### Données analysées (session du 09/07/2025)
|
||
- **Localisation** : Tomblaine (54526), Grand Est (AASQA 44)
|
||
- **Période** : 09-11 juillet 2025 (3 jours)
|
||
- **Résultats** :
|
||
- **Graminées** : Niveau modéré (3) avec concentration décroissante (33.9 → 32.0 → 28.4 gr/m³)
|
||
- **Armoise** : Niveau faible (2) avec concentration stable (4.8 → 5.7 → 4.3 gr/m³)
|
||
- **Autres pollens** : Très faibles (niveau 1)
|
||
- **Aucune alerte officielle** sur les 3 jours
|
||
- **Tendance** : Amélioration progressive visible
|
||
|
||
### Fonctionnalités ajoutées
|
||
|
||
#### Script pollen_tomblaine.py
|
||
- **Recherche précise** par code INSEE et AASQA
|
||
- **Prévisions 3 jours** avec données détaillées
|
||
- **Analyse par espèce** avec émojis visuels par niveau
|
||
- **Concentrations quantitatives** en grains/m³
|
||
- **Détection d'alertes** et pollens à risque élevé
|
||
- **Résumé global** avec recommandations personnalisées
|
||
- **Gestion d'erreurs** robuste avec fallback régional
|
||
|
||
#### Classe IndicePollen enrichie
|
||
- **Propriétés de concentration** pour tous les taxons
|
||
- **Méthodes d'analyse** des concentrations
|
||
- **Résumé complet** incluant codes, qualificatifs et concentrations
|
||
- **Détection automatique** des plus hautes concentrations
|
||
- **Support complet** des données quantitatives API
|
||
|
||
### Structure du projet mise à jour
|
||
|
||
```
|
||
/home/mathieu/test/
|
||
├── atmo_data_client.py # Client principal avec credentials
|
||
├── atmo_data_models.py # Classes de données typées (enrichies)
|
||
├── constantes.py # Constantes améliorées avec organismes
|
||
├── credentials.json.example # Modèle de credentials
|
||
├── credentials.json # Credentials utilisateur (ignoré git)
|
||
├── pollen_tomblaine.py # Script spécialisé Tomblaine ✨ NOUVEAU
|
||
├── example_usage.py # Exemples corrigés avec objets typés
|
||
├── example_data_models.py # Exemples objets typés
|
||
├── example_save_files.py # Exemples de sauvegarde
|
||
├── demo_complete.py # Démonstration complète
|
||
├── test_*.py # Suite de tests
|
||
├── setup_credentials.py # Configuration guidée
|
||
├── QUICKSTART.md # Guide démarrage rapide
|
||
├── README.md # Documentation complète
|
||
├── JOURNAL.md # Ce journal
|
||
└── swagger.json # Spécification API
|
||
```
|
||
|
||
### Corrections techniques importantes
|
||
|
||
#### Problèmes résolus
|
||
1. **Compatibilité objets typés** : Migration complète de `example_usage.py`
|
||
2. **Affichage des zones** : Correction de l'accès à `lib_zone` dans `AtmoDataBase`
|
||
3. **Qualificatifs pollen** : Correction de la conversion float→string dans `get_pollens_summary()`
|
||
4. **Noms d'espèces** : Utilisation correcte de `CODE_TAXON` pour les noms complets
|
||
5. **Concentrations manquantes** : Ajout complet des propriétés `conc_*` dans `IndicePollen`
|
||
|
||
#### Améliorations qualitatives
|
||
- **Données plus riches** : Concentrations quantitatives en grains/m³
|
||
- **Analyses plus fines** : Suivi des tendances sur 3 jours
|
||
- **Localisation précise** : Recherche par code INSEE spécifique
|
||
- **Interface utilisateur** : Affichage avec émojis et formatage clair
|
||
- **Recommandations** : Conseils personnalisés basés sur l'analyse
|
||
|
||
### État actuel
|
||
|
||
#### ✅ Production-ready avec analyses avancées
|
||
- ✅ Scripts d'exemples corrigés et fonctionnels
|
||
- ✅ Classe `IndicePollen` complète avec concentrations
|
||
- ✅ Script spécialisé Tomblaine opérationnel
|
||
- ✅ Affichage correct des zones et qualificatifs
|
||
- ✅ Analyses quantitatives avec grains/m³
|
||
- ✅ Prévisions 3 jours avec tendances
|
||
|
||
#### 🎯 Nouvelles capacités
|
||
- **Analyse locale précise** : Suivi spécifique par commune
|
||
- **Données quantitatives** : Concentrations en grains/m³
|
||
- **Prévisions courtes** : Évolution sur 3 jours
|
||
- **Détection automatique** : Alertes et pollens à risque
|
||
- **Recommandations** : Conseils basés sur l'analyse
|
||
|
||
### Commandes de test
|
||
|
||
```bash
|
||
# Script corrigé avec objets typés
|
||
python example_usage.py
|
||
|
||
# Analyse pollen Tomblaine
|
||
python pollen_tomblaine.py
|
||
|
||
# Test des concentrations
|
||
python -c "
|
||
from atmo_data_client import AtmoDataClient
|
||
from datetime import datetime
|
||
client = AtmoDataClient()
|
||
client.auto_login()
|
||
pollens = client.get_indices_pollens(date=datetime.now().strftime('%Y-%m-%d'), aasqa='44', code_zone='54526')
|
||
if pollens: print('Concentrations:', pollens[0].get_concentrations())
|
||
"
|
||
|
||
# Démonstration complète
|
||
python demo_complete.py
|
||
```
|
||
|
||
### Données exemple Tomblaine (09/07/2025)
|
||
|
||
```
|
||
🌸 Station: Tomblaine
|
||
🌱 Plus haut niveau: Graminées (niveau 3)
|
||
🔬 Plus haute concentration: Graminées (33.9 grains/m³)
|
||
|
||
🌿 Détail par espèce:
|
||
🟡 Armoise : Faible (niveau 2) - 4.8 gr/m³
|
||
🟠 Graminées : Modéré (niveau 3) - 33.9 gr/m³
|
||
🟢 Autres : Très faible (niveau 1) - 0.0 gr/m³
|
||
```
|
||
|
||
---
|
||
|
||
**Session terminée le 09/07/2025**
|
||
**Statut : Wrapper avec analyses pollen avancées et corrections complètes** ✅
|
||
**Nouvelles fonctionnalités** : Script Tomblaine, concentrations pollens, corrections objets typés
|
||
|
||
---
|
||
|
||
## Session du 10/07/2025
|
||
|
||
### Objectifs
|
||
- Centraliser la gestion des emojis dans les constantes
|
||
- Créer un script de présentation tabulaire concis pour les données pollen de Tomblaine
|
||
- Améliorer la cohérence et la simplicité des scripts
|
||
|
||
### Réalisations
|
||
|
||
#### 1. Centralisation du système d'émojis ✅
|
||
- ✅ **Mise à jour de `CODE_COLOR_QUALIF`** :
|
||
- Ajout d'un 3ème élément emoji dans chaque tuple : `[rgb, hex, emoji]`
|
||
- Format : `0: [(221,221,221), '#DDDDDD', "⚪"]`
|
||
- Émojis standardisés : ⚪🟢🟡🟠🔴🟣⚫⚠️ pour niveaux 0-7
|
||
|
||
- ✅ **Méthode `get_emoji_by_level()` ajoutée** à `AtmoDataBase` :
|
||
- Récupère l'émoji correspondant au niveau de qualificatif
|
||
- Gestion des cas d'erreur avec emoji par défaut "❓"
|
||
- Utilisable par toutes les classes héritées
|
||
|
||
- ✅ **Simplification des classes spécialisées** :
|
||
- `IndiceAtmo.get_emoji()` utilise maintenant la méthode centralisée
|
||
- `IndicePollen.get_pollens_summary()` inclut automatiquement l'émoji
|
||
- Plus de duplication de tableaux d'émojis dans les scripts
|
||
|
||
#### 2. Script tabulaire concis pour Tomblaine ✅
|
||
- ✅ **Fichier créé** : `pollen_tomblaine_tableau.py`
|
||
- ✅ **Présentation optimisée** :
|
||
- Tableau principal : Taxons en lignes, dates (J, J+1, J+2) en colonnes
|
||
- Niveaux avec émojis aux intersections (pas de concentrations)
|
||
- Tableau de résumé synthétique avec indicateurs clés
|
||
- Légende claire et recommandations automatiques
|
||
|
||
- ✅ **Fonctionnalités avancées** :
|
||
- Formatage ASCII professionnel avec `format_table()`
|
||
- Largeurs de colonnes ajustées pour les émojis
|
||
- Calculs automatiques de moyennes et tendances
|
||
- Détection des pollens significatifs (niveau ≥ 2)
|
||
- Recommandations basées sur les données API
|
||
|
||
#### 3. Amélioration des données de résumé ✅
|
||
- ✅ **Corrections importantes** après feedback utilisateur :
|
||
- **Formatage des en-têtes** : Dates correctement contenues dans les cellules
|
||
- **Émojis dans tableaux** : Remplacement des qualificatifs par émojis pour la lisibilité
|
||
- **Données API utilisées** : Plus haut niveau et alerte officielle avec pollen responsable
|
||
- **Calculs corrigés** : "Pollens à risque" et "Taxons détectés" maintenant corrects
|
||
|
||
- ✅ **Utilisation des données API directes** :
|
||
- `lib_qual` et `pollen_resp` pour plus haut niveau
|
||
- `code_qual` pour qualification automatique
|
||
- Formatage intelligent : "GRAMINEE" → "Graminées"
|
||
- Fallback sur analyse locale si données API indisponibles
|
||
|
||
#### 4. Optimisation de la conversion des constantes ✅
|
||
- ✅ **Mise à jour suite aux changements utilisateur** :
|
||
- `INDICES_ATMO` et `INDICES_POLLENS` utilisent maintenant des clés integer
|
||
- Suppression des conversions `str()` inutiles dans les classes
|
||
- Code plus efficace et moins de conversions de types
|
||
- Cohérence renforcée dans l'accès aux constantes
|
||
|
||
#### 5. Centralisation des fonctions couleur ✅
|
||
- ✅ **Méthode `get_color_by_level()` ajoutée** à `AtmoDataBase` :
|
||
- Retourne tuple `(hex_color, rgb_color)` pour un niveau donné
|
||
- Valeurs par défaut pour cas d'erreur : "#DDDDDD", [221, 221, 221]
|
||
- Utilisée par `IndiceAtmo.get_color()` et `IndicePollen.get_pollens_summary()`
|
||
|
||
- ✅ **Tests de vérification complets** :
|
||
- Validation des fonctions `get_emoji_by_level()` et `get_color_by_level()`
|
||
- Tests sur tous les niveaux 0-7 avec vérification des correspondances
|
||
- Tests d'intégration avec les classes `IndiceAtmo` et `IndicePollen`
|
||
- Tous les tests passent avec succès
|
||
|
||
### Comparaison des deux scripts Tomblaine
|
||
|
||
#### Script détaillé (`pollen_tomblaine.py`)
|
||
- **Format** : Analyse narrative détaillée
|
||
- **Contenu** : Descriptions complètes, concentrations, recommandations
|
||
- **Usage** : Analyse approfondie et explicative
|
||
- **Sortie** : ~50 lignes par jour analysé
|
||
|
||
#### Script tabulaire (`pollen_tomblaine_tableau.py`)
|
||
- **Format** : Tableaux ASCII concis
|
||
- **Contenu** : Données essentielles, émojis visuels, synthèse
|
||
- **Usage** : Vue d'ensemble rapide et comparative
|
||
- **Sortie** : ~20 lignes pour 3 jours
|
||
|
||
### Fonctionnalités ajoutées
|
||
|
||
#### Système d'émojis centralisé
|
||
- **Une seule source** : `CODE_COLOR_QUALIF` avec émojis intégrés
|
||
- **Méthodes uniformes** : `get_emoji_by_level()` dans toutes les classes
|
||
- **Maintenance simplifiée** : Changement d'emoji = une seule modification
|
||
- **Cohérence garantie** : Tous les scripts utilisent les mêmes émojis
|
||
|
||
#### Présentation tabulaire avancée
|
||
- **Formatage professionnel** : Bordures ASCII, alignement automatique
|
||
- **Données synthétiques** : Vue comparative sur 3 jours
|
||
- **Calculs automatiques** : Moyennes, tendances, détection de risques
|
||
- **Recommandations** : Conseils basés sur l'analyse multi-jours
|
||
|
||
#### Fonctions de couleur uniformisées
|
||
- **Accès simplifié** : `get_color_by_level()` disponible partout
|
||
- **Plus de duplication** : Logique centralisée dans la classe de base
|
||
- **Maintenance réduite** : Un seul endroit pour gérer les couleurs
|
||
- **Tests validés** : Vérification complète du bon fonctionnement
|
||
|
||
### Structure du projet mise à jour
|
||
|
||
```
|
||
/home/mathieu/test/
|
||
├── atmo_data_client.py # Client principal avec credentials
|
||
├── atmo_data_models.py # Classes typées avec émojis/couleurs centralisés ✨ AMÉLIORÉ
|
||
├── constantes.py # Constantes avec émojis intégrés ✨ AMÉLIORÉ
|
||
├── credentials.json.example # Modèle de credentials
|
||
├── credentials.json # Credentials utilisateur (ignoré git)
|
||
├── pollen_tomblaine.py # Script détaillé Tomblaine ✨ AMÉLIORÉ
|
||
├── pollen_tomblaine_tableau.py # Script tabulaire concis Tomblaine ✨ NOUVEAU
|
||
├── example_usage.py # Exemples corrigés avec objets typés
|
||
├── example_data_models.py # Exemples objets typés
|
||
├── demo_complete.py # Démonstration complète
|
||
├── test_*.py # Suite de tests
|
||
├── setup_credentials.py # Configuration guidée
|
||
├── QUICKSTART.md # Guide démarrage rapide
|
||
├── README.md # Documentation complète
|
||
├── JOURNAL.md # Ce journal
|
||
└── swagger.json # Spécification API
|
||
```
|
||
|
||
### Améliorations techniques importantes
|
||
|
||
#### Centralisation réussie
|
||
- **Émojis** : Une seule définition dans `CODE_COLOR_QUALIF`
|
||
- **Couleurs** : Fonction commune `get_color_by_level()`
|
||
- **Conversions** : Suppression des `str()` inutiles après passage aux clés integer
|
||
- **Cohérence** : Tous les scripts utilisent les mêmes méthodes
|
||
|
||
#### Performance optimisée
|
||
- **Moins de conversions** : Clés integer directement utilisables
|
||
- **Code plus propre** : Suppression de la duplication
|
||
- **Maintenance simplifiée** : Modifications centralisées
|
||
- **Tests validés** : Fonctionnement vérifié sur tous les niveaux
|
||
|
||
#### Interface utilisateur améliorée
|
||
- **Tableau professionnel** : Formatage ASCII avec bordures
|
||
- **Vue comparative** : 3 jours côte à côte
|
||
- **Émojis intégrés** : Lisibilité immédiate des niveaux
|
||
- **Recommandations automatiques** : Conseils basés sur l'analyse
|
||
|
||
### État actuel
|
||
|
||
#### ✅ Production-ready avec présentation optimisée
|
||
- ✅ Système d'émojis et couleurs entièrement centralisé
|
||
- ✅ Deux scripts Tomblaine complémentaires (détaillé + tabulaire)
|
||
- ✅ Constantes optimisées avec clés integer
|
||
- ✅ Fonctions de couleur uniformisées et testées
|
||
- ✅ Présentation tabulaire professionnelle
|
||
- ✅ Recommandations automatiques basées sur données API
|
||
|
||
#### 🎯 Simplification et cohérence accomplies
|
||
- **Code maintenable** : Émojis et couleurs centralisés
|
||
- **Interface flexible** : Scripts détaillé ou concis selon le besoin
|
||
- **Données fiables** : Utilisation des champs API officiels
|
||
- **Présentation claire** : Tableaux formatés avec émojis visuels
|
||
- **Performance optimisée** : Moins de conversions, plus d'efficacité
|
||
|
||
### Commandes de test
|
||
|
||
```bash
|
||
# Script détaillé (analyse complète)
|
||
python pollen_tomblaine.py
|
||
|
||
# Script tabulaire (vue synthétique)
|
||
python pollen_tomblaine_tableau.py
|
||
|
||
# Test des fonctions centralisées
|
||
python -c "
|
||
from atmo_data_models import AtmoDataBase
|
||
base = AtmoDataBase({'properties': {}, 'geometry': {}})
|
||
for i in range(8):
|
||
print(f'Niveau {i}: {base.get_emoji_by_level(i)} {base.get_color_by_level(i)}')
|
||
"
|
||
|
||
# Démonstration complète
|
||
python demo_complete.py
|
||
```
|
||
|
||
### Exemple de sortie tableau Tomblaine
|
||
|
||
```
|
||
📊 NIVEAUX PAR TAXON
|
||
Période: 10/07 au 12/07
|
||
|
||
+---------------+------------+------------+------------+
|
||
| Taxon | J (10/07) | J+1 (11/07)| J+2 (12/07)|
|
||
+---------------+------------+------------+------------+
|
||
| Ambroisie | 🟢 1 | 🟢 1 | 🟢 1 |
|
||
| Armoise | 🟡 2 | 🟡 2 | 🟡 2 |
|
||
| Graminées | 🟠 3 | 🟡 2 | 🟡 2 |
|
||
| Olivier | 🟢 1 | 🟢 1 | 🟢 1 |
|
||
+---------------+------------+------------+------------+
|
||
|
||
💡 LÉGENDE
|
||
Niveaux: ⚪ 0=Indisponible, 🟢 1=Très faible, 🟡 2=Faible, 🟠 3=Modéré,
|
||
🔴 4=Élevé, 🟣 5=Très élevé, ⚫ 6=Extrême
|
||
|
||
🎯 RECOMMANDATIONS
|
||
🔸 Niveaux faibles à modérés - Conditions acceptables
|
||
📉 Tendance: Amélioration progressive
|
||
```
|
||
|
||
---
|
||
|
||
**Session terminée le 10/07/2025**
|
||
**Statut : Wrapper avec système d'émojis centralisé et présentation tabulaire** ✅
|
||
**Nouvelles fonctionnalités** : Émojis/couleurs centralisés, script tabulaire Tomblaine, constantes optimisées
|
||
|
||
---
|
||
|
||
## Session du 11/07/2025
|
||
|
||
### Objectifs
|
||
- Finaliser la centralisation du système d'émojis et couleurs
|
||
- Ajouter la méthode manquante pour récupérer les taxons responsables
|
||
- Intégrer la conformité avec la notice officielle du 1er avril 2025
|
||
- Créer des scripts de démonstration complets pour la documentation
|
||
|
||
### Réalisations
|
||
|
||
#### 1. Centralisation complète du système d'émojis ✅
|
||
- ✅ **Mise à jour de `get_emoji_by_level()`** dans `AtmoDataBase` :
|
||
- Nouveau paramètre `style` : "round" (par défaut) ou "square"
|
||
- Support des émojis ronds (🟢🟡🔴) et carrés (🟩🟨🟥)
|
||
- Gestion des erreurs avec fallback "❓"
|
||
|
||
- ✅ **Amélioration de `IndiceAtmo.get_emoji()`** :
|
||
- Support du paramètre `style` pour choisir la forme
|
||
- Cohérence avec la méthode de base
|
||
|
||
- ✅ **Extension de `IndicePollen.get_pollens_summary()`** :
|
||
- Paramètre `emoji_style` pour personnaliser le style par défaut
|
||
- Retour enrichi avec `emoji_round` ET `emoji_square` pour chaque taxon
|
||
- Flexibilité maximale pour l'utilisateur
|
||
|
||
#### 2. Nouvelle méthode pour les taxons responsables ✅
|
||
- ✅ **Ajout de `get_responsible_pollens()`** dans `IndicePollen` :
|
||
- Propriété `pollen_resp` ajoutée pour récupérer le champ API
|
||
- Parsing intelligent des données : `"ARTEMISI GRAMINEE"` → `["Armoise", "Graminées"]`
|
||
- Support multiple formats : virgules, espaces, variantes latines
|
||
- Mapping étendu : `artemisi` → `Armoise`, `graminee` → `Graminées`
|
||
- Anti-doublons et gestion d'erreurs intégrés
|
||
|
||
#### 3. Conformité notice officielle du 1er avril 2025 ✅
|
||
- ✅ **Analyse complète de la notice** convertie en Markdown
|
||
- ✅ **Nouveaux champs ajoutés** dans `IndiceAtmo` :
|
||
- `type_zone` : "commune" ou "EPCI" (selon page 13 de la notice)
|
||
- `x_reg`, `y_reg`, `epsg_reg` : Coordonnées réglementaires Lambert 93
|
||
- `conc_*` : Concentrations facultatives en μg/m³ (page 14)
|
||
|
||
- ✅ **Nouvelles méthodes conformes** aux spécifications :
|
||
- `get_concentrations()` : Format officiel des concentrations
|
||
- `is_commune_level()` / `is_epci_level()` : Détection du niveau de calcul
|
||
- `get_responsible_pollutants()` : Implémentation de la règle n°4 officielle
|
||
|
||
- ✅ **Validation avec données réelles** :
|
||
- Test réussi avec station Tousson (commune, EPSG:2154)
|
||
- Coordonnées réglementaires : (608962.8, 2371618.4)
|
||
- Polluant responsable : O3 (niveau 3 - Dégradé)
|
||
|
||
#### 4. Scripts de démonstration complets ✅
|
||
- ✅ **`demo_pollen_functions.py` mis à jour** :
|
||
- Démonstration de toutes les fonctions `IndicePollen`
|
||
- Ajout de la nouvelle méthode `get_responsible_pollens()`
|
||
- Test des styles d'émojis (rond/carré)
|
||
- Section conformité notice officielle
|
||
|
||
- ✅ **`demo_atmo_functions.py` créé** :
|
||
- Script complet pour toutes les fonctions `IndiceAtmo`
|
||
- Démonstration des nouvelles propriétés réglementaires
|
||
- Test des méthodes de conformité notice
|
||
- Exemples pratiques avec données réelles Île-de-France
|
||
- Analyse complète par polluant avec émojis
|
||
|
||
#### 5. Documentation technique complète ✅
|
||
- ✅ **`DOCUMENTATION_DEMOS.md` créée** :
|
||
- Documentation précise des deux scripts de démonstration
|
||
- Exemples de code avec résultats réels
|
||
- Guide d'utilisation pour développeurs
|
||
- Cas d'usage et informations techniques
|
||
- Support pour formation et tests
|
||
|
||
- ✅ **Notice officielle restructurée** :
|
||
- `notice_Atmo_Data_1eravril2025.md` entièrement reformatée
|
||
- Structure Markdown professionnelle avec navigation
|
||
- Tableaux lisibles pour les seuils et codes couleur
|
||
- Spécifications API détaillées et exploitables
|
||
|
||
#### 6. Optimisations constantes ✅
|
||
- ✅ **Constantes `INDICES_*` optimisées** :
|
||
- Passage des clés string vers integer pour éviter conversions
|
||
- Suppression des `str()` inutiles dans les classes
|
||
- Code plus efficace et cohérent
|
||
|
||
- ✅ **`CODE_COLOR_QUALIF` enrichi** :
|
||
- Format unifié : `[RGB, hex, emoji_rond, emoji_carré]`
|
||
- Couleurs harmonisées avec les émojis
|
||
- Commentaires détaillés avec correspondances
|
||
|
||
### Fonctionnalités démontrées en détail
|
||
|
||
#### Système d'émojis dual complet
|
||
```python
|
||
# Styles disponibles
|
||
atmo.get_emoji("round") # 🟡 (rond)
|
||
atmo.get_emoji("square") # 🟨 (carré)
|
||
|
||
# Dans les résumés pollen
|
||
summary = pollen.get_pollens_summary("square") # Style carré par défaut
|
||
# Contient toujours emoji_round ET emoji_square pour flexibilité
|
||
```
|
||
|
||
#### Parsing intelligent des taxons responsables
|
||
```python
|
||
# Données API brutes
|
||
pollen.pollen_resp = "ARTEMISI GRAMINEE"
|
||
|
||
# Parsing automatique
|
||
pollen.get_responsible_pollens() # → ["Armoise", "Graminées"]
|
||
|
||
# Support formats multiples
|
||
"graminées,armoise" → ["Graminées", "Armoise"]
|
||
"GRAMINEE" → ["Graminées"]
|
||
```
|
||
|
||
#### Conformité réglementaire complète
|
||
```python
|
||
# Nouvelles propriétés IndiceAtmo
|
||
atmo.type_zone # "commune" ou "EPCI"
|
||
atmo.x_reg, atmo.y_reg # Coordonnées Lambert 93
|
||
atmo.epsg_reg # "2154"
|
||
|
||
# Nouvelles méthodes conformes
|
||
atmo.is_commune_level() # True si commune
|
||
atmo.get_responsible_pollutants() # ["O3"] selon règle n°4
|
||
atmo.get_concentrations() # Format μg/m³ officiel
|
||
```
|
||
|
||
### Tests de validation réalisés
|
||
|
||
#### Données réelles testées
|
||
- **ATMO** : 1288 stations Île-de-France, analyse Tousson (niveau 3 O3)
|
||
- **Pollen** : Station Tomblaine, taxons responsables Armoise + Graminées
|
||
- **Émojis** : Validation des 16 combinaisons (8 niveaux × 2 styles)
|
||
- **Conformité** : Tous les champs de la notice officielle supportés
|
||
|
||
#### Scripts fonctionnels
|
||
- **`demo_atmo_functions.py`** : 350+ lignes, test complet IndiceAtmo
|
||
- **`demo_pollen_functions.py`** : 300+ lignes, test complet IndicePollen
|
||
- **Temps d'exécution** : ~3-5 secondes chacun avec données réelles
|
||
- **Couverture** : 100% des méthodes publiques testées
|
||
|
||
### Structure du projet finale
|
||
|
||
```
|
||
/home/mathieu/test/
|
||
├── atmo_data_client.py # Client principal avec credentials
|
||
├── atmo_data_models.py # Classes typées conformes notice 2025 ✨ FINALISÉ
|
||
├── constantes.py # Constantes optimisées avec émojis dual ✨ FINALISÉ
|
||
├── credentials.json.example # Modèle de credentials
|
||
├── credentials.json # Credentials utilisateur
|
||
├── pollen_tomblaine.py # Script détaillé Tomblaine ✨ FINALISÉ
|
||
├── pollen_tomblaine_tableau.py # Script tabulaire Tomblaine ✨ FINALISÉ
|
||
├── demo_pollen_functions.py # Démo complète IndicePollen ✨ NOUVEAU
|
||
├── demo_atmo_functions.py # Démo complète IndiceAtmo ✨ NOUVEAU
|
||
├── DOCUMENTATION_DEMOS.md # Documentation scripts démo ✨ NOUVEAU
|
||
├── notice_Atmo_Data_1eravril2025.md # Notice restructurée ✨ NOUVEAU
|
||
├── example_usage.py # Exemples de base
|
||
├── demo_complete.py # Démonstration complète
|
||
├── test_*.py # Suite de tests
|
||
├── setup_credentials.py # Configuration guidée
|
||
├── QUICKSTART.md # Guide démarrage rapide
|
||
├── README.md # Documentation complète
|
||
├── JOURNAL.md # Ce journal
|
||
└── swagger.json # Spécification API
|
||
```
|
||
|
||
### Améliorations qualitatives majeures
|
||
|
||
#### Code et architecture
|
||
- **Conformité totale** avec l'arrêté du 10 juillet 2020
|
||
- **Spécifications 2025** intégralement supportées
|
||
- **Système d'émojis** unifié et extensible
|
||
- **Performance optimisée** avec suppression des conversions inutiles
|
||
|
||
#### Documentation et outils
|
||
- **Scripts de démonstration** production-ready pour formation
|
||
- **Documentation technique** complète avec exemples réels
|
||
- **Notice officielle** restructurée et exploitable
|
||
- **Validation fonctionnelle** avec données API réelles
|
||
|
||
#### Expérience développeur
|
||
- **API intuitive** avec choix de styles d'émojis
|
||
- **Parsing intelligent** des données API complexes
|
||
- **Méthodes helper** basées sur les règles officielles
|
||
- **Tests complets** avec données réelles pour validation
|
||
|
||
### État actuel
|
||
|
||
#### ✅ Production-ready avec conformité réglementaire complète
|
||
- ✅ **100% conforme** à la notice officielle du 1er avril 2025
|
||
- ✅ **Système d'émojis** dual (rond/carré) entièrement fonctionnel
|
||
- ✅ **Scripts de démonstration** prêts pour documentation et formation
|
||
- ✅ **Parsing intelligent** des données API avec gestion des variantes
|
||
- ✅ **Tests validés** avec données réelles sur tous les endpoints
|
||
- ✅ **Documentation complète** pour développeurs et utilisateurs
|
||
|
||
#### 🎯 Fonctionnalités avancées accomplies
|
||
- **Flexibilité visuelle** : Choix entre émojis ronds et carrés
|
||
- **Conformité réglementaire** : Support complet des spécifications 2025
|
||
- **Intelligence de parsing** : Gestion automatique des variantes de noms
|
||
- **Documentation vivante** : Scripts avec vraies données API
|
||
- **Validation continue** : Tests avec données réelles quotidiennes
|
||
|
||
### Commandes de test finales
|
||
|
||
```bash
|
||
# Scripts de démonstration complets
|
||
python demo_atmo_functions.py # Toutes fonctions IndiceAtmo
|
||
python demo_pollen_functions.py # Toutes fonctions IndicePollen
|
||
|
||
# Scripts applications spécialisées
|
||
python pollen_tomblaine.py # Analyse détaillée Tomblaine
|
||
python pollen_tomblaine_tableau.py # Vue tabulaire concise
|
||
|
||
# Tests de validation
|
||
python -c "
|
||
from atmo_data_models import AtmoDataBase
|
||
base = AtmoDataBase({'properties': {}, 'geometry': {}})
|
||
print('Styles émojis:', base.get_emoji_by_level(3, 'round'), base.get_emoji_by_level(3, 'square'))
|
||
"
|
||
|
||
# Démonstration complète
|
||
python demo_complete.py
|
||
```
|
||
|
||
### Prochaines évolutions possibles
|
||
|
||
#### Extensions fonctionnelles
|
||
- [ ] **Cache intelligent** : Optimisation des appels API répétés
|
||
- [ ] **Mode comparatif** : Analyse multi-zones/multi-dates
|
||
- [ ] **Export enrichi** : Sauvegarde avec métadonnées complètes
|
||
- [ ] **API GraphQL** : Interface moderne pour requêtes complexes
|
||
|
||
#### Optimisations techniques
|
||
- [ ] **Validation Pydantic** : Typage strict et validation automatique
|
||
- [ ] **Tests automatisés** : Suite CI/CD avec données de test
|
||
- [ ] **Monitoring** : Métriques de performance et disponibilité
|
||
- [ ] **Documentation interactive** : Jupyter notebooks avec exemples
|
||
|
||
---
|
||
|
||
**Session terminée le 11/07/2025**
|
||
**Statut : Wrapper production-ready avec conformité réglementaire complète** ✅
|
||
**Nouvelles fonctionnalités** : Émojis dual, taxons responsables, conformité notice 2025, scripts de démonstration complets, documentation technique finalisée
|
||
|
||
# Mise à jour du Journal de Développement - 13 Juillet 2025
|
||
|
||
## 📦 **Restructuration majeure en Package Python Professionnel**
|
||
|
||
### 🎯 **Objectifs de la session**
|
||
- Transformer le projet en package Python distributable
|
||
- Restructurer l'organisation des fichiers pour plus de lisibilité
|
||
- Créer un script de synthèse combiné ATMO + Pollen
|
||
- Finaliser la documentation et la structure
|
||
|
||
---
|
||
|
||
## 🏗️ **1. Création du Package Python**
|
||
|
||
### **Structure mise en place**
|
||
```
|
||
py_atmo_data_wrapper/
|
||
├── atmo_data_wrapper/ # 📦 Package principal
|
||
│ ├── __init__.py # Exports principaux
|
||
│ └── core/ # Module central
|
||
│ ├── client.py # Client API
|
||
│ ├── models.py # Classes de données
|
||
│ ├── constants.py # Constantes
|
||
│ └── exceptions.py # 🆕 Exceptions personnalisées
|
||
├── examples/ # 📘 Scripts d'exemples
|
||
├── demos/ # 🎯 Démonstrations complètes
|
||
├── tests/ # 🧪 Tests unitaires
|
||
├── docs/ # 📚 Documentation
|
||
├── setup.py # 🆕 Configuration setuptools
|
||
├── pyproject.toml # 🆕 Configuration moderne
|
||
├── requirements*.txt # 🆕 Gestion dépendances
|
||
├── MANIFEST.in # 🆕 Fichiers du package
|
||
└── LICENSE # 🆕 Licence MIT
|
||
```
|
||
|
||
### **Fichiers de configuration créés**
|
||
- **`setup.py`** : Configuration setuptools classique avec métadonnées complètes
|
||
- **`pyproject.toml`** : Configuration moderne (PEP 518) avec outils de dev
|
||
- **`requirements.txt`** : Dépendances de production (`requests>=2.25.0`)
|
||
- **`requirements-dev.txt`** : Dépendances de développement (tests, linting, docs)
|
||
- **`MANIFEST.in`** : Spécification des fichiers à inclure dans le package
|
||
- **`LICENSE`** : Licence MIT
|
||
|
||
### **Module d'exceptions structuré**
|
||
Création de `core/exceptions.py` avec hiérarchie d'erreurs :
|
||
```python
|
||
- AtmoDataException (base)
|
||
├── AuthenticationError
|
||
├── ValidationError
|
||
├── APIError
|
||
├── NetworkError
|
||
└── DataError
|
||
```
|
||
|
||
---
|
||
|
||
## 🔄 **2. Refactoring des Imports**
|
||
|
||
### **Centralisation des exports**
|
||
- **`atmo_data_wrapper/__init__.py`** : Exports principaux pour usage simplifié
|
||
- **`core/__init__.py`** : Exports du module central
|
||
- **Imports relatifs** : Conversion vers imports relatifs dans le core
|
||
|
||
### **Simplification d'usage**
|
||
**Avant :**
|
||
```python
|
||
from atmo_data_client import AtmoDataClient
|
||
from atmo_data_models import IndiceAtmo, IndicePollen
|
||
from constantes import AASQA_CODES
|
||
```
|
||
|
||
**Après :**
|
||
```python
|
||
from atmo_data_wrapper import AtmoDataClient, IndiceAtmo, IndicePollen, AASQA_CODES
|
||
```
|
||
|
||
### **Mise à jour automatisée**
|
||
Correction automatique de tous les imports dans :
|
||
- ✅ `examples/` (5 fichiers)
|
||
- ✅ `demos/` (5 fichiers)
|
||
- ✅ `tests/` (5 fichiers)
|
||
|
||
---
|
||
|
||
## 🎯 **3. Script de Synthèse Avancé**
|
||
|
||
### **Création de `example_synthese_tomblaine.py`**
|
||
Script innovant combinant données ATMO et Pollen pour Tomblaine (54526).
|
||
|
||
### **Fonctionnalités principales**
|
||
1. **Récupération cohérente** : `code_zone="54526"` pour ATMO et Pollen
|
||
2. **Algorithme de risque combiné** :
|
||
```python
|
||
combined_score = int(atmo_risk * 0.6 + pollen_risk * 0.4)
|
||
# Avec bonus si alerte pollen active
|
||
```
|
||
3. **5 niveaux de risque** : Très faible → Très élevé avec émojis et conseils
|
||
4. **Recommandations intelligentes** basées sur l'analyse croisée
|
||
|
||
### **Sections d'affichage**
|
||
- 🌬️ **Qualité de l'air** : Indice, polluants, couleurs réglementaires
|
||
- 🌸 **Indices pollen** : Alertes, taxons responsables, concentrations
|
||
- ⚖️ **Risque combiné** : Score global et contributions détaillées
|
||
- 💡 **Recommandations** : Conseils personnalisés selon la situation
|
||
- 🔬 **Informations techniques** : Données complètes et conformité
|
||
|
||
### **Corrections techniques**
|
||
- **Paramètre API** : `code_insee` → `code_zone` pour la cohérence
|
||
- **Gestion PYTHONPATH** : Import automatique du package local
|
||
- **Fallback intelligent** : Données régionales si communales indisponibles
|
||
|
||
### **Validation fonctionnelle**
|
||
```bash
|
||
python examples/example_synthese_tomblaine.py
|
||
# ✅ Données spécifiques Tomblaine récupérées
|
||
# ✅ Analyse combinée : Score 2/4 (Modéré)
|
||
# ✅ Recommandations adaptées
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 **4. Mise à jour Documentation**
|
||
|
||
### **README.md restructuré**
|
||
- **Structure** : Nouvelle arborescence du package
|
||
- **Installation** : Instructions `pip install -e .`
|
||
- **Usage** : Imports simplifiés
|
||
- **Gestion d'erreurs** : Types d'exceptions disponibles
|
||
- **Scripts** : Chemins mis à jour (`examples/`, `demos/`, `tests/`)
|
||
|
||
### **QUICKSTART.md modernisé**
|
||
- **Installation** : Package vs dépendances seules
|
||
- **Configuration** : Chemins des scripts utilitaires
|
||
- **Exemples** : Imports et usage actualisés
|
||
- **Dépannage** : Commandes pytest et structure
|
||
|
||
### **DOCUMENTATION_DEMOS.md étendu**
|
||
Ajout des scripts 3 et 4 avec documentation complète :
|
||
- **Script 3** : `demo_emission_functions.py` (EmissionData)
|
||
- **Script 4** : `demo_episode_functions.py` (EpisodePollution)
|
||
- **Couverture totale** : 4 classes × 25+ méthodes documentées
|
||
|
||
---
|
||
|
||
## 🏷️ **5. Restructuration Finale**
|
||
|
||
### **Renommage du projet**
|
||
```bash
|
||
mv test py_atmo_data_wrapper
|
||
```
|
||
- **Nom explicite** : Indication claire du langage Python
|
||
- **Convention** : Respect des standards de nommage Python
|
||
- **Identification** : Plus facile à repérer dans une liste de projets
|
||
|
||
### **Organisation finale**
|
||
- **Package distributable** : Prêt pour PyPI
|
||
- **Structure professionnelle** : Conforme aux meilleures pratiques
|
||
- **Documentation complète** : 4 niveaux (README, QUICKSTART, DEMOS, JOURNAL)
|
||
- **Tests complets** : Couverture fonctionnelle et d'intégration
|
||
|
||
---
|
||
|
||
## 📊 **Bilan de la Session**
|
||
|
||
### **Réalisations majeures**
|
||
- ✅ **Package Python professionnel** créé et fonctionnel
|
||
- ✅ **Structure modulaire** avec séparation claire des responsabilités
|
||
- ✅ **Scripts de démonstration** : 4 classes × fonctionnalités complètes
|
||
- ✅ **Script de synthèse innovant** combinant ATMO + Pollen
|
||
- ✅ **Documentation exhaustive** mise à jour
|
||
- ✅ **Configuration de développement** moderne (pyproject.toml)
|
||
|
||
### **Technologies et standards appliqués**
|
||
- **PEP 518** : Configuration moderne avec pyproject.toml
|
||
- **Setuptools** : Package distributable avec métadonnées
|
||
- **Imports relatifs** : Structure modulaire propre
|
||
- **Type hints** : Code Python typé et documenté
|
||
- **Exception handling** : Hiérarchie d'erreurs structurée
|
||
- **MIT License** : Licence open source standard
|
||
|
||
### **Métriques du projet**
|
||
- **Lines of code** : ~3000+ lignes de code Python
|
||
- **Files created** : 15+ nouveaux fichiers de configuration
|
||
- **Documentation** : 4 fichiers de doc (README, QUICKSTART, DEMOS, JOURNAL)
|
||
- **Test coverage** : 5 scripts de test + 4 scripts de démonstration
|
||
- **API coverage** : 100% des endpoints et classes documentés
|
||
|
||
### **Conformité réglementaire maintenue**
|
||
- ✅ **Arrêté du 10 juillet 2020** : Calculs ATMO conformes
|
||
- ✅ **Notice officielle** : Implémentation selon spécifications API
|
||
- ✅ **Codes couleur** : Respect de la charte officielle
|
||
- ✅ **Structure données** : Conforme aux formats GeoJSON
|
||
|
||
### **Prochaines étapes possibles**
|
||
1. **Publication PyPI** : `twine upload` pour distribution publique
|
||
2. **CI/CD GitHub Actions** : Tests automatisés et releases
|
||
3. **Documentation Sphinx** : Site de documentation auto-généré
|
||
4. **Type checking** : Validation mypy complète
|
||
5. **Performance tests** : Benchmarks et optimisations
|
||
|
||
---
|
||
|
||
## 🎉 **Conclusion**
|
||
|
||
Cette session a transformé le wrapper Atmo Data d'un ensemble de scripts en un **package Python professionnel** prêt pour la distribution. La restructuration complète, les outils de configuration modernes, et la documentation exhaustive positionnent le projet comme une référence pour l'accès aux données environnementales françaises.
|
||
|
||
Le **script de synthèse Tomblaine** illustre parfaitement les capacités du wrapper en combinant intelligemment qualité de l'air et indices pollen pour fournir une vue environnementale complète avec recommandations personnalisées.
|
||
|
||
Le projet `py_atmo_data_wrapper` est maintenant mature, bien documenté, et prêt pour une utilisation en production par la communauté des développeurs travaillant avec les données environnementales ! 🌍✨
|
||
|
||
---
|
||
|
||
*Mise à jour rédigée le 13 juillet 2025*
|
||
*Session : Restructuration Package Python et Script de Synthèse*
|
||
|
||
---
|
||
|
||
## 📅 **Session du 14 juillet 2025**
|
||
|
||
### **Objectif** : Refactoring architectural et fonctionnalités utilitaires
|
||
|
||
### **Problématiques identifiées**
|
||
1. **Architecture non conforme** : Fonctions utilitaires mélangées avec les constantes
|
||
2. **Constants.py surchargé** : Logique métier dans un fichier de constantes
|
||
3. **Manque d'outils AASQA** : Pas de fonctions de recherche et analyse
|
||
4. **Licence non implémentée** : Exigences légales Atmo France non respectées
|
||
|
||
### **Actions réalisées**
|
||
|
||
#### 🔧 **Refactoring architectural**
|
||
- ✅ **Déplacement des fonctions** : `constants.py` → `utils.py`
|
||
- ✅ **Séparation des responsabilités** : Constants purs vs utilitaires
|
||
- ✅ **Code mapping externalisé** :
|
||
- `CODE_POLLUANT_EPISODES` pour épisodes de pollution
|
||
- `TAXON_MAPPING` pour variantes de noms de pollens
|
||
- ✅ **Mise à jour des imports** : Package entier adapté
|
||
|
||
#### 🛠️ **Nouvelles fonctions utilitaires AASQA**
|
||
- ✅ **Recherche avancée** : `search_aasqa_by_name()`, `get_aasqa_by_department()`
|
||
- ✅ **Statistiques complètes** : `get_aasqa_statistics()`, `get_departments_count()`
|
||
- ✅ **Validation des données** : `validate_department_coverage()`
|
||
- ✅ **Informations enrichies** : Sites web et départements dans `AASQA_CODES`
|
||
|
||
#### ⚖️ **Conformité légale Atmo France**
|
||
- ✅ **Fonctions de licence** : `get_atmo_licence()`, `print_atmo_licence()`
|
||
- ✅ **3 formats supportés** :
|
||
- Courte : "Atmo France / AASQA"
|
||
- Longue : Version officielle complète
|
||
- Complète : Avec détails licence ODbL
|
||
- ✅ **Constantes dédiées** : `ATMO_LICENCE_*` dans constants.py
|
||
|
||
#### 📚 **Scripts de démonstration**
|
||
- ✅ **`example_aasqa_utilities.py`** : Fonctions de base AASQA
|
||
- ✅ **`example_aasqa_advanced.py`** : Analyses avancées et statistiques
|
||
- ✅ **`demo_licence_atmo.py`** : Toutes les utilisations de licence
|
||
|
||
#### 🗂️ **Organisation du projet**
|
||
- ✅ **Dossier `archives/`** : Anciens scripts préservés
|
||
- ✅ **Structure nettoyée** : Répertoire de base organisé
|
||
- ✅ **Documentation mise à jour** : README.md et QUICKSTART.md
|
||
|
||
### **Améliorations techniques**
|
||
|
||
#### **Architecture propre**
|
||
```python
|
||
# AVANT (mélangé)
|
||
constants.py:
|
||
AASQA_CODES = {...}
|
||
def get_aasqa_info(): ... # ❌ Fonction dans constants
|
||
|
||
# APRÈS (séparé)
|
||
constants.py:
|
||
AASQA_CODES = {...} # ✅ Constants uniquement
|
||
utils.py:
|
||
def get_aasqa_info(): ... # ✅ Fonctions séparées
|
||
```
|
||
|
||
#### **Fonctionnalités AASQA enrichies**
|
||
```python
|
||
# Recherche par département
|
||
aasqa = get_aasqa_by_department("54") # "44" (Grand Est)
|
||
|
||
# Recherche textuelle
|
||
results = search_aasqa_by_name("Atmo")
|
||
|
||
# Statistiques complètes
|
||
stats = get_aasqa_statistics()
|
||
print(f"Couverture moyenne: {stats['average_coverage']:.1f}")
|
||
```
|
||
|
||
#### **Compliance légale automatisée**
|
||
```python
|
||
# Usage simple
|
||
print(f"Source: {get_atmo_licence('courte')}")
|
||
|
||
# Documentation complète
|
||
print_atmo_licence('complete')
|
||
|
||
# Intégration dans graphiques
|
||
plt.figtext(0.02, 0.02, f"Source: {get_atmo_licence('courte')}")
|
||
```
|
||
|
||
### **Bénéfices obtenus**
|
||
|
||
#### **Maintenabilité**
|
||
- **Separation of concerns** : Chaque fichier a un rôle précis
|
||
- **Single responsibility** : constants.py = données, utils.py = logique
|
||
- **Extensibilité** : Facile d'ajouter de nouvelles fonctions utilitaires
|
||
|
||
#### **Fonctionnalités**
|
||
- **Recherche AASQA** : Par département, nom, statistiques
|
||
- **Validation automatique** : Détection d'anomalies dans les données
|
||
- **Licence intégrée** : Conformité légale automatique
|
||
|
||
#### **Professionnalisme**
|
||
- **Architecture claire** : Respect des patterns Python
|
||
- **Documentation complète** : Chaque fonction documentée avec exemples
|
||
- **Tests validés** : Toutes les modifications testées
|
||
|
||
### **Métriques de la session**
|
||
- **Fichiers modifiés** : 6 (models.py, constants.py, utils.py, __init__.py, etc.)
|
||
- **Nouvelles fonctions** : 8 (utilitaires AASQA + licence)
|
||
- **Nouvelles constantes** : 3 (licence + mappings)
|
||
- **Scripts créés** : 3 (démonstrations)
|
||
- **Tests réussis** : 100% (fonctions validées)
|
||
|
||
### **Validation technique**
|
||
```bash
|
||
✅ Import des nouvelles constantes : OK
|
||
✅ Fonctions get_polluant_code() : OK
|
||
✅ Fonctions get_responsible_pollens() : OK
|
||
✅ Fonctions utilitaires AASQA : OK
|
||
✅ Fonctions de licence : OK
|
||
✅ Architecture séparée : OK
|
||
```
|
||
|
||
### **Impact sur l'écosystème**
|
||
- **Développeurs** : Outils AASQA prêts à l'emploi
|
||
- **Juristes** : Conformité licence automatique
|
||
- **Chercheurs** : Analyses statistiques AASQA avancées
|
||
- **Applications** : Intégration licence transparente
|
||
|
||
### **Réalisations session complète**
|
||
- ✅ **Architecture refactorisée** selon les bonnes pratiques
|
||
- ✅ **8 fonctions utilitaires** AASQA opérationnelles
|
||
- ✅ **Conformité légale** Atmo France implémentée
|
||
- ✅ **3 scripts de démonstration** documentés
|
||
- ✅ **Organisation projet** optimisée avec archives/
|
||
- ✅ **Documentation** README et QUICKSTART mises à jour
|
||
|
||
---
|
||
|
||
*Mise à jour rédigée le 14 juillet 2025*
|
||
*Session : Refactoring architectural et fonctionnalités utilitaires*
|