@open3cl/engine 1.8.60 → 1.8.62
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 -8
- package/14_generateur_ecs.spec.js +127 -0
- package/9_generateur_ch.js +32 -1
- package/9_generateur_ch.spec.js +70 -1
- package/README.md +23 -23
- package/engine.js +1 -1
- package/package.json +1 -1
package/14_generateur_ecs.js
CHANGED
|
@@ -236,6 +236,28 @@ export function rg_accumulateur_gaz(di, besoin_ecs) {
|
|
|
236
236
|
);
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
+
/**
|
|
240
|
+
* Rendements de génération + stockage possibles pour un réseau de chaleur (Tribu
|
|
241
|
+
* Calcul_installation_ECS.cs l. 264-286 : 0,75 si l'équipement réseau est non isolé, sinon 0,9).
|
|
242
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.3
|
|
243
|
+
*/
|
|
244
|
+
const RGS_RESEAU_CHALEUR = [0.75, 0.9];
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Le moteur de référence choisit 0,75 ou 0,9 à partir de isolation_equipement_reseau, qui n'est pas
|
|
248
|
+
* exporté dans le DPE. Le type de générateur (72 / 73) et reseau_distribution_isole ne le reflètent
|
|
249
|
+
* pas toujours : les logiciels exportent 0,75 pour des types 73 et, pour les générateurs assimilés à un
|
|
250
|
+
* réseau de chaleur (76, multi-bâtiment…), reseau_distribution_isole n'est qu'un proxy.
|
|
251
|
+
* En bug_for_bug_compat, le rendement saisi (0,75 ou 0,9) est donc la seule source fiable.
|
|
252
|
+
*
|
|
253
|
+
* @param {number} rgSaisi rendement_generation_stockage exporté dans le DPE
|
|
254
|
+
* @param {number} rgReseau rendement déduit par Open3CL
|
|
255
|
+
* @returns {boolean} true si le rendement saisi doit remplacer le rendement déduit
|
|
256
|
+
*/
|
|
257
|
+
export function isRgsReseauChaleurSaisiRepris(rgSaisi, rgReseau) {
|
|
258
|
+
return RGS_RESEAU_CHALEUR.includes(rgSaisi) && rgSaisi !== rgReseau;
|
|
259
|
+
}
|
|
260
|
+
|
|
239
261
|
export function rgrsReseauUrbain(de, ecs_de) {
|
|
240
262
|
/**
|
|
241
263
|
* Le rendement de génération d'un réseau de chaleur dépend de son caractère isolé ou non.
|
|
@@ -385,16 +407,11 @@ export default function calc_gen_ecs(dpe, gen_ecs, ecs_di, ecs_de, GV, ca_id, zc
|
|
|
385
407
|
const rgSaisi = di.rendement_generation_stockage;
|
|
386
408
|
let rgReseau = rgrsReseauUrbain(de, ecs_de);
|
|
387
409
|
|
|
388
|
-
|
|
389
|
-
* Type 72 (réseau non isolé) exporté avec 0.9 : le logiciel n'a pas transmis
|
|
390
|
-
* isolation_equipement_reseau = installation_non_isoles au moteur de référence, qui applique alors
|
|
391
|
-
* 0.9 (Tribu Calcul_installation_ECS.cs, cas reseau_de_chaleur). On reproduit la valeur du DPE.
|
|
392
|
-
*/
|
|
393
|
-
if (bug_for_bug_compat && de.enum_type_generateur_ecs_id === '72' && rgSaisi === 0.9) {
|
|
394
|
-
rgReseau = 0.9;
|
|
410
|
+
if (bug_for_bug_compat && isRgsReseauChaleurSaisiRepris(rgSaisi, rgReseau)) {
|
|
395
411
|
console.warn(
|
|
396
|
-
`Correction rendement_generation_stockage pour le générateur ECS ${de.description} (
|
|
412
|
+
`Correction rendement_generation_stockage pour le générateur ECS ${de.description} (${rgSaisi} saisi au lieu de ${rgReseau})`
|
|
397
413
|
);
|
|
414
|
+
rgReseau = rgSaisi;
|
|
398
415
|
}
|
|
399
416
|
|
|
400
417
|
di.rendement_generation_stockage = rgReseau;
|
|
@@ -75,6 +75,7 @@ const {
|
|
|
75
75
|
rgrs_chaudiere,
|
|
76
76
|
rg_accumulateur_gaz,
|
|
77
77
|
rgrsReseauUrbain,
|
|
78
|
+
isRgsReseauChaleurSaisiRepris,
|
|
78
79
|
isPveilChauffeEauGazInstantaneTribu,
|
|
79
80
|
PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU,
|
|
80
81
|
RG_CHAUDIERE_ELECTRIQUE,
|
|
@@ -150,6 +151,35 @@ describe('rgrsReseauUrbain - rendement d’un réseau de chaleur', () => {
|
|
|
150
151
|
});
|
|
151
152
|
});
|
|
152
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Rendement saisi d'un réseau de chaleur repris en bug_for_bug_compat : isolation_equipement_reseau,
|
|
156
|
+
* lu par le moteur de référence, n'est pas exporté.
|
|
157
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.3
|
|
158
|
+
* @see https://github.com/Open3CL/engine/issues/290
|
|
159
|
+
*/
|
|
160
|
+
describe('isRgsReseauChaleurSaisiRepris - reprise du rendement saisi', () => {
|
|
161
|
+
test.each([
|
|
162
|
+
[0.75, 0.9],
|
|
163
|
+
[0.9, 0.75]
|
|
164
|
+
])('saisi %s, déduit %s : rendement saisi repris', (saisi, deduit) => {
|
|
165
|
+
expect(isRgsReseauChaleurSaisiRepris(saisi, deduit)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test.each([
|
|
169
|
+
[0.75, 0.75],
|
|
170
|
+
[0.9, 0.9]
|
|
171
|
+
])('saisi %s identique au déduit %s : pas de reprise', (saisi, deduit) => {
|
|
172
|
+
expect(isRgsReseauChaleurSaisiRepris(saisi, deduit)).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test.each([0.8, 1, 0, undefined, null, '0.9'])(
|
|
176
|
+
'saisi hors {0,75 ; 0,9} (%s) : pas de reprise',
|
|
177
|
+
(saisi) => {
|
|
178
|
+
expect(isRgsReseauChaleurSaisiRepris(saisi, 0.75)).toBe(false);
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
153
183
|
/**
|
|
154
184
|
* Veilleuse des chauffe-eau gaz / GPL instantanés 2001-2015 : 100 W selon la méthode, 10 W chez Tribu.
|
|
155
185
|
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1.1
|
|
@@ -947,6 +977,103 @@ describe('calc_gen_ecs - consommation par générateur', () => {
|
|
|
947
977
|
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.75);
|
|
948
978
|
});
|
|
949
979
|
|
|
980
|
+
/**
|
|
981
|
+
* Type 73 exporté à 0,75, générateur assimilé (76, multi-bâtiment) : le rendement saisi est repris
|
|
982
|
+
* en bug_for_bug_compat, quel que soit reseau_distribution_isole (#290).
|
|
983
|
+
*/
|
|
984
|
+
test.each([
|
|
985
|
+
['73', 1, 0.75],
|
|
986
|
+
['73', 0, 0.75],
|
|
987
|
+
['76', 1, 0.75],
|
|
988
|
+
['84', 1, 0.75]
|
|
989
|
+
])(
|
|
990
|
+
'bug_for_bug_compat : type %s (distribution isolée = %s), %s saisi -> repris',
|
|
991
|
+
(type, iso, saisi) => {
|
|
992
|
+
state.bug = true;
|
|
993
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
994
|
+
ecs_de.enum_type_installation_id = '3';
|
|
995
|
+
ecs_de.reseau_distribution_isole = iso;
|
|
996
|
+
const g = {
|
|
997
|
+
donnee_entree: {
|
|
998
|
+
usage_generateur: 'ecs',
|
|
999
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
1000
|
+
volume_stockage: 0,
|
|
1001
|
+
type_energie: 'réseau de chauffage urbain',
|
|
1002
|
+
enum_type_generateur_ecs_id: type,
|
|
1003
|
+
description: 'RCU'
|
|
1004
|
+
},
|
|
1005
|
+
donnee_intermediaire: { rendement_generation_stockage: saisi }
|
|
1006
|
+
};
|
|
1007
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
1008
|
+
|
|
1009
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(saisi);
|
|
1010
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage_depensier).toBe(saisi);
|
|
1011
|
+
expect(warnSpy).toHaveBeenCalledWith(
|
|
1012
|
+
expect.stringContaining('Correction rendement_generation_stockage')
|
|
1013
|
+
);
|
|
1014
|
+
warnSpy.mockRestore();
|
|
1015
|
+
}
|
|
1016
|
+
);
|
|
1017
|
+
|
|
1018
|
+
test('bug_for_bug_compat : type 73 avec 0,75 saisi -> conso ECS recalculée avec 0,75', () => {
|
|
1019
|
+
state.bug = true;
|
|
1020
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
1021
|
+
ecs_de.reseau_distribution_isole = 1;
|
|
1022
|
+
const g = {
|
|
1023
|
+
donnee_entree: {
|
|
1024
|
+
usage_generateur: 'ecs',
|
|
1025
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
1026
|
+
volume_stockage: 0,
|
|
1027
|
+
type_energie: 'réseau de chauffage urbain',
|
|
1028
|
+
enum_type_generateur_ecs_id: '73'
|
|
1029
|
+
},
|
|
1030
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.75 }
|
|
1031
|
+
};
|
|
1032
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
1033
|
+
|
|
1034
|
+
// valeur de référence de régression : 100 / (0.75 * 0.9)
|
|
1035
|
+
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(148.14814814814815, 9);
|
|
1036
|
+
warnSpy.mockRestore();
|
|
1037
|
+
});
|
|
1038
|
+
|
|
1039
|
+
test.each([
|
|
1040
|
+
['73', 0.75, 0.9],
|
|
1041
|
+
['76', 0.75, 0.9]
|
|
1042
|
+
])('sans bug_for_bug_compat : type %s avec %s saisi -> %s (méthode)', (type, saisi, attendu) => {
|
|
1043
|
+
ecs_de.reseau_distribution_isole = 1;
|
|
1044
|
+
const g = {
|
|
1045
|
+
donnee_entree: {
|
|
1046
|
+
usage_generateur: 'ecs',
|
|
1047
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
1048
|
+
volume_stockage: 0,
|
|
1049
|
+
type_energie: 'réseau de chauffage urbain',
|
|
1050
|
+
enum_type_generateur_ecs_id: type
|
|
1051
|
+
},
|
|
1052
|
+
donnee_intermediaire: { rendement_generation_stockage: saisi }
|
|
1053
|
+
};
|
|
1054
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
1055
|
+
|
|
1056
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(attendu);
|
|
1057
|
+
});
|
|
1058
|
+
|
|
1059
|
+
test('bug_for_bug_compat : rendement saisi hors {0,75 ; 0,9} -> rendement déduit conservé', () => {
|
|
1060
|
+
state.bug = true;
|
|
1061
|
+
ecs_de.reseau_distribution_isole = 1;
|
|
1062
|
+
const g = {
|
|
1063
|
+
donnee_entree: {
|
|
1064
|
+
usage_generateur: 'ecs',
|
|
1065
|
+
type_stockage_ecs: "abscence de stockage d'ecs (production instantanée)",
|
|
1066
|
+
volume_stockage: 0,
|
|
1067
|
+
type_energie: 'réseau de chauffage urbain',
|
|
1068
|
+
enum_type_generateur_ecs_id: '73'
|
|
1069
|
+
},
|
|
1070
|
+
donnee_intermediaire: { rendement_generation_stockage: 0.8 }
|
|
1071
|
+
};
|
|
1072
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'immeuble');
|
|
1073
|
+
|
|
1074
|
+
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.9);
|
|
1075
|
+
});
|
|
1076
|
+
|
|
950
1077
|
test('usage chauffage + ecs : type de générateur limité aux générateurs mixtes', () => {
|
|
951
1078
|
const g = gen({
|
|
952
1079
|
type_energie: 'électricité',
|
package/9_generateur_ch.js
CHANGED
|
@@ -252,7 +252,10 @@ export function calc_generateur_ch(
|
|
|
252
252
|
/**
|
|
253
253
|
* 15 Calcul des consommations d’auxiliaires des installations de chauffage (Caux_ch) et d’ECS (Caux_ecs)
|
|
254
254
|
*/
|
|
255
|
-
if (
|
|
255
|
+
if (
|
|
256
|
+
hasConsoForAuxDistribution(de.enum_type_generateur_ch_id) ||
|
|
257
|
+
hasEmetteurAerauliqueLie(em_ch, de)
|
|
258
|
+
) {
|
|
256
259
|
conso_aux_distribution_ch(em_ch, de, di, du, Sh, zc_id, ca_id, ilpa, GV);
|
|
257
260
|
}
|
|
258
261
|
const paroi_ancienne = isParoisAncienneInertieLourde(dpe);
|
|
@@ -316,6 +319,34 @@ export function hasConsoForAuxDistribution(enum_type_generateur_ch_id) {
|
|
|
316
319
|
);
|
|
317
320
|
}
|
|
318
321
|
|
|
322
|
+
/** enum_type_emission_distribution_id 5 : réseau aéraulique (air soufflé) */
|
|
323
|
+
const TYPE_EMISSION_DISTRIBUTION_AERAULIQUE = 5;
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 15.2 Auxiliaires de distribution d'un réseau aéraulique (émetteur 5).
|
|
327
|
+
*
|
|
328
|
+
* Le moteur de référence calcule les auxiliaires de distribution à partir du réseau desservi
|
|
329
|
+
* (ΔθDim = 15, Fcot = 0,802), et non du générateur : une PAC air/air (1 à 3) sur réseau
|
|
330
|
+
* aéraulique a donc des auxiliaires de distribution, bien que hasConsoForAuxDistribution l'exclue.
|
|
331
|
+
* L'émetteur est rattaché au générateur s'il est seul, ou par enum_lien_generateur_emetteur_id.
|
|
332
|
+
*
|
|
333
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
|
|
334
|
+
* @see Tribu Calcul_installation.cs (calcul_Cauxiliaires), Calcul_batiment.cs (Calcul_Cauxiliaires)
|
|
335
|
+
* @see https://github.com/Open3CL/engine/issues/291
|
|
336
|
+
* @param em_ch {EmetteurChauffageItem[]}
|
|
337
|
+
* @param de {Donnee_entree} donnée d'entrée du générateur de chauffage
|
|
338
|
+
* @returns {boolean}
|
|
339
|
+
*/
|
|
340
|
+
export function hasEmetteurAerauliqueLie(em_ch, de) {
|
|
341
|
+
return (em_ch || []).some(
|
|
342
|
+
(em) =>
|
|
343
|
+
Number(em.donnee_entree.enum_type_emission_distribution_id) ===
|
|
344
|
+
TYPE_EMISSION_DISTRIBUTION_AERAULIQUE &&
|
|
345
|
+
(em_ch.length === 1 ||
|
|
346
|
+
em.donnee_entree.enum_lien_generateur_emetteur_id === de.enum_lien_generateur_emetteur_id)
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
319
350
|
/**
|
|
320
351
|
* 18.3 Cas des bâtiments à inertie lourde, constitués de parois anciennes
|
|
321
352
|
*
|
package/9_generateur_ch.spec.js
CHANGED
|
@@ -68,7 +68,8 @@ const {
|
|
|
68
68
|
type_generateur_ch,
|
|
69
69
|
checkForGeneratorType,
|
|
70
70
|
calc_generateur_ch,
|
|
71
|
-
hasConsoForAuxDistribution
|
|
71
|
+
hasConsoForAuxDistribution,
|
|
72
|
+
hasEmetteurAerauliqueLie
|
|
72
73
|
} = await import('./9_generateur_ch.js');
|
|
73
74
|
const { requestInput, requestInputID, tv, tvColumnIDs } = await import('./utils.js');
|
|
74
75
|
const { conso_aux_distribution_ch, conso_aux_gen } = await import('./15_conso_aux.js');
|
|
@@ -413,6 +414,47 @@ describe('hasConsoForAuxDistribution - éligibilité aux auxiliaires de distribu
|
|
|
413
414
|
});
|
|
414
415
|
});
|
|
415
416
|
|
|
417
|
+
/**
|
|
418
|
+
* 15.2 Réseau aéraulique (émetteur 5) rattaché au générateur : auxiliaires de distribution calculés
|
|
419
|
+
* quel que soit le générateur, comme le moteur de référence (#291).
|
|
420
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
|
|
421
|
+
*/
|
|
422
|
+
describe('hasEmetteurAerauliqueLie - réseau aéraulique rattaché au générateur', () => {
|
|
423
|
+
const em = (ed, lien) => ({
|
|
424
|
+
donnee_entree: {
|
|
425
|
+
enum_type_emission_distribution_id: ed,
|
|
426
|
+
enum_lien_generateur_emetteur_id: lien
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
test('émetteur 5 seul : rattaché au générateur quel que soit le lien', () => {
|
|
431
|
+
expect(
|
|
432
|
+
hasEmetteurAerauliqueLie([em('5', '2')], { enum_lien_generateur_emetteur_id: '1' })
|
|
433
|
+
).toBe(true);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test('identifiant numérique ou chaîne : même règle', () => {
|
|
437
|
+
expect(hasEmetteurAerauliqueLie([em(5)], {})).toBe(true);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
test('émetteur 5 parmi plusieurs : rattaché si même lien générateur/émetteur', () => {
|
|
441
|
+
const de = { enum_lien_generateur_emetteur_id: '1' };
|
|
442
|
+
expect(hasEmetteurAerauliqueLie([em('1', '2'), em('5', '1')], de)).toBe(true);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test('émetteur 5 relié à un autre générateur : non rattaché', () => {
|
|
446
|
+
const de = { enum_lien_generateur_emetteur_id: '1' };
|
|
447
|
+
expect(hasEmetteurAerauliqueLie([em('1', '1'), em('5', '2')], de)).toBe(false);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
test('aucun émetteur aéraulique ou liste absente : faux', () => {
|
|
451
|
+
expect(hasEmetteurAerauliqueLie([em('1'), em('3')], {})).toBe(false);
|
|
452
|
+
expect(hasEmetteurAerauliqueLie([em('4')], {})).toBe(false);
|
|
453
|
+
expect(hasEmetteurAerauliqueLie([], {})).toBe(false);
|
|
454
|
+
expect(hasEmetteurAerauliqueLie(undefined, {})).toBe(false);
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
|
|
416
458
|
/**
|
|
417
459
|
* calc_generateur_ch : aiguillage du rendement puis délégations.
|
|
418
460
|
*/
|
|
@@ -562,6 +604,33 @@ describe('calc_generateur_ch - orchestration du calcul générateur', () => {
|
|
|
562
604
|
expect(conso_aux_distribution_ch).not.toHaveBeenCalled();
|
|
563
605
|
});
|
|
564
606
|
|
|
607
|
+
/**
|
|
608
|
+
* PAC air/air (non éligible par son type) reliée à un réseau aéraulique : auxiliaires calculés (#291).
|
|
609
|
+
* @see https://github.com/Open3CL/engine/issues/291
|
|
610
|
+
*/
|
|
611
|
+
test('PAC air/air sur réseau aéraulique (émetteur 5) : conso_aux_distribution_ch appelé', () => {
|
|
612
|
+
const gen = generateur({ enum_type_generateur_ch_id: '3' }, { isPacGenerator: true });
|
|
613
|
+
const em = { donnee_entree: { enum_type_emission_distribution_id: '5' } };
|
|
614
|
+
appel(gen, [em]);
|
|
615
|
+
expect(conso_aux_distribution_ch).toHaveBeenCalledWith(
|
|
616
|
+
[em],
|
|
617
|
+
gen.donnee_entree,
|
|
618
|
+
gen.donnee_intermediaire,
|
|
619
|
+
gen.donnee_utilisateur,
|
|
620
|
+
100,
|
|
621
|
+
1,
|
|
622
|
+
1,
|
|
623
|
+
0,
|
|
624
|
+
150
|
|
625
|
+
);
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
test('PAC air/air sur émetteur non aéraulique : conso_aux_distribution_ch ignoré', () => {
|
|
629
|
+
const gen = generateur({ enum_type_generateur_ch_id: '3' }, { isPacGenerator: true });
|
|
630
|
+
appel(gen, [{ donnee_entree: { enum_type_emission_distribution_id: '1' } }]);
|
|
631
|
+
expect(conso_aux_distribution_ch).not.toHaveBeenCalled();
|
|
632
|
+
});
|
|
633
|
+
|
|
565
634
|
test('bâtiment à parois anciennes et inertie lourde transmis à conso_ch', () => {
|
|
566
635
|
vi.mocked(requestInputID).mockReturnValue('1');
|
|
567
636
|
vi.mocked(tv).mockReturnValue({ rg: '0.9', tv_rendement_generation_id: '1' });
|
package/README.md
CHANGED
|
@@ -375,28 +375,28 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
375
375
|
|
|
376
376
|
<!-- CORPUS:START -->
|
|
377
377
|
|
|
378
|
-
> **Version `1.8.
|
|
378
|
+
> **Version `1.8.61`** · branche `main` · généré le 2026-10-15
|
|
379
379
|
> Seuil de tolérance **5%**
|
|
380
380
|
|
|
381
381
|
<table>
|
|
382
382
|
<tr>
|
|
383
383
|
<td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
|
|
384
384
|
<td align="center"><strong>89 418</strong><br/><sub>DPE analysés</sub></td>
|
|
385
|
-
<td align="center"><strong>70
|
|
386
|
-
<td align="center"><strong>
|
|
385
|
+
<td align="center"><strong>70 789</strong><br/><sub>DPE conformes</sub></td>
|
|
386
|
+
<td align="center"><strong>79,17 %</strong><br/><sub>réussite globale</sub></td>
|
|
387
387
|
</tr>
|
|
388
388
|
</table>
|
|
389
389
|
|
|
390
390
|
| | Corpus | Réussite | | DPE conformes |
|
|
391
391
|
| :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
|
|
392
|
-
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **47,
|
|
393
|
-
| 🟢 | **Appartement · chauffage
|
|
394
|
-
| 🟢 | **Appartement · chauffage
|
|
395
|
-
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **90,
|
|
396
|
-
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,
|
|
397
|
-
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **
|
|
398
|
-
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **85,
|
|
399
|
-
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **69,
|
|
392
|
+
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **47,71 %** | `██████████░░░░░░░░░░` | 4 771 / 9 999 |
|
|
393
|
+
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **93,28 %** | `███████████████████░` | 9 328 / 10 000 |
|
|
394
|
+
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,96 %** | `███████████████████░` | 9 296 / 10 000 |
|
|
395
|
+
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **90,69 %** | `██████████████████░░` | 9 062 / 9 992 |
|
|
396
|
+
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,92 %** | `██████████████████░░` | 8 891 / 9 999 |
|
|
397
|
+
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **88,19 %** | `██████████████████░░` | 8 655 / 9 814 |
|
|
398
|
+
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **85,05 %** | `█████████████████░░░` | 8 503 / 9 998 |
|
|
399
|
+
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **69,36 %** | `██████████████░░░░░░` | 6 670 / 9 616 |
|
|
400
400
|
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **56,13 %** | `███████████░░░░░░░░░` | 5 613 / 10 000 |
|
|
401
401
|
|
|
402
402
|
<sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
|
|
@@ -408,24 +408,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
408
408
|
|
|
409
409
|
<table>
|
|
410
410
|
<tr>
|
|
411
|
-
<td align="center"><strong>5,
|
|
412
|
-
<td align="center"><strong>4,
|
|
411
|
+
<td align="center"><strong>5,18 ms</strong><br/><sub>moyenne</sub></td>
|
|
412
|
+
<td align="center"><strong>4,55 ms</strong><br/><sub>médiane</sub></td>
|
|
413
413
|
<td align="center"><strong>0,11 ms</strong><br/><sub>min</sub></td>
|
|
414
|
-
<td align="center"><strong>
|
|
414
|
+
<td align="center"><strong>994,3 ms</strong><br/><sub>max</sub></td>
|
|
415
415
|
</tr>
|
|
416
416
|
</table>
|
|
417
417
|
|
|
418
418
|
| Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
|
|
419
419
|
| :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
|
|
420
|
-
| **Généraliste** | 4,
|
|
421
|
-
| **Appartement · chauffage
|
|
422
|
-
| **Appartement · chauffage
|
|
423
|
-
| **Logement individuel (2025)** |
|
|
424
|
-
| **Maison individuelle (2025)** |
|
|
425
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
426
|
-
| **Immeuble · chauffage individuel** | 6,
|
|
427
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
428
|
-
| **Individuel généré depuis l'immeuble (2026)** |
|
|
420
|
+
| **Généraliste** | 4,55 ms | 4,10 ms | 0,21 ms | 40,1 ms | 8,24 ms | 11,1 ms |
|
|
421
|
+
| **Appartement · chauffage collectif (2025)** | 4,51 ms | 4,14 ms | 1,59 ms | 31,4 ms | 7,33 ms | 9,53 ms |
|
|
422
|
+
| **Appartement · chauffage individuel (2025)** | 4,03 ms | 3,71 ms | 1,49 ms | 34,3 ms | 6,83 ms | 8,45 ms |
|
|
423
|
+
| **Logement individuel (2025)** | 4,85 ms | 4,34 ms | 1,66 ms | 30,8 ms | 8,92 ms | 11,8 ms |
|
|
424
|
+
| **Maison individuelle (2025)** | 5,54 ms | 5,04 ms | 1,83 ms | 50,4 ms | 9,68 ms | 12,7 ms |
|
|
425
|
+
| **Immeuble · chauffage collectif** | 5,54 ms | 4,80 ms | 0,12 ms | 92,2 ms | 10,1 ms | 15,7 ms |
|
|
426
|
+
| **Immeuble · chauffage individuel** | 6,45 ms | 5,48 ms | 0,11 ms | 120,4 ms | 12,9 ms | 20,5 ms |
|
|
427
|
+
| **Immeuble · chauffage mixte** | 5,36 ms | 4,35 ms | 0,18 ms | 994,3 ms | 11,0 ms | 18,0 ms |
|
|
428
|
+
| **Individuel généré depuis l'immeuble (2026)** | 5,80 ms | 4,96 ms | 1,77 ms | 53,2 ms | 10,8 ms | 17,9 ms |
|
|
429
429
|
|
|
430
430
|
<sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
|
|
431
431
|
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
|
@@ -35,7 +35,7 @@ import DpeSanitizerService from './dpe-sanitizer.service.js';
|
|
|
35
35
|
import { reconstituerRdimDpeGenereImmeuble } from './17.2_rdim_dpe_genere_immeuble.js';
|
|
36
36
|
import { reconstituerRdimEcsIndividuelleUnique } from './11_rdim_ecs_individuelle_unique.js';
|
|
37
37
|
|
|
38
|
-
const LIB_VERSION = '1.8.
|
|
38
|
+
const LIB_VERSION = '1.8.62';
|
|
39
39
|
|
|
40
40
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
41
41
|
|