UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

170 lines (155 loc) 5.2 kB
import { inject } from 'dioma'; import { PRECISION } from '../../constants.js'; import { DeperditionService } from '../deperdition.service.js'; import { TvStore } from '../../../../dpe/infrastructure/tv.store.js'; /** * Calcul des déperditions de l’enveloppe GV * Chapitre 3.2.3 Calcul des planchers haut * * 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 DeperditionPlancherHautService extends DeperditionService { /** * @param tvStore {TvStore} */ constructor(tvStore = inject(TvStore)) { super(tvStore); } /** * @param ctx {Contexte} * @param phDE {PlancherHautDE} * @return {PlancherHautDI} */ execute(ctx, phDE) { const uph0 = this.#uph0(phDE); const uph = this.#uph(phDE, uph0, ctx); const b = this.b({ enumTypeAdjacenceId: phDE.enum_type_adjacence_id, surfaceAiu: phDE.surface_aiu, surfaceAue: phDE.surface_aue, enumCfgIsolationLncId: phDE.enum_cfg_isolation_lnc_id, zoneClimatique: ctx.zoneClimatique.value }); /** @type {PlancherHautDI} */ return { uph0, uph, b }; } /** * @param phDE {PlancherHautDE} * @param uph0 {number} * @param ctx {Contexte} * @return {number|undefined} */ #uph(phDE, uph0, ctx) { // On determine uph_nu (soit uph0 soit 2 comme valeur minimale forfaitaire) const uphNu = Math.min(uph0, 2.5); const enumPeriodeIsolationId = this.getEnumPeriodeIsolationId( phDE.enum_periode_isolation_id, ctx ); // Selon l'isolation, on applique un calcul au uph nu pour simuler son isolation let uph; switch (phDE.enum_methode_saisie_u_id) { case '1': // non isolé uph = uphNu; break; case '2': // isolation inconnue (table forfaitaire) case '7': // année d'isolation différente de l'année de construction case '8': // année de construction saisie uph = Math.min( uphNu, this.tvStore.getUph( enumPeriodeIsolationId, this.#getTypeAdjacence(phDE), ctx.zoneClimatique.id, ctx.effetJoule ) ); break; case '3': // epaisseur isolation saisie justifiée par mesure ou observation case '4': // epaisseur isolation saisie (en cm) uph = 1 / (1 / uphNu + (phDE.epaisseur_isolation * 0.01) / 0.04); break; case '5': case '6': // resistance isolation saisie uph = 1 / (1 / uphNu + phDE.resistance_isolation); break; default: // saisie direct de la valeur de u uph = phDE.uph_saisi; break; } return Math.round(parseFloat(uph) * PRECISION) / PRECISION; } /** * @param phDE {PlancherHautDE} * @return {number|undefined} */ #uph0(phDE) { let uph0; switch (phDE.enum_methode_saisie_u0_id) { case '1': case '2': // type de paroi inconnu (valeur par défaut) // déterminé selon le matériau et épaisseur à partir de la table de valeur forfaitaire uph0 = this.tvStore.getUph0(phDE.enum_type_plancher_haut_id); break; case '5': // u0 non saisi car le u est saisi connu et justifié return; default: // Valeur saisie return phDE.uph0_saisi; } return uph0; } /** * Retourne le type d'adjacence à utiliser combles ou terrasse * @see Méthode de calcul 3CL-DPE 2021 (cotobre 2021) chapitre 3.2.3.1 * "Lorsque le local au-dessus du logement est un local non chauffé, ou un local autre que d’habitation., Uph_tab est pris dans la catégorie « Terrasse »." * @param phDE {PlancherHautDE} * @return {'combles'|'terasse'} */ #getTypeAdjacence(phDE) { switch (phDE.enum_type_adjacence_id) { case '1': // extérieur - type de ph != 'combles aménagés sous rampant' return phDE.enum_type_plancher_haut_id === '12' ? 'combles' : 'terrasse'; case '7': // locaux non chauffés non accessible return 'terrasse'; default: return 'combles'; } } /** * Retourner le type d'isolation du plancher haut * Si isolation inconnue : * - Pour les bâtiments d’avant 1975, la paroi est considérée comme non isolée * - Pour les bâtiments construits à partir de 1975, les plafonds sont considérés isolés par l’extérieur * * @param ctx {Contexte} * @param plancherHautDE {PlancherHautDE} * @return {number} */ typeIsolation(ctx, plancherHautDE) { const typeIsolation = parseInt(plancherHautDE.enum_type_isolation_id); // Type d'isolation inconnu if (typeIsolation === 1) { const periodeIsolation = parseInt(plancherHautDE.enum_periode_isolation_id) || parseInt(ctx.enumPeriodeConstructionId); // Année isolation / construction < 1975 if (periodeIsolation < 3) { // Non isolé return 2; } else { // Isolation ITE return 4; } } // Isolation ITE si "isolé mais type d'isolation inconnu" return typeIsolation === 9 ? 4 : typeIsolation; } }