@open3cl/engine 1.4.5 → 1.5.0

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.
@@ -1,7 +1,7 @@
1
1
  import enums from './enums.js';
2
2
  import { mois_liste, tv } from './utils.js';
3
3
  import tvs from './tv.js';
4
- import { COEFF_EP_1_9, COEFF_EP_2_3 } from './conso.js';
4
+ import { DEFAULT_COEFF_EP } from './conso.js';
5
5
 
6
6
  export class ProductionENR {
7
7
  #taplpi = {
@@ -18,9 +18,13 @@ export class ProductionENR {
18
18
  * Calcul des consommations d'électricité auto-consommée par enveloppe
19
19
  * Mise à jour des conso ef en prenant en compte ces auto-consommations
20
20
  * @param productionElecEnr
21
- * @param Sh {string}
21
+ * @param conso
22
+ * @param Sh {number}
23
+ * @param th {string}
24
+ * @param zc_id {string}
25
+ * @param coeff_ep_override {number?}
22
26
  */
23
- calculateEnr(productionElecEnr, conso, Sh, th, zc_id, use_coeff_ch_elec_2_3) {
27
+ calculateEnr(productionElecEnr, conso, Sh, th, zc_id, coeff_ep_override) {
24
28
  const productionElectricite = {
25
29
  conso_elec_ac: 0,
26
30
  production_pv: 0,
@@ -45,7 +49,7 @@ export class ProductionENR {
45
49
  this.updateEfConso(productionElectricite, conso, Sh);
46
50
 
47
51
  // Mise à jour des consommations d'énergie primaire en minorant l'énergie consommée par l'énergie autoconsommée par le poste
48
- this.updateEPConso(productionElectricite, conso, Sh, use_coeff_ch_elec_2_3);
52
+ this.updateEPConso(productionElectricite, conso, Sh, coeff_ep_override);
49
53
  }
50
54
 
51
55
  return {
@@ -181,17 +185,17 @@ export class ProductionENR {
181
185
  * @param productionElectricite
182
186
  * @param conso {{ep_conso: Ep_conso}}
183
187
  * @param Sh {number}
184
- * @param use_coeff_ch_elec_2_3 {boolean} "true" pour ne pas utiliser le dernier coeff de chauffage électrique
188
+ * @param coeff_ep_override {number?} coeff ep à surcharger si définit
185
189
  */
186
- updateEPConso(productionElectricite, conso, Sh, use_coeff_ch_elec_2_3) {
187
- if (use_coeff_ch_elec_2_3) {
188
- conso.ep_conso.ep_conso_ecs -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_ecs;
189
- conso.ep_conso.ep_conso_ch -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_ch;
190
- conso.ep_conso.ep_conso_fr -= COEFF_EP_2_3 * productionElectricite.conso_elec_ac_fr;
190
+ updateEPConso(productionElectricite, conso, Sh, coeff_ep_override) {
191
+ if (coeff_ep_override) {
192
+ conso.ep_conso.ep_conso_ecs -= coeff_ep_override * productionElectricite.conso_elec_ac_ecs;
193
+ conso.ep_conso.ep_conso_ch -= coeff_ep_override * productionElectricite.conso_elec_ac_ch;
194
+ conso.ep_conso.ep_conso_fr -= coeff_ep_override * productionElectricite.conso_elec_ac_fr;
191
195
  conso.ep_conso.ep_conso_eclairage -=
192
- COEFF_EP_2_3 * productionElectricite.conso_elec_ac_eclairage;
196
+ coeff_ep_override * productionElectricite.conso_elec_ac_eclairage;
193
197
  conso.ep_conso.ep_conso_totale_auxiliaire -=
194
- COEFF_EP_2_3 * productionElectricite.conso_elec_ac_auxiliaire;
198
+ coeff_ep_override * productionElectricite.conso_elec_ac_auxiliaire;
195
199
 
196
200
  const conso_elec =
197
201
  productionElectricite.conso_elec_ac_ecs +
@@ -200,17 +204,17 @@ export class ProductionENR {
200
204
  productionElectricite.conso_elec_ac_eclairage +
201
205
  productionElectricite.conso_elec_ac_auxiliaire;
202
206
 
203
- conso.ep_conso.ep_conso_5_usages -= COEFF_EP_2_3 * conso_elec;
207
+ conso.ep_conso.ep_conso_5_usages -= coeff_ep_override * conso_elec;
204
208
 
205
209
  conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
206
210
  } else {
207
- conso.ep_conso.ep_conso_ecs -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_ecs;
208
- conso.ep_conso.ep_conso_ch -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_ch;
209
- conso.ep_conso.ep_conso_fr -= COEFF_EP_1_9 * productionElectricite.conso_elec_ac_fr;
211
+ conso.ep_conso.ep_conso_ecs -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_ecs;
212
+ conso.ep_conso.ep_conso_ch -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_ch;
213
+ conso.ep_conso.ep_conso_fr -= DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_fr;
210
214
  conso.ep_conso.ep_conso_eclairage -=
211
- COEFF_EP_1_9 * productionElectricite.conso_elec_ac_eclairage;
215
+ DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_eclairage;
212
216
  conso.ep_conso.ep_conso_totale_auxiliaire -=
213
- COEFF_EP_1_9 * productionElectricite.conso_elec_ac_auxiliaire;
217
+ DEFAULT_COEFF_EP * productionElectricite.conso_elec_ac_auxiliaire;
214
218
 
215
219
  const conso_elec =
216
220
  productionElectricite.conso_elec_ac_ecs +
@@ -219,7 +223,7 @@ export class ProductionENR {
219
223
  productionElectricite.conso_elec_ac_eclairage +
220
224
  productionElectricite.conso_elec_ac_auxiliaire;
221
225
 
222
- conso.ep_conso.ep_conso_5_usages -= COEFF_EP_1_9 * conso_elec;
226
+ conso.ep_conso.ep_conso_5_usages -= DEFAULT_COEFF_EP * conso_elec;
223
227
 
224
228
  conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
225
229
  }
package/README.md CHANGED
@@ -83,7 +83,12 @@ C'est un bon moyen de détecter un éventuel problème dans le dpe ou la librair
83
83
  ## Utilisation
84
84
 
85
85
  ```javascript
86
- import { calcul_3cl } from 'open3cl';
86
+ import { @open3cl } from 'open3cl/engine';
87
+ import {
88
+ set_bug_for_bug_compat,
89
+ } from '@open3cl/engine/utils.js';
90
+
91
+ set_bug_for_bug_compat();
87
92
 
88
93
  // Exemple d'objet JSON (partiel) issu d'un fichier XML DPE
89
94
  const dpeData = {
@@ -316,20 +321,29 @@ Résultats des tests de corpus avec le mode de compatibilité activé.
316
321
  | 1.4.3 | dpe_immeuble_chauffage_collectif.csv | 6149 | 61% | |
317
322
  | 1.4.3 | dpe_immeuble_chauffage_mixte.csv | 4805 | 48% | |
318
323
  | 1.4.3 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
324
+ | <ins>**1.4.4**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4560 (+4)**<ins> | <ins>**45%**<ins> | |
325
+ | 1.4.4 | dpe_logement_individuel_2025.csv | 8719 (+3) | 87% (+2%) | |
326
+ | 1.4.4 | dpe_maison_individuelle_2025.csv | 8715 | 87% | |
327
+ | 1.4.4 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9070 | 91% | |
328
+ | 1.4.4 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6803 (-1) | 68% | |
329
+ | 1.4.4 | dpe_immeuble_chauffage_individuel.csv | 7320 | 73% | |
330
+ | 1.4.4 | dpe_immeuble_chauffage_collectif.csv | 6149 | 61% | |
331
+ | 1.4.4 | dpe_immeuble_chauffage_mixte.csv | 4805 | 48% | |
332
+ | 1.4.4 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
319
333
 
320
334
  </details>
321
335
 
322
- | Version librairie | corpus | Nb en dessous du taux d'erreur | Taux de réussite | Description |
323
- | :------------------ | -------------------------------------------------------- | ------------------------------ | ----------------- | ----------- |
324
- | <ins>**1.4.4**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4560 (+4)**<ins> | <ins>**45%**<ins> | |
325
- | 1.4.4 | dpe_logement_individuel_2025.csv | 8719 (+3) | 87% (+2%) | |
326
- | 1.4.4 | dpe_maison_individuelle_2025.csv | 8715 | 87% | |
327
- | 1.4.4 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9070 | 91% | |
328
- | 1.4.4 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6803 (-1) | 68% | |
329
- | 1.4.4 | dpe_immeuble_chauffage_individuel.csv | 7320 | 73% | |
330
- | 1.4.4 | dpe_immeuble_chauffage_collectif.csv | 6149 | 61% | |
331
- | 1.4.4 | dpe_immeuble_chauffage_mixte.csv | 4805 | 48% | |
332
- | 1.4.4 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
336
+ | Version librairie | corpus | Nb en dessous du taux d'erreur | Taux de réussite | Description |
337
+ | :------------------ | -------------------------------------------------------- | ------------------------------ | ----------------------- | ----------- |
338
+ | <ins>**1.4.5**<ins> | <ins>**corpus_dpe.csv**<ins> | <ins>**4582 (+22)**<ins> | <ins>**46% (+1%)**<ins> | |
339
+ | 1.4.5 | dpe_logement_individuel_2025.csv | 8790 (+71) | 88% (+1%) | |
340
+ | 1.4.5 | dpe_maison_individuelle_2025.csv | 8791 (+76) | 88% (+1%) | |
341
+ | 1.4.5 | dpe_appartement_individuel_chauffage_individuel_2025.csv | 9143 (+73) | 91% | |
342
+ | 1.4.5 | dpe_appartement_individuel_chauffage_collectif_2025.csv | 6836 (+33) | 68% | |
343
+ | 1.4.5 | dpe_immeuble_chauffage_individuel.csv | 7371 (+51) | 74% (+1%) | |
344
+ | 1.4.5 | dpe_immeuble_chauffage_collectif.csv | 6155 (+6) | 61% | |
345
+ | 1.4.5 | dpe_immeuble_chauffage_mixte.csv | 4816 (+11S) | 48% | |
346
+ | 1.4.5 | dpe_individuel_a_partir_dpe_immeuble_2026.csv | 2755 | 27% | |
333
347
 
334
348
  ## Roadmap
335
349
 
package/conso.js CHANGED
@@ -5,6 +5,8 @@ import { tv } from './utils.js';
5
5
 
6
6
  export const COEFF_EP_2_3 = 2.3;
7
7
  export const COEFF_EP_1_9 = 1.9;
8
+ export const COEFF_EP_1_7 = 1.7;
9
+ export const DEFAULT_COEFF_EP = COEFF_EP_1_9;
8
10
 
9
11
  /**
10
12
  * Coeff de chauffage 1.9 au 01/01/2026
@@ -29,6 +31,17 @@ export const coef_ep_2_3 = {
29
31
  'électricité auxiliaire': COEFF_EP_2_3
30
32
  };
31
33
 
34
+ /**
35
+ * Coeff de chauffage 1.7 au 01/01/2027
36
+ */
37
+ export const coef_ep_1_7 = {
38
+ 'électricité ch': COEFF_EP_1_7,
39
+ 'électricité ecs': COEFF_EP_1_7,
40
+ 'électricité fr': COEFF_EP_1_7,
41
+ 'électricité éclairage': COEFF_EP_1_7,
42
+ 'électricité auxiliaire': COEFF_EP_1_7
43
+ };
44
+
32
45
  /**
33
46
  * Au 31 mars 2021
34
47
  * @link {https://www.legifrance.gouv.fr/download/pdf?id=doxMrRr0wbfJVvtWjfDP4gHzzERt1iX0PtobthCE6A0=}
@@ -1,28 +1,39 @@
1
1
  import { ObjectUtil } from './core/util/infrastructure/object-util.js';
2
+ import { set, has } from 'lodash-es';
2
3
 
3
4
  const nodesToMap = [
4
- 'mur',
5
- 'plancher_bas',
6
- 'plancher_haut',
7
- 'baie_vitree',
8
- 'porte',
9
- 'pont_thermique',
10
- 'ventilation',
11
5
  'installation_ecs',
12
6
  'generateur_ecs',
13
- 'climatisation',
14
7
  'installation_chauffage',
15
8
  'generateur_chauffage',
16
9
  'emetteur_chauffage',
17
10
  'sortie_par_energie'
18
11
  ];
19
12
 
13
+ const nodesCollectionToCheck = [
14
+ 'logement.enveloppe.mur_collection.mur',
15
+ 'logement.enveloppe.plancher_bas_collection.plancher_bas',
16
+ 'logement.enveloppe.plancher_haut_collection.plancher_haut',
17
+ 'logement.ventilation_collection.ventilation',
18
+ 'logement.climatisation_collection.climatisation',
19
+ 'logement.enveloppe.baie_vitree_collection.baie_vitree',
20
+ 'logement.enveloppe.porte_collection.porte',
21
+ 'logement.enveloppe.pont_thermique_collection.pont_thermique'
22
+ ];
23
+
20
24
  /**
21
25
  * Transform single nodes in {@link nodesToMap} into array of nodes.
22
26
  * Transform string number into digits
23
27
  * These transformations should be done inside the open3cl library
24
28
  *
25
29
  * @example
30
+ *
31
+ * // Will create
32
+ * "plancher_haut_collection": {
33
+ * "plancher_haut": []
34
+ * }
35
+ * if the plancher_haut_collection.plancher_haut nodes does not exist or are not an array
36
+ *
26
37
  * // Will transform
27
38
  * "plancher_haut_collection": {
28
39
  * "plancher_haut": {"id": 1}
@@ -44,6 +55,12 @@ export default class DpeSanitizerService {
44
55
  * @return {FullDpe}
45
56
  */
46
57
  execute(dpe) {
58
+ for (const path of nodesCollectionToCheck) {
59
+ if (!has(dpe, path)) {
60
+ set(dpe, path, []);
61
+ }
62
+ }
63
+
47
64
  return ObjectUtil.deepObjectTransform(
48
65
  dpe,
49
66
  (key) => key,
package/engine.js CHANGED
@@ -11,7 +11,10 @@ import calc_conso, {
11
11
  classe_bilan_dpe,
12
12
  classe_emission_ges,
13
13
  coef_ep,
14
- coef_ep_2_3
14
+ coef_ep_1_7,
15
+ coef_ep_2_3,
16
+ COEFF_EP_1_7,
17
+ COEFF_EP_2_3
15
18
  } from './conso.js';
16
19
  import {
17
20
  add_references,
@@ -28,7 +31,7 @@ import getFicheTechnique from './ficheTechnique.js';
28
31
  import { ProductionENR } from './16.2_production_enr.js';
29
32
  import DpeSanitizerService from './dpe-sanitizer.service.js';
30
33
 
31
- const LIB_VERSION = '1.4.5';
34
+ const LIB_VERSION = '1.5.0';
32
35
 
33
36
  const dpeSanitizerService = new DpeSanitizerService();
34
37
 
@@ -559,8 +562,30 @@ export function calcul_3cl(inputDpe, options) {
559
562
  conso,
560
563
  Sh,
561
564
  th,
565
+ zc_id
566
+ );
567
+
568
+ const conso1_7 = calc_conso(
569
+ Sh,
562
570
  zc_id,
563
- false
571
+ ca_id,
572
+ vt_list,
573
+ instal_ch,
574
+ ecs,
575
+ clim,
576
+ prorataECS,
577
+ prorataChauffage,
578
+ dateDpe,
579
+ coef_ep_1_7
580
+ );
581
+
582
+ productionENR.calculateEnr(
583
+ dpe.logement.production_elec_enr,
584
+ conso1_7,
585
+ Sh,
586
+ th,
587
+ zc_id,
588
+ COEFF_EP_1_7
564
589
  );
565
590
 
566
591
  const conso2_3 = calc_conso(
@@ -577,7 +602,14 @@ export function calcul_3cl(inputDpe, options) {
577
602
  coef_ep_2_3
578
603
  );
579
604
 
580
- productionENR.calculateEnr(dpe.logement.production_elec_enr, conso2_3, Sh, th, zc_id, true);
605
+ productionENR.calculateEnr(
606
+ dpe.logement.production_elec_enr,
607
+ conso2_3,
608
+ Sh,
609
+ th,
610
+ zc_id,
611
+ COEFF_EP_2_3
612
+ );
581
613
 
582
614
  // get all baie_vitree orientations
583
615
  const ph_list = env.plancher_haut_collection.plancher_haut || [];
@@ -594,12 +626,15 @@ export function calcul_3cl(inputDpe, options) {
594
626
  ...logement.sortie.ep_conso,
595
627
  coeff_2_3_classe_bilan_dpe: conso2_3.ep_conso.classe_bilan_dpe,
596
628
  coeff_2_3_ep_conso_5_usages: conso2_3.ep_conso.ep_conso_5_usages,
597
- coeff_2_3_ep_conso_5_usages_m2: conso2_3.ep_conso.ep_conso_5_usages_m2
629
+ coeff_2_3_ep_conso_5_usages_m2: conso2_3.ep_conso.ep_conso_5_usages_m2,
630
+ coeff_1_7_classe_bilan_dpe: conso1_7.ep_conso.classe_bilan_dpe,
631
+ coeff_1_7_ep_conso_5_usages: conso1_7.ep_conso.ep_conso_5_usages,
632
+ coeff_1_7_ep_conso_5_usages_m2: conso1_7.ep_conso.ep_conso_5_usages_m2
598
633
  };
599
634
 
600
- logement.sortie.ep_conso.classe_bilan_dpe_2026 = logement.sortie.ep_conso.classe_bilan_dpe;
601
- logement.sortie.ep_conso.ep_conso_5_usages_2026 = logement.sortie.ep_conso.ep_conso_5_usages;
602
- logement.sortie.ep_conso.ep_conso_5_usages_2026_m2 =
635
+ logement.sortie.ep_conso.classe_bilan_dpe_2027 = logement.sortie.ep_conso.classe_bilan_dpe;
636
+ logement.sortie.ep_conso.ep_conso_5_usages_2027 = logement.sortie.ep_conso.ep_conso_5_usages;
637
+ logement.sortie.ep_conso.ep_conso_5_usages_2027_m2 =
603
638
  logement.sortie.ep_conso.ep_conso_5_usages_m2;
604
639
 
605
640
  return dpe;
@@ -633,20 +668,31 @@ export function get_classe_ges_dpe(dpe) {
633
668
 
634
669
  /**
635
670
  * Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique
636
- * Applicable uniquement à partir de janvier 2026
671
+ * Applicable uniquement à partir de janvier 2027
672
+ *
673
+ * {@link https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000054747079}
637
674
  *
638
- * {@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.}
675
+ * @param dpe {FullDpe}
676
+ * @returns {{ep_conso_5_usages: number; ep_conso_5_usages_m2: number; classe_bilan_dpe: string}}
677
+ */
678
+ export function get_conso_coeff_1_7_2027(dpe) {
679
+ return get_conso_with_coeff(dpe, 0.7 / 0.9);
680
+ }
681
+
682
+ /**
683
+ * Calcul de la nouvelle conso suite à la modification du coefficient pour le chauffage électrique
639
684
  *
640
685
  * @param dpe {FullDpe}
686
+ * @param coeff {number}
641
687
  * @returns {{ep_conso_5_usages: number; ep_conso_5_usages_m2: number; classe_bilan_dpe: string}}
642
688
  */
643
- export function get_conso_coeff_1_9_2026(dpe) {
689
+ function get_conso_with_coeff(dpe, coeff) {
644
690
  const zc_id = dpe.logement.meteo.enum_zone_climatique_id;
645
691
  const ca_id = dpe.logement.meteo.enum_classe_altitude_id;
646
692
  const th = calc_th(dpe.logement.caracteristique_generale.enum_methode_application_dpe_log_id);
647
693
 
648
694
  const ep_conso_5_usages =
649
- (0.9 / 1.3) *
695
+ coeff *
650
696
  (Number(dpe.logement.sortie.ep_conso.ep_conso_5_usages) -
651
697
  Number(dpe.logement.sortie.ef_conso.conso_5_usages)) +
652
698
  Number(dpe.logement.sortie.ef_conso.conso_5_usages);
package/index.js CHANGED
@@ -3,8 +3,16 @@ import {
3
3
  calcul_3cl_xml,
4
4
  get_classe_ges_dpe,
5
5
  get_conso_coeff_1_9_2026,
6
+ get_conso_coeff_1_7_2027,
6
7
  getVersion
7
8
  } from './engine.js';
8
- export { calcul_3cl, calcul_3cl_xml, get_classe_ges_dpe, get_conso_coeff_1_9_2026, getVersion };
9
+ export {
10
+ calcul_3cl,
11
+ calcul_3cl_xml,
12
+ get_classe_ges_dpe,
13
+ get_conso_coeff_1_9_2026,
14
+ get_conso_coeff_1_7_2027,
15
+ getVersion
16
+ };
9
17
  import { Umur, Uph, Upb, Uporte, Ubv, Upt } from './3_deperdition.js';
10
18
  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.4.5",
3
+ "version": "1.5.0",
4
4
  "description": "Open Source 3CL-DPE engine",
5
5
  "main": "index.js",
6
6
  "directories": {