@open3cl/engine 1.8.44 → 1.8.45
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/14_generateur_ecs.js +25 -2
- package/14_generateur_ecs.spec.js +69 -5
- package/README.md +22 -22
- package/engine.js +1 -1
- package/package.json +1 -1
package/14_generateur_ecs.js
CHANGED
|
@@ -218,6 +218,14 @@ export function rgrsReseauUrbain(de, ecs_de) {
|
|
|
218
218
|
if (de.enum_type_generateur_ecs_id === '73') {
|
|
219
219
|
return 0.9;
|
|
220
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Type 72 explicitement non isolé : 0.75, quel que soit reseau_distribution_isole (qui porte sur
|
|
223
|
+
* le réseau de distribution ECS, pas sur l'équipement du réseau de chaleur). Moteur de référence
|
|
224
|
+
* CSTB : Calcul_installation_ECS.cs, isolation_equipement_reseau = installation_non_isoles -> 0.75.
|
|
225
|
+
*/
|
|
226
|
+
if (de.enum_type_generateur_ecs_id === '72') {
|
|
227
|
+
return 0.75;
|
|
228
|
+
}
|
|
221
229
|
/**
|
|
222
230
|
* Pour les autres générateurs assimilés à un réseau de chaleur (ex : installation
|
|
223
231
|
* collective multi-bâtiment modélisée comme un réseau de chaleur), on retombe sur
|
|
@@ -346,8 +354,23 @@ export default function calc_gen_ecs(dpe, gen_ecs, ecs_di, ecs_de, GV, ca_id, zc
|
|
|
346
354
|
}
|
|
347
355
|
}
|
|
348
356
|
|
|
349
|
-
di.rendement_generation_stockage
|
|
350
|
-
|
|
357
|
+
const rgSaisi = di.rendement_generation_stockage;
|
|
358
|
+
let rgReseau = rgrsReseauUrbain(de, ecs_de);
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Type 72 (réseau non isolé) exporté avec 0.9 : le logiciel n'a pas transmis
|
|
362
|
+
* isolation_equipement_reseau = installation_non_isoles au moteur de référence, qui applique alors
|
|
363
|
+
* 0.9 (Tribu Calcul_installation_ECS.cs, cas reseau_de_chaleur). On reproduit la valeur du DPE.
|
|
364
|
+
*/
|
|
365
|
+
if (bug_for_bug_compat && de.enum_type_generateur_ecs_id === '72' && rgSaisi === 0.9) {
|
|
366
|
+
rgReseau = 0.9;
|
|
367
|
+
console.warn(
|
|
368
|
+
`Correction rendement_generation_stockage pour le générateur ECS ${de.description} (0.9 saisi pour un réseau de chaleur non isolé)`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
di.rendement_generation_stockage = rgReseau;
|
|
373
|
+
di.rendement_generation_stockage_depensier = rgReseau;
|
|
351
374
|
|
|
352
375
|
Iecs = 1 / di.rendement_generation_stockage;
|
|
353
376
|
Iecs_dep = 1 / di.rendement_generation_stockage_depensier;
|
|
@@ -118,17 +118,32 @@ describe('rgrsReseauUrbain - rendement d’un réseau de chaleur', () => {
|
|
|
118
118
|
expect(rgrsReseauUrbain({ enum_type_generateur_ecs_id: '73' }, {})).toBe(0.9);
|
|
119
119
|
});
|
|
120
120
|
|
|
121
|
-
test('réseau
|
|
121
|
+
test('type 72 (réseau non isolé) : 0.75, même si le réseau de distribution est isolé', () => {
|
|
122
|
+
// reseau_distribution_isole porte sur la distribution ECS, pas sur l'équipement du réseau de
|
|
123
|
+
// chaleur : le type 72 impose 0.75 (Calcul_installation_ECS.cs, installation_non_isoles).
|
|
122
124
|
expect(
|
|
123
125
|
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '72' }, { reseau_distribution_isole: 1 })
|
|
124
|
-
).toBe(0.
|
|
126
|
+
).toBe(0.75);
|
|
125
127
|
});
|
|
126
128
|
|
|
127
|
-
test('réseau non isolé
|
|
129
|
+
test('type 72 (réseau non isolé), distribution non isolée : 0.75', () => {
|
|
128
130
|
expect(
|
|
129
131
|
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '72' }, { reseau_distribution_isole: 0 })
|
|
130
132
|
).toBe(0.75);
|
|
131
133
|
});
|
|
134
|
+
|
|
135
|
+
test('autre générateur assimilé réseau de chaleur, installation marquée isolée : 0.9', () => {
|
|
136
|
+
expect(
|
|
137
|
+
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '84' }, { reseau_distribution_isole: 1 })
|
|
138
|
+
).toBe(0.9);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('autre générateur assimilé réseau de chaleur, non isolé par défaut : 0.75', () => {
|
|
142
|
+
expect(
|
|
143
|
+
rgrsReseauUrbain({ enum_type_generateur_ecs_id: '84' }, { reseau_distribution_isole: 0 })
|
|
144
|
+
).toBe(0.75);
|
|
145
|
+
expect(rgrsReseauUrbain({ enum_type_generateur_ecs_id: '84' }, undefined)).toBe(0.75);
|
|
146
|
+
});
|
|
132
147
|
});
|
|
133
148
|
|
|
134
149
|
/**
|
|
@@ -758,6 +773,54 @@ describe('calc_gen_ecs - consommation par générateur', () => {
|
|
|
758
773
|
warnSpy.mockRestore();
|
|
759
774
|
});
|
|
760
775
|
|
|
776
|
+
/**
|
|
777
|
+
* Type 72 exporté à 0.9 : le logiciel n'a pas transmis « non isolé » au moteur de référence
|
|
778
|
+
* (Tribu Calcul_installation_ECS.cs : 0.9 hors installation_non_isoles). En bug_for_bug_compat,
|
|
779
|
+
* on reproduit la valeur saisie.
|
|
780
|
+
*/
|
|
781
|
+
test.each([0, 1])(
|
|
782
|
+
'bug_for_bug_compat : type 72 avec 0.9 saisi (distribution isolée = %s) -> 0.9 conservé',
|
|
783
|
+
(iso) => {
|
|
784
|
+
state.bug = true;
|
|
785
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
786
|
+
ecs_de.reseau_distribution_isole = iso;
|
|
787
|
+
const g = {
|
|
788
|
+
donnee_entree: {
|
|
789
|
+
usage_generateur: 'ecs',
|
|
790
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
791
|
+
volume_stockage: 0,
|
|
792
|
+
type_energie: 'réseau de chauffage urbain',
|
|
793
|
+
enum_type_generateur_ecs_id: '72'
|
|
794
|
+
},
|
|
795
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.9 }
|
|
796
|
+
};
|
|
797
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
798
|
+
|
|
799
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.9);
|
|
800
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage_depensier).toBe(0.9);
|
|
801
|
+
// valeur de référence de régression : 100 / (0.9 * 0.9)
|
|
802
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(123.45679012345678, 9);
|
|
803
|
+
warnSpy.mockRestore();
|
|
804
|
+
}
|
|
805
|
+
);
|
|
806
|
+
|
|
807
|
+
test('sans bug_for_bug_compat : type 72 avec 0.9 saisi -> 0.75 (méthode)', () => {
|
|
808
|
+
ecs_de.reseau_distribution_isole = 1;
|
|
809
|
+
const g = {
|
|
810
|
+
donnee_entree: {
|
|
811
|
+
usage_generateur: 'ecs',
|
|
812
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
813
|
+
volume_stockage: 0,
|
|
814
|
+
type_energie: 'réseau de chauffage urbain',
|
|
815
|
+
enum_type_generateur_ecs_id: '72'
|
|
816
|
+
},
|
|
817
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.9 }
|
|
818
|
+
};
|
|
819
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
820
|
+
|
|
821
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.75);
|
|
822
|
+
});
|
|
823
|
+
|
|
761
824
|
test('usage chauffage + ecs : type de générateur limité aux générateurs mixtes', () => {
|
|
762
825
|
const g = gen({
|
|
763
826
|
type_energie: 'électricité',
|
|
@@ -839,8 +902,9 @@ describe('calc_gen_ecs - consommation par générateur', () => {
|
|
|
839
902
|
};
|
|
840
903
|
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
841
904
|
|
|
842
|
-
//
|
|
843
|
-
|
|
905
|
+
// Type 72 (réseau non isolé) : 0.75 conservé malgré reseau_distribution_isole = 1, l'avertissement
|
|
906
|
+
// d'incohérence reste émis.
|
|
907
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.75);
|
|
844
908
|
expect(warnSpy).toHaveBeenCalled();
|
|
845
909
|
warnSpy.mockRestore();
|
|
846
910
|
});
|
package/README.md
CHANGED
|
@@ -370,28 +370,28 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
370
370
|
|
|
371
371
|
<!-- CORPUS:START -->
|
|
372
372
|
|
|
373
|
-
> **Version `1.8.
|
|
373
|
+
> **Version `1.8.44`** · branche `main` · généré le 2026-10-10
|
|
374
374
|
> Seuil de tolérance **5%**
|
|
375
375
|
|
|
376
376
|
<table>
|
|
377
377
|
<tr>
|
|
378
378
|
<td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
|
|
379
379
|
<td align="center"><strong>89 984</strong><br/><sub>DPE analysés</sub></td>
|
|
380
|
-
<td align="center"><strong>61
|
|
381
|
-
<td align="center"><strong>68,
|
|
380
|
+
<td align="center"><strong>61 996</strong><br/><sub>DPE conformes</sub></td>
|
|
381
|
+
<td align="center"><strong>68,90 %</strong><br/><sub>réussite globale</sub></td>
|
|
382
382
|
</tr>
|
|
383
383
|
</table>
|
|
384
384
|
|
|
385
385
|
| | Corpus | Réussite | | DPE conformes |
|
|
386
386
|
| :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
|
|
387
387
|
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **46,24 %** | `█████████░░░░░░░░░░░` | 4 624 / 9 999 |
|
|
388
|
-
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,
|
|
389
|
-
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **89,
|
|
388
|
+
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,56 %** | `███████████████████░` | 9 256 / 10 000 |
|
|
389
|
+
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **89,57 %** | `██████████████████░░` | 8 950 / 9 992 |
|
|
390
390
|
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,66 %** | `██████████████████░░` | 8 865 / 9 999 |
|
|
391
|
-
| 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **84,
|
|
392
|
-
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **71,
|
|
393
|
-
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **66,
|
|
394
|
-
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **53,
|
|
391
|
+
| 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **84,23 %** | `█████████████████░░░` | 8 421 / 9 998 |
|
|
392
|
+
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **71,70 %** | `██████████████░░░░░░` | 7 170 / 10 000 |
|
|
393
|
+
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **66,32 %** | `█████████████░░░░░░░` | 6 631 / 9 999 |
|
|
394
|
+
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **53,75 %** | `███████████░░░░░░░░░` | 5 373 / 9 997 |
|
|
395
395
|
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **27,06 %** | `█████░░░░░░░░░░░░░░░` | 2 706 / 10 000 |
|
|
396
396
|
|
|
397
397
|
<sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
|
|
@@ -403,24 +403,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
403
403
|
|
|
404
404
|
<table>
|
|
405
405
|
<tr>
|
|
406
|
-
<td align="center"><strong>
|
|
407
|
-
<td align="center"><strong>4,
|
|
408
|
-
<td align="center"><strong>0,
|
|
409
|
-
<td align="center"><strong>
|
|
406
|
+
<td align="center"><strong>5,42 ms</strong><br/><sub>moyenne</sub></td>
|
|
407
|
+
<td align="center"><strong>4,79 ms</strong><br/><sub>médiane</sub></td>
|
|
408
|
+
<td align="center"><strong>0,10 ms</strong><br/><sub>min</sub></td>
|
|
409
|
+
<td align="center"><strong>559,3 ms</strong><br/><sub>max</sub></td>
|
|
410
410
|
</tr>
|
|
411
411
|
</table>
|
|
412
412
|
|
|
413
413
|
| Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
|
|
414
414
|
| :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
|
|
415
|
-
| **Généraliste** | 4,
|
|
416
|
-
| **Appartement · chauffage individuel (2025)** | 3,
|
|
417
|
-
| **Logement individuel (2025)** |
|
|
418
|
-
| **Maison individuelle (2025)** | 5,
|
|
419
|
-
| **Immeuble · chauffage individuel** | 6,
|
|
420
|
-
| **Appartement · chauffage collectif (2025)** | 4,
|
|
421
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
422
|
-
| **Immeuble · chauffage mixte** |
|
|
423
|
-
| **Individuel généré depuis l'immeuble (2026)** |
|
|
415
|
+
| **Généraliste** | 4,88 ms | 4,46 ms | 0,21 ms | 35,3 ms | 8,71 ms | 11,8 ms |
|
|
416
|
+
| **Appartement · chauffage individuel (2025)** | 3,85 ms | 3,53 ms | 1,35 ms | 27,3 ms | 6,58 ms | 8,11 ms |
|
|
417
|
+
| **Logement individuel (2025)** | 5,06 ms | 4,53 ms | 1,54 ms | 38,3 ms | 9,39 ms | 12,9 ms |
|
|
418
|
+
| **Maison individuelle (2025)** | 5,93 ms | 5,34 ms | 1,90 ms | 48,4 ms | 10,7 ms | 13,8 ms |
|
|
419
|
+
| **Immeuble · chauffage individuel** | 6,83 ms | 5,88 ms | 0,10 ms | 123,6 ms | 13,7 ms | 21,9 ms |
|
|
420
|
+
| **Appartement · chauffage collectif (2025)** | 4,55 ms | 4,32 ms | 1,48 ms | 36,9 ms | 7,21 ms | 9,12 ms |
|
|
421
|
+
| **Immeuble · chauffage collectif** | 5,84 ms | 5,11 ms | 0,19 ms | 99,2 ms | 10,6 ms | 18,0 ms |
|
|
422
|
+
| **Immeuble · chauffage mixte** | 5,71 ms | 4,71 ms | 0,21 ms | 559,3 ms | 12,0 ms | 19,5 ms |
|
|
423
|
+
| **Individuel généré depuis l'immeuble (2026)** | 6,13 ms | 5,27 ms | 1,72 ms | 47,2 ms | 11,6 ms | 18,2 ms |
|
|
424
424
|
|
|
425
425
|
<sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
|
|
426
426
|
dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
|
package/engine.js
CHANGED
|
@@ -33,7 +33,7 @@ import getFicheTechnique from './ficheTechnique.js';
|
|
|
33
33
|
import { ProductionENR, ratioProrataPvLogement } from './16.2_production_enr.js';
|
|
34
34
|
import DpeSanitizerService from './dpe-sanitizer.service.js';
|
|
35
35
|
|
|
36
|
-
const LIB_VERSION = '1.8.
|
|
36
|
+
const LIB_VERSION = '1.8.45';
|
|
37
37
|
|
|
38
38
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
39
39
|
|