@open3cl/engine 1.8.59 → 1.8.61
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 +60 -8
- package/14_generateur_ecs.spec.js +220 -0
- package/README.md +23 -23
- package/engine.js +1 -1
- package/package.json +1 -1
package/14_generateur_ecs.js
CHANGED
|
@@ -183,6 +183,34 @@ function type_generateur_ecs(di, de, du, usage_generateur) {
|
|
|
183
183
|
/** Rendement de génération d'une chaudière électrique (tv rendement_generation, id 30). */
|
|
184
184
|
export const RG_CHAUDIERE_ELECTRIQUE = 0.97;
|
|
185
185
|
|
|
186
|
+
/**
|
|
187
|
+
* Chauffe-eau gaz / GPL à production instantanée 2001-2015 (types 66 et 113) : la méthode donne
|
|
188
|
+
* Pveil = 100 W, mais le moteur de référence (Tribu, Calcul_generateur.cs, Pveil1 = 0,01 kW pour
|
|
189
|
+
* Pn > 10 kW comme pour Pn ≤ 10 kW) applique 10 W. Les DPE exportent alors pveilleuse = 10 (W) ou
|
|
190
|
+
* 0,01 (kW). Ce cas n'est reproduit qu'en mode bug_for_bug_compat.
|
|
191
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1.1
|
|
192
|
+
* @see https://github.com/Open3CL/engine/issues/289
|
|
193
|
+
*/
|
|
194
|
+
export const PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU = 10;
|
|
195
|
+
const TYPES_CHAUFFE_EAU_GAZ_INSTANTANE_2001_2015 = ['66', '113'];
|
|
196
|
+
const PVEILLEUSES_EXPORTEES_TRIBU = [10, 0.01];
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Indique si la puissance de veilleuse du générateur doit être ramenée à la valeur Tribu (10 W) :
|
|
200
|
+
* chauffe-eau gaz / GPL instantané 2001-2015, veilleuse de la méthode (100 W) retenue, et
|
|
201
|
+
* pveilleuse exportée par le DPE égale à 10 W ou 0,01 kW.
|
|
202
|
+
* @param typeGenerateurId {string|number} enum_type_generateur_ecs_id
|
|
203
|
+
* @param di {Donnee_intermediaire}
|
|
204
|
+
* @returns {boolean}
|
|
205
|
+
*/
|
|
206
|
+
export function isPveilChauffeEauGazInstantaneTribu(typeGenerateurId, di) {
|
|
207
|
+
return (
|
|
208
|
+
TYPES_CHAUFFE_EAU_GAZ_INSTANTANE_2001_2015.includes(String(typeGenerateurId)) &&
|
|
209
|
+
di.pveil === 100 &&
|
|
210
|
+
PVEILLEUSES_EXPORTEES_TRIBU.includes(Number(di.pveilleuse))
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
186
214
|
export function rg_chauffe_eau_gaz(di, besoin_ecs) {
|
|
187
215
|
return (
|
|
188
216
|
1 /
|
|
@@ -208,6 +236,28 @@ export function rg_accumulateur_gaz(di, besoin_ecs) {
|
|
|
208
236
|
);
|
|
209
237
|
}
|
|
210
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
|
+
|
|
211
261
|
export function rgrsReseauUrbain(de, ecs_de) {
|
|
212
262
|
/**
|
|
213
263
|
* Le rendement de génération d'un réseau de chaleur dépend de son caractère isolé ou non.
|
|
@@ -357,16 +407,11 @@ export default function calc_gen_ecs(dpe, gen_ecs, ecs_di, ecs_de, GV, ca_id, zc
|
|
|
357
407
|
const rgSaisi = di.rendement_generation_stockage;
|
|
358
408
|
let rgReseau = rgrsReseauUrbain(de, ecs_de);
|
|
359
409
|
|
|
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;
|
|
410
|
+
if (bug_for_bug_compat && isRgsReseauChaleurSaisiRepris(rgSaisi, rgReseau)) {
|
|
367
411
|
console.warn(
|
|
368
|
-
`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})`
|
|
369
413
|
);
|
|
414
|
+
rgReseau = rgSaisi;
|
|
370
415
|
}
|
|
371
416
|
|
|
372
417
|
di.rendement_generation_stockage = rgReseau;
|
|
@@ -405,6 +450,13 @@ export default function calc_gen_ecs(dpe, gen_ecs, ecs_di, ecs_de, GV, ca_id, zc
|
|
|
405
450
|
di.pveil = 0;
|
|
406
451
|
}
|
|
407
452
|
|
|
453
|
+
if (bug_for_bug_compat && isPveilChauffeEauGazInstantaneTribu(type_generateur_id, di)) {
|
|
454
|
+
console.warn(
|
|
455
|
+
`Correction pveil pour le générateur ECS ${de.description} : ${PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU} W au lieu de ${di.pveil} W (moteur de référence)`
|
|
456
|
+
);
|
|
457
|
+
di.pveil = PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU;
|
|
458
|
+
}
|
|
459
|
+
|
|
408
460
|
const type_generateur = enums.type_generateur_ecs[type_generateur_id];
|
|
409
461
|
if (
|
|
410
462
|
type_generateur.includes('chauffe-eau gaz') ||
|
|
@@ -24,6 +24,8 @@ vi.mock('./enums.js', () => ({
|
|
|
24
24
|
pac: 'pac double service',
|
|
25
25
|
autre: 'générateur non implémenté',
|
|
26
26
|
combautre: 'foyer fermé bois à combustion',
|
|
27
|
+
66: 'chauffe-eau gaz à production instantanée 2001-2015',
|
|
28
|
+
113: 'chauffe-eau gpl/propane/butane à production instantanée 2001-2015',
|
|
27
29
|
84: 'chaudière fioul (système collectif par défaut)'
|
|
28
30
|
},
|
|
29
31
|
type_generateur_ch: { chaud_ch: 'chaudière gaz condensation' },
|
|
@@ -73,6 +75,9 @@ const {
|
|
|
73
75
|
rgrs_chaudiere,
|
|
74
76
|
rg_accumulateur_gaz,
|
|
75
77
|
rgrsReseauUrbain,
|
|
78
|
+
isRgsReseauChaleurSaisiRepris,
|
|
79
|
+
isPveilChauffeEauGazInstantaneTribu,
|
|
80
|
+
PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU,
|
|
76
81
|
RG_CHAUDIERE_ELECTRIQUE,
|
|
77
82
|
typeGenerateurPertesStockage
|
|
78
83
|
} = await import('./14_generateur_ecs.js');
|
|
@@ -146,6 +151,68 @@ describe('rgrsReseauUrbain - rendement d’un réseau de chaleur', () => {
|
|
|
146
151
|
});
|
|
147
152
|
});
|
|
148
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
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Veilleuse des chauffe-eau gaz / GPL instantanés 2001-2015 : 100 W selon la méthode, 10 W chez Tribu.
|
|
185
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §14.1.1
|
|
186
|
+
* @see https://github.com/Open3CL/engine/issues/289
|
|
187
|
+
*/
|
|
188
|
+
describe('isPveilChauffeEauGazInstantaneTribu - veilleuse 10 W du moteur de référence', () => {
|
|
189
|
+
test('valeur Tribu : 10 W', () => {
|
|
190
|
+
expect(PVEIL_CHAUFFE_EAU_GAZ_INSTANTANE_TRIBU).toBe(10);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test('types 66 (gaz) et 113 (GPL), pveil 100 W, pveilleuse exportée 10 W ou 0,01 kW : concerné', () => {
|
|
194
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 100, pveilleuse: 10 })).toBe(true);
|
|
195
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 100, pveilleuse: 0.01 })).toBe(true);
|
|
196
|
+
expect(isPveilChauffeEauGazInstantaneTribu(113, { pveil: 100, pveilleuse: '10' })).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('autres chauffe-eau gaz instantanés (1990-2000, après 2015) : non concernés', () => {
|
|
200
|
+
expect(isPveilChauffeEauGazInstantaneTribu('65', { pveil: 100, pveilleuse: 10 })).toBe(false);
|
|
201
|
+
expect(isPveilChauffeEauGazInstantaneTribu('67', { pveil: 100, pveilleuse: 10 })).toBe(false);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('pveilleuse exportée conforme à la méthode (100 W / 0,1 kW) ou absente : non concerné', () => {
|
|
205
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 100, pveilleuse: 100 })).toBe(false);
|
|
206
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 100, pveilleuse: 0.1 })).toBe(false);
|
|
207
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 100 })).toBe(false);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('pveil retenue différente de 100 W (sans veilleuse, ou déjà 10 W) : non concerné', () => {
|
|
211
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 0, pveilleuse: 10 })).toBe(false);
|
|
212
|
+
expect(isPveilChauffeEauGazInstantaneTribu('66', { pveil: 10, pveilleuse: 10 })).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
149
216
|
/**
|
|
150
217
|
* calc_gen_ecs : sélection de la branche de rendement selon le type d'énergie / générateur.
|
|
151
218
|
*/
|
|
@@ -271,6 +338,62 @@ describe('calc_gen_ecs - consommation par générateur', () => {
|
|
|
271
338
|
expect(g.donnee_intermediaire.conso_ecs).toBeCloseTo(123.81056790123455, 9);
|
|
272
339
|
});
|
|
273
340
|
|
|
341
|
+
describe('chauffe-eau gaz instantané 2001-2015 : veilleuse (#289)', () => {
|
|
342
|
+
function chauffeEau(type, pveilleuse) {
|
|
343
|
+
vi.mocked(tvColumnIDs).mockImplementation((table) =>
|
|
344
|
+
table === 'generateur_combustion' ? [type] : []
|
|
345
|
+
);
|
|
346
|
+
vi.mocked(tv_generateur_combustion).mockImplementation((dpe, di) => {
|
|
347
|
+
di.rpn = 0.84;
|
|
348
|
+
di.qp0 = 0;
|
|
349
|
+
di.pveil = 100;
|
|
350
|
+
di.pveilleuse = pveilleuse;
|
|
351
|
+
di.pn = 21000;
|
|
352
|
+
});
|
|
353
|
+
return gen({
|
|
354
|
+
type_energie: 'gaz naturel',
|
|
355
|
+
enum_type_generateur_ecs_id: type,
|
|
356
|
+
enum_methode_saisie_carac_sys_id: '1',
|
|
357
|
+
presence_veilleuse: 1
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
test('bug_for_bug_compat, pveilleuse exportée 10 W : Pveil = 10 W (Tribu)', () => {
|
|
362
|
+
state.bug = true;
|
|
363
|
+
const g = chauffeEau('66', 10);
|
|
364
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
365
|
+
|
|
366
|
+
expect(g.donnee_intermediaire.pveil).toBe(10);
|
|
367
|
+
// valeur de référence de régression : 1 / (1 / 0.84 + 6970 * 10 / (100 * 1000))
|
|
368
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.5298080076696016, 9);
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
test('bug_for_bug_compat, GPL (113), pveilleuse exportée 0,01 kW : Pveil = 10 W', () => {
|
|
372
|
+
state.bug = true;
|
|
373
|
+
const g = chauffeEau('113', 0.01);
|
|
374
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
375
|
+
|
|
376
|
+
expect(g.donnee_intermediaire.pveil).toBe(10);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test('hors bug_for_bug_compat : Pveil de la méthode (100 W) conservée', () => {
|
|
380
|
+
const g = chauffeEau('66', 10);
|
|
381
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
382
|
+
|
|
383
|
+
expect(g.donnee_intermediaire.pveil).toBe(100);
|
|
384
|
+
// valeur de référence de régression : 1 / (1 / 0.84 + 6970 * 100 / (100 * 1000))
|
|
385
|
+
expect(g.donnee_intermediaire.rendement_generation).toBeCloseTo(0.12254186847172784, 9);
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
test('bug_for_bug_compat, pveilleuse exportée 100 W : Pveil de la méthode conservée', () => {
|
|
389
|
+
state.bug = true;
|
|
390
|
+
const g = chauffeEau('66', 100);
|
|
391
|
+
calc_gen_ecs({}, g, ecs_di, ecs_de, 0, '1', '1', 'maison');
|
|
392
|
+
|
|
393
|
+
expect(g.donnee_intermediaire.pveil).toBe(100);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
|
|
274
397
|
test('installation solaire : la couverture solaire réduit la consommation', () => {
|
|
275
398
|
ecs_de.enum_type_installation_solaire_id = '1';
|
|
276
399
|
ecs_de.fecs_saisi = 0.5;
|
|
@@ -854,6 +977,103 @@ describe('calc_gen_ecs - consommation par générateur', () => {
|
|
|
854
977
|
expect(g.donnee_intermediaire.rendement_generation_stockage).toBe(0.75);
|
|
855
978
|
});
|
|
856
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
|
+
|
|
857
1077
|
test('usage chauffage + ecs : type de générateur limité aux générateurs mixtes', () => {
|
|
858
1078
|
const g = gen({
|
|
859
1079
|
type_energie: 'électricité',
|
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.60`** · branche `main` · généré le 2026-10-14
|
|
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>
|
|
386
|
-
<td align="center"><strong>
|
|
385
|
+
<td align="center"><strong>70 429</strong><br/><sub>DPE conformes</sub></td>
|
|
386
|
+
<td align="center"><strong>78,76 %</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 individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,
|
|
394
|
-
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **
|
|
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
|
-
|
|
|
399
|
-
|
|
|
392
|
+
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **47,68 %** | `██████████░░░░░░░░░░` | 4 768 / 9 999 |
|
|
393
|
+
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,96 %** | `███████████████████░` | 9 296 / 10 000 |
|
|
394
|
+
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **92,11 %** | `██████████████████░░` | 9 211 / 10 000 |
|
|
395
|
+
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **90,54 %** | `██████████████████░░` | 9 047 / 9 992 |
|
|
396
|
+
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,91 %** | `██████████████████░░` | 8 890 / 9 999 |
|
|
397
|
+
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **86,00 %** | `█████████████████░░░` | 8 440 / 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,27 %** | `██████████████░░░░░░` | 6 661 / 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,49 ms</strong><br/><sub>moyenne</sub></td>
|
|
412
|
+
<td align="center"><strong>4,83 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>626,5 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 individuel (2025)** | 4,
|
|
422
|
-
| **Appartement · chauffage collectif (2025)** | 4,
|
|
423
|
-
| **Logement individuel (2025)** | 5,
|
|
424
|
-
| **Maison individuelle (2025)** | 6,
|
|
425
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
426
|
-
| **Immeuble · chauffage individuel** | 6,
|
|
427
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
428
|
-
| **Individuel généré depuis l'immeuble (2026)** | 6,
|
|
420
|
+
| **Généraliste** | 4,75 ms | 4,25 ms | 0,22 ms | 31,6 ms | 8,80 ms | 12,7 ms |
|
|
421
|
+
| **Appartement · chauffage individuel (2025)** | 4,03 ms | 3,72 ms | 1,44 ms | 27,8 ms | 6,78 ms | 8,70 ms |
|
|
422
|
+
| **Appartement · chauffage collectif (2025)** | 4,43 ms | 4,04 ms | 1,64 ms | 36,9 ms | 7,23 ms | 9,29 ms |
|
|
423
|
+
| **Logement individuel (2025)** | 5,40 ms | 4,87 ms | 1,68 ms | 34,9 ms | 9,89 ms | 13,4 ms |
|
|
424
|
+
| **Maison individuelle (2025)** | 6,27 ms | 5,71 ms | 1,95 ms | 39,2 ms | 11,0 ms | 14,4 ms |
|
|
425
|
+
| **Immeuble · chauffage collectif** | 5,76 ms | 5,03 ms | 0,19 ms | 117,5 ms | 10,5 ms | 17,5 ms |
|
|
426
|
+
| **Immeuble · chauffage individuel** | 6,91 ms | 5,88 ms | 0,11 ms | 100,8 ms | 14,0 ms | 22,1 ms |
|
|
427
|
+
| **Immeuble · chauffage mixte** | 5,58 ms | 4,54 ms | 0,21 ms | 626,5 ms | 11,5 ms | 19,7 ms |
|
|
428
|
+
| **Individuel généré depuis l'immeuble (2026)** | 6,29 ms | 5,39 ms | 1,77 ms | 64,7 ms | 11,8 ms | 19,6 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.61';
|
|
39
39
|
|
|
40
40
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
41
41
|
|