@open3cl/engine
Version:
Open Source 3CL-DPE engine
339 lines (301 loc) • 11.8 kB
JavaScript
import { DeperditionService } from '../deperdition.service.js';
import { logger } from '../../../../../core/util/logger/log-service.js';
import { TypeHabitation } from '../../../../dpe/domain/models/type-habitation.model.js';
import { TypeVentilation } from '../../../../dpe/domain/models/type-ventilation.model.js';
/**
* Calcul des déperditions par ventilation
* Chapitre 4 Calcul des déperditions par renouvellement d’air
*
* Méthode de calcul 3CL-DPE 2021
* Octobre 2021
* @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf
*/
export class DeperditionVentilationService extends DeperditionService {
/**
* Calcul des déperditions par ventilation
* @param ctx {Contexte}
* @param ventilationDE {VentilationDE}
* @param surfaceDeperditive {number}
* @param surfaceIsolee {number}
* @param surfaceNonIsolee {number}
* @param surfaceMenuiserieAvecJoint {number}
* @param surfaceMenuiserieSansJoint {number}
* @return {VentilationDI}
*/
execute(
ctx,
ventilationDE,
surfaceDeperditive,
surfaceIsolee,
surfaceNonIsolee,
surfaceMenuiserieAvecJoint,
surfaceMenuiserieSansJoint
) {
const q4paConv = this.q4paConv(
ventilationDE,
ctx,
surfaceIsolee,
surfaceNonIsolee,
surfaceMenuiserieAvecJoint,
surfaceMenuiserieSansJoint
);
const debitsVentilation = this.#debitsVentilation(ventilationDE.enum_type_ventilation_id);
/** @type {VentilationDI} */
return {
...{
hvent: this.hvent(ctx.surfaceHabitable, debitsVentilation),
hperm: this.hperm(ventilationDE, debitsVentilation, ctx, surfaceDeperditive, q4paConv)
},
...this.#consoAuxiliaireVentilation(ventilationDE, ctx, debitsVentilation)
};
}
/**
* Valeur conventionnelle de la perméabilité sous 4Pa
*
* @param ventilationDE {VentilationDE}
* @param ctx {Contexte}
* @param surfaceIsolee {number}
* @param surfaceNonIsolee {number}
* @param surfaceMenuiserieAvecJoint {number}
* @param surfaceMenuiserieSansJoint {number}
* @return {number}
*/
q4paConv(
ventilationDE,
ctx,
surfaceIsolee,
surfaceNonIsolee,
surfaceMenuiserieAvecJoint,
surfaceMenuiserieSansJoint
) {
// Pour les bâtiments qui ont fait l’objet d’une mesure d’étanchéité à l’air moins de deux ans avant le diagnostic, la valeur
// mesurée de Q4Paconv/m² peut être saisie.
if (ventilationDE.q4pa_conv_saisi) {
return ventilationDE.q4pa_conv_saisi;
}
const enumPeriodeConstructionId = ctx.enumPeriodeConstructionId;
let isolationSurface;
let presenceJointsMenuiserie;
if (enumPeriodeConstructionId === '1') {
// Pour les bâtiments ou logements construits avant 1948, avec une isolation des murs et/ou du plafond (isolation
// de plus de 50% des surfaces) => valeur forfaitaire.
isolationSurface = surfaceIsolee > surfaceNonIsolee ? '1' : '0';
if (isolationSurface === '0') {
// Pour les bâtiments ou logements construits avant 1948, si les menuiseries possèdent des joints
// (si les menuiseries représentant plus de 50% de la surface totale possèdent des joints) => valeur forfaitaire.
if (surfaceMenuiserieAvecJoint > surfaceMenuiserieSansJoint) {
presenceJointsMenuiserie = '1';
}
}
} else if (enumPeriodeConstructionId === '2') {
// Pour les bâtiments ou logements construits entre 1948 et 1974, avec une isolation des murs et/ou du plafond (isolation
// de plus de 50% des surfaces) => valeur forfaitaire.
isolationSurface = surfaceIsolee > surfaceNonIsolee ? '1' : '0';
}
return this.tvStore.getQ4paConv(
ctx.enumPeriodeConstructionId,
ctx.typeHabitation,
isolationSurface,
presenceJointsMenuiserie
)?.q4pa_conv;
}
/**
* Déperdition thermique par renouvellement d’air due au système de ventilation
* @param surfaceHabitable {number}
* @param debitsVentilation {{qvarep_conv?: number, qvasouf_conv?: number, smea_conv?: number}}
* @return number
*/
hvent(surfaceHabitable, debitsVentilation) {
return 0.34 * Number(debitsVentilation?.qvarep_conv) * surfaceHabitable;
}
/**
* Déperdition thermique par renouvellement d’air due au système de ventilation
* @param ventilationDE {VentilationDE}
* @param debitsVentilation {{qvarep_conv?: number, qvasouf_conv?: number, smea_conv?: number}}
* @param ctx {Contexte}
* @param surfaceDeperditive {number}
* @param q4paConv {number}
* @return number
*/
hperm(ventilationDE, debitsVentilation, ctx, surfaceDeperditive, q4paConv) {
const pfe = ventilationDE.plusieurs_facade_exposee;
const surfaceHabitable = ctx.surfaceHabitable;
// Coefficients de protection
const e = pfe ? 0.07 : 0.02;
const f = pfe ? 15 : 20;
const q4pa_env = q4paConv * surfaceDeperditive;
// Perméabilité sous 4 Pa de la zone
const q4pa = q4pa_env + 0.45 * debitsVentilation?.smea_conv * surfaceHabitable;
const n50 = q4pa / ((4 / 50) ** (2 / 3) * ctx.hauteurSousPlafond * surfaceHabitable);
// Débit d’air dû aux infiltrations liées au vent (m3/h)
const qvinf =
(ctx.hauteurSousPlafond * surfaceHabitable * n50 * e) /
(1 +
(f / e) *
((debitsVentilation?.qvasouf_conv - debitsVentilation?.qvarep_conv) /
(ctx.hauteurSousPlafond * n50)) **
2);
return 0.34 * qvinf;
}
/**
* Puissance moyenne des auxiliaires (W)
* @param typeVentilation {string}
* @param ctx {Contexte}
* @param ventilationPost2012 {boolean}
* @param debitsVentilation {{qvarep_conv?: number, qvasouf_conv?: number, smea_conv?: number}}
* @returns {*|number}
*/
pventMoy(typeVentilation, ctx, ventilationPost2012, debitsVentilation) {
let hybride = false;
/** @type {TypeVentilation} **/
let type;
/**
* 1 - ventilation par ouverture des fenêtres
* 2 - ventilation par entrées d'air hautes et basses
* 25 - ventilation naturelle par conduit
* 34 - ventilation naturelle par conduit avec entrées d'air hygro
* 35 - puits climatique sans échangeur avant 2013
* 36 - puits climatique sans échangeur à partir de 2013
* 37 - puits climatique avec échangeur avant 2013
* 38 - puits climatique avec échangeur à partir de 2013
*/
if (['1', '2', '25', '34', '35', '36', '37', '38'].includes(typeVentilation)) {
return 0;
}
/**
* 26 - ventilation hybride avant 2001
* 27 - ventilation hybride de 2001 à 2012
* 28 - ventilation hybride après 2012
* 29 - ventilation hybride avec entrées d'air hygro avant 2001
* 30 - ventilation hybride avec entrées d'air hygro de 2001 à 2012
* 31 - ventilation hybride avec entrées d'air hygro après 2012
*/
if (['26', '27', '28', '29', '30', '31'].includes(typeVentilation)) {
hybride = true;
type = TypeVentilation.SIMPLE_FLUX_AUTO;
}
/**
* 3 - vmc sf auto réglable avant 1982
* 4 - vmc sf auto réglable de 1982 à 2000
* 5 - vmc sf auto réglable de 2001 à 2012
* 6 - vmc sf auto réglable après 2012
* 32 - ventilation mécanique sur conduit existant avant 2013
* 33 - ventilation mécanique sur conduit existant à partir de 2013
*/
if (['3', '4', '5', '6', '32', '33'].includes(typeVentilation)) {
type = TypeVentilation.SIMPLE_FLUX_AUTO;
}
/**
* 10 - vmc sf gaz avant 2001
* 11 - vmc sf gaz de 2001 à 2012
* 12 - vmc sf gaz après 2012
*/
if (['10', '11', '12'].includes(typeVentilation)) {
type = TypeVentilation.SIMPLE_FLUX_AUTO;
}
/**
* 7 - vmc sf hygro a avant 2001
* 8 - vmc sf hygro a de 2001 à 2012
* 9 - vmc sf hygro a après 2012
* 13 - vmc sf hygro b avant 2001
* 14 - vmc sf hygro b de 2001 à 2012
* 15 - vmc sf hygro b après 2012
* 16 - vmc basse pression auto-réglable
* 17 - vmc basse pression hygro a
* 18 - vmc basse pression hygro b
*/
if (['7', '8', '9', '13', '14', '15', '16', '17', '18'].includes(typeVentilation)) {
type = TypeVentilation.SIMPLE_FLUX_HYGRO;
}
/**
* 19 - vmc df individuelle avec échangeur avant 2013
* 20 - vmc df individuelle avec échangeur à partir de 2013
* 21 - vmc df collective avec échangeur avant 2013
* 22 - vmc df collective avec échangeur à partir de 2013
* 23 - vmc df sans échangeur avant 2013
* 24 - vmc df sans échangeur après 2012
*/
if (['19', '20', '21', '22', '23', '24'].includes(typeVentilation)) {
type = TypeVentilation.DOUBLE_FLUX;
}
// Puissance des auxiliaires (W/(m³/h))
let pvent;
switch (type) {
case TypeVentilation.SIMPLE_FLUX_AUTO: {
if (ctx.typeHabitation === TypeHabitation.MAISON) {
pvent = ventilationPost2012 ? 35 : 65;
} else {
pvent = ventilationPost2012 ? 0.25 : 0.46;
}
break;
}
case TypeVentilation.SIMPLE_FLUX_HYGRO: {
if (ctx.typeHabitation === TypeHabitation.MAISON) {
pvent = ventilationPost2012 ? 15 : 50;
} else {
pvent = ventilationPost2012 ? 0.25 : 0.46;
}
break;
}
case TypeVentilation.DOUBLE_FLUX: {
if (ctx.typeHabitation === TypeHabitation.MAISON) {
pvent = ventilationPost2012 ? 35 : 80;
} else {
pvent = ventilationPost2012 ? 0.6 : 1.1;
}
break;
}
}
let pventMoy;
/**
* @see Methode_de_calcul_3CL_DPE_2021-338.pdf, pages 41-42
* Les consommations d’auxiliaires pour une VMC hybride correspondent aux consommations d’une VMC
* classique autoréglable de 2001 à 2012 multipliées par le ratio du temps d’utilisation
*/
const ratioUtilisation = hybride
? (ctx.typeHabitation === TypeHabitation.MAISON ? 14 : 28) / (24 * 7)
: 1;
if (ctx.typeHabitation === TypeHabitation.MAISON) {
pventMoy = pvent * ratioUtilisation;
} else {
pventMoy = pvent * debitsVentilation?.qvarep_conv * ctx.surfaceHabitable * ratioUtilisation;
}
return pventMoy;
}
/**
* Débits de ventilation
* @param typeVentilation {number}
* @return {{qvarep_conv?: number, qvasouf_conv?: number, smea_conv?: number}}
*/
#debitsVentilation(typeVentilation) {
const debitsVentilation = this.tvStore.getDebitsVentilation(typeVentilation);
return {
qvarep_conv: Number(debitsVentilation?.qvarep_conv),
qvasouf_conv: Number(debitsVentilation?.qvasouf_conv),
smea_conv: Number(debitsVentilation?.smea_conv)
};
}
/**
* Consommation des auxiliaires de ventilation
* @param ventilationDE {VentilationDE}
* @param ctx {Contexte}
* @param debitsVentilation {{qvarep_conv?: number, qvasouf_conv?: number, smea_conv?: number}}
* @returns {{conso_auxiliaire_ventilation: number, pvent_moy}|number}
*/
#consoAuxiliaireVentilation(ventilationDE, ctx, debitsVentilation) {
const typeVentilation = ventilationDE.enum_type_ventilation_id;
let ventilationPost2012 = ventilationDE.ventilation_post_2012;
if (typeVentilation === undefined && ventilationPost2012 === undefined) {
logger.error(`
Impossible de calculer la consommation des auxiliaires de ventilation sans les variables enum_type_ventilation_id et ventilation_post_2012
`);
return 0;
}
// Puissance moyenne des auxiliaires (W)
const pventMoy = this.pventMoy(typeVentilation, ctx, ventilationPost2012, debitsVentilation);
return {
conso_auxiliaire_ventilation: 8.76 * pventMoy,
pvent_moy: pventMoy
};
}
}