@open3cl/engine 1.8.53 → 1.8.55
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 +22 -22
- package/conso.js +26 -1
- package/conso.spec.js +92 -0
- package/engine.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -370,15 +370,15 @@ 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.54`** · branche `main` · généré le 2026-10-12
|
|
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
|
-
<td align="center"><strong>89
|
|
380
|
-
<td align="center"><strong>65
|
|
381
|
-
<td align="center"><strong>72,
|
|
379
|
+
<td align="center"><strong>89 980</strong><br/><sub>DPE analysés</sub></td>
|
|
380
|
+
<td align="center"><strong>65 482</strong><br/><sub>DPE conformes</sub></td>
|
|
381
|
+
<td align="center"><strong>72,77 %</strong><br/><sub>réussite globale</sub></td>
|
|
382
382
|
</tr>
|
|
383
383
|
</table>
|
|
384
384
|
|
|
@@ -386,41 +386,41 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
386
386
|
| :-: | :---------------------------------------------------------------------------------------------------------------------- | ----------: | :--------------------- | -------------: |
|
|
387
387
|
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **46,65 %** | `█████████░░░░░░░░░░░` | 4 665 / 9 999 |
|
|
388
388
|
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,90 %** | `███████████████████░` | 9 290 / 10 000 |
|
|
389
|
-
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **91,
|
|
389
|
+
| 🟢 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **91,62 %** | `██████████████████░░` | 9 162 / 10 000 |
|
|
390
390
|
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **89,93 %** | `██████████████████░░` | 8 986 / 9 992 |
|
|
391
|
-
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,
|
|
391
|
+
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,89 %** | `██████████████████░░` | 8 888 / 9 999 |
|
|
392
392
|
| 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **84,57 %** | `█████████████████░░░` | 8 455 / 9 998 |
|
|
393
|
-
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **74,
|
|
394
|
-
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **56,
|
|
393
|
+
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **74,90 %** | `███████████████░░░░░` | 7 486 / 9 995 |
|
|
394
|
+
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **56,67 %** | `███████████░░░░░░░░░` | 5 665 / 9 997 |
|
|
395
395
|
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **28,85 %** | `██████░░░░░░░░░░░░░░` | 2 885 / 10 000 |
|
|
396
396
|
|
|
397
397
|
<sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
|
|
398
398
|
|
|
399
399
|
#### Temps d’exécution
|
|
400
400
|
|
|
401
|
-
> Durée de l’appel à `calcul_3cl` par DPE, sur 89
|
|
401
|
+
> Durée de l’appel à `calcul_3cl` par DPE, sur 89 946 calculs.
|
|
402
402
|
> La copie défensive de l’entrée et la lecture du fichier sont exclues de la mesure.
|
|
403
403
|
|
|
404
404
|
<table>
|
|
405
405
|
<tr>
|
|
406
|
-
<td align="center"><strong>5,
|
|
407
|
-
<td align="center"><strong>4,
|
|
408
|
-
<td align="center"><strong>0,
|
|
409
|
-
<td align="center"><strong>
|
|
406
|
+
<td align="center"><strong>5,46 ms</strong><br/><sub>moyenne</sub></td>
|
|
407
|
+
<td align="center"><strong>4,78 ms</strong><br/><sub>médiane</sub></td>
|
|
408
|
+
<td align="center"><strong>0,14 ms</strong><br/><sub>min</sub></td>
|
|
409
|
+
<td align="center"><strong>912,6 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)** | 4,
|
|
417
|
-
| **Appartement · chauffage collectif (2025)** | 4,
|
|
418
|
-
| **Logement individuel (2025)** | 5,
|
|
419
|
-
| **Maison individuelle (2025)** | 6,
|
|
420
|
-
| **Immeuble · chauffage individuel** |
|
|
421
|
-
| **Immeuble · chauffage collectif** |
|
|
422
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
423
|
-
| **Individuel généré depuis l'immeuble (2026)** | 6,
|
|
415
|
+
| **Généraliste** | 4,42 ms | 3,97 ms | 0,21 ms | 28,2 ms | 8,06 ms | 11,2 ms |
|
|
416
|
+
| **Appartement · chauffage individuel (2025)** | 4,06 ms | 3,72 ms | 1,43 ms | 29,3 ms | 6,84 ms | 8,79 ms |
|
|
417
|
+
| **Appartement · chauffage collectif (2025)** | 4,46 ms | 4,11 ms | 1,68 ms | 38,0 ms | 7,20 ms | 9,18 ms |
|
|
418
|
+
| **Logement individuel (2025)** | 5,51 ms | 4,94 ms | 1,67 ms | 41,4 ms | 10,2 ms | 13,5 ms |
|
|
419
|
+
| **Maison individuelle (2025)** | 6,36 ms | 5,77 ms | 2,02 ms | 45,6 ms | 11,3 ms | 14,7 ms |
|
|
420
|
+
| **Immeuble · chauffage individuel** | 6,61 ms | 5,58 ms | 0,14 ms | 116,3 ms | 13,4 ms | 20,8 ms |
|
|
421
|
+
| **Immeuble · chauffage collectif** | 5,81 ms | 5,04 ms | 0,20 ms | 102,9 ms | 10,6 ms | 19,1 ms |
|
|
422
|
+
| **Immeuble · chauffage mixte** | 5,69 ms | 4,56 ms | 0,20 ms | 912,6 ms | 12,1 ms | 20,2 ms |
|
|
423
|
+
| **Individuel généré depuis l'immeuble (2026)** | 6,24 ms | 5,28 ms | 1,72 ms | 64,6 ms | 11,8 ms | 19,5 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/conso.js
CHANGED
|
@@ -307,7 +307,9 @@ function getConso(coef, type_energie, conso) {
|
|
|
307
307
|
const val = coef_val(conso);
|
|
308
308
|
return val;
|
|
309
309
|
}
|
|
310
|
-
|
|
310
|
+
// Un coefficient nul est une valeur légitime (ex. réseau de chaleur à contenu CO2 nul) :
|
|
311
|
+
// seul un coefficient absent conserve la consommation telle quelle.
|
|
312
|
+
if (Number.isFinite(coef_val)) return coef_val * conso;
|
|
311
313
|
return conso;
|
|
312
314
|
}
|
|
313
315
|
|
|
@@ -408,6 +410,25 @@ export function getContenuCo2ReseauChaleur(
|
|
|
408
410
|
return COEF_GES_AUTRES_RESEAUX_CHALEUR;
|
|
409
411
|
}
|
|
410
412
|
|
|
413
|
+
/**
|
|
414
|
+
* Générateurs « chaudière(s) <énergie> multi bâtiment modélisée(s) comme un réseau de chaleur »
|
|
415
|
+
* (enum_type_generateur_ch_id 109-111, enum_type_generateur_ecs_id 74-76) : énergie réellement
|
|
416
|
+
* consommée par les chaudières, dont le facteur d'émission s'applique à la place du facteur
|
|
417
|
+
* « autres réseaux de chaleur ».
|
|
418
|
+
*
|
|
419
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.3 p.118 : « l'installation de chauffage est
|
|
420
|
+
* traitée comme un réseau de chaleur local. Les émissions de gaz à effet de serre seront calculées
|
|
421
|
+
* à partir des énergies consommées réellement par les générateurs. »
|
|
422
|
+
* Tribu (Calcul_batiment.cs l.1189) applique `contenu_CO2_RCU_ch`, transmis par le logiciel : LICIEL
|
|
423
|
+
* et Pleiades y placent le facteur de l'énergie des chaudières (« Taux CO2 fonction du système réel »).
|
|
424
|
+
* Le bois retient 0,03 (bûches / granulés), valeur exportée par la majorité des DPE LICIEL.
|
|
425
|
+
* Les PAC multi-bâtiment (112 / 77) ne sont pas couvertes : facteurs exportés non reproductibles.
|
|
426
|
+
*/
|
|
427
|
+
const ENERGIE_MULTI_BATIMENT = {
|
|
428
|
+
ch: { 109: 'bois – bûches', 110: 'fioul domestique', 111: 'gaz naturel' },
|
|
429
|
+
ecs: { 74: 'bois – bûches', 75: 'fioul domestique', 76: 'gaz naturel' }
|
|
430
|
+
};
|
|
431
|
+
|
|
411
432
|
/**
|
|
412
433
|
* Récupération du coefficient d'émission GES pour le générateur
|
|
413
434
|
* @param gen_ch {GenerateurChauffageItem||GenerateurEcsItem}
|
|
@@ -433,6 +454,10 @@ function getGesCoeffForGenerateur(gen_ch, suffix, dateDpe, versionLogiciel) {
|
|
|
433
454
|
versionLogiciel
|
|
434
455
|
);
|
|
435
456
|
}
|
|
457
|
+
// Chaudière(s) multi bâtiment sans identifiant : facteur de l'énergie des chaudières (§17.3)
|
|
458
|
+
const typeGenerateur = gen_ch.donnee_entree[`enum_type_generateur_${suffix}_id`];
|
|
459
|
+
const energieMultiBatiment = ENERGIE_MULTI_BATIMENT[suffix][typeGenerateur];
|
|
460
|
+
if (energieMultiBatiment) return coef_ges[energieMultiBatiment];
|
|
436
461
|
// Prendre la valeur pour "AUTRES RESEAUX DE CHALEUR"
|
|
437
462
|
return COEF_GES_AUTRES_RESEAUX_CHALEUR;
|
|
438
463
|
}
|
package/conso.spec.js
CHANGED
|
@@ -1386,4 +1386,96 @@ describe('réseaux de chaleur - sélection de l’arrêté et du contenu CO2', (
|
|
|
1386
1386
|
const autreRes = calc_conso(...args);
|
|
1387
1387
|
expect(autreRes.emission_ges.emission_ges_ch).toBeCloseTo(61, 9);
|
|
1388
1388
|
});
|
|
1389
|
+
|
|
1390
|
+
test('calc_conso : réseau à contenu CO2 nul, émissions chauffage et ECS nulles (pas de repli sur 1)', () => {
|
|
1391
|
+
utilsState.bugForBugCompat = true;
|
|
1392
|
+
// Réseau 1606C (MONTEMBOEUF), arrêté du 05/07/2024 : contenu_co2 = 0 (transmis par LICIEL)
|
|
1393
|
+
mockTables({
|
|
1394
|
+
'1606C': { reseau_chaleur_2023: { contenu_co2: '0', contenu_co2_acv: '0.024' } }
|
|
1395
|
+
});
|
|
1396
|
+
const de = { identifiant_reseau_chaleur: '1606C', date_arrete_reseau_chaleur: '2024-07-05' };
|
|
1397
|
+
const ch = [
|
|
1398
|
+
installCh({ cle_repartition_ch: 1 }, [
|
|
1399
|
+
genCh('3', { conso_ch: 1000, conso_ch_depensier: 1200 }, de)
|
|
1400
|
+
])
|
|
1401
|
+
];
|
|
1402
|
+
const ecs = [
|
|
1403
|
+
installEcs({ cle_repartition_ecs: 1 }, [
|
|
1404
|
+
genEcs('3', { conso_ecs: 500, conso_ecs_depensier: 600 }, de)
|
|
1405
|
+
])
|
|
1406
|
+
];
|
|
1407
|
+
const args = [100, 1, 1, [], ch, ecs, [], 1, 1, '2025-03-06', coef_ep, 1, 1, {}];
|
|
1408
|
+
|
|
1409
|
+
const licielRes = calc_conso(...args, 'LICIEL Diagnostics v4');
|
|
1410
|
+
// DPE 2516E0769459J : emission_ges_ch = emission_ges_ecs = 0 dans l'export ADEME (avant : 1000 et 500)
|
|
1411
|
+
expect(licielRes.emission_ges.emission_ges_ch).toBe(0);
|
|
1412
|
+
expect(licielRes.emission_ges.emission_ges_ecs).toBe(0);
|
|
1413
|
+
expect(licielRes.emission_ges.emission_ges_ch_depensier).toBe(0);
|
|
1414
|
+
|
|
1415
|
+
// Hors LICIEL : contenu ACV 0,024
|
|
1416
|
+
const autreRes = calc_conso(...args);
|
|
1417
|
+
expect(autreRes.emission_ges.emission_ges_ch).toBeCloseTo(24, 9);
|
|
1418
|
+
});
|
|
1419
|
+
|
|
1420
|
+
/**
|
|
1421
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.3 p.118 : GES calculées à partir des énergies
|
|
1422
|
+
* consommées réellement par les générateurs.
|
|
1423
|
+
*/
|
|
1424
|
+
const calcMultiBatiment = (typeCh, typeEcs, deExtra = {}) => {
|
|
1425
|
+
const ch = [
|
|
1426
|
+
installCh({ cle_repartition_ch: 1 }, [
|
|
1427
|
+
genCh(
|
|
1428
|
+
'3',
|
|
1429
|
+
{ conso_ch: 1000, conso_ch_depensier: 1200 },
|
|
1430
|
+
{ enum_type_generateur_ch_id: typeCh, identifiant_reseau_chaleur: '', ...deExtra }
|
|
1431
|
+
)
|
|
1432
|
+
])
|
|
1433
|
+
];
|
|
1434
|
+
const ecs = [
|
|
1435
|
+
installEcs({ cle_repartition_ecs: 1 }, [
|
|
1436
|
+
genEcs(
|
|
1437
|
+
'3',
|
|
1438
|
+
{ conso_ecs: 500, conso_ecs_depensier: 600 },
|
|
1439
|
+
{ enum_type_generateur_ecs_id: typeEcs, identifiant_reseau_chaleur: '', ...deExtra }
|
|
1440
|
+
)
|
|
1441
|
+
])
|
|
1442
|
+
];
|
|
1443
|
+
return calc_conso(100, 1, 1, [], ch, ecs, [], 1, 1, '2025-01-22', coef_ep, 1, 1, {}, 'LICIEL')
|
|
1444
|
+
.emission_ges;
|
|
1445
|
+
};
|
|
1446
|
+
|
|
1447
|
+
test.each([
|
|
1448
|
+
// DPE 2373E0201684Z (109/74) : facteur ADEME 0,03 (0,024 sur quelques exports plaquettes)
|
|
1449
|
+
['109', '74', 0.03],
|
|
1450
|
+
['110', '75', 0.324],
|
|
1451
|
+
// DPE 2467E0759983V-like (111/76) : 814 DPE LICIEL KO GES-seul à 0,227
|
|
1452
|
+
['111', '76', 0.227]
|
|
1453
|
+
])(
|
|
1454
|
+
'chaudière(s) multi bâtiment %s / %s sans identifiant : facteur de l’énergie %f',
|
|
1455
|
+
(typeCh, typeEcs, facteur) => {
|
|
1456
|
+
const ges = calcMultiBatiment(typeCh, typeEcs);
|
|
1457
|
+
expect(ges.emission_ges_ch).toBeCloseTo(1000 * facteur, 9);
|
|
1458
|
+
expect(ges.emission_ges_ecs).toBeCloseTo(500 * facteur, 9);
|
|
1459
|
+
expect(tv).not.toHaveBeenCalled();
|
|
1460
|
+
}
|
|
1461
|
+
);
|
|
1462
|
+
|
|
1463
|
+
test('PAC multi bâtiment (112 / 77) ou réseau sans identifiant : facteur « autres réseaux » 0,385', () => {
|
|
1464
|
+
const ges = calcMultiBatiment('112', '77');
|
|
1465
|
+
expect(ges.emission_ges_ch).toBeCloseTo(385, 9);
|
|
1466
|
+
expect(ges.emission_ges_ecs).toBeCloseTo(192.5, 9);
|
|
1467
|
+
// Réseau de chaleur classique (ch 71 / ecs 72) sans identifiant
|
|
1468
|
+
const reseau = calcMultiBatiment('71', '72');
|
|
1469
|
+
expect(reseau.emission_ges_ch).toBeCloseTo(385, 9);
|
|
1470
|
+
});
|
|
1471
|
+
|
|
1472
|
+
test('chaudière multi bâtiment avec identifiant réseau : contenu CO2 de l’arrêté prioritaire', () => {
|
|
1473
|
+
mockTables({ R: { reseau_chaleur_2023: { contenu_co2: '0.05', contenu_co2_acv: '0.06' } } });
|
|
1474
|
+
const ges = calcMultiBatiment('111', '76', {
|
|
1475
|
+
identifiant_reseau_chaleur: 'R',
|
|
1476
|
+
date_arrete_reseau_chaleur: '2024-07-05'
|
|
1477
|
+
});
|
|
1478
|
+
expect(ges.emission_ges_ch).toBeCloseTo(60, 9);
|
|
1479
|
+
expect(ges.emission_ges_ecs).toBeCloseTo(30, 9);
|
|
1480
|
+
});
|
|
1389
1481
|
});
|
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.55';
|
|
37
37
|
|
|
38
38
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
39
39
|
|