@open3cl/engine 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/10_besoin_fr.spec.js +1 -0
  2. package/10_clim.spec.js +1 -0
  3. package/11_besoin_ecs.spec.js +1 -0
  4. package/11_ecs.spec.js +1 -0
  5. package/12.4_pac.spec.js +1 -0
  6. package/13.2_generateur_combustion.spec.js +3 -3
  7. package/13.2_generateur_combustion_ch.spec.js +3 -3
  8. package/14_generateur_ecs.spec.js +1 -0
  9. package/15_conso_aux.spec.js +3 -3
  10. package/2021_04_13_confort_ete.spec.js +1 -0
  11. package/3.1_b.spec.js +1 -0
  12. package/3.2.1_mur.spec.js +1 -0
  13. package/3.2.2_plancher_bas.spec.js +1 -0
  14. package/3.2.3_plancher_haut.spec.js +1 -0
  15. package/3.3.1.4_porte.spec.js +1 -0
  16. package/3.3_baie_vitree.spec.js +1 -0
  17. package/3.4_pont_thermique.spec.js +1 -0
  18. package/4_ventilation.spec.js +1 -0
  19. package/5_conso_ventilation.spec.js +1 -0
  20. package/6.2_surface_sud_equivalente.spec.js +1 -0
  21. package/9_besoin_ch.spec.js +1 -0
  22. package/9_chauffage.spec.js +3 -3
  23. package/9_conso_ch.spec.js +1 -0
  24. package/9_emetteur_ch.spec.js +1 -0
  25. package/9_generateur_ch.spec.js +1 -0
  26. package/README.md +412 -291
  27. package/conso.spec.js +1 -0
  28. package/engine.js +3 -1
  29. package/engine.spec.js +1 -0
  30. package/package.json +15 -14
  31. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
  32. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
  33. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
  34. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
  35. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
  36. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
  37. package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
  38. package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
  39. package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
  40. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
  41. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
  42. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
  43. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
  44. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
  45. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
  46. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
  47. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
  48. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +0 -508
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  <a id="readme-top"></a>
2
+
2
3
  [![Contributors][contributors-shield]][contributors-url]
3
4
  [![Forks][forks-shield]][forks-url]
4
5
  [![Stargazers][stars-shield]][stars-url]
@@ -17,79 +18,237 @@ Implémentation open source du moteur Open3CL de l'ADEME.
17
18
 
18
19
  ![Javascript][Javascript]
19
20
 
20
- <br/>
21
- <a href="https://github.com/Open3CL/issues/new?labels=bug&template=bug-report---.md">Créer un bug</a>
21
+ <br/>
22
+ <a href="https://github.com/Open3CL/engine/issues/new?labels=bug&template=bug-report---.md">Créer un bug</a>
23
+ &middot;
24
+ <a href="https://github.com/Open3CL/engine/issues/new?labels=enhancement&template=feature-request---.md">Créer une feature</a>
25
+ &middot;
26
+ <a href="https://open3cl.github.io/engine/build/">Démo en ligne</a>
22
27
  &middot;
23
- <a href="https://github.com/Open3CL/issues/new?labels=enhancement&template=feature-request---.md">Créer une feature</a>
28
+ <a href="https://open3cl.github.io/engine/reports/corpus">Rapports de corpus</a>
24
29
  </p>
25
30
  </div>
26
31
 
32
+ <div align="center">
33
+
34
+ **Donnez-lui un DPE au format XML ou JSON, il vous rend les consommations, les émissions et les étiquettes.**
35
+
36
+ </div>
37
+
27
38
  <details>
28
- <summary>Sommaire</summary>
39
+ <summary>📚 Sommaire</summary>
29
40
  <ol>
30
- <li>
31
- <a href="#a-propos-du-projet">A propos du projet</a>
41
+ <li><a href="#-à-propos-du-projet">À propos du projet</a>
42
+ <ul>
43
+ <li><a href="#ce-que-fait-le-moteur">Ce que fait le moteur</a></li>
44
+ <li><a href="#périmètre-couvert">Périmètre couvert</a></li>
45
+ <li><a href="#lécosystème-open3cl">L'écosystème Open3CL</a></li>
46
+ </ul>
32
47
  </li>
33
- <li>
34
- <a href="#demarrage">Démarrage</a>
48
+ <li><a href="#-démarrage">Démarrage</a>
35
49
  <ul>
36
- <li><a href="#pre-requis">Pre-requis</a></li>
50
+ <li><a href="#pré-requis">Pré-requis</a></li>
37
51
  <li><a href="#installation">Installation</a></li>
38
- <li><a href="#documentation">Documentation</a></li>
52
+ <li><a href="#en-30-secondes">En 30 secondes</a></li>
53
+ </ul>
54
+ </li>
55
+ <li><a href="#-utilisation">Utilisation</a>
56
+ <ul>
57
+ <li><a href="#api-publique">API publique</a></li>
58
+ <li><a href="#options-de-calcul">Options de calcul</a></li>
59
+ <li><a href="#lire-le-résultat">Lire le résultat</a></li>
60
+ <li><a href="#tester-un-dpe-sans-écrire-de-code">Tester un DPE sans écrire de code</a></li>
61
+ </ul>
62
+ </li>
63
+ <li><a href="#-tests-de-corpus">Tests de corpus</a>
64
+ <ul>
65
+ <li><a href="#le-rapport-interactif">Le rapport interactif</a></li>
66
+ <li><a href="#lancer-un-corpus">Lancer un corpus</a></li>
67
+ <li><a href="#résultats-corpus">Résultats corpus</a></li>
39
68
  </ul>
40
69
  </li>
41
- <li><a href="#usage">Usage</a></li>
42
- <li><a href="#rapports">Rapports</a></li>
43
- <li><a href="#roadmap">Roadmap</a></li>
44
- <li><a href="#contribution">Contribution</a></li>
45
- <li><a href="#license">License</a></li>
46
- <li><a href="#contact">Contact</a></li>
47
- <li><a href="#acknowledgments">Acknowledgments</a></li>
70
+ <li><a href="#-roadmap">Roadmap</a></li>
71
+ <li><a href="#-contribuer">Contribuer</a></li>
72
+ <li><a href="#-licence">Licence</a></li>
73
+ <li><a href="#-contact">Contact</a></li>
74
+ <li><a href="#-remerciements">Remerciements</a></li>
48
75
  </ol>
49
76
  </details>
50
77
 
51
- ## A propos du projet
78
+ ---
79
+
80
+ ## 🌍 À propos du projet
81
+
82
+ **Open3CL** est une librairie JavaScript open source qui calcule un **Diagnostic de Performance Énergétique (DPE)**.
83
+ Elle implémente la méthode **3CL-DPE 2021** définie dans
84
+ [l'annexe 1 de l'arrêté du 31 mars 2021](https://rt-re-batiment.developpement-durable.gouv.fr/IMG/pdf/consolide_annexe_1_arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf),
85
+ la même méthode que celle utilisée par les logiciels certifiés du marché.
86
+
87
+ Concrètement : vous lui fournissez les **données d'entrée** d'un DPE (l'enveloppe du bâtiment, les systèmes de
88
+ chauffage,
89
+ d'ECS, de ventilation, de climatisation) et elle recalcule **l'intégralité des sorties** — déperditions, besoins,
90
+ consommations, émissions de gaz à effet de serre, coûts et étiquettes.
91
+
92
+ | | |
93
+ | :---------------------- | :--------------------------------------------------------------------------------------------------------- |
94
+ | 🎯 **Conforme** | Implémente la méthode réglementaire 3CL-DPE 2021, article par article |
95
+ | 🔍 **Vérifiable** | ~90 000 DPE réels rejoués à chaque version, résultats publiés (voir [Résultats corpus](#résultats-corpus)) |
96
+ | 🧩 **Sans dépendance** | Pure JavaScript (ESM), aucun service externe, fonctionne en Node.js comme dans un navigateur |
97
+ | 📦 **Prête à intégrer** | Entrée XML ADEME ou objet JSON, sortie JSON complète |
98
+ | 🆓 **Libre** | Licence GPL-3.0, développée au grand jour |
99
+
100
+ ### Ce que fait le moteur
101
+
102
+ ```mermaid
103
+ flowchart LR
104
+ A["📄 DPE<br/>XML ou JSON"] --> B["🧹 Sanitisation<br/>normalisation des entrées"]
105
+ B --> C["🧱 Enveloppe<br/>déperditions, inertie,<br/>ponts thermiques"]
106
+ C --> D["🌡️ Besoins<br/>chauffage, ECS,<br/>refroidissement"]
107
+ D --> E["⚙️ Systèmes<br/>générateurs, émetteurs,<br/>auxiliaires"]
108
+ E --> F["🔌 Consommations<br/>EF, EP, GES, coûts"]
109
+ F --> G["🏷️ Étiquettes<br/>DPE & climat"]
110
+ ```
111
+
112
+ <details>
113
+ <summary><strong>Le détail des étapes de calcul</strong></summary>
114
+
115
+ | Étape | Ce qui est calculé |
116
+ | :-------------------- | :---------------------------------------------------------------------------------------------------- |
117
+ | **Sanitisation** | Normalisation et correction des données d'entrée incohérentes (optionnelle) |
118
+ | **Enveloppe** | Déperditions des murs, planchers, baies, portes, ponts thermiques, renouvellement d'air, perméabilité |
119
+ | **Inertie & confort** | Classe d'inertie, confort d'été, qualité d'isolation |
120
+ | **Besoins** | Besoins de chauffage et d'ECS mensuels, apports solaires et internes, besoin de refroidissement |
121
+ | **Systèmes** | Rendements de génération / distribution / émission / stockage, pertes, intermittence |
122
+ | **Auxiliaires** | Consommations des auxiliaires de génération et de distribution (chauffage et ECS) |
123
+ | **Consommations** | Énergie finale, énergie primaire, émissions de GES, coûts par usage et par énergie |
124
+ | **Étiquettes** | Classe énergie et classe climat, y compris la projection avec le coefficient EP 1,7 |
125
+
126
+ </details>
127
+
128
+ ### Périmètre couvert
129
+
130
+ | Type de DPE | Statut |
131
+ | :-------------------------------------------- | :--------------------------- |
132
+ | Maison individuelle | ✅ Supporté |
133
+ | Appartement (chauffage individuel) | ✅ Supporté |
134
+ | Appartement (chauffage collectif ou mixte) | ✅ Supporté |
135
+ | Immeuble collectif | ✅ Supporté |
136
+ | Appartement généré à partir d'un DPE immeuble | 🚧 En cours de fiabilisation |
137
+ | Photovoltaïque | 🚧 En cours |
138
+
139
+ > [!NOTE]
140
+ > Le moteur vise la **reproduction fidèle** des sorties des logiciels certifiés, y compris certains de leurs écarts à la
141
+ > méthode.
52
142
 
53
- Open3CL est une librairie JavaScript open source, spécialement conçue pour faciliter le calcul des Diagnostics de
54
- Performance Énergétique (DPE). Elle implémente la norme définie
55
- dans [l'annexe 1 de l'arrêté du 31 mars 2021](https://rt-re-batiment.developpement-durable.gouv.fr/IMG/pdf/consolide_annexe_1_arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf).
56
- Elle est destinée aux développeurs qui souhaitent intégrer des calculs énergétiques précis et conformes à la
57
- réglementation dans leurs applications.
143
+ ### L'écosystème Open3CL
144
+
145
+ | Ressource | Description |
146
+ | :-------------------------------------------------------------------- | :------------------------------------------------------------- |
147
+ | [open3cl.fr](https://open3cl.fr) | Le site du projet |
148
+ | [Démonstrateur](https://open3cl.github.io/engine/build/) | Chargez un DPE XML et comparez les sorties du moteur, en ligne |
149
+ | [Rapports de corpus](https://open3cl.github.io/engine/reports/corpus) | Le tableau de bord interactif des résultats sur DPE réels |
150
+ | [@open3cl/engine](https://www.npmjs.com/package/@open3cl/engine) | Le paquet npm |
58
151
 
59
152
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
60
153
 
61
- ## Démarrage
154
+ ---
155
+
156
+ ## 🚀 Démarrage
157
+
158
+ ### Pré-requis
62
159
 
63
- ### Pre-requis
160
+ | Outil | Version |
161
+ | :---------- | :-------- |
162
+ | **Node.js** | ≥ 24.14.1 |
163
+ | **npm** | ≥ 11.11.0 |
64
164
 
65
- Vous devez d'abord installer [NodeJS](https://nodejs.org/en) en version 20 ou supérieure.
165
+ La version exacte utilisée en développement et en CI est fixée dans [`.nvmrc`](.nvmrc) (`nvm use`).
66
166
 
67
167
  ### Installation
68
168
 
69
169
  ```sh
70
- npm install @open3cl/engine
170
+ npm install @open3cl/engine
171
+ ```
172
+
173
+ <details>
174
+ <summary>Avec un autre gestionnaire de paquets</summary>
175
+
176
+ ```sh
177
+ yarn add @open3cl/engine
178
+ pnpm add @open3cl/engine
71
179
  ```
72
180
 
73
- ## Démonstration
181
+ </details>
182
+
183
+ ### En 30 secondes
184
+
185
+ ```javascript
186
+ import { calcul_3cl_xml } from '@open3cl/engine';
187
+ import { readFileSync } from 'node:fs';
188
+
189
+ const dpe = calcul_3cl_xml(readFileSync('./mon-dpe.xml', 'utf8'));
190
+
191
+ const { ep_conso, emission_ges } = dpe.logement.sortie;
192
+
193
+ console.log(`Étiquette énergie : ${ep_conso.classe_bilan_dpe}`);
194
+ console.log(`Consommation : ${ep_conso.ep_conso_5_usages_m2} kWh/m²/an`);
195
+ console.log(`Étiquette climat : ${emission_ges.classe_emission_ges}`);
196
+ console.log(`Émissions : ${emission_ges.emission_ges_5_usages_m2} kgCO₂/m²/an`);
197
+ ```
198
+
199
+ ```text
200
+ Étiquette énergie : D
201
+ Consommation : 174 kWh/m²/an
202
+ Étiquette climat : C
203
+ Émissions : 30 kgCO₂/m²/an
204
+ ```
205
+
206
+ > [!TIP]
207
+ > Les fichiers XML de n'importe quel DPE publié sont téléchargeables depuis
208
+ > [l'observatoire de l'ADEME](https://observatoire-dpe-audit.ademe.fr/). C'est le moyen le plus simple de tester le
209
+ > moteur sur un cas réel.
210
+
211
+ <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
212
+
213
+ ---
214
+
215
+ ## 🛠️ Utilisation
74
216
 
75
- Il est possible d'analyser un dpe pour tester la lib
76
- Open3CL: [https://open3cl.github.io/engine](https://open3cl.github.io/engine/build/). Un dpe au format XML peut être
77
- chargé, il sera envoyé à la lib Open3CL. Un visuel permet de voir les informations du dpe d'origine ainsi que du dpe en
78
- sortie de la lib ainsi qu'un différentiel.
217
+ ### API publique
79
218
 
80
- C'est un bon moyen de détecter un éventuel problème dans le dpe ou la librairie.
219
+ | Fonction | Entrée | Description |
220
+ | :------------------------------ | :---------- | :--------------------------------------------------------- |
221
+ | `calcul_3cl(dpe, options?)` | Objet JSON | Calcule un DPE et renvoie l'objet enrichi de ses sorties |
222
+ | `calcul_3cl_xml(xml, options?)` | Chaîne XML | Parse le XML puis appelle `calcul_3cl` |
223
+ | `get_classe_ges_dpe(dpe)` | DPE calculé | Recalcule les étiquettes énergie et climat |
224
+ | `get_conso_coeff_1_7_2027(dpe)` | DPE calculé | Projette la consommation avec le coefficient EP 1,7 (2027) |
225
+ | `getVersion()` | – | Version du moteur utilisée |
81
226
 
82
- ## Utilisation
227
+ ### Options de calcul
83
228
 
84
229
  ```javascript
85
- import { @open3cl } from 'open3cl/engine';
86
- import {
87
- set_bug_for_bug_compat,
88
- } from '@open3cl/engine/utils.js';
230
+ import { calcul_3cl, calcul_3cl_xml } from '@open3cl/engine';
89
231
 
90
- set_bug_for_bug_compat();
232
+ // Depuis un objet JSON — sanitisation activée par défaut
233
+ const a = calcul_3cl(dpeData);
234
+ const b = calcul_3cl(dpeData, { sanitize: true }); // équivalent
91
235
 
92
- // Exemple d'objet JSON (partiel) issu d'un fichier XML DPE
236
+ // Sans pré-transformation : les données d'entrée sont utilisées telles quelles
237
+ const c = calcul_3cl(dpeData, { sanitize: false });
238
+
239
+ // Depuis un XML ADEME
240
+ const d = calcul_3cl_xml(xmlString);
241
+ const e = calcul_3cl_xml(xmlString, { sanitize: false });
242
+ ```
243
+
244
+ | Option | Défaut | Effet |
245
+ | :--------- | :----- | :----------------------------------------------------------------------------------------------------- |
246
+ | `sanitize` | `true` | Normalise et corrige les incohérences du DPE d'entrée avant calcul. Désactivez-le pour un calcul brut. |
247
+
248
+ <details>
249
+ <summary><strong>Exemple d'objet JSON d'entrée (partiel)</strong></summary>
250
+
251
+ ```javascript
93
252
  const dpeData = {
94
253
  numero_dpe: '2113E1018248X',
95
254
  statut: 'ACTIF',
@@ -104,311 +263,273 @@ const dpeData = {
104
263
  description: 'Chaudière individuelle gaz standard',
105
264
  surface_chauffee: 49.96,
106
265
  generateur_chauffage_collection: {
107
- generateur_chauffage: [{description: '...'}]
266
+ generateur_chauffage: [{ description: '...' }]
108
267
  }
109
268
  }
110
269
  ]
111
270
  }
112
271
  }
113
272
  };
273
+ ```
114
274
 
115
- // Execution d'un dpe avec la librairie Open3CL avec pré-transformation / nettoyage du dpe (comportement par défaut)
116
- const result = calcul_3cl(dpeData);
117
- const result = calcul_3cl(dpeData, {sanitize: true});
275
+ La structure attendue est celle du **XML DPE de l'ADEME**, converti en JSON. Les types complets sont décrits dans
276
+ [`types.d.ts`](types.d.ts).
118
277
 
119
- // Execution d'un dpe avec la librairie Open3CL sans pré-transformation / nettoyage du dpe
120
- const result = calcul_3cl(dpeData, {sanitize: false});
278
+ </details>
121
279
 
122
- // Execution d'un dpe au format xml avec la librairie Open3CL avec pré-transformation / nettoyage du dpe (comportement par défaut)
123
- const result = calcul_3cl_xml('<xml><dpe><numero_dpe>2113E1018248X</numero_dpe></dpe</xml>');
124
- const result = calcul_3cl_xml('<xml><dpe><numero_dpe>2113E1018248X</numero_dpe></dpe</xml>', {
125
- sanitize: true
126
- });
280
+ ### Lire le résultat
127
281
 
128
- // Execution d'un dpe au format xml avec la librairie Open3CL sans pré-transformation / nettoyage du dpe (comportement par défaut)
129
- const result = calcul_3cl_xml('<xml><dpe><numero_dpe>2113E1018248X</numero_dpe></dpe</xml>', {
130
- sanitize: false
131
- });
132
- ```
282
+ Le DPE renvoyé est l'objet d'entrée, enrichi de `logement.sortie` :
133
283
 
134
- ## Variables d'environnements
284
+ | Chemin | Contenu |
285
+ | :----------------------------------------- | :----------------------------------------------------- |
286
+ | `sortie.deperdition` | Déperditions par paroi et déperdition d'enveloppe (GV) |
287
+ | `sortie.apport_et_besoin` | Besoins de chauffage et d'ECS, apports, `nadeq` |
288
+ | `sortie.ef_conso` | Consommations en énergie finale, par usage |
289
+ | `sortie.ep_conso` | Énergie primaire, `classe_bilan_dpe`, projection 2027 |
290
+ | `sortie.emission_ges` | Émissions de GES et `classe_emission_ges` |
291
+ | `sortie.cout` | Coûts annuels par usage |
292
+ | `sortie.confort_ete` / `qualite_isolation` | Indicateurs de confort d'été et de qualité d'isolation |
293
+ | `sortie.production_electricite` | Production photovoltaïque |
135
294
 
136
- | Nom | Description |
137
- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
138
- | DPE_FOLDER_PATH | **Obligatoire**: Chemin vers lequel sont stockés les fichiers DPE (si non précisé, utiliser `dpes-folder-path` dans la ligne de commande |
139
- | ADEME_API_CLIENT_ID | Client id pour l'api de l'ademe |
140
- | ADEME_API_CLIENT_SECRET | Client secret pour l'api de l'ademe |
141
- | MAX_WORKER_THREADS | Nombre de threads maximum pour les tests de corpus, par défaut: os.availableParallelism \* 1.5 |
142
- | WORKER_THREADS_CHUNKS | Nombre de dpe à analyser par thread, par défaut: 200 |
143
- | DOWNLOAD_DPE_WAIT | Temps d'attente en ms entre chaque dpe à télécharge, par défaut: 1s |
144
- | SCW_ACCESS_KEY | Client id pour l'api scaleway |
145
- | SCW_SECRET_KEY | Client secret pour l'api scaleway |
146
- | S3_REGION | Region du bucket S3 dans lequel sont sauvegardés les DPE |
147
- | S3_ENDPOINT | Url du endpoint du bucket S3 dans lequel sont sauvegardés les DPE |
148
- | DOWNLOAD_DPE_WAIT | Temps d'attente en ms entre chaque dpe à télécharge, par défaut: 1s |
295
+ ### Tester un DPE sans écrire de code
149
296
 
150
- Attention aux quotas sur l'api:
297
+ Le [démonstrateur en ligne](https://open3cl.github.io/engine/build/) accepte un DPE au format XML, l'envoie au moteur et
298
+ affiche **côte à côte** les valeurs du DPE d'origine, celles calculées par Open3CL, et le différentiel.
151
299
 
152
- - 100 requêtes / seconde
153
- - 1000 requêtes / minute
154
- - 10000 requêtes / jour
300
+ C'est le moyen le plus rapide de qualifier un écart : problème dans le DPE d'origine, ou bug dans la librairie ?
155
301
 
156
- Dans le cas où un corpus est joué avec beaucoup de dpe à télécharger via l'api de l'ademe (car non présent en local), la
157
- meilleure configuration est:
302
+ <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
158
303
 
159
- - `export MAX_WORKER_THREADS=10`
160
- - `export API_ADEME_DOWNLOAD_WAIT=1000`
161
- - `export WORKER_THREADS_CHUNKS=300`
304
+ ---
162
305
 
163
- <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
306
+ ## 🧪 Tests de corpus
164
307
 
165
- ## Corpus
308
+ > Un corpus, c'est une liste de numéros de DPE réels. Le moteur les rejoue **tous**, compare ses sorties à celles du
309
+ > DPE publié, et en tire un taux de conformité. C'est le principal indicateur de qualité du projet.
166
310
 
167
- ### Introduction
311
+ ```mermaid
312
+ flowchart LR
313
+ A["📋 Liste de<br/>numéros DPE"] --> B["⬇️ Téléchargement<br/>API ADEME<br/><sub>ou cache local</sub>"]
314
+ B --> C["⚙️ Calcul<br/>Open3CL"]
315
+ C --> D["📐 Comparaison<br/><sub>écart ≤ 5 %</sub>"]
316
+ D --> E["📊 Rapports<br/>JSON · CSV · HTML"]
317
+ ```
318
+
319
+ **22 grandeurs** sont comparées pour chaque DPE. Quatre d'entre elles sont **bloquantes** : un DPE n'est déclaré
320
+ conforme
321
+ que si **toutes** restent sous le seuil de tolérance de **5 %**.
322
+
323
+ | Contrôle bloquant | Ce que c'est |
324
+ | :----------------------------------------------------- | :---------------------------------- |
325
+ | `sortie.ef_conso.conso_ecs` | Consommation d'eau chaude sanitaire |
326
+ | `sortie.ef_conso.conso_ch` | Consommation de chauffage |
327
+ | `sortie.ep_conso.ep_conso_5_usages` (ou `_m2`) | Consommation en énergie primaire |
328
+ | `sortie.emission_ges.emission_ges_5_usages` (ou `_m2`) | Émissions de gaz à effet de serre |
168
329
 
169
- Les tests de corpus consistent à analyser une liste de numéro de DPE présent dans un fichier CSV.
330
+ 📖 **Guide complet** : [docs/CORPUS.md](docs/CORPUS.md) — liste des corpus, contrôles informatifs, variables
331
+ d'environnement, quotas de l'API ADEME, structure des rapports.
170
332
 
171
- - Pour chaque DPE, le fichier est téléchargé si pas déjà présent en local, et il est envoyé à la librairie Open3CL.
172
- - On analyse en sortie de la lib certaines valeurs que l'on compare aux valeurs du DPE initial.
173
- - **Le seuil de tolérance est fixé par défaut à 5%**.
333
+ ### Le rapport interactif
334
+
335
+ Chaque exécution produit un tableau de bord HTML : jauge de réussite, ratio par contrôle, liste des DPE au-dessus du
336
+ seuil avec le **détail des propriétés en écart**, et comparaison entre deux branches.
337
+
338
+ <div align="center">
339
+ <a href="https://open3cl.github.io/engine/reports/corpus">
340
+ <img src="images/corpus-report.png" alt="Rapport de corpus Open3CL" width="900">
341
+ </a>
342
+ <br/>
343
+ <sub>👉 <a href="https://open3cl.github.io/engine/reports/corpus"><strong>Ouvrir le rapport interactif</strong></a></sub>
344
+ </div>
174
345
 
175
- ### Qu'est-ce qui est contrôlé ?
346
+ > [!NOTE]
347
+ > GitHub neutralise les scripts et les `iframe` dans les fichiers markdown : le rapport ne peut donc pas être
348
+ > **intégré**
349
+ > tel quel dans ce README. Il est affiché ici sous forme d'aperçu cliquable, et reste consultable en ligne ou en local :
350
+ >
351
+ > ```sh
352
+ > npm run reports:preview # sert dist/reports/corpus et ouvre le navigateur
353
+ > ```
176
354
 
177
- Les informations contrôlées et qui doivent obligatoirement ne pas dépasser le seuil des **5%** entre le dpe d'origine et
178
- le dpe proposé par la librairie Open3CL sont :
355
+ ### Lancer un corpus
179
356
 
180
- - logement.sortie.ef_conso.conso_ecs
181
- - logement.sortie.ef_conso.conso_ch
182
- - logement.sortie.ep_conso.ep_conso_5_usages ou logement.sortie.ep_conso.ep_conso_5_usages_m2
183
- - logement.sortie.emission_ges.emission_ges_5_usages ou logement.sortie.emission_ges.emission_ges_5_usages_m2
357
+ ```sh
358
+ # Tous les corpus, puis mise à jour automatique des résultats dans ce README
359
+ npm run test:corpus:all
184
360
 
185
- ### Liste des corpus
361
+ # Un seul corpus
362
+ npm run test:corpus
186
363
 
187
- Il existe actuellement 9 corpus (avec 10000 dpe analysés dans chaque corpus) :
364
+ # Un corpus précis
365
+ npm run test:corpus -- corpus-file-path=corpus.csv
188
366
 
189
- - `corpus.csv`: Corpus généraliste
190
- - `dpe_logement_individuel_2025.csv`: Corpus avec uniquement des dpe individuels réalisés en 2025
191
- - `dpe_maison_individuelle_2025.csv`: Corpus avec uniquement des dpe maison individuelle réalisés en 2025
192
- - `dpe_appartement_individuel_chauffage_individuel_2025.csv`: Corpus avec uniquement des dpe appartement avec chauffage
193
- individuel réalisés en 2025
194
- - `dpe_appartement_individuel_chauffage_collectif_2025.csv`: Corpus avec uniquement des dpe appartement avec chauffage
195
- collectif réalisés en 2025
196
- - `dpe_immeuble_chauffage_individuel.csv`: Corpus avec uniquement des dpe immeuble pour des logements avec chauffage
197
- individuel
198
- - `dpe_immeuble_chauffage_collectif.csv`: Corpus avec uniquement des dpe immeuble pour des logements avec chauffage
199
- collectif
200
- - `dpe_immeuble_chauffage_mixte.csv`: Corpus avec uniquement des dpe immeuble pour des logements avec chauffage mixte
201
- - `dpe_individuel_a_partir_dpe_immeuble_2026.csv`: Corpus avec uniquement des dpe individuels réalisés à partir du dpe
202
- immeuble en 2026
367
+ # Un seul DPE, pour investiguer
368
+ npm run test:corpus -- dpes-code=2592E1233185X
369
+ ```
203
370
 
204
- ### Comment lancer les corpus ?
371
+ | Argument | Description |
372
+ | :------------------------ | :------------------------------------------------------------------------- |
373
+ | `corpus-file-path=<path>` | Fichier de corpus à analyser (défaut : `test/corpus/files/corpus_dpe.csv`) |
374
+ | `dpes-folder-path=<path>` | Dossier de cache des DPE. Un DPE déjà présent n'est pas retéléchargé |
375
+ | `dpes-code=<code>` | Ne rejoue qu'un seul DPE |
205
376
 
206
- - `npm run test:corpus:all`: Joue l'intégralité des corpus et génère les rapports associés.
207
- - `npm run test:corpus`. Joue le corpus [corpus_dpe.csv](test/corpus/files/corpus_dpe.csv) et génère les rapports
208
- associés.
209
- - `npm run test:corpus -- corpus-file-path=corpus.csv`. Chemin relatif vers le fichier de corpus à analyser Par défaut,
210
- le corpus utilisé est présent ici : [test/corpus/corpus_dpe.csv](test/corpus/files/corpus_dpe.csv)
211
- - `npm run test:corpus -- dpes-folder-path=/home/user/dpes`. Chemin vers le dossier ou les DPE seront téléchargés. Si un
212
- fichier DPE est déjà présent dans ce dossier, il ne sera pas retéléchargé.
213
- - `npm run test:corpus -- dpes-code=2592E1233185X`. Execution du corpus sur le dpe spécifié.
214
- - Si le dpe n'est pas présent en local, il sera téléchargé sur le site de l'ADEME.
377
+ > [!TIP]
378
+ > Définissez `DPE_FOLDER_PATH` une fois pour toutes plutôt que de répéter `dpes-folder-path`. Les DPE absents du cache
379
+ > sont téléchargés depuis l'API de l'ADEME — pensez aux [quotas](docs/CORPUS.md#quotas-de-lapi-ademe).
215
380
 
216
381
  ### Résultats corpus
217
382
 
218
- Résultats des tests de corpus avec le mode de compatibilité activé.
383
+ Ces résultats sont **générés automatiquement** à la fin de `npm run test:corpus:all` par
384
+ [`scripts/generate_corpus_readme.js`](scripts/generate_corpus_readme.js). Ne les modifiez pas à la main.
219
385
 
220
- <details>
221
- <summary>Voir les versions précédents</summary>
222
-
223
- | Version librairie | corpus | Nb en dessous du taux d'erreur | Taux de réussite | Description |
224
- | :------------------- | -------------------------------------------------------- | ------------------------------ | ----------------------- | ------------------------------------------------- |
225
- | <ins>**1.2.3**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4489**<ins> | <ins>**45%**<ins> | |
226
- | 1.2.3 | dpe_immeuble_chauffage_individuel.csv | 3257 | 32% | |
227
- | 1.2.3 | dpe_immeuble_chauffage_collectif.csv | 5279 | 53% | |
228
- | 1.2.3 | dpe_immeuble_chauffage_mixte.csv | 2728 | 27% | |
229
- | <ins>**1.2.8**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**489**<ins> | <ins>**45%**<ins> | |
230
- | 1.2.8 | dpe_immeuble_chauffage_individuel.csv | 5275 (+2018) | 53% (+21%) | |
231
- | 1.2.8 | dpe_immeuble_chauffage_collectif.csv | 5747 (+468) | 57% (+4%) | |
232
- | 1.2.8 | dpe_immeuble_chauffage_mixte.csv | 3142 (+414) | 31% (+4%) | |
233
- | <ins>**1.3.1**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4508 (+19)**<ins> | <ins>**45%**<ins> | |
234
- | 1.3.1 | dpe_immeuble_chauffage_individuel.csv | 5459 (+184) | 55% (+2%) | |
235
- | 1.3.1 | dpe_immeuble_chauffage_collectif.csv | 5848 (+101) | 58% (+1%) | |
236
- | 1.3.1 | dpe_immeuble_chauffage_mixte.csv | 4018 (+876) | 40% (+9%) | |
237
- | <ins>**1.3.2**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4519 (+11)**<ins> | <ins>**45%**<ins> | |
238
- | 1.3.2 | dpe_immeuble_chauffage_individuel.csv | 5476 (+17) | 55% | |
239
- | 1.3.2 | dpe_immeuble_chauffage_collectif.csv | 5869 (+21) | 58% | |
240
- | 1.3.2 | dpe_immeuble_chauffage_mixte.csv | 4040 (+22) | 40% | |
241
- | <ins>**1.3.5**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4522 (+3)**<ins> | <ins>**45%**<ins> | |
242
- | 1.3.5 | dpe_immeuble_chauffage_individuel.csv | 5488 (+12) | 55% | |
243
- | 1.3.5 | dpe_immeuble_chauffage_collectif.csv | 5869 | 58% | |
244
- | 1.3.5 | dpe_immeuble_chauffage_mixte.csv | 4082 (+42) | 40% | |
245
- | <ins>**1.3.6**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4522**<ins> | <ins>**45%**<ins> | |
246
- | 1.3.6 | dpe_immeuble_chauffage_individuel.csv | 5650 (+162) | 56% | |
247
- | 1.3.6 | dpe_immeuble_chauffage_collectif.csv | 5894 (+25) | 59% (+1%) | |
248
- | 1.3.6 | dpe_immeuble_chauffage_mixte.csv | 4141 (+59) | 41% (+1%) | |
249
- | <ins>**1.3.7**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4522**<ins> | <ins>**45%**<ins> | |
250
- | 1.3.7 | dpe_immeuble_chauffage_individuel.csv | 6960 (+1310) | 69% (+13%) | |
251
- | 1.3.7 | dpe_immeuble_chauffage_collectif.csv | 6106 (+212) | 61% (+2%) | |
252
- | 1.3.7 | dpe_immeuble_chauffage_mixte.csv | 4730 (+589) | 47% (+6%) | |
253
- | <ins>**1.3.8**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4522**<ins> | <ins>**45%**<ins> | |
254
- | 1.3.8 | dpe_immeuble_chauffage_individuel.csv | 6965 (+5) | 69% | |
255
- | 1.3.8 | dpe_immeuble_chauffage_collectif.csv | 6110 (+4) | 61% | |
256
- | 1.3.8 | dpe_immeuble_chauffage_mixte.csv | 4735 (+5) | 47% | |
257
- | <ins>**1.3.9**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4460**<ins> (-62) | <ins>**44% (-1%)**<ins> | Pertes liés au fix bug tribu zone 2hd valeur dh19 |
258
- | 1.3.9 | dpe_immeuble_chauffage_individuel.csv | 6901 (-64) | 69% | Pertes liés au fix bug tribu zone 2hd valeur dh19 |
259
- | 1.3.9 | dpe_immeuble_chauffage_collectif.csv | 6058 (-58) | 60% (-1%) | Pertes liés au fix bug tribu zone 2hd valeur dh19 |
260
- | 1.3.9 | dpe_immeuble_chauffage_mixte.csv | 4728 (-7) | 47% | Pertes liés au fix bug tribu zone 2hd valeur dh19 |
261
- | <ins>**1.3.11**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4468**<ins> (+8) | <ins>**44%**<ins> | |
262
- | 1.3.11 | dpe_immeuble_chauffage_individuel.csv | 6901 | 69% | |
263
- | 1.3.11 | dpe_immeuble_chauffage_collectif.csv | 6058 | 60% | |
264
- | 1.3.11 | dpe_immeuble_chauffage_mixte.csv | 4727 (-1) | 47% | Dpes erronés sur le calcul volume ballon ecs |
265
- | <ins>**1.3.12**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4467**<ins> (-1) | <ins>**44%**<ins> | Dpe erroné avec surface chauffée invalide |
266
- | 1.3.12 | dpe_logement_individuel_2025.csv | 8429 | 84% | |
267
- | 1.3.12 | dpe_immeuble_chauffage_individuel.csv | 6900 (-1) | 69% | Dpe erroné avec surface chauffée invalide |
268
- | 1.3.12 | dpe_immeuble_chauffage_collectif.csv | 6058 | 60% | |
269
- | 1.3.12 | dpe_immeuble_chauffage_mixte.csv | 4725 (-2) | 47% | Dpe erroné avec surface chauffée invalide |
270
- | <ins>**1.3.15**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4481**<ins> (+14) | <ins>**45 (+1%)**<ins> | |
271
- | 1.3.15 | dpe_logement_individuel_2025.csv | 8453 | 84% | |
272
- | 1.3.15 | dpe_immeuble_chauffage_individuel.csv | 7106 (+205) | 71% (+2%) | |
273
- | 1.3.15 | dpe_immeuble_chauffage_collectif.csv | 6083 (+25) | 61% (+1%) | |
274
- | 1.3.15 | dpe_immeuble_chauffage_mixte.csv | 4751 (+24) | 47% | |
275
- | <ins>**1.3.20**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4500**<ins> (+19) | <ins>**45%**<ins> | |
276
- | 1.3.20 | dpe_logement_individuel_2025.csv | 8459 (+6) | 84% | |
277
- | 1.3.20 | dpe_maison_individuelle_2025.csv | 8638 | 86% | |
278
- | 1.3.20 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 8561 | 86% | |
279
- | 1.3.20 | dpe_immeuble_chauffage_individuel.csv | 7106 | 71% | |
280
- | 1.3.20 | dpe_immeuble_chauffage_collectif.csv | 6083 | 61% | |
281
- | 1.3.20 | dpe_immeuble_chauffage_mixte.csv | 4751 | 47% | |
282
- | <ins>**1.3.21**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4502**<ins> (+2) | <ins>**45%**<ins> | |
283
- | 1.3.21 | dpe_logement_individuel_2025.csv | 8504 (+45) | 85% (+1%) | |
284
- | 1.3.21 | dpe_maison_individuelle_2025.csv | 8652 (+14) | 86% | |
285
- | 1.3.21 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 8578 (+17) | 86% | |
286
- | 1.3.21 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6681 | 67% | |
287
- | 1.3.21 | dpe_immeuble_chauffage_individuel.csv | 7144 (+38) | 71% | |
288
- | 1.3.21 | dpe_immeuble_chauffage_collectif.csv | 6144 (+61) | 61% | |
289
- | 1.3.21 | dpe_immeuble_chauffage_mixte.csv | 4760 (+9) | 47% | |
290
- | 1.3.25 | dpe_logement_individuel_2025.csv | 8512 (+8) | 85% | |
291
- | 1.3.25 | dpe_maison_individuelle_2025.csv | 8674 (+22) | 87% (+1%) | |
292
- | 1.3.25 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 8581 (+3) | 86% | |
293
- | 1.3.25 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6680 (-1) | 67% | Dpe erronés enlevés du corpus |
294
- | 1.3.25 | dpe_immeuble_chauffage_individuel.csv | 7142 (-2) | 71% | Dpe erronés enlevés du corpus |
295
- | 1.3.25 | dpe_immeuble_chauffage_collectif.csv | 6144 | 61% | |
296
- | 1.3.25 | dpe_immeuble_chauffage_mixte.csv | 4758 (-2) | 47% | Dpe erronés enlevés du corpus |
297
- | <ins>**1.4.0**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4515**<ins> | <ins>**45%**<ins> | Maj coeff electricité (janvier 2026) |
298
- | 1.4.0 | dpe_logement_individuel_2025.csv | 8512 | 85% | Maj coeff electricité (janvier 2026) |
299
- | 1.4.0 | dpe_maison_individuelle_2025.csv | 8674 | 87% | Maj coeff electricité (janvier 2026) |
300
- | 1.4.0 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 8581 | 86% | Maj coeff electricité (janvier 2026) |
301
- | 1.4.0 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6680 | 67% | Maj coeff electricité (janvier 2026) |
302
- | 1.4.0 | dpe_immeuble_chauffage_individuel.csv | 7142 | 71% | Maj coeff electricité (janvier 2026) |
303
- | 1.4.0 | dpe_immeuble_chauffage_collectif.csv | 6144 | 61% | Maj coeff electricité (janvier 2026) |
304
- | 1.4.0 | dpe_immeuble_chauffage_mixte.csv | 4758 | 47% | Maj coeff electricité (janvier 2026) |
305
- | <ins>**1.4.2**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4515**<ins> | <ins>**45%**<ins> | |
306
- | 1.4.2 | dpe_logement_individuel_2025.csv | 8512 | 85% | |
307
- | 1.4.2 | dpe_maison_individuelle_2025.csv | 8674 | 87% | |
308
- | 1.4.2 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 8581 | 86% | |
309
- | 1.4.2 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6680 | 67% | |
310
- | 1.4.2 | dpe_immeuble_chauffage_individuel.csv | 7143 | 71% | |
311
- | 1.4.2 | dpe_immeuble_chauffage_collectif.csv | 6144 | 61% | |
312
- | 1.4.2 | dpe_immeuble_chauffage_mixte.csv | 4758 | 47% | |
313
- | 1.4.2 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2757 | 27% | |
314
- | <ins>**1.4.3**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4556**<ins> | <ins>**45%**<ins> | |
315
- | 1.4.3 | dpe_logement_individuel_2025.csv | 8716 | 87% | |
316
- | 1.4.3 | dpe_maison_individuelle_2025.csv | 8715 | 87% | |
317
- | 1.4.3 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9070 | 91% | |
318
- | 1.4.3 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6804 | 68% | |
319
- | 1.4.3 | dpe_immeuble_chauffage_individuel.csv | 7320 | 73% | |
320
- | 1.4.3 | dpe_immeuble_chauffage_collectif.csv | 6149 | 61% | |
321
- | 1.4.3 | dpe_immeuble_chauffage_mixte.csv | 4805 | 48% | |
322
- | 1.4.3 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
323
- | <ins>**1.4.4**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4560 (+4)**<ins> | <ins>**45%**<ins> | |
324
- | 1.4.4 | dpe_logement_individuel_2025.csv | 8719 (+3) | 87% (+2%) | |
325
- | 1.4.4 | dpe_maison_individuelle_2025.csv | 8715 | 87% | |
326
- | 1.4.4 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9070 | 91% | |
327
- | 1.4.4 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6803 (-1) | 68% | |
328
- | 1.4.4 | dpe_immeuble_chauffage_individuel.csv | 7320 | 73% | |
329
- | 1.4.4 | dpe_immeuble_chauffage_collectif.csv | 6149 | 61% | |
330
- | 1.4.4 | dpe_immeuble_chauffage_mixte.csv | 4805 | 48% | |
331
- | 1.4.4 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
332
- | <ins>**1.4.5**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4582 (+22)**<ins> | <ins>**46% (+1%)**<ins> | |
333
- | 1.4.5 | dpe_logement_individuel_2025.csv | 8790 (+71) | 88% (+1%) | |
334
- | 1.4.5 | dpe_maison_individuelle_2025.csv | 8791 (+76) | 88% (+1%) | |
335
- | 1.4.5 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9143 (+73) | 91% | |
336
- | 1.4.5 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6836 (+33) | 68% | |
337
- | 1.4.5 | dpe_immeuble_chauffage_individuel.csv | 7371 (+51) | 74% (+1%) | |
338
- | 1.4.5 | dpe_immeuble_chauffage_collectif.csv | 6155 (+6) | 61% | |
339
- | 1.4.5 | dpe_immeuble_chauffage_mixte.csv | 4816 (+11S) | 48% | |
340
- | 1.4.5 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
341
- | <ins>**1.5.1 **<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4582**<ins> | <ins>**46%**<ins> | |
342
- | 1.5.1 | dpe_logement_individuel_2025.csv | 8790 | 88% | |
343
- | 1.5.1 | dpe_maison_individuelle_2025.csv | 8791 | 88% | |
344
- | 1.5.1 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9143 | 91% | |
345
- | 1.5.1 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6836 | 68% | |
346
- | 1.5.1 | dpe_immeuble_chauffage_individuel.csv | 7371 | 74% | |
347
- | 1.5.1 | dpe_immeuble_chauffage_collectif.csv | 6155 | 61% | |
348
- | 1.5.1 | dpe_immeuble_chauffage_mixte.csv | 4816 | 48% | |
349
- | 1.5.1 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
386
+ <!-- CORPUS:START -->
350
387
 
351
- </details>
388
+ > **Version `1.6.2`** · branche `main` · généré le 2026-09-11
389
+ > Seuil de tolérance **5%**
352
390
 
353
- | Version librairie | corpus | Nb en dessous du taux d'erreur | Taux de réussite | Description |
354
- | :------------------- | -------------------------------------------------------- | ------------------------------ | ----------------- | ----------- |
355
- | <ins>**1.6.1 **<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4591 (+3)**<ins> | <ins>**46%**<ins> | |
356
- | 1.6.1 | dpe_logement_individuel_2025.csv | 8791 (+1) | 88% | |
357
- | 1.6.1 | dpe_maison_individuelle_2025.csv | 8793 (+2) | 88% | |
358
- | 1.6.1 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9146 (+3) | 91% | |
359
- | 1.6.1 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6837 (+1) | 68% | |
360
- | 1.6.1 | dpe_immeuble_chauffage_individuel.csv | 7371 | 74% | |
361
- | 1.6.1 | dpe_immeuble_chauffage_collectif.csv | 6155 | 61% | |
362
- | 1.6.1 | dpe_immeuble_chauffage_mixte.csv | 4819 (+3) | 48% | |
363
- | 1.6.1 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
364
-
365
- ## Roadmap
366
-
367
- - [x] Site Open 3CL
368
- - [ ] Refacto technique
369
- - [ ] Rapports de tests
370
- - [ ] Certification ADEME
371
- - [ ] Fonctionnalités
372
- - [ ] DPE à l'immeuble
373
- - [ ] Photovoltaïque
374
-
375
- Voir la liste des [issues](https://github.com/Open3CL/engine/issues) pour avoir le détail complet des bugs et
376
- fonctionnalités en cours de réalisation.
391
+ <table>
392
+ <tr>
393
+ <td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
394
+ <td align="center"><strong>89 996</strong><br/><sub>DPE analysés</sub></td>
395
+ <td align="center"><strong>59 497</strong><br/><sub>DPE conformes</sub></td>
396
+ <td align="center"><strong>66,11 %</strong><br/><sub>réussite globale</sub></td>
397
+ </tr>
398
+ </table>
399
+
400
+ | | Corpus | Réussite | | DPE conformes |
401
+ | :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
402
+ | 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **45,97 %** | `█████████░░░░░░░░░░░` | 4 597 / 10 000 |
403
+ | 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **91,55 %** | `██████████████████░░` | 9 155 / 10 000 |
404
+ | 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **88,14 %** | `██████████████████░░` | 8 812 / 9 998 |
405
+ | 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **87,93 %** | `██████████████████░░` | 8 793 / 10 000 |
406
+ | 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **73,76 %** | `███████████████░░░░░` | 7 375 / 9 999 |
407
+ | 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **69,47 %** | `██████████████░░░░░░` | 6 947 / 10 000 |
408
+ | 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **62,27 %** | `████████████░░░░░░░░` | 6 226 / 9 999 |
409
+ | 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **48,37 %** | `██████████░░░░░░░░░░` | 4 837 / 10 000 |
410
+ | 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **27,55 %** | `██████░░░░░░░░░░░░░░` | 2 755 / 10 000 |
411
+
412
+ <sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
413
+
414
+ <!-- CORPUS:END -->
415
+
416
+ 📈 Historique complet des versions : [docs/CORPUS-HISTORY.md](docs/CORPUS-HISTORY.md)
377
417
 
378
418
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
379
419
 
380
- ## Contribution
420
+ ---
421
+
422
+ ## 🗺️ Roadmap
423
+
424
+ ```mermaid
425
+ flowchart TD
426
+ subgraph fait ["✅ Fait"]
427
+ A1["Site Open3CL"]
428
+ A2["Rapports de corpus interactifs"]
429
+ end
430
+ subgraph cours ["🚧 En cours"]
431
+ B1["Refonte technique"]
432
+ B2["DPE à l'immeuble"]
433
+ B3["Certification ADEME"]
434
+ end
435
+ fait --> cours
436
+ ```
437
+
438
+ | Étape | Statut | Détail |
439
+ | :------------------ | :---------- | :--------------------------------------------------------------- |
440
+ | Site Open3CL | ✅ Terminé | [open3cl.fr](https://open3cl.fr) |
441
+ | Rapports de tests | ✅ Terminé | Tableau de bord interactif publié à chaque exécution |
442
+ | Refonte technique | 🚧 En cours | Découpage par article de la méthode, couverture de tests à 100 % |
443
+ | DPE à l'immeuble | 🚧 En cours | Fiabilisation des appartements générés depuis un DPE immeuble |
444
+ | Certification ADEME | 🚧 En cours | Objectif de long terme |
381
445
 
382
- Nous accueillons les contributions avec plaisir ! Si vous souhaitez améliorer Open3CL, veuillez :
446
+ Le détail complet des bugs et fonctionnalités en cours est dans les
447
+ [issues](https://github.com/Open3CL/engine/issues).
383
448
 
384
- - Forker le dépôt.
385
- - Créer une branche pour vos modifications.
386
- - Soumettre une pull request avec une description claire des changements apportés.
387
- - Consultez le fichier [CONTRIBUTING.md](CONTRIBUTING.md) pour plus de détails.
449
+ <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
388
450
 
389
- ### Meilleurs contributeurs
451
+ ---
390
452
 
391
- <a href="https://github.com/Open3CL/engine/graphs/contributors">
392
- <img src="https://contrib.rocks/image?repo=Open3CL/engine" alt="contrib.rocks image" />
393
- </a>
453
+ ## 🤝 Contribuer
454
+
455
+ Toutes les contributions sont les bienvenues : correction d'un écart de calcul, ajout de tests, documentation, ou
456
+ simplement le signalement d'un DPE qui ne passe pas.
457
+
458
+ ```sh
459
+ git clone https://github.com/Open3CL/engine.git
460
+ cd engine
461
+ npm ci
462
+ npm run test:unit # tests unitaires
463
+ npm run qa:lint # analyse statique
464
+ npm run qa:format # formatage
465
+ ```
466
+
467
+ | Vous voulez… | Allez voir |
468
+ | :----------------------------- | :------------------------------------------------------------------------------------------------------------------- |
469
+ | Signaler un bug | [Ouvrir un bug](https://github.com/Open3CL/engine/issues/new?labels=bug&template=bug-report---.md) |
470
+ | Proposer une fonctionnalité | [Ouvrir une feature](https://github.com/Open3CL/engine/issues/new?labels=enhancement&template=feature-request---.md) |
471
+ | Soumettre du code | [CONTRIBUTING.md](CONTRIBUTING.md) |
472
+ | Comprendre les tests de corpus | [docs/CORPUS.md](docs/CORPUS.md) |
473
+
474
+ 📖 Le guide de contribution détaillé — conventions de commit, règles de code, cycle d'une pull request, méthode de
475
+ debug d'un écart de calcul — est dans **[CONTRIBUTING.fr.md](CONTRIBUTING.fr.md)**.
394
476
 
395
477
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
396
478
 
397
- ## Licence
479
+ ---
398
480
 
399
- Distribué sous la license `MIT`. Lire le fichier `LICENSE` pour plus d'informations.
481
+ ## 📄 Licence
482
+
483
+ Distribué sous licence **GPL-3.0**. Voir le fichier [`LICENSE`](LICENSE) pour plus d'informations.
400
484
 
401
485
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
402
486
 
403
- ## Contact
487
+ ---
488
+
489
+ ## 📬 Contact
404
490
 
405
- Pour plus d'informations merci de nous contacter à cette adresse : open3cl@redfroggy.fr
491
+ Pour toute question : **open3cl@redfroggy.fr**
406
492
 
407
493
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
408
494
 
409
- ## Remerciements
495
+ ---
496
+
497
+ ## 🙏 Remerciements
498
+
499
+ ### Les contributeurs
500
+
501
+ Merci à toutes les personnes qui ont écrit, testé, relu ou corrigé une ligne de ce moteur.
502
+
503
+ <a href="https://github.com/Open3CL/engine/graphs/contributors">
504
+ <img src="https://contrib.rocks/image?repo=Open3CL/engine" alt="Contributeurs Open3CL" />
505
+ </a>
410
506
 
411
- A compléter
507
+ ### Les organisations qui soutiennent le projet
508
+
509
+ <table>
510
+ <tr>
511
+ <td align="center" width="33%">
512
+ <a href="https://redfroggy.fr/"><strong>RedFroggy</strong></a>
513
+ <br/><br/>
514
+ <sub>À l'initiative du projet et de sa maintenance. Studio de développement web et mobile.</sub>
515
+ </td>
516
+ <td align="center" width="33%">
517
+ <a href="https://kardino.fr"><strong>Kardino</strong></a>
518
+ <br/><br/>
519
+ <sub>Accompagnement à la rénovation énergétique des logements.</sub>
520
+ </td>
521
+ <td align="center" width="33%">
522
+ <a href="https://checkdpe.fr/"><strong>Check DPE</strong></a>
523
+ <br/><br/>
524
+ <sub>Vérification et analyse de DPE en ligne.</sub>
525
+ </td>
526
+ </tr>
527
+ </table>
528
+
529
+ ### Les ressources
530
+
531
+ - L'[ADEME](https://www.ademe.fr/) pour la publication de la méthode 3CL-DPE 2021 et l'ouverture des données DPE
532
+ - L'[observatoire DPE-Audit](https://observatoire-dpe-audit.ademe.fr/) qui rend possible les tests de corpus
412
533
 
413
534
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
414
535