@open3cl/engine 1.11.2 → 1.11.4
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/10_besoin_fr.spec.js +1 -1
- package/10_clim.js +1 -1
- package/10_clim.spec.js +5 -9
- package/11_besoin_ecs.spec.js +1 -1
- package/11_ecs.js +2 -1
- package/11_ecs.spec.js +2 -2
- package/11_nadeq.js +1 -0
- package/11_nadeq.spec.js +1 -1
- package/11_rdim_ecs_individuelle_unique.js +78 -0
- package/11_rdim_ecs_individuelle_unique.spec.js +136 -0
- package/12.4_pac.js +5 -3
- package/12.4_pac.spec.js +10 -18
- package/13.2_generateur_combustion.js +19 -16
- package/13.2_generateur_combustion.spec.js +10 -10
- package/13.2_generateur_combustion_bouilleur.js +5 -2
- package/13.2_generateur_combustion_bouilleur.spec.js +1 -1
- package/13.2_generateur_combustion_ch.js +8 -7
- package/13.2_generateur_combustion_ch.spec.js +7 -7
- package/13.2_generateur_combustion_chaudiere.js +5 -2
- package/13.2_generateur_combustion_chaudiere.spec.js +2 -2
- package/13.2_generateur_combustion_pdim.js +6 -6
- package/13.2_generateur_combustion_pdim.spec.js +1 -1
- package/13.2_generateur_combustion_pn.spec.js +1 -1
- package/13.2_generateur_pac.js +4 -1
- package/13.2_generateur_pac.spec.js +1 -1
- package/13_rendement_distribution_ecs.spec.js +1 -1
- package/14_generateur_ecs.js +2 -1
- package/14_generateur_ecs.spec.js +4 -4
- package/15_conso_aux.js +19 -17
- package/15_conso_aux.spec.js +8 -8
- package/16.2_production_enr.js +4 -3
- package/16.2_production_enr.spec.js +1 -1
- package/16_conso_eclairage.spec.js +1 -1
- package/2021_04_13_confort_ete.spec.js +1 -1
- package/2021_04_13_qualite_isolation.js +1 -1
- package/2021_04_13_qualite_isolation.spec.js +2 -2
- package/3.1_b.spec.js +1 -1
- package/3.2.1_mur.js +10 -9
- package/3.2.1_mur.spec.js +11 -19
- package/3.2.2_plancher_bas.js +4 -3
- package/3.2.2_plancher_bas.spec.js +10 -20
- package/3.2.3_plancher_haut.js +1 -1
- package/3.2.3_plancher_haut.spec.js +2 -2
- package/3.3.1.4_porte.js +1 -1
- package/3.3.1.4_porte.spec.js +2 -2
- package/3.3_baie_vitree.js +2 -2
- package/3.3_baie_vitree.spec.js +3 -3
- package/3.4_pont_thermique.js +6 -4
- package/3.4_pont_thermique.spec.js +7 -7
- package/3_deperdition.js +1 -0
- package/3_deperdition.spec.js +3 -3
- package/4_ventilation.js +2 -2
- package/4_ventilation.spec.js +1 -1
- package/5_conso_ventilation.spec.js +1 -1
- package/6.1_apport_gratuit.spec.js +2 -2
- package/6.2_surface_sud_equivalente.js +12 -9
- package/6.2_surface_sud_equivalente.spec.js +3 -3
- package/7_inertie.js +7 -4
- package/7_inertie.spec.js +1 -1
- package/8_intermittence.spec.js +1 -1
- package/9_besoin_ch.js +5 -3
- package/9_besoin_ch.spec.js +3 -3
- package/9_chauffage.js +12 -11
- package/9_chauffage.spec.js +7 -7
- package/9_conso_ch.spec.js +3 -3
- package/9_emetteur_ch.js +5 -5
- package/9_emetteur_ch.spec.js +1 -1
- package/9_generateur_ch.js +16 -13
- package/9_generateur_ch.spec.js +6 -6
- package/README.md +19 -19
- package/apport_et_besoin.spec.js +1 -1
- package/conso.js +18 -14
- package/conso.spec.js +3 -3
- package/core/assets/domain/synchronize-assets.js +2 -0
- package/core/assets/domain/synchronize-c1-tables.js +2 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +2 -0
- package/core/assets/domain/synchronize-enum-tables.js +2 -0
- package/core/assets/domain/synchronize-solicitations-tables.js +2 -0
- package/core/assets/domain/synchronize-valeur-tables.js +6 -0
- package/core/file/infrastructure/adapter/csv-parser.store.js +2 -1
- package/dpe-sanitizer.service.js +1 -0
- package/engine.js +11 -2
- package/engine.spec.js +23 -2
- package/enums.d.ts +1257 -0
- package/features/dpe/domain/models/baie-ets.model.ts +8 -11
- package/features/dpe/domain/models/baie-vitree.model.ts +28 -96
- package/features/dpe/domain/models/climatisation.model.ts +13 -23
- package/features/dpe/domain/models/dpe-xsd.generated.ts +2797 -0
- package/features/dpe/domain/models/dpe.model.ts +105 -181
- package/features/dpe/domain/models/ets.model.ts +10 -18
- package/features/dpe/domain/models/installation-chauffage.model.ts +92 -99
- package/features/dpe/domain/models/installation-ecs.model.ts +45 -77
- package/features/dpe/domain/models/mur.model.ts +10 -38
- package/features/dpe/domain/models/plancher.model.ts +22 -63
- package/features/dpe/domain/models/pont-thermique.model.ts +10 -20
- package/features/dpe/domain/models/porte.model.ts +10 -30
- package/features/dpe/domain/models/production-elec-enr.model.ts +13 -27
- package/features/dpe/domain/models/sortie.model.ts +32 -176
- package/features/dpe/domain/models/type-generateur.model.js +4 -3
- package/features/dpe/domain/models/type-habitation.model.js +8 -6
- package/features/dpe/domain/models/type-stockage.model.js +4 -3
- package/features/dpe/domain/models/type-ventilation.model.js +4 -3
- package/features/dpe/domain/models/ventilation.model.ts +15 -25
- package/features/dpe/infrastructure/ch/chTv.store.js +2 -2
- package/features/dpe/infrastructure/ecs/ecsTv.store.js +3 -3
- package/features/dpe/infrastructure/enveloppe/baieVitreeTv.store.js +1 -1
- package/features/dpe/infrastructure/froid/frTv.store.js +3 -3
- package/features/dpe/infrastructure/froid/frTv.store.spec.js +1 -1
- package/features/dpe/infrastructure/tv.store.js +1 -1
- package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.js +3 -0
- package/features/engine/domain/apport_et_besoin/apport_gratuit/apport-gratuit.service.js +3 -1
- package/features/engine/domain/apport_et_besoin/ch/besoin-ch.service.js +3 -1
- package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.js +9 -3
- package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +1 -1
- package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.js +2 -1
- package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.js +4 -1
- package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.js +3 -1
- package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.js +7 -2
- package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +1 -1
- package/features/engine/domain/ch/emetteur-ch.service.js +3 -1
- package/features/engine/domain/ch/emetteur-ch.service.spec.js +1 -1
- package/features/engine/domain/ch/generateur-ch.service.js +4 -1
- package/features/engine/domain/ch/generateur-ch.service.spec.js +3 -3
- package/features/engine/domain/ch/installation-ch.service.js +2 -0
- package/features/engine/domain/conso/conso.service.js +2 -0
- package/features/engine/domain/conso/froid/conso-froid.service.js +5 -1
- package/features/engine/domain/contexte.builder.js +2 -0
- package/features/engine/domain/ecs/generateur-ecs.service.js +1 -0
- package/features/engine/domain/ecs/installation-ecs.service.js +3 -0
- package/features/engine/domain/engine.service.js +1 -0
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +4 -1
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +3 -0
- package/features/engine/domain/enveloppe/deperdition.service.js +8 -4
- package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.js +4 -1
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +3 -1
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +3 -1
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +2 -2
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +4 -2
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.js +9 -1
- package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +1 -1
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +3 -1
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +3 -1
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +1 -1
- package/features/engine/domain/logement/nadeq.service.js +1 -1
- package/features/engine/domain/logement/nadeq.service.spec.js +1 -1
- package/features/engine/domain/models/contexte.model.ts +2 -2
- package/features/normalizer/domain/dpe-normalizer.service.js +1 -0
- package/ficheTechnique.js +4 -2
- package/globals.d.ts +14 -0
- package/package.json +3 -2
- package/preprocessor/index.js +1 -0
- package/tv.d.ts +759 -0
- package/tvs.d.ts +2 -7
- package/utils.js +8 -6
package/7_inertie.spec.js
CHANGED
package/8_intermittence.spec.js
CHANGED
|
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'vitest';
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* 8. Modélisation de l'intermittence
|
|
6
|
-
* @see
|
|
6
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §8
|
|
7
7
|
*
|
|
8
8
|
* i = i0 / (1 + 0.1 * (G - 1)) avec G = GV / (Sh * Hsp)
|
|
9
9
|
* (fonction pure, aucune dépendance à mocker).
|
package/9_besoin_ch.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @import { GenerateurChauffage } from './features/dpe/domain/models/installation-chauffage.model.js' */
|
|
2
|
+
/** @import { GenerateurEcs } from './features/dpe/domain/models/installation-ecs.model.js' */
|
|
1
3
|
import enums from './enums.js';
|
|
2
4
|
import tvs from './tv.js';
|
|
3
5
|
import { calc_besoin_ecs_j } from './11_besoin_ecs.js';
|
|
@@ -99,7 +101,7 @@ export default function calc_besoin_ch(
|
|
|
99
101
|
* Seules les pertes des générateurs et des ballons de stockage en volume chauffé sont récupérables. Les pertes
|
|
100
102
|
* récupérées des générateurs d’air chaud sont nulles.
|
|
101
103
|
*
|
|
102
|
-
* @type {
|
|
104
|
+
* @type {GenerateurChauffage[]}
|
|
103
105
|
*/
|
|
104
106
|
const gen_ch_recup = instal_ch.flatMap((inst_ch) =>
|
|
105
107
|
inst_ch.generateur_chauffage_collection.generateur_chauffage.filter(
|
|
@@ -112,9 +114,9 @@ export default function calc_besoin_ch(
|
|
|
112
114
|
* 9.1.1 - Générateurs de la collection ECS assurant l'ECS uniquement, avec Qp0 > 0 et situés en
|
|
113
115
|
* volume chauffé : leurs pertes de génération sont aussi récupérées pour le chauffage.
|
|
114
116
|
* Les générateurs 'chauffage + ecs' sont exclus car déjà présents dans la collection chauffage.
|
|
115
|
-
* @see issue
|
|
117
|
+
* @see issue 153
|
|
116
118
|
*
|
|
117
|
-
* @type {
|
|
119
|
+
* @type {GenerateurEcs[]}
|
|
118
120
|
*/
|
|
119
121
|
const gen_ecs_recup = instal_ecs.flatMap((inst_ecs) =>
|
|
120
122
|
(inst_ecs.generateur_ecs_collection?.generateur_ecs || []).filter(
|
package/9_besoin_ch.spec.js
CHANGED
|
@@ -73,7 +73,7 @@ const { calc_Qrec_gen_j, calc_Qrec_gen_ecs_j, isGenerateurEcsSeulRecuperable } =
|
|
|
73
73
|
|
|
74
74
|
/**
|
|
75
75
|
* 9. Besoins de chauffage (Bch)
|
|
76
|
-
* @see
|
|
76
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
|
|
77
77
|
*/
|
|
78
78
|
describe('calc_Fj - fraction des besoins de chauffage couverte par les apports', () => {
|
|
79
79
|
test('retourne 0 lorsque le nombre de degrés-heures est nul', () => {
|
|
@@ -419,7 +419,7 @@ describe('calc_besoin_ch - branches complémentaires', () => {
|
|
|
419
419
|
/**
|
|
420
420
|
* 9.1.1 - Pertes récupérées de génération : générateurs de la collection ECS assurant l'ECS
|
|
421
421
|
* uniquement, avec Qp0 > 0 et en volume chauffé (issue #153).
|
|
422
|
-
* @see
|
|
422
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
|
|
423
423
|
*/
|
|
424
424
|
describe('calc_besoin_ch - récupération des pertes des générateurs ECS seuls (#153)', () => {
|
|
425
425
|
const genEcsSeul = {
|
|
@@ -566,7 +566,7 @@ describe('calc_besoin_ch - récupération des pertes des générateurs ECS seuls
|
|
|
566
566
|
* Immeuble à plusieurs installations ECS dont une collective (ex. installation mixte
|
|
567
567
|
* individuelle/collective) : besoin de chaque installation = Becs_immeuble × Sh_ecs / SH, × rdim
|
|
568
568
|
* pour une installation individuelle (Tribu, Calcul_batiment.Calcul_Cecs et l. 374).
|
|
569
|
-
* @see
|
|
569
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1 et §11.4
|
|
570
570
|
*/
|
|
571
571
|
describe('calc_besoin_ch - immeuble à installations ECS individuelles et collectives', () => {
|
|
572
572
|
const ecsIndividuelle = (surface_habitable, rdim) => ({
|
package/9_chauffage.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @import { FullDpe } from './features/dpe/domain/models/dpe.model.js' */
|
|
2
|
+
/** @import { GenerateurChauffage, GenerateurChauffageDU, InstallationChauffage, InstallationChauffageDE } from './features/dpe/domain/models/installation-chauffage.model.js' */
|
|
1
3
|
import { requestInput, Tbase, tv, tvColumnIDs } from './utils.js';
|
|
2
4
|
import { calc_emetteur_ch } from './9_emetteur_ch.js';
|
|
3
5
|
import {
|
|
@@ -195,9 +197,8 @@ export default function calc_chauffage(
|
|
|
195
197
|
zc,
|
|
196
198
|
principaux.includes(gen)
|
|
197
199
|
);
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
(gen.donnee_utilisateur = gen.donnee_utilisateur || {}).nbGenerateurCascade =
|
|
200
|
+
// donnee_utilisateur est toujours renseignée par la première boucle sur gen_ch ci-dessus
|
|
201
|
+
/** @type {GenerateurChauffageDU} */ (gen.donnee_utilisateur).nbGenerateurCascade =
|
|
201
202
|
reseauCirculateurUnique(de.enum_cfg_installation_ch_id) ? 1 : gen_ch.length;
|
|
202
203
|
|
|
203
204
|
calc_generateur_ch(
|
|
@@ -251,9 +252,9 @@ export default function calc_chauffage(
|
|
|
251
252
|
* Comme le moteur de référence CSTB (Tribu, autotests État APP5-0-4/41/43), le générateur
|
|
252
253
|
* prioritaire assure la totalité du besoin et son taux de charge est calculé avec sa seule Pn.
|
|
253
254
|
*
|
|
254
|
-
* @see
|
|
255
|
-
* @param gen_ch {
|
|
256
|
-
* @return {
|
|
255
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
|
|
256
|
+
* @param gen_ch {GenerateurChauffage[]}
|
|
257
|
+
* @return {GenerateurChauffage[]} générateurs principaux
|
|
257
258
|
*/
|
|
258
259
|
export function generateursPrincipauxCascade(gen_ch) {
|
|
259
260
|
const priorites = gen_ch.map((gen) => Number(gen.donnee_entree.priorite_generateur_cascade));
|
|
@@ -278,7 +279,7 @@ export function generateursPrincipauxCascade(gen_ch) {
|
|
|
278
279
|
* collectif (cfg 10). Le circulateur unique n'est pas divisé par le nombre de générateurs.
|
|
279
280
|
* Autotests CSTB IC4-0-1 (cfg 6, Tribu Caux_dist_ch = 8908,24 kWh), IC5-0-1 (cfg 8, 1777,76 kWh),
|
|
280
281
|
* IC5-0-3 (cfg 10, 1951,90 kWh).
|
|
281
|
-
* @see
|
|
282
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
|
|
282
283
|
* @param cfgInstallationId {string|number} enum_cfg_installation_ch_id
|
|
283
284
|
* @return {boolean}
|
|
284
285
|
*/
|
|
@@ -332,8 +333,8 @@ function getProrataGenerateur(
|
|
|
332
333
|
|
|
333
334
|
/**
|
|
334
335
|
* Retourne le facteur de couverture solaire pour les maisons avec chauffage solaire
|
|
335
|
-
* @param de {
|
|
336
|
-
* @param zc_id {
|
|
336
|
+
* @param de {InstallationChauffageDE}
|
|
337
|
+
* @param zc_id {number}
|
|
337
338
|
* @returns {number|*|null}
|
|
338
339
|
*/
|
|
339
340
|
function tv_ch_facteur_couverture_solaire(de, zc_id) {
|
|
@@ -362,7 +363,7 @@ function tv_ch_facteur_couverture_solaire(de, zc_id) {
|
|
|
362
363
|
* 13.2.1.2 Présence d’un ou plusieurs générateurs à combustion indépendants
|
|
363
364
|
* Calcul du taux de charge cdimref et cdimrefDep pour chacun des générateurs
|
|
364
365
|
*
|
|
365
|
-
* @param installationChauffage {
|
|
366
|
+
* @param installationChauffage {InstallationChauffage[]}
|
|
366
367
|
* @param GV {number} déperdition de l'enveloppe
|
|
367
368
|
* @param zcId {string} id de la zone climatique du bien
|
|
368
369
|
* @param caId {string} id de la classe d'altitude du bien
|
|
@@ -421,7 +422,7 @@ export function tauxChargeForGenerator(installationChauffage, GV, caId, zcId, th
|
|
|
421
422
|
* En immeuble, chaque installation est ramenée à l'échelle de l'immeuble par son rdim (y compris les
|
|
422
423
|
* installations collectives : rdim est renseigné par le logiciel et déjà appliqué au GV avant correctif).
|
|
423
424
|
*
|
|
424
|
-
* @param installCh {
|
|
425
|
+
* @param installCh {InstallationChauffage}
|
|
425
426
|
* @param th {string} type d'habitation
|
|
426
427
|
* @return {number}
|
|
427
428
|
*/
|
package/9_chauffage.spec.js
CHANGED
|
@@ -176,7 +176,7 @@ beforeEach(() => {
|
|
|
176
176
|
|
|
177
177
|
/**
|
|
178
178
|
* 9. Consommation de chauffage — orchestration
|
|
179
|
-
* @see
|
|
179
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
|
|
180
180
|
*/
|
|
181
181
|
describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
|
|
182
182
|
test('agrège les consommations et renseigne les données intermédiaires', () => {
|
|
@@ -243,7 +243,7 @@ describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
|
|
|
243
243
|
/**
|
|
244
244
|
* Longueur du réseau de l'installation de chauffage, même formule que la longueur de
|
|
245
245
|
* bouclage ECS : Lb = 4 × (Sh / Niv)^0,5 + 6 × (Niv − 0,5)
|
|
246
|
-
* @see
|
|
246
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
|
|
247
247
|
*/
|
|
248
248
|
describe('calc_lb_installation_ch - longueur du réseau de chauffage', () => {
|
|
249
249
|
test.each([
|
|
@@ -442,7 +442,7 @@ describe('calc_chauffage - générateurs à combustion', () => {
|
|
|
442
442
|
});
|
|
443
443
|
|
|
444
444
|
/**
|
|
445
|
-
* @see
|
|
445
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.2.4 (prorata de Pch à la surface desservie)
|
|
446
446
|
*/
|
|
447
447
|
test('ratio surface chauffée de l’installation / Sh transmis pour la Pn estimée (issue #264)', () => {
|
|
448
448
|
const ch = installation(
|
|
@@ -550,7 +550,7 @@ describe('calc_chauffage - générateurs à combustion', () => {
|
|
|
550
550
|
* dimensionné pour tout le besoin (pas de division par le nombre de générateurs). La consommation
|
|
551
551
|
* est ensuite répartie entre générateurs (division par nbGenWithAuxConsoDistribution).
|
|
552
552
|
* Autotests CSTB IC4-0-2 / IC4-0-21 (cascade de 2 chaudières gaz, Tribu Pcirc = 1321,76 W).
|
|
553
|
-
* @see
|
|
553
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
|
|
554
554
|
*/
|
|
555
555
|
describe('calc_chauffage - nombre de générateurs pris en compte pour le circulateur', () => {
|
|
556
556
|
test('installation simple (cfg 1) avec 2 générateurs en cascade : circulateur unique', () => {
|
|
@@ -577,7 +577,7 @@ describe('calc_chauffage - nombre de générateurs pris en compte pour le circul
|
|
|
577
577
|
* PAC (cfg 8) et base + appoint collectif (cfg 10) partagent le réseau ; le circulateur est
|
|
578
578
|
* dimensionné pour tout le besoin, comme en installation simple (cfg 1).
|
|
579
579
|
* Autotests CSTB IC4-0-1 (cfg 6), IC5-0-1 (cfg 8), IC5-0-3 (cfg 10).
|
|
580
|
-
* @see
|
|
580
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.1
|
|
581
581
|
*/
|
|
582
582
|
describe('reseauCirculateurUnique', () => {
|
|
583
583
|
test.each(['1', '6', '8', '10', 6, 8])('configuration %s : circulateur unique', (cfg) => {
|
|
@@ -641,7 +641,7 @@ describe('calc_chauffage - prorata entre générateurs', () => {
|
|
|
641
641
|
|
|
642
642
|
/**
|
|
643
643
|
* 13.2.1.3 Cascade de deux générateurs à combustion avec priorité
|
|
644
|
-
* @see
|
|
644
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.3
|
|
645
645
|
*/
|
|
646
646
|
describe('calc_chauffage - cascade de générateurs à combustion avec priorité', () => {
|
|
647
647
|
/** Deux chaudières (combustion) en cascade sur un seul émetteur. */
|
|
@@ -779,7 +779,7 @@ describe('calc_chauffage - initialisation défensive des données du générateu
|
|
|
779
779
|
|
|
780
780
|
/**
|
|
781
781
|
* 13.2.1.2 Taux de charge des générateurs à combustion (cdimref)
|
|
782
|
-
* @see
|
|
782
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §13.2.1.2
|
|
783
783
|
*/
|
|
784
784
|
describe('tauxChargeForGenerator - taux de charge des générateurs à combustion', () => {
|
|
785
785
|
/** Installation avec un générateur à combustion. */
|
package/9_conso_ch.spec.js
CHANGED
|
@@ -66,7 +66,7 @@ function emetteur(i0, surface = 100, lien = '1') {
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* 9. Consommations de chauffage (Cch)
|
|
69
|
-
* @see
|
|
69
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9
|
|
70
70
|
*/
|
|
71
71
|
describe('conso_ch - configuration par défaut (installation simple)', () => {
|
|
72
72
|
beforeEach(() => {
|
|
@@ -467,7 +467,7 @@ describe('conso_ch - installation collective base + appoint', () => {
|
|
|
467
467
|
* bâtiment) est proratisé à la surface chauffée par l'installation, comme `bch`.
|
|
468
468
|
* Tribu Calcul_installation.cs l.79-86 : bch = Bch1 × S_ratio / Rdim et
|
|
469
469
|
* Bch1_mensuel × S_ratio / Rdim, avec S_ratio = Sh_chauffée × Rdim / Stotal.
|
|
470
|
-
* @see
|
|
470
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.8
|
|
471
471
|
*/
|
|
472
472
|
describe('installation desservant une partie de l’immeuble (Sh_installation < Sh)', () => {
|
|
473
473
|
function appelPartiel(pos, { pn = 0, Sh = 200, sInst = 100, bch = 25, rdim = 1 } = {}) {
|
|
@@ -645,7 +645,7 @@ describe('conso_ch - installation collective base + appoint', () => {
|
|
|
645
645
|
* génération (§15.1 : Caux_g = Paux_g × Bch_générateur / Pn).
|
|
646
646
|
* Autotests CSTB APP5-0-5 (relève de PAC, 0,8 / 0,2) et IC4-0-1 (relève d'une chaudière bois,
|
|
647
647
|
* 0,75 / 0,25).
|
|
648
|
-
* @see
|
|
648
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9 et §15.1
|
|
649
649
|
*/
|
|
650
650
|
describe('conso_ch - besoin couvert par le générateur', () => {
|
|
651
651
|
beforeEach(() => {
|
package/9_emetteur_ch.js
CHANGED
|
@@ -43,7 +43,7 @@ function tv_rendement_emission(di, de) {
|
|
|
43
43
|
const matcher = {
|
|
44
44
|
enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
|
|
45
45
|
};
|
|
46
|
-
const row = tv('rendement_emission', matcher
|
|
46
|
+
const row = tv('rendement_emission', matcher);
|
|
47
47
|
if (row) {
|
|
48
48
|
di.rendement_emission = Number(row.re);
|
|
49
49
|
de.tv_rendement_emission_id = Number(row.tv_rendement_emission_id);
|
|
@@ -56,7 +56,7 @@ function tv_rendement_regulation(di, de) {
|
|
|
56
56
|
const matcher = {
|
|
57
57
|
enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
|
|
58
58
|
};
|
|
59
|
-
const row = tv('rendement_regulation', matcher
|
|
59
|
+
const row = tv('rendement_regulation', matcher);
|
|
60
60
|
if (row) {
|
|
61
61
|
di.rendement_regulation = Number(row.rr);
|
|
62
62
|
de.tv_rendement_regulation_id = Number(row.tv_rendement_regulation_id);
|
|
@@ -73,7 +73,7 @@ function tv_rendement_regulation(di, de) {
|
|
|
73
73
|
*/
|
|
74
74
|
export function isIntermittenceCollectiveSaisie(de) {
|
|
75
75
|
if (!bug_for_bug_compat || !de.tv_intermittence_id) return false;
|
|
76
|
-
const row = tv('intermittence', { tv_intermittence_id: de.tv_intermittence_id }
|
|
76
|
+
const row = tv('intermittence', { tv_intermittence_id: de.tv_intermittence_id });
|
|
77
77
|
if (!row || !row.enum_type_installation_id) return false;
|
|
78
78
|
return !row.enum_type_installation_id.split('|').includes('1');
|
|
79
79
|
}
|
|
@@ -94,7 +94,7 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndiv
|
|
|
94
94
|
const inertie = {
|
|
95
95
|
tv_intermittence_id: de.tv_intermittence_id
|
|
96
96
|
};
|
|
97
|
-
row = tv('intermittence', inertie
|
|
97
|
+
row = tv('intermittence', inertie);
|
|
98
98
|
|
|
99
99
|
if (row && row.comptage_individuel) {
|
|
100
100
|
hasComptage = row.comptage_individuel.includes('Présence');
|
|
@@ -128,7 +128,7 @@ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id, isAppointIndiv
|
|
|
128
128
|
delete matcher.comptage_individuel;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
row = tv('intermittence', matcher
|
|
131
|
+
row = tv('intermittence', matcher);
|
|
132
132
|
if (row) {
|
|
133
133
|
di.i0 = Number(row.i0);
|
|
134
134
|
de.tv_intermittence_id = Number(row.tv_intermittence_id);
|
package/9_emetteur_ch.spec.js
CHANGED
|
@@ -81,7 +81,7 @@ function emetteur({
|
|
|
81
81
|
* Tests pour le calcul du rendement de distribution pour chauffage (9_emetteur_ch.js)
|
|
82
82
|
* Focus sur la correction du bug #170 : conservation du tv_rendement_distribution_ch_id
|
|
83
83
|
* pour type_emission_distribution=41 ('Autres équipements').
|
|
84
|
-
* @see
|
|
84
|
+
* @see https://github.com/Open3CL/engine/issues/170
|
|
85
85
|
*/
|
|
86
86
|
describe('tv_rendement_distribution_ch - rendement de distribution CH', () => {
|
|
87
87
|
test("type_emission=41 AVEC tv_rendement_distribution_ch_id=6 : conserve l'ID original", () => {
|
package/9_generateur_ch.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/** @import { FullDpe } from './features/dpe/domain/models/dpe.model.js' */
|
|
2
|
+
/** @import { EmetteurChauffage, GenerateurChauffageDE, GenerateurChauffageDI } from './features/dpe/domain/models/installation-chauffage.model.js' */
|
|
3
|
+
/** @import { GenerateurEcs, GenerateurEcsDE, GenerateurEcsDI } from './features/dpe/domain/models/installation-ecs.model.js' */
|
|
1
4
|
import enums from './enums.js';
|
|
2
5
|
import { requestInput, requestInputID, tv, tvColumnIDs } from './utils.js';
|
|
3
6
|
import { conso_aux_distribution_ch, conso_aux_gen } from './15_conso_aux.js';
|
|
@@ -57,15 +60,15 @@ export function calc_Qrec_gen_j(gen_ch, nrefj, Bch_hp_j) {
|
|
|
57
60
|
* l'usage est 'ecs' sont concernés. Les générateurs 'chauffage + ecs' sont déjà pris en compte via
|
|
58
61
|
* la collection des générateurs de chauffage (cf. issue #153).
|
|
59
62
|
*
|
|
60
|
-
* @see
|
|
63
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
|
|
61
64
|
*
|
|
62
|
-
* @param gen_ecs {
|
|
65
|
+
* @param gen_ecs {GenerateurEcs}
|
|
63
66
|
* @param nrefj {number}
|
|
64
67
|
* @returns {number}
|
|
65
68
|
*/
|
|
66
69
|
export function calc_Qrec_gen_ecs_j(gen_ecs, nrefj) {
|
|
67
70
|
const de = gen_ecs.donnee_entree;
|
|
68
|
-
const di = gen_ecs.donnee_intermediaire || {};
|
|
71
|
+
const di = /** @type {GenerateurEcsDI} */ (gen_ecs.donnee_intermediaire || {});
|
|
69
72
|
|
|
70
73
|
if (!isGenerateurEcsSeulRecuperable(gen_ecs)) return 0;
|
|
71
74
|
|
|
@@ -78,12 +81,12 @@ export function calc_Qrec_gen_ecs_j(gen_ecs, nrefj) {
|
|
|
78
81
|
* s'il a des pertes à l'arrêt (Qp0 > 0), s'il est en volume chauffé et si son usage est 'ecs' seul
|
|
79
82
|
* (enum_usage_generateur_id = 2).
|
|
80
83
|
*
|
|
81
|
-
* @param gen_ecs {
|
|
84
|
+
* @param gen_ecs {GenerateurEcs}
|
|
82
85
|
* @returns {boolean}
|
|
83
86
|
*/
|
|
84
87
|
export function isGenerateurEcsSeulRecuperable(gen_ecs) {
|
|
85
|
-
const de = gen_ecs.donnee_entree || {};
|
|
86
|
-
const di = gen_ecs.donnee_intermediaire || {};
|
|
88
|
+
const de = /** @type {GenerateurEcsDE} */ (gen_ecs.donnee_entree || {});
|
|
89
|
+
const di = /** @type {GenerateurEcsDI} */ (gen_ecs.donnee_intermediaire || {});
|
|
87
90
|
return (
|
|
88
91
|
Number(di.qp0 || 0) > 0 &&
|
|
89
92
|
Number(de.position_volume_chauffe ?? 0) === 1 &&
|
|
@@ -95,7 +98,7 @@ function tv_rendement_generation(di, de, du) {
|
|
|
95
98
|
const matcher = {
|
|
96
99
|
enum_type_generateur_ch_id: requestInputID(de, du, 'type_generateur_ch')
|
|
97
100
|
};
|
|
98
|
-
const row = tv('rendement_generation', matcher
|
|
101
|
+
const row = tv('rendement_generation', matcher);
|
|
99
102
|
if (row) {
|
|
100
103
|
di.rendement_generation = Number(row.rg);
|
|
101
104
|
di.rg = di.rendement_generation;
|
|
@@ -128,8 +131,8 @@ export function type_generateur_ch(di, de, du, usage_generateur) {
|
|
|
128
131
|
/**
|
|
129
132
|
* Récupération du type de générateur
|
|
130
133
|
* @param dpe {FullDpe}
|
|
131
|
-
* @param de {
|
|
132
|
-
* @param di {
|
|
134
|
+
* @param de {GenerateurChauffageDE}
|
|
135
|
+
* @param di {GenerateurChauffageDI}
|
|
133
136
|
* @param du {Object}
|
|
134
137
|
*/
|
|
135
138
|
export function checkForGeneratorType(dpe, de, di, du) {
|
|
@@ -285,7 +288,7 @@ export function calc_generateur_ch(
|
|
|
285
288
|
* ce générateur (part de base / d'appoint, relève), et non le besoin de toute l'installation.
|
|
286
289
|
* Autotests CSTB APP5-0-5 (chaudière fioul en relève de PAC, Tribu Qaux_ch = 2,13 kWh) et
|
|
287
290
|
* IC4-0-1 (chaudière en relève d'une chaudière bois).
|
|
288
|
-
* @see
|
|
291
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
|
|
289
292
|
*/
|
|
290
293
|
const besoinGenerateur = besoinCouvert ?? bch;
|
|
291
294
|
const besoinGenerateurDep = bch > 0 ? (bch_dep * besoinGenerateur) / bch : 0;
|
|
@@ -330,11 +333,11 @@ const TYPE_EMISSION_DISTRIBUTION_AERAULIQUE = 5;
|
|
|
330
333
|
* aéraulique a donc des auxiliaires de distribution, bien que hasConsoForAuxDistribution l'exclue.
|
|
331
334
|
* L'émetteur est rattaché au générateur s'il est seul, ou par enum_lien_generateur_emetteur_id.
|
|
332
335
|
*
|
|
333
|
-
* @see
|
|
336
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
|
|
334
337
|
* @see Tribu Calcul_installation.cs (calcul_Cauxiliaires), Calcul_batiment.cs (Calcul_Cauxiliaires)
|
|
335
338
|
* @see https://github.com/Open3CL/engine/issues/291
|
|
336
|
-
* @param em_ch {
|
|
337
|
-
* @param de {
|
|
339
|
+
* @param em_ch {EmetteurChauffage[]}
|
|
340
|
+
* @param de {GenerateurChauffageDE} donnée d'entrée du générateur de chauffage
|
|
338
341
|
* @returns {boolean}
|
|
339
342
|
*/
|
|
340
343
|
export function hasEmetteurAerauliqueLie(em_ch, de) {
|
package/9_generateur_ch.spec.js
CHANGED
|
@@ -94,7 +94,7 @@ beforeEach(() => {
|
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
96
|
* 9.1.1 Pertes récupérées de génération pour le chauffage (Qrec_gen)
|
|
97
|
-
* @see
|
|
97
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
|
|
98
98
|
*/
|
|
99
99
|
describe('calc_Qrec_gen_j - pertes de génération récupérées', () => {
|
|
100
100
|
/** Générateur minimal en volume chauffé, non "air chaud". */
|
|
@@ -159,7 +159,7 @@ describe('calc_Qrec_gen_j - pertes de génération récupérées', () => {
|
|
|
159
159
|
* 9.1.1 Pertes récupérées de génération pour le chauffage : générateur de la collection ECS
|
|
160
160
|
* assurant l'ECS uniquement (issue #153).
|
|
161
161
|
* Dperj = Nrefj * 1790 / 8760 ; Qgen_rec_j = 0,48 * Cper * Qp0 * Dperj
|
|
162
|
-
* @see
|
|
162
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.1
|
|
163
163
|
*/
|
|
164
164
|
describe('calc_Qrec_gen_ecs_j / isGenerateurEcsSeulRecuperable - générateur ECS seul', () => {
|
|
165
165
|
/** Générateur ECS seul (usage 2), en volume chauffé, avec Qp0 = 100 W. */
|
|
@@ -355,7 +355,7 @@ describe('checkForGeneratorType - classification du générateur', () => {
|
|
|
355
355
|
|
|
356
356
|
/**
|
|
357
357
|
* Chaudière fioul par défaut : chaudière standard datant de la construction du bâtiment.
|
|
358
|
-
* @see
|
|
358
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §17.2.1.1
|
|
359
359
|
*/
|
|
360
360
|
describe('cas 119 : chaudière fioul par défaut selon l’année de construction', () => {
|
|
361
361
|
beforeEach(() => {
|
|
@@ -397,7 +397,7 @@ describe('checkForGeneratorType - classification du générateur', () => {
|
|
|
397
397
|
|
|
398
398
|
/**
|
|
399
399
|
* 15 Consommations d'auxiliaires de distribution : générateurs concernés.
|
|
400
|
-
* @see
|
|
400
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15
|
|
401
401
|
*/
|
|
402
402
|
describe('hasConsoForAuxDistribution - éligibilité aux auxiliaires de distribution', () => {
|
|
403
403
|
test('générateurs éligibles (chacune des plages)', () => {
|
|
@@ -428,7 +428,7 @@ describe('hasConsoForAuxDistribution - éligibilité aux auxiliaires de distribu
|
|
|
428
428
|
/**
|
|
429
429
|
* 15.2 Réseau aéraulique (émetteur 5) rattaché au générateur : auxiliaires de distribution calculés
|
|
430
430
|
* quel que soit le générateur, comme le moteur de référence (#291).
|
|
431
|
-
* @see
|
|
431
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2
|
|
432
432
|
*/
|
|
433
433
|
describe('hasEmetteurAerauliqueLie - réseau aéraulique rattaché au générateur', () => {
|
|
434
434
|
const em = (ed, lien) => ({
|
|
@@ -688,7 +688,7 @@ describe('calc_generateur_ch - orchestration du calcul générateur', () => {
|
|
|
688
688
|
* effectivement couvert par le générateur (retourné par conso_ch : part de relève, de base ou
|
|
689
689
|
* d'appoint) et non le besoin de toute l'installation.
|
|
690
690
|
* Autotest CSTB APP5-0-5 : chaudière fioul en relève de PAC (part 0,2), Tribu Qaux_ch = 2,13 kWh.
|
|
691
|
-
* @see
|
|
691
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.1
|
|
692
692
|
*/
|
|
693
693
|
describe('calc_generateur_ch - besoin couvert transmis aux auxiliaires de génération', () => {
|
|
694
694
|
const dpe = {
|
package/README.md
CHANGED
|
@@ -383,15 +383,15 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
383
383
|
|
|
384
384
|
<!-- CORPUS:START -->
|
|
385
385
|
|
|
386
|
-
> **Version `1.
|
|
386
|
+
> **Version `1.11.3`** · branche `main` · généré le 2026-11-07
|
|
387
387
|
> Seuil de tolérance **5%**
|
|
388
388
|
|
|
389
389
|
<table>
|
|
390
390
|
<tr>
|
|
391
391
|
<td align="center"><strong>9</strong><br/><sub>corpus</sub></td>
|
|
392
392
|
<td align="center"><strong>88 475</strong><br/><sub>DPE analysés</sub></td>
|
|
393
|
-
<td align="center"><strong>75
|
|
394
|
-
<td align="center"><strong>85,
|
|
393
|
+
<td align="center"><strong>75 961</strong><br/><sub>DPE conformes</sub></td>
|
|
394
|
+
<td align="center"><strong>85,86 %</strong><br/><sub>réussite globale</sub></td>
|
|
395
395
|
</tr>
|
|
396
396
|
</table>
|
|
397
397
|
|
|
@@ -402,9 +402,9 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
402
402
|
| 🟢 | **Logement individuel (2025)**<br/><sub>`dpe_logement_individuel_2025.csv`</sub> | **93,36 %** | `███████████████████░` | 9 180 / 9 833 |
|
|
403
403
|
| 🟢 | **Maison individuelle (2025)**<br/><sub>`dpe_maison_individuelle_2025.csv`</sub> | **92,14 %** | `██████████████████░░` | 9 003 / 9 771 |
|
|
404
404
|
| 🟢 | **Maison individuelle (2026)**<br/><sub>`dpe_maison_individuelle_2026.csv`</sub> | **90,46 %** | `██████████████████░░` | 9 046 / 10 000 |
|
|
405
|
-
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **89,
|
|
406
|
-
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **86,
|
|
407
|
-
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **
|
|
405
|
+
| 🟢 | **Immeuble · chauffage collectif**<br/><sub>`dpe_immeuble_chauffage_collectif.csv`</sub> | **89,23 %** | `██████████████████░░` | 8 690 / 9 739 |
|
|
406
|
+
| 🟢 | **Immeuble · chauffage individuel**<br/><sub>`dpe_immeuble_chauffage_individuel.csv`</sub> | **86,17 %** | `█████████████████░░░` | 8 552 / 9 924 |
|
|
407
|
+
| 🟡 | **Immeuble · chauffage mixte**<br/><sub>`dpe_immeuble_chauffage_mixte.csv`</sub> | **72,99 %** | `███████████████░░░░░` | 6 986 / 9 571 |
|
|
408
408
|
| 🔴 | **Individuel généré depuis l'immeuble (2026)**<br/><sub>`dpe_individuel_a_partir_dpe_immeuble_2026.csv`</sub> | **57,83 %** | `████████████░░░░░░░░` | 5 678 / 9 818 |
|
|
409
409
|
|
|
410
410
|
<sub>🟢 ≥ 85 % · 🟡 ≥ 60 % · 🔴 < 60 %</sub>
|
|
@@ -416,24 +416,24 @@ Ces résultats sont **générés automatiquement** à la fin de `npm run test:co
|
|
|
416
416
|
|
|
417
417
|
<table>
|
|
418
418
|
<tr>
|
|
419
|
-
<td align="center"><strong>5,
|
|
420
|
-
<td align="center"><strong>4,
|
|
421
|
-
<td align="center"><strong>0,
|
|
422
|
-
<td align="center"><strong>
|
|
419
|
+
<td align="center"><strong>5,25 ms</strong><br/><sub>moyenne</sub></td>
|
|
420
|
+
<td align="center"><strong>4,54 ms</strong><br/><sub>médiane</sub></td>
|
|
421
|
+
<td align="center"><strong>0,12 ms</strong><br/><sub>min</sub></td>
|
|
422
|
+
<td align="center"><strong>527,5 ms</strong><br/><sub>max</sub></td>
|
|
423
423
|
</tr>
|
|
424
424
|
</table>
|
|
425
425
|
|
|
426
426
|
| Corpus | Moyenne | Médiane | Min | Max | p95 | p99 |
|
|
427
427
|
| :--------------------------------------------- | ------: | ------: | ------: | -------: | ------: | ------: |
|
|
428
|
-
| **Appartement · chauffage individuel (2025)** |
|
|
429
|
-
| **Appartement · chauffage collectif (2025)** | 4,
|
|
430
|
-
| **Logement individuel (2025)** | 5,
|
|
431
|
-
| **Maison individuelle (2025)** |
|
|
432
|
-
| **Maison individuelle (2026)** | 6,
|
|
433
|
-
| **Immeuble · chauffage collectif** | 5,
|
|
434
|
-
| **Immeuble · chauffage individuel** |
|
|
435
|
-
| **Immeuble · chauffage mixte** | 5,
|
|
436
|
-
| **Individuel généré depuis l'immeuble (2026)** |
|
|
428
|
+
| **Appartement · chauffage individuel (2025)** | 3,67 ms | 3,30 ms | 1,36 ms | 43,8 ms | 6,43 ms | 8,54 ms |
|
|
429
|
+
| **Appartement · chauffage collectif (2025)** | 4,14 ms | 3,70 ms | 1,59 ms | 42,2 ms | 6,90 ms | 8,93 ms |
|
|
430
|
+
| **Logement individuel (2025)** | 5,04 ms | 4,49 ms | 1,81 ms | 55,4 ms | 9,25 ms | 13,0 ms |
|
|
431
|
+
| **Maison individuelle (2025)** | 5,94 ms | 5,28 ms | 2,04 ms | 59,1 ms | 10,7 ms | 14,7 ms |
|
|
432
|
+
| **Maison individuelle (2026)** | 6,03 ms | 5,39 ms | 1,92 ms | 53,8 ms | 10,6 ms | 14,6 ms |
|
|
433
|
+
| **Immeuble · chauffage collectif** | 5,29 ms | 4,48 ms | 0,14 ms | 123,7 ms | 9,60 ms | 16,3 ms |
|
|
434
|
+
| **Immeuble · chauffage individuel** | 6,07 ms | 5,12 ms | 0,12 ms | 111,3 ms | 12,3 ms | 20,4 ms |
|
|
435
|
+
| **Immeuble · chauffage mixte** | 5,17 ms | 4,19 ms | 0,19 ms | 527,5 ms | 11,0 ms | 17,2 ms |
|
|
436
|
+
| **Individuel généré depuis l'immeuble (2026)** | 5,91 ms | 4,90 ms | 1,80 ms | 83,7 ms | 11,1 ms | 18,6 ms |
|
|
437
437
|
|
|
438
438
|
<sub>La moyenne est tirée vers le haut par les DPE collectifs, dont le coût atteint plusieurs
|
|
439
439
|
dizaines de fois la médiane : c’est la médiane qui décrit le cas courant, et p95/p99 le cas
|
package/apport_et_besoin.spec.js
CHANGED
|
@@ -62,7 +62,7 @@ beforeEach(() => {
|
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Calcul des apports et besoins (assembleur chauffage / froid / ECS)
|
|
65
|
-
* @see
|
|
65
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf
|
|
66
66
|
*/
|
|
67
67
|
describe('calc_apport_et_besoin', () => {
|
|
68
68
|
test('agrège les besoins, apports et volumes ECS (climatisation présente)', () => {
|
package/conso.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @import { GenerateurChauffage, GenerateurChauffageDE, GenerateurChauffageDU } from './features/dpe/domain/models/installation-chauffage.model.js' */
|
|
2
|
+
/** @import { GenerateurEcs, GenerateurEcsDE, GenerateurEcsDU, InstallationEcs } from './features/dpe/domain/models/installation-ecs.model.js' */
|
|
1
3
|
import enums from './enums.js';
|
|
2
4
|
import calc_conso_eclairage from './16_conso_eclairage.js';
|
|
3
5
|
import tvs from './tv.js';
|
|
@@ -219,7 +221,7 @@ export function masqueEnergie(groupe) {
|
|
|
219
221
|
* Calcul_batiment.cs l.1318). Vérifié sur 927 / 1000 DPE ADEME appartement gaz collectif 2026.
|
|
220
222
|
*
|
|
221
223
|
* @param base {object} barème (prix unitaires et fonctions par tranches)
|
|
222
|
-
* @param consoGroupe {function(
|
|
224
|
+
* @param consoGroupe {function(object): {total: number, collectif: number}} consommations EF
|
|
223
225
|
* @param nbLogements {number} nombre de logements (1 hors immeuble)
|
|
224
226
|
* @param genCollectifs {Set} générateurs de chauffage / ECS d'installations collectives
|
|
225
227
|
* @param ratioSurfaceCollectif {number} SH_immeuble / SH_logement pour un appartement (1 sinon)
|
|
@@ -261,12 +263,12 @@ function coefPourGenerateur(coef, gen) {
|
|
|
261
263
|
/**
|
|
262
264
|
* Part d'appoint individuel (40 % du besoin, §9.1.6) de la consommation d'un convecteur
|
|
263
265
|
* bi-jonction, mémorisée par conso_ch (9_conso_ch.js) ; 0 pour les autres générateurs.
|
|
264
|
-
* @param gen {
|
|
266
|
+
* @param gen {GenerateurChauffage}
|
|
265
267
|
* @param field {'conso_ch'|'conso_ch_depensier'}
|
|
266
268
|
* @returns {number}
|
|
267
269
|
*/
|
|
268
270
|
export function appointBijonction(gen, field) {
|
|
269
|
-
const du = gen.donnee_utilisateur || {};
|
|
271
|
+
const du = /** @type {GenerateurChauffageDU} */ (gen.donnee_utilisateur || {});
|
|
270
272
|
const appoint =
|
|
271
273
|
field === 'conso_ch_depensier'
|
|
272
274
|
? du.conso_ch_appoint_bijonction_depensier
|
|
@@ -281,10 +283,10 @@ export function appointBijonction(gen, field) {
|
|
|
281
283
|
* Moteur de référence CSTB : DPE.Core Calcul_batiment.cs l.861-872 (base Cch1 → conso_elec_coll_ch
|
|
282
284
|
* si l'installation n'est pas individuelle) et l.912-915 (Cch_appoint_elec → conso_elec_indiv_ch),
|
|
283
285
|
* Calcul_cout.cs l.149-172 (tarification séparée collectif / individuel).
|
|
284
|
-
* @see
|
|
286
|
+
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §9.1.6 (convecteurs bi-jonction)
|
|
285
287
|
*
|
|
286
288
|
* @param coef {object} barème issu de coefCoutProrata
|
|
287
|
-
* @param gen {
|
|
289
|
+
* @param gen {GenerateurChauffage}
|
|
288
290
|
* @param typeEnergie {string}
|
|
289
291
|
* @param conso {number} consommation du générateur (base + appoint)
|
|
290
292
|
* @param field {'conso_ch'|'conso_ch_depensier'}
|
|
@@ -444,7 +446,7 @@ const ENERGIE_MULTI_BATIMENT = {
|
|
|
444
446
|
|
|
445
447
|
/**
|
|
446
448
|
* Récupération du coefficient d'émission GES pour le générateur
|
|
447
|
-
* @param gen_ch {
|
|
449
|
+
* @param gen_ch {GenerateurChauffage|GenerateurEcs}
|
|
448
450
|
* @param suffix {'ch'|'ecs'}
|
|
449
451
|
* @param dateDpe {string} date d'établissement du DPE
|
|
450
452
|
* @param versionLogiciel {string} version du logiciel de saisie
|
|
@@ -508,8 +510,9 @@ export default function calc_conso(
|
|
|
508
510
|
value.donnee_entree.enum_methode_calcul_conso_id =
|
|
509
511
|
ch.donnee_entree.enum_methode_calcul_conso_id;
|
|
510
512
|
value.donnee_entree.enum_type_installation_id = ch.donnee_entree.enum_type_installation_id;
|
|
511
|
-
|
|
512
|
-
|
|
513
|
+
/** @type {GenerateurChauffageDU} */ (
|
|
514
|
+
value.donnee_utilisateur = value.donnee_utilisateur || {}
|
|
515
|
+
).coeffEmissionGes = getGesCoeffForGenerateur(value, 'ch', dateDpe, versionLogiciel);
|
|
513
516
|
});
|
|
514
517
|
return acc.concat(generateur_chauffage);
|
|
515
518
|
}, []);
|
|
@@ -523,8 +526,9 @@ export default function calc_conso(
|
|
|
523
526
|
generateur_ecs.forEach((value) => {
|
|
524
527
|
value.donnee_entree.cle_repartition_ecs =
|
|
525
528
|
(ecs.donnee_entree.cle_repartition_ecs || 1) * getRdimEcs(ecs);
|
|
526
|
-
|
|
527
|
-
|
|
529
|
+
/** @type {GenerateurEcsDU} */ (
|
|
530
|
+
value.donnee_utilisateur = value.donnee_utilisateur || {}
|
|
531
|
+
).coeffEmissionGes = getGesCoeffForGenerateur(value, 'ecs', dateDpe, versionLogiciel);
|
|
528
532
|
});
|
|
529
533
|
}
|
|
530
534
|
return acc.concat(generateur_ecs);
|
|
@@ -882,7 +886,7 @@ export function classe_emission_ges(emission_ges_5_usages_m2, zc_id, ca_id, Sh)
|
|
|
882
886
|
|
|
883
887
|
/**
|
|
884
888
|
Calcul de la consommation globale d'ECS
|
|
885
|
-
* @param gen_ecs {
|
|
889
|
+
* @param gen_ecs {GenerateurEcs[]}
|
|
886
890
|
* @param field {string}
|
|
887
891
|
* @param coef {number}
|
|
888
892
|
* @param prorataECS {number}
|
|
@@ -948,8 +952,8 @@ export function getAuxGenerationEcs(ecs, field, coef, prorataECS, facteurAc = 1)
|
|
|
948
952
|
|
|
949
953
|
/**
|
|
950
954
|
* Calcul de la consommation globale de chauffage
|
|
951
|
-
* @param gen_ch {
|
|
952
|
-
* @param field {
|
|
955
|
+
* @param gen_ch {GenerateurChauffage[]}
|
|
956
|
+
* @param field {'conso_ch'|'conso_ch_depensier'}
|
|
953
957
|
* @param coef {number}
|
|
954
958
|
* @param prorataChauffage {number}
|
|
955
959
|
* @param prefix {string}
|
|
@@ -1133,7 +1137,7 @@ function calc_conso_pond(
|
|
|
1133
1137
|
/**
|
|
1134
1138
|
* Retourne le type d'énergie utilisé.
|
|
1135
1139
|
* 1 - Electricité par défaut si la donnée n'est pas définie
|
|
1136
|
-
* @param donneeEntree {
|
|
1140
|
+
* @param donneeEntree {GenerateurChauffageDE|GenerateurEcsDE}
|
|
1137
1141
|
* @param suffix {string} Suffix à ajouter au type électricité
|
|
1138
1142
|
* @return {string}
|
|
1139
1143
|
*/
|