# PAV decisionnel - prototype local

Projet FastAPI + PostgreSQL/PostGIS + Leaflet pour tester un premier tableau de bord d'aide a la decision autour des PAV instrumentes.

Le projet reprend la logique du compteur foncier :

- une application FastAPI simple (`app.py`) ;
- une interface cartographique dans `static/index.html` ;
- une configuration par `.env` ;
- des scripts SQL pour creer les vues stables et les index ;
- des croisements avec les donnees deja presentes dans le schema du compteur foncier.

## 1. Principe general

La table brute des capteurs peut evoluer ou etre rechargee souvent. Le tableau de bord ne lit pas directement tous les tags dans l'interface : il passe par des vues SQL stables.

```text
capteurs_fibre."capteurs_donnees" ou capteurs_fibre."capteurs_données"
        -> vues SQL v_pav_latest et v_pav_saturation_rate
        -> API FastAPI
        -> carte Leaflet et indicateurs
```

Les nouveaux `tagreference` seront ignores tant qu'ils ne sont pas utiles aux indicateurs. Tant que les colonnes techniques de la table brute restent stables (`deviceidentifier`, `tagreference`, `value`, `timestamp`, `date`, `isevent`), la mise a jour de la table ne doit pas poser de probleme.

## 2. Indicateurs V1 integres

1. Population a moins de 400 m d'un PAV.
2. Volume disponible / capacite accessible par habitant a 400 m.
3. Volume disponible par commune.
4. Taux de remplissage moyen et taux pondere par volume.
5. Batiments a moins de 50 m d'un PAV via fichiers fonciers + cadastre.
6. Taux de jours en saturation, avec saturation definie par `FT_percent_of_bin_used >= 95`.
7. Logements Sitadel autorises dans un rayon de 300 m.

## 3. Tables attendues

### Schema capteurs

Par defaut : `capteurs_fibre`.

Tables attendues :

- `capteurs_données` ou `capteurs_donnees`, selon le nom reel dans PostgreSQL ;
- `capteurs_points` ;
- `Filosofi2017_carreaux_200m_met`.

La table Filosofi est configuree avec le nom exact conserve, sans conversion en minuscules :

```env
FILOSOFI_SCHEMA=capteurs_fibre
FILOSOFI_TABLE=Filosofi2017_carreaux_200m_met
FILOSOFI_IND_COL=Ind
FILOSOFI_GEOM_COL=geom
```

### Schema compteur foncier

Par defaut : `compteur_foncier`.

Tables reutilisees :

- `commune_aula_admin_express_2025` ;
- `cadastre` ;
- `ff_2023` ;
- `sitadel_aula_dido_newlog_13_25`.

## 4. Installation locale

```bash
cd pav-decisionnel-local
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
```

Sous Windows :

```bat
cd pav-decisionnel-local
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
```

Puis modifier `.env` avec vos parametres de connexion PostgreSQL.

## 5. Creation des vues et index

Apres avoir verifie le nom exact de la table capteurs, executer :

```bash
psql -h <host> -p <port> -U <user> -d <database> -f sql/01_views_capteurs.sql
psql -h <host> -p <port> -U <user> -d <database> -f sql/02_indexes_recommandes.sql
```

Ou utiliser le script :

```bash
./setup_db.sh
```

Sous Windows :

```bat
setup_db.bat
```

Les scripts supposent que `psql` est installe et accessible dans le PATH.

## 6. Lancement

```bash
./run_dev.sh
```

Sous Windows :

```bat
run_dev.bat
```

Application :

```text
http://localhost:8000
```

## 7. Endpoints utiles

```text
/api/health
/api/debug/columns?schema=capteurs_fibre&table=Filosofi2017_carreaux_200m_met
/api/debug/columns?schema=capteurs_fibre&table=capteurs_données
/api/tags
/api/epci
/api/communes
/api/pav/devices
/api/pav/points?deviceIdentifier=<id_pav>
/api/pav/stats?deviceIdentifier=<id_pav>
```

## 8. Controle de la table Filosofi

```sql
SELECT COUNT(*) AS nb_carreaux
FROM capteurs_fibre."Filosofi2017_carreaux_200m_met";

SELECT SUM("Ind") AS population_totale
FROM capteurs_fibre."Filosofi2017_carreaux_200m_met";

SELECT ST_SRID(geom) AS srid, COUNT(*)
FROM capteurs_fibre."Filosofi2017_carreaux_200m_met"
GROUP BY ST_SRID(geom);
```

## 9. Points a adapter si besoin

### Nom de la table capteurs

Dans `.env` :

```env
PAV_DATA_TABLE=capteurs_données
```

Si la table est sans accent :

```env
PAV_DATA_TABLE=capteurs_donnees
```

Le script SQL `sql/01_views_capteurs.sql` contient aussi le nom de table. Si besoin, remplacer :

```sql
capteurs_fibre."capteurs_données"
```

par :

```sql
capteurs_fibre.capteurs_donnees
```

### Champ logement Sitadel

Le champ par defaut est :

```env
SIT_NB_LOG_COL=nb_logements_autorises
```

Verifier le nom exact avec :

```text
/api/debug/columns?schema=compteur_foncier&table=sitadel_aula_dido_newlog_13_25
```

Puis modifier `.env` si necessaire.

## 10. Pourquoi la mise a jour capteurs est robuste

- La table brute peut etre alimentee en continu.
- La vue `v_pav_latest` reprend automatiquement la derniere valeur connue par PAV et par tag.
- La vue `v_pav_saturation_rate` recalcule le taux de jours en saturation a partir de l'historique.
- L'API interroge les vues, pas une table pivot figee.
- Les nouveaux tags n'ont pas d'impact tant qu'ils ne remplacent pas les tags utilises par les indicateurs V1.

## 11. Tags PAV utilises dans la V1

- `FT_percent_of_bin_used`
- `FT_volume_bin`
- `DT_temperature`
- `DT_distance_cm`
- `CT_Address`
- `CT_Latitude`
- `CT_Longitude`
- `PT_bin_empty_threshold`
- `PT_bin_full_threshold`
- `PT_container_width`
- `PT_container_length`
- `PT_temperature_threshold_high`
- `PT_temperature_threshold_low`

## 12. Evolution de style et filtre PAV

Cette version conserve les principes techniques du compteur foncier, mais l'interface a ete reorganisee :

- carte Leaflet en plein ecran, utilisee comme support central ;
- filtres flottants en haut de l'ecran ;
- panneaux d'indicateurs flottants autour de la carte ;
- filtre direct par identifiant PAV (`deviceIdentifier`) ;
- liste de PAV alimentee par l'endpoint `/api/pav/devices` ;
- bouton dans la popup cartographique pour filtrer rapidement sur un PAV.

Le filtre PAV est applique sur la vue stable `v_pav_latest`, donc il reste compatible avec une table capteurs rechargee regulierement, tant que le champ d'identifiant reste disponible dans les donnees capteurs et dans `capteurs_points`.
