@open3cl/engine 1.8.43 → 1.8.44
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/13.2_generateur_combustion.js +26 -1
- package/13.2_generateur_combustion.spec.js +72 -1
- package/README.md +20 -20
- package/engine.js +1 -1
- package/package.json +1 -1
|
@@ -45,6 +45,31 @@ function evaluateFormula(formulaOrValue, pn, E, F) {
|
|
|
45
45
|
return evaluateTvFormula(formulaOrValue, pn, E, F);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Puissance nominale maximale (W) retenue dans la formule Qp0 = Pn × (E + F × log Pn) / 100 des
|
|
50
|
+
* chaudières gaz standard et basse température installées après 2015.
|
|
51
|
+
*/
|
|
52
|
+
export const PN_MAX_QP0_CHAUDIERE_GAZ = 400000;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Puissance (W) à utiliser dans la formule qp0 de la ligne de table.
|
|
56
|
+
*
|
|
57
|
+
* Pour les chaudières gaz après 2015 (qp0 = Pn × (E + F × log Pn) / 100), le moteur de référence
|
|
58
|
+
* (Tribu, `Calcul_generateur.cs` Rpn_chaudieregaz, `Math.Min(400.0, Pn)`) plafonne Pn à 400 kW :
|
|
59
|
+
* au-delà, la formule n'est plus représentative (elle décroît et devient négative vers 1 500 kW).
|
|
60
|
+
* Le plafond ne s'applique pas aux chaudières fioul (Rpn_chaudierefioul : Pn non plafonné).
|
|
61
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.2
|
|
62
|
+
*
|
|
63
|
+
* @param row {object} ligne de la table generateur_combustion
|
|
64
|
+
* @param pnCollectif {number} puissance nominale du générateur (W)
|
|
65
|
+
* @returns {number}
|
|
66
|
+
*/
|
|
67
|
+
export function puissanceFormuleQp0(row, pnCollectif) {
|
|
68
|
+
const formuleEF = /E\s*\+\s*F/.test(row.qp0_perc || '');
|
|
69
|
+
const chaudiereGaz = /chaudi[eè]re gaz/i.test(row.type_generateur || '');
|
|
70
|
+
return formuleEF && chaudiereGaz ? Math.min(pnCollectif, PN_MAX_QP0_CHAUDIERE_GAZ) : pnCollectif;
|
|
71
|
+
}
|
|
72
|
+
|
|
48
73
|
/**
|
|
49
74
|
* Caractéristiques forfaitaires (rpn, rpint, qp0) d'un générateur à combustion.
|
|
50
75
|
*
|
|
@@ -78,7 +103,7 @@ export function caracteristiquesGenerateurCombustion(row, pn, ratio, E, F, type,
|
|
|
78
103
|
|
|
79
104
|
if (![4, 5].includes(methodeSaisie)) {
|
|
80
105
|
if (row.qp0_perc) {
|
|
81
|
-
const qp0_calc = evaluateFormula(row.qp0_perc, pn / ratio, E, F);
|
|
106
|
+
const qp0_calc = evaluateFormula(row.qp0_perc, puissanceFormuleQp0(row, pn / ratio), E, F);
|
|
82
107
|
// Certaines chaudières ont un qp0 en % de pn, d'autres ont des valeurs constantes
|
|
83
108
|
if (row.qp0_perc.includes('Pn')) {
|
|
84
109
|
caracteristiques.qp0 = qp0_calc * 1000 * ratio;
|
|
@@ -64,7 +64,9 @@ const {
|
|
|
64
64
|
tv_generateur_combustion,
|
|
65
65
|
findGenerateurChMixteJumeau,
|
|
66
66
|
updateGenerateurCombustion,
|
|
67
|
-
caracteristiquesGenerateurCombustion
|
|
67
|
+
caracteristiquesGenerateurCombustion,
|
|
68
|
+
puissanceFormuleQp0,
|
|
69
|
+
PN_MAX_QP0_CHAUDIERE_GAZ
|
|
68
70
|
} = await import('./13.2_generateur_combustion.js');
|
|
69
71
|
const { tv, tvColumnLines } = await import('./utils.js');
|
|
70
72
|
const { conventionPuissanceNominale } = await import('./13.2_generateur_combustion_pn.js');
|
|
@@ -1099,3 +1101,72 @@ describe('caracteristiquesGenerateurCombustion - selon la méthode de saisie', (
|
|
|
1099
1101
|
).toBeCloseTo(50, 9);
|
|
1100
1102
|
});
|
|
1101
1103
|
});
|
|
1104
|
+
|
|
1105
|
+
/**
|
|
1106
|
+
* Plafond de Pn à 400 kW dans Qp0 = Pn × (E + F × log Pn) / 100 des chaudières gaz après 2015
|
|
1107
|
+
* (moteur de référence Tribu : Calcul_generateur.cs, Rpn_chaudieregaz, Math.Min(400.0, Pn)).
|
|
1108
|
+
* @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.2
|
|
1109
|
+
*/
|
|
1110
|
+
describe('puissanceFormuleQp0 - plafond de Pn à 400 kW pour les chaudières gaz', () => {
|
|
1111
|
+
const ROW_GAZ = {
|
|
1112
|
+
type_generateur: 'Chaudière gaz basse température après 2015',
|
|
1113
|
+
qp0_perc: 'Pn*(E+F*log10(Pn))/100'
|
|
1114
|
+
};
|
|
1115
|
+
const ROW_FIOUL = {
|
|
1116
|
+
type_generateur: 'Chaudière fioul standard après 2015',
|
|
1117
|
+
qp0_perc: 'Pn*(E+F*log10(Pn))/100'
|
|
1118
|
+
};
|
|
1119
|
+
|
|
1120
|
+
test('chaudière gaz de 500 kW : puissance plafonnée à 400 kW', () => {
|
|
1121
|
+
expect(PN_MAX_QP0_CHAUDIERE_GAZ).toBe(400000);
|
|
1122
|
+
expect(puissanceFormuleQp0(ROW_GAZ, 500000)).toBe(400000);
|
|
1123
|
+
});
|
|
1124
|
+
|
|
1125
|
+
test('chaudière gaz de 400 kW ou moins : puissance inchangée', () => {
|
|
1126
|
+
expect(puissanceFormuleQp0(ROW_GAZ, 400000)).toBe(400000);
|
|
1127
|
+
expect(puissanceFormuleQp0(ROW_GAZ, 24000)).toBe(24000);
|
|
1128
|
+
});
|
|
1129
|
+
|
|
1130
|
+
test('chaudière fioul : pas de plafond', () => {
|
|
1131
|
+
expect(puissanceFormuleQp0(ROW_FIOUL, 500000)).toBe(500000);
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1134
|
+
test('chaudière gaz avec qp0 forfaitaire (sans E, F) : pas de plafond', () => {
|
|
1135
|
+
expect(
|
|
1136
|
+
puissanceFormuleQp0(
|
|
1137
|
+
{ type_generateur: 'Chaudière gaz standard 2001-2015', qp0_perc: '1%' },
|
|
1138
|
+
5e5
|
|
1139
|
+
)
|
|
1140
|
+
).toBe(500000);
|
|
1141
|
+
});
|
|
1142
|
+
|
|
1143
|
+
test('ligne sans libellé ni formule qp0 : pas de plafond', () => {
|
|
1144
|
+
expect(puissanceFormuleQp0({}, 500000)).toBe(500000);
|
|
1145
|
+
});
|
|
1146
|
+
|
|
1147
|
+
test('qp0 d’une chaudière gaz BT de 500 kW avec ventilateur (E = 1.75, F = -0.55) : Pn = 400 kW', () => {
|
|
1148
|
+
const { qp0 } = caracteristiquesGenerateurCombustion(ROW_GAZ, 500000, 1, 1.75, -0.55, 'ch', 1);
|
|
1149
|
+
// 400 × (1.75 − 0.55 × log10(400)) / 100 kW = Qp0 Tribu IC4-0-21 -- valeur de référence de régression
|
|
1150
|
+
expect(qp0).toBeCloseTo(1275.468019078, 6);
|
|
1151
|
+
});
|
|
1152
|
+
|
|
1153
|
+
test('qp0 d’une chaudière fioul de 500 kW : formule appliquée sur Pn = 500 kW', () => {
|
|
1154
|
+
const { qp0 } = caracteristiquesGenerateurCombustion(
|
|
1155
|
+
ROW_FIOUL,
|
|
1156
|
+
500000,
|
|
1157
|
+
1,
|
|
1158
|
+
1.75,
|
|
1159
|
+
-0.55,
|
|
1160
|
+
'ch',
|
|
1161
|
+
1
|
|
1162
|
+
);
|
|
1163
|
+
// 500 × (1.75 − 0.55 × log10(500)) / 100 kW -- valeur de référence de régression
|
|
1164
|
+
expect(qp0).toBeCloseTo(500 * (1.75 - 0.55 * Math.log10(500)) * 10, 6);
|
|
1165
|
+
});
|
|
1166
|
+
|
|
1167
|
+
test('chaudière gaz virtualisée : plafond appliqué sur Pn collectif puis qp0 ramené au logement', () => {
|
|
1168
|
+
const { qp0 } = caracteristiquesGenerateurCombustion(ROW_GAZ, 50000, 0.1, 1.75, -0.55, 'ch', 1);
|
|
1169
|
+
// Pn collectif = 500 kW plafonné à 400 kW, puis × ratio 0.1
|
|
1170
|
+
expect(qp0).toBeCloseTo(127.5468019078, 6);
|
|
1171
|
+
});
|
|
1172
|
+
});
|
package/README.md
CHANGED
|
@@ -370,26 +370,26 @@ 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.43`** · 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 969</strong><br/><sub>DPE conformes</sub></td>
|
|
381
|
+
<td align="center"><strong>68,87 %</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
|
-
| 🔴 | **Généraliste**<br/><sub>`corpus_dpe.csv`</sub> | **46,
|
|
388
|
-
| 🟢 | **Appartement · chauffage individuel (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_individuel_2025.csv`</sub> | **92,
|
|
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,55 %** | `███████████████████░` | 9 255 / 10 000 |
|
|
389
389
|
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **89,55 %** | `██████████████████░░` | 8 948 / 9 992 |
|
|
390
|
-
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,
|
|
390
|
+
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **88,66 %** | `██████████████████░░` | 8 865 / 9 999 |
|
|
391
391
|
| 🟡 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **84,22 %** | `█████████████████░░░` | 8 420 / 9 998 |
|
|
392
|
-
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **71,
|
|
392
|
+
| 🟡 | **Appartement · chauffage collectif (2025)**<br/><sub>`dpe_appartement_individuel_chauffage_collectif_2025.csv`</sub> | **71,61 %** | `██████████████░░░░░░` | 7 161 / 10 000 |
|
|
393
393
|
| 🟡 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **66,19 %** | `█████████████░░░░░░░` | 6 618 / 9 999 |
|
|
394
394
|
| 🔴 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **53,74 %** | `███████████░░░░░░░░░` | 5 372 / 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 |
|
|
@@ -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>4,
|
|
407
|
-
<td align="center"><strong>4,
|
|
408
|
-
<td align="center"><strong>0,
|
|
409
|
-
<td align="center"><strong>
|
|
406
|
+
<td align="center"><strong>4,86 ms</strong><br/><sub>moyenne</sub></td>
|
|
407
|
+
<td align="center"><strong>4,24 ms</strong><br/><sub>médiane</sub></td>
|
|
408
|
+
<td align="center"><strong>0,12 ms</strong><br/><sub>min</sub></td>
|
|
409
|
+
<td align="center"><strong>549,1 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)** | 4,
|
|
418
|
-
| **Maison individuelle (2025)** | 5,
|
|
419
|
-
| **Immeuble · chauffage individuel** | 6,
|
|
420
|
-
| **Appartement · chauffage collectif (2025)** | 4,08 ms | 3,
|
|
421
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
422
|
-
| **Immeuble · chauffage mixte** | 4,
|
|
423
|
-
| **Individuel généré depuis l'immeuble (2026)** | 5,
|
|
415
|
+
| **Généraliste** | 4,32 ms | 3,87 ms | 0,21 ms | 28,9 ms | 8,02 ms | 10,8 ms |
|
|
416
|
+
| **Appartement · chauffage individuel (2025)** | 3,79 ms | 3,46 ms | 1,50 ms | 34,3 ms | 6,55 ms | 8,57 ms |
|
|
417
|
+
| **Logement individuel (2025)** | 4,75 ms | 4,21 ms | 1,61 ms | 34,4 ms | 8,90 ms | 12,2 ms |
|
|
418
|
+
| **Maison individuelle (2025)** | 5,40 ms | 4,87 ms | 1,76 ms | 36,9 ms | 9,53 ms | 12,7 ms |
|
|
419
|
+
| **Immeuble · chauffage individuel** | 6,22 ms | 5,32 ms | 0,14 ms | 115,4 ms | 12,5 ms | 19,3 ms |
|
|
420
|
+
| **Appartement · chauffage collectif (2025)** | 4,08 ms | 3,65 ms | 1,48 ms | 34,4 ms | 6,76 ms | 8,58 ms |
|
|
421
|
+
| **Immeuble · chauffage collectif** | 5,30 ms | 4,49 ms | 0,12 ms | 107,4 ms | 9,83 ms | 17,6 ms |
|
|
422
|
+
| **Immeuble · chauffage mixte** | 4,78 ms | 3,93 ms | 0,22 ms | 549,1 ms | 9,87 ms | 15,9 ms |
|
|
423
|
+
| **Individuel généré depuis l'immeuble (2026)** | 5,07 ms | 4,39 ms | 1,65 ms | 42,9 ms | 9,57 ms | 14,4 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.44';
|
|
37
37
|
|
|
38
38
|
const dpeSanitizerService = new DpeSanitizerService();
|
|
39
39
|
|