@open3cl/engine 1.2.3 → 1.2.5

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.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  </a>
13
13
 
14
14
  <h3 align="center">Open3CL</h3>
15
- Implémentation open source du moteur Open3CL de l'ADEME.
15
+ Implémentation open source du moteur Open3CL de l'ADEME.
16
16
  <p align="center">
17
17
 
18
18
  ![Javascript][Javascript]
@@ -50,8 +50,12 @@
50
50
 
51
51
  ## A propos du projet
52
52
 
53
- Open3CL est une librairie JavaScript open source, spécialement conçue pour faciliter le calcul des Diagnostics de Performance Énergétique (DPE).
54
- Elle implémente la norme définie 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). Elle est destinée aux développeurs qui souhaitent intégrer des calculs énergétiques précis et conformes à la réglementation dans leurs applications.
53
+ Open3CL est une librairie JavaScript open source, spécialement conçue pour faciliter le calcul des Diagnostics de
54
+ Performance Énergétique (DPE).
55
+ Elle implémente la norme définie
56
+ 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).
57
+ Elle est destinée aux développeurs qui souhaitent intégrer des calculs énergétiques précis et conformes à la
58
+ réglementation dans leurs applications.
55
59
 
56
60
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
57
61
 
@@ -104,11 +108,67 @@ const dpeData = {
104
108
  const result = calcul_3cl(dpeData);
105
109
  ```
106
110
 
111
+ ## Variables d'environnements
112
+
113
+ | Nom | Description |
114
+ | ----------------------- | ---------------------------------------------------------- |
115
+ | ADEME_API_CLIENT_ID | Client id pour l'api de l'ademe |
116
+ | ADEME_API_CLIENT_SECRET | Client secret pour l'api de l'ademe |
117
+ | CORPUS_DPES_FILE_PATH | Chemin vers le dossier contenant tous les DPES téléchargés |
118
+
119
+ Attention aux quotas sur l'api:
120
+
121
+ - 100 requêtes / seconde
122
+ - 1000 requêtes / minute
123
+ - 10000 requêtes / jour
124
+
107
125
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
108
126
 
109
- ## Rapports
127
+ ## Lancement des tests sur des corpus de DPE
128
+
129
+ Les tests de corpus consistent à analyser une liste de numéro de DPE présent dans un fichier CSV.
130
+ Pour chaque DPE, le fichier est téléchargé si pas déjà présent en local, et il est envoyé à la librairie Open3CL.
131
+ On analyse en sortie de la lib certaines valeurs que l'on compare aux valeurs du DPE initial. Le seuil de tolérance est
132
+ fixé par défaut à 5%.
133
+ La liste des valeurs analysées est la suivante:
134
+
135
+ ```javascript
136
+ deperdition_mur,
137
+ deperdition_baie_vitree,
138
+ deperdition_plancher_bas,
139
+ deperdition_plancher_haut,
140
+ deperdition_porte,
141
+ deperdition_renouvellement_air,
142
+ hperm,
143
+ deperdition_pont_thermique,
144
+ surface_sud_equivalente,
145
+ besoin_ecs,
146
+ besoin_ch,
147
+ conso_auxiliaire_distribution_ecs,
148
+ conso_auxiliaire_generation_ch,
149
+ conso_auxiliaire_generation_ecs,
150
+ conso_ecs,
151
+ conso_ch,
152
+ conso_auxiliaire_distribution_ch,
153
+ conso_auxiliaire_ventilation,
154
+ ep_conso_5_usages,
155
+ ep_conso_5_usages_m2,
156
+ emission_ges_5_usages,
157
+ emission_ges_5_usages_m2;
158
+ ```
159
+
160
+ - `npm run test:corpus`. Va générer 2 rapports de sortie au format csv (détaillé) et json (global)
161
+ - `npm run test:corpus -- corpus-file-path=corpus.csv`. Chemin relatif vers le fichier de corpus à analyser
162
+ Par défaut, le corpus utilisé est présent ici : [test/corpus/corpus_dpe.csv](test/corpus/corpus_dpe.csv)
163
+ - `npm run test:corpus -- dpes-folder-path=/home/user/dpes`. Chemin vers le dossier où les DPE seront téléchargés. Si un
164
+ fichier DPE est déjà présent dans ce dossier, il ne sera pas retéléchargé.
165
+
166
+ ### Résultats corpus
110
167
 
111
- Lister ici les rapports de tests avec stats sur le CORPUS DPE.
168
+ | Version librairie | corpus | Taux d'erreur | Nb de DPES analysés | Nb en dessous tu taux d'erreur | Taux de réussite | Détail des valeurs |
169
+ | :---------------- | :------------------------------------ | :------------ | ------------------- | ------------------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------- |
170
+ | 1.2.3 | corpus_dpe.csv | 5% | 9980 | 4489 | 45% | [Voir le détail](https://open3cl.github.io/engine/reports/corpus?corpus_file=corpus_dpe.csv) |
171
+ | 1.2.3 | dpe_immeuble_chauffage_individuel.csv | 5% | 9998 | 3257 | 32% | [Voir le détail](https://open3cl.github.io/engine/reports/corpus?corpus_file=dpe_immeuble_chauffage_individuel.csv) |
112
172
 
113
173
  ## Roadmap
114
174
 
@@ -120,7 +180,8 @@ Lister ici les rapports de tests avec stats sur le CORPUS DPE.
120
180
  - [ ] DPE à l'immeuble
121
181
  - [ ] Photovoltaïque
122
182
 
123
- Voir la liste des [issues](https://github.com/Open3CL/engine/issues) pour avoir le détail complet des bugs et fonctionnalités en cours de réalisation.
183
+ Voir la liste des [issues](https://github.com/Open3CL/engine/issues) pour avoir le détail complet des bugs et
184
+ fonctionnalités en cours de réalisation.
124
185
 
125
186
  <p align="right">(<a href="#readme-top">Retour sommaire</a>)</p>
126
187
 
@@ -0,0 +1,20 @@
1
+ import { parse } from 'fast-csv';
2
+
3
+ export default class CsvParserStore {
4
+ /**
5
+ * @param stream {ReadStream}
6
+ * @param opts {import('fast-csv').ParserOptionsArgs}
7
+ * @param transform {import('fast-csv').RowTransformFunction}
8
+ * @return Promise<object[]>
9
+ */
10
+ parseFromStream(stream, opts, transform) {
11
+ const rows = [];
12
+ return new Promise((resolve, reject) => {
13
+ stream
14
+ .pipe(parse(opts).transform(transform))
15
+ .on('error', (error) => reject(error))
16
+ .on('data', (row) => rows.push(row))
17
+ .on('end', () => resolve(rows));
18
+ });
19
+ }
20
+ }
@@ -0,0 +1,28 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import CsvParserStore from './csv-parser.store.js';
3
+ import { createReadStream } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+
6
+ describe('CsvParserStore', () => {
7
+ /** @type {CsvParserStore} **/
8
+ let store;
9
+
10
+ /** @type {ReadStream} **/
11
+ let stream;
12
+
13
+ beforeEach(() => {
14
+ store = new CsvParserStore();
15
+ });
16
+
17
+ describe('parseFromStream', () => {
18
+ it('should parse a csv file from a stream', () => {
19
+ stream = createReadStream(resolve('test/corpus/corpus_dpe.csv'));
20
+
21
+ return store
22
+ .parseFromStream(stream, {}, (data) => data)
23
+ .then((data) => {
24
+ expect(data).toBeDefined();
25
+ });
26
+ });
27
+ });
28
+ });
package/engine.js CHANGED
@@ -499,6 +499,9 @@ export function calcul_3cl(dpe) {
499
499
  ...conso
500
500
  };
501
501
 
502
+ const conso_coeff_1_9 = get_conso_coeff_1_9_2026(dpe);
503
+ logement.sortie.ep_conso = { ...logement.sortie.ep_conso, ...conso_coeff_1_9 };
504
+
502
505
  return dpe;
503
506
  }
504
507
 
@@ -527,3 +530,35 @@ export function get_classe_ges_dpe(dpe) {
527
530
  )
528
531
  };
529
532
  }
533
+
534
+ /**
535
+ * Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique
536
+ * Applicable uniquement à partir de janvier 2026
537
+ *
538
+ * {@link https://www.ecologie.gouv.fr/actualites/evolutions-du-calcul-du-dpe-reponses-vos-questions#:~:text=Les%20DPE%20r%C3%A9alis%C3%A9s%20avant%20le,%2DAudit%20de%20l'Ademe.}
539
+ *
540
+ * @param dpe {FullDpe}
541
+ * @returns {{ep_conso_5_usages_2026: number; ep_conso_5_usages_2026_m2: number; classe_bilan_dpe_2026: string}}
542
+ */
543
+ export function get_conso_coeff_1_9_2026(dpe) {
544
+ const zc_id = dpe.logement.meteo.enum_zone_climatique_id;
545
+ const ca_id = dpe.logement.meteo.enum_classe_altitude_id;
546
+ const th = calc_th(dpe.logement.caracteristique_generale.enum_methode_application_dpe_log_id);
547
+
548
+ const ep_conso_5_usages_2026 =
549
+ (0.9 / 1.3) *
550
+ (Number(dpe.logement.sortie.ep_conso.ep_conso_5_usages) -
551
+ Number(dpe.logement.sortie.ef_conso.conso_5_usages)) +
552
+ Number(dpe.logement.sortie.ef_conso.conso_5_usages);
553
+
554
+ let Sh;
555
+ if (th === 'maison' || th === 'appartement')
556
+ Sh = Number(dpe.logement.caracteristique_generale.surface_habitable_logement);
557
+ else if (th === 'immeuble')
558
+ Sh = Number(dpe.logement.caracteristique_generale.surface_habitable_immeuble);
559
+
560
+ const ep_conso_5_usages_2026_m2 = Math.floor(ep_conso_5_usages_2026 / Sh);
561
+ const classe_bilan_dpe_2026 = classe_bilan_dpe(ep_conso_5_usages_2026_m2, zc_id, ca_id, Sh);
562
+
563
+ return { classe_bilan_dpe_2026, ep_conso_5_usages_2026_m2, ep_conso_5_usages_2026 };
564
+ }
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { calcul_3cl, get_classe_ges_dpe } from './engine.js';
2
- export { calcul_3cl, get_classe_ges_dpe };
1
+ import { calcul_3cl, get_classe_ges_dpe, get_conso_coeff_1_9_2026 } from './engine.js';
2
+ export { calcul_3cl, get_classe_ges_dpe, get_conso_coeff_1_9_2026 };
3
3
  import { Umur, Uph, Upb, Uporte, Ubv, Upt } from './3_deperdition.js';
4
4
  export { Umur, Uph, Upb, Uporte, Ubv, Upt };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open3cl/engine",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Open Source 3CL-DPE engine",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -15,14 +15,6 @@
15
15
  "test": "vitest run",
16
16
  "test:ci": "vitest run --coverage",
17
17
  "test:corpus": "node test/corpus/run_corpus_checks.js",
18
- "test:corpus:bench:5": "npm run test:corpus -- threshold=5 && npm run test:corpus -- compatibility threshold=5",
19
- "test:corpus:bench:6": "npm run test:corpus -- threshold=6 && npm run test:corpus -- compatibility threshold=6",
20
- "test:corpus:bench:7": "npm run test:corpus -- threshold=7 && npm run test:corpus -- compatibility threshold=7",
21
- "test:corpus:bench:8": "npm run test:corpus -- threshold=8 && npm run test:corpus -- compatibility threshold=8",
22
- "test:corpus:bench:9": "npm run test:corpus -- threshold=9 && npm run test:corpus -- compatibility threshold=9",
23
- "test:corpus:bench:10": "npm run test:corpus -- threshold=10 && npm run test:corpus -- compatibility threshold=10",
24
- "test:corpus:bench": "npm run test:corpus:bench:5 && npm run test:corpus:bench:6 && npm run test:corpus:bench:7 && npm run test:corpus:bench:8 && npm run test:corpus:bench:9 && npm run test:corpus:bench:10",
25
- "test:benchmark": "node inspect test/run_benchmark.js",
26
18
  "qa:lint": "eslint .",
27
19
  "qa:lint:fix": "npm run qa:lint -- --fix",
28
20
  "qa:duplication": "jscpd",
@@ -55,6 +47,8 @@
55
47
  "@semantic-release/github": "^10.0.2",
56
48
  "@types/node": "^20.12.4",
57
49
  "@vitest/coverage-v8": "^3.0.6",
50
+ "ansi-colors": "^4.1.3",
51
+ "cli-progress": "^3.12.0",
58
52
  "deep-object-diff": "^1.1.9",
59
53
  "eslint": "^8.57.0",
60
54
  "eslint-config-prettier": "^9.1.0",
@@ -66,6 +60,7 @@
66
60
  "fast-csv": "^5.0.2",
67
61
  "husky": "^9.0.11",
68
62
  "jscpd": "^3.5.10",
63
+ "piscina": "^5.1.2",
69
64
  "prettier": "^3.2.5",
70
65
  "pretty-quick": "^4.0.0",
71
66
  "semantic-release": "^23.0.6",