@open3cl/engine 1.7.0 → 1.7.2

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 (58) 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.js +2 -10
  7. package/13.2_generateur_combustion.spec.js +3 -3
  8. package/13.2_generateur_combustion_ch.spec.js +3 -3
  9. package/14_generateur_ecs.spec.js +1 -0
  10. package/15_conso_aux.spec.js +3 -3
  11. package/2021_04_13_confort_ete.spec.js +1 -0
  12. package/3.1_b.js +45 -33
  13. package/3.1_b.spec.js +1 -0
  14. package/3.2.1_mur.spec.js +1 -0
  15. package/3.2.2_plancher_bas.spec.js +1 -0
  16. package/3.2.3_plancher_haut.spec.js +1 -0
  17. package/3.3.1.4_porte.spec.js +1 -0
  18. package/3.3_baie_vitree.js +32 -10
  19. package/3.3_baie_vitree.spec.js +1 -0
  20. package/3.4_pont_thermique.js +21 -13
  21. package/3.4_pont_thermique.spec.js +2 -1
  22. package/4_ventilation.spec.js +1 -0
  23. package/5_conso_ventilation.spec.js +1 -0
  24. package/6.2_surface_sud_equivalente.spec.js +1 -0
  25. package/9_besoin_ch.spec.js +1 -0
  26. package/9_chauffage.spec.js +3 -3
  27. package/9_conso_ch.spec.js +1 -0
  28. package/9_emetteur_ch.spec.js +1 -0
  29. package/9_generateur_ch.spec.js +1 -0
  30. package/README.md +442 -291
  31. package/conso.spec.js +1 -0
  32. package/engine.js +3 -1
  33. package/engine.spec.js +1 -0
  34. package/ficheTechnique.js +133 -53
  35. package/ficheTechnique.spec.js +46 -14
  36. package/formula.js +251 -0
  37. package/formula.spec.js +99 -0
  38. package/package.json +15 -15
  39. package/utils.js +195 -44
  40. package/utils.spec.js +69 -0
  41. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
  42. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
  43. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
  44. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
  45. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
  46. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
  47. package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
  48. package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
  49. package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
  50. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
  51. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
  52. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
  53. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
  54. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
  55. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
  56. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
  57. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
  58. 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
52
129
 
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.
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.
142
+
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
+ ---
62
155
 
63
- ### Pre-requis
156
+ ## 🚀 Démarrage
64
157
 
65
- Vous devez d'abord installer [NodeJS](https://nodejs.org/en) en version 20 ou supérieure.
158
+ ### Pré-requis
159
+
160
+ | Outil | Version |
161
+ | :---------- | :-------- |
162
+ | **Node.js** | ≥ 24.14.1 |
163
+ | **npm** | ≥ 11.11.0 |
164
+
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
71
171
  ```
72
172
 
73
- ## Démonstration
173
+ <details>
174
+ <summary>Avec un autre gestionnaire de paquets</summary>
74
175
 
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.
176
+ ```sh
177
+ yarn add @open3cl/engine
178
+ pnpm add @open3cl/engine
179
+ ```
79
180
 
80
- C'est un bon moyen de détecter un éventuel problème dans le dpe ou la librairie.
181
+ </details>
81
182
 
82
- ## Utilisation
183
+ ### En 30 secondes
83
184
 
84
185
  ```javascript
85
- import { @open3cl } from 'open3cl/engine';
86
- import {
87
- set_bug_for_bug_compat,
88
- } from '@open3cl/engine/utils.js';
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
216
+
217
+ ### API publique
218
+
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 |
89
226
 
90
- set_bug_for_bug_compat();
227
+ ### Options de calcul
91
228
 
92
- // Exemple d'objet JSON (partiel) issu d'un fichier XML DPE
229
+ ```javascript
230
+ import { calcul_3cl, calcul_3cl_xml } from '@open3cl/engine';
231
+
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
235
+
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,303 @@ 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
+ ```
168
318
 
169
- Les tests de corpus consistent à analyser une liste de numéro de DPE présent dans un fichier CSV.
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 %**.
170
322
 
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%**.
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 |
174
329
 
175
- ### Qu'est-ce qui est contrôlé ?
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.
176
332
 
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 :
333
+ ### Le rapport interactif
179
334
 
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
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.
184
337
 
185
- ### Liste des corpus
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>
186
345
 
187
- Il existe actuellement 9 corpus (avec 10000 dpe analysés dans chaque corpus) :
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
+ > ```
188
354
 
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
355
+ ### Lancer un corpus
203
356
 
204
- ### Comment lancer les corpus ?
357
+ ```sh
358
+ # Tous les corpus, puis mise à jour automatique des résultats dans ce README
359
+ npm run test:corpus:all
205
360
 
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.
361
+ # Un seul corpus
362
+ npm run test:corpus
363
+
364
+ # Un corpus précis
365
+ npm run test:corpus -- corpus-file-path=corpus.csv
366
+
367
+ # Un seul DPE, pour investiguer
368
+ npm run test:corpus -- dpes-code=2592E1233185X
369
+ ```
370
+
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 |
376
+
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.
385
+
386
+ <!-- CORPUS:START -->
387
+
388
+ > **Version `1.6.2`** · branche `main` · généré le 2026-09-18
389
+ > Seuil de tolérance **5%**
390
+
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
+ #### Temps d’exécution
415
+
416
+ > Durée de l’appel à `calcul_3cl` par DPE, sur 89 956 calculs.
417
+ > La copie défensive de l’entrée et la lecture du fichier sont exclues de la mesure.
418
+
419
+ <table>
420
+ <tr>
421
+ <td align="center"><strong>5,61 ms</strong><br/><sub>moyenne</sub></td>
422
+ <td align="center"><strong>5,03 ms</strong><br/><sub>médiane</sub></td>
423
+ <td align="center"><strong>0,11 ms</strong><br/><sub>min</sub></td>
424
+ <td align="center"><strong>705,8 ms</strong><br/><sub>max</sub></td>
425
+ </tr>
426
+ </table>
427
+
428
+ | Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
429
+ | :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
430
+ | **Généraliste** | 4,50 ms | 4,09 ms | 0,20 ms | 34,8 ms | 8,12 ms | 11,3 ms |
431
+ | **Appartement · chauffage individuel (2025)** | 3,71 ms | 3,46 ms | 1,32 ms | 26,1 ms | 6,22 ms | 7,99 ms |
432
+ | **Logement individuel (2025)** | 5,30 ms | 4,84 ms | 1,52 ms | 42,5 ms | 9,73 ms | 13,2 ms |
433
+ | **Maison individuelle (2025)** | 6,54 ms | 6,02 ms | 1,71 ms | 54,5 ms | 11,6 ms | 16,4 ms |
434
+ | **Immeuble · chauffage individuel** | 7,17 ms | 6,22 ms | 0,11 ms | 137,7 ms | 14,3 ms | 22,3 ms |
435
+ | **Appartement · chauffage collectif (2025)** | 3,98 ms | 3,76 ms | 1,22 ms | 37,6 ms | 6,35 ms | 8,00 ms |
436
+ | **Immeuble · chauffage collectif** | 6,40 ms | 5,58 ms | 0,15 ms | 101,0 ms | 12,1 ms | 21,2 ms |
437
+ | **Immeuble · chauffage mixte** | 6,01 ms | 5,01 ms | 0,22 ms | 705,8 ms | 12,4 ms | 19,8 ms |
438
+ | **Individuel généré depuis l'immeuble (2026)** | 6,89 ms | 6,27 ms | 1,52 ms | 65,1 ms | 13,0 ms | 19,7 ms |
439
+
440
+ <sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
441
+ dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
442
+ défavorable réel.</sub>
443
+
444
+ <!-- CORPUS:END -->
445
+
446
+ 📈 Historique complet des versions : [docs/CORPUS-HISTORY.md](docs/CORPUS-HISTORY.md)
219
447
 
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% | |
448
+ <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
350
449
 
351
- </details>
450
+ ---
451
+
452
+ ## 🗺️ Roadmap
453
+
454
+ ```mermaid
455
+ flowchart TD
456
+ subgraph fait ["✅ Fait"]
457
+ A1["Site Open3CL"]
458
+ A2["Rapports de corpus interactifs"]
459
+ end
460
+ subgraph cours ["🚧 En cours"]
461
+ B1["Refonte technique"]
462
+ B2["DPE à l'immeuble"]
463
+ B3["Certification ADEME"]
464
+ end
465
+ fait --> cours
466
+ ```
467
+
468
+ | Étape | Statut | Détail |
469
+ | :------------------ | :---------- | :--------------------------------------------------------------- |
470
+ | Site Open3CL | ✅ Terminé | [open3cl.fr](https://open3cl.fr) |
471
+ | Rapports de tests | ✅ Terminé | Tableau de bord interactif publié à chaque exécution |
472
+ | Refonte technique | 🚧 En cours | Découpage par article de la méthode, couverture de tests à 100 % |
473
+ | DPE à l'immeuble | 🚧 En cours | Fiabilisation des appartements générés depuis un DPE immeuble |
474
+ | Certification ADEME | 🚧 En cours | Objectif de long terme |
352
475
 
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.
476
+ Le détail complet des bugs et fonctionnalités en cours est dans les
477
+ [issues](https://github.com/Open3CL/engine/issues).
377
478
 
378
479
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
379
480
 
380
- ## Contribution
481
+ ---
381
482
 
382
- Nous accueillons les contributions avec plaisir ! Si vous souhaitez améliorer Open3CL, veuillez :
483
+ ## 🤝 Contribuer
383
484
 
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.
485
+ Toutes les contributions sont les bienvenues : correction d'un écart de calcul, ajout de tests, documentation, ou
486
+ simplement le signalement d'un DPE qui ne passe pas.
388
487
 
389
- ### Meilleurs contributeurs
488
+ ```sh
489
+ git clone https://github.com/Open3CL/engine.git
490
+ cd engine
491
+ npm ci
492
+ npm run test:unit # tests unitaires
493
+ npm run qa:lint # analyse statique
494
+ npm run qa:format # formatage
495
+ ```
390
496
 
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>
497
+ | Vous voulez… | Allez voir |
498
+ | :----------------------------- | :------------------------------------------------------------------------------------------------------------------- |
499
+ | Signaler un bug | [Ouvrir un bug](https://github.com/Open3CL/engine/issues/new?labels=bug&template=bug-report---.md) |
500
+ | Proposer une fonctionnalité | [Ouvrir une feature](https://github.com/Open3CL/engine/issues/new?labels=enhancement&template=feature-request---.md) |
501
+ | Soumettre du code | [CONTRIBUTING.md](CONTRIBUTING.md) |
502
+ | Comprendre les tests de corpus | [docs/CORPUS.md](docs/CORPUS.md) |
503
+
504
+ 📖 Le guide de contribution détaillé — conventions de commit, règles de code, cycle d'une pull request, méthode de
505
+ debug d'un écart de calcul — est dans **[CONTRIBUTING.fr.md](CONTRIBUTING.fr.md)**.
394
506
 
395
507
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
396
508
 
397
- ## Licence
509
+ ---
510
+
511
+ ## 📄 Licence
398
512
 
399
- Distribué sous la license `MIT`. Lire le fichier `LICENSE` pour plus d'informations.
513
+ Distribué sous licence **GPL-3.0**. Voir le fichier [`LICENSE`](LICENSE) pour plus d'informations.
400
514
 
401
515
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
402
516
 
403
- ## Contact
517
+ ---
404
518
 
405
- Pour plus d'informations merci de nous contacter à cette adresse : open3cl@redfroggy.fr
519
+ ## 📬 Contact
520
+
521
+ Pour toute question : **open3cl@redfroggy.fr**
406
522
 
407
523
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
408
524
 
409
- ## Remerciements
525
+ ---
526
+
527
+ ## 🙏 Remerciements
528
+
529
+ ### Les contributeurs
530
+
531
+ Merci à toutes les personnes qui ont écrit, testé, relu ou corrigé une ligne de ce moteur.
532
+
533
+ <a href="https://github.com/Open3CL/engine/graphs/contributors">
534
+ <img src="https://contrib.rocks/image?repo=Open3CL/engine" alt="Contributeurs Open3CL" />
535
+ </a>
410
536
 
411
- A compléter
537
+ ### Les organisations qui soutiennent le projet
538
+
539
+ <table>
540
+ <tr>
541
+ <td align="center" width="33%">
542
+ <a href="https://redfroggy.fr/"><strong>RedFroggy</strong></a>
543
+ <br/><br/>
544
+ <sub>À l'initiative du projet et de sa maintenance. Studio de développement web et mobile.</sub>
545
+ </td>
546
+ <td align="center" width="33%">
547
+ <a href="https://kardino.fr"><strong>Kardino</strong></a>
548
+ <br/><br/>
549
+ <sub>Accompagnement à la rénovation énergétique des logements.</sub>
550
+ </td>
551
+ <td align="center" width="33%">
552
+ <a href="https://checkdpe.fr/"><strong>Check DPE</strong></a>
553
+ <br/><br/>
554
+ <sub>Vérification et analyse de DPE en ligne.</sub>
555
+ </td>
556
+ </tr>
557
+ </table>
558
+
559
+ ### Les ressources
560
+
561
+ - L'[ADEME](https://www.ademe.fr/) pour la publication de la méthode 3CL-DPE 2021 et l'ouverture des données DPE
562
+ - L'[observatoire DPE-Audit](https://observatoire-dpe-audit.ademe.fr/) qui rend possible les tests de corpus
412
563
 
413
564
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
414
565