UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

220 lines (186 loc) 7.8 kB
import { tv, requestInputID, requestInput, bug_for_bug_compat } from './utils.js'; import calc_pvent from './5_conso_ventilation.js'; function tv_debits_ventilation(di, de, du) { const matcher = { enum_type_ventilation_id: requestInputID(de, du, 'type_ventilation') }; const row = tv('debits_ventilation', matcher); if (row) { di.qvarep_conv = Number(row.qvarep_conv); di.qvasouf_conv = Number(row.qvasouf_conv); di.smea_conv = Number(row.smea_conv); de.tv_debits_ventilation_id = Number(row.tv_debits_ventilation_id); } else { console.error('!! pas de valeur forfaitaire trouvée pour debits_ventilation !!'); } } function tv_q4pa_conv(di, de, cg, mur_list, ph_list, porte_list, bv_list) { const surfaces = mur_list.concat(ph_list); const surface_isolee = surfaces.reduce((acc, s) => { if (s.donnee_intermediaire.b === 0) return acc; const typeIsolation = parseInt(s.donnee_entree.enum_type_isolation_id); // Si le type isolation est inconnu mais avec que la période d'isolation est connue et > 1974 alors on considère la surface isolée if (typeIsolation === 1 && parseInt(s.donnee_entree.enum_periode_isolation_id) >= 3) { return acc + s.donnee_entree.surface_paroi_opaque; } // Si type d'isolation "1 - inconnu" ou "2 - non isolé" if ([1, 2].includes(typeIsolation)) return acc; else return acc + s.donnee_entree.surface_paroi_opaque; }, 0); const surface_non_isolee = surfaces.reduce((acc, s) => { if (s.donnee_intermediaire.b === 0) return acc; const typeIsolation = parseInt(s.donnee_entree.enum_type_isolation_id); // Si le type isolation est inconnu mais avec que la période d'isolation est connue et > 1974 alors on considère la surface isolée if (typeIsolation === 1 && parseInt(s.donnee_entree.enum_periode_isolation_id) >= 3) { return acc; } // Si type d'isolation "1 - inconnu" ou "2 - non isolé" if ([1, 2].includes(typeIsolation)) { return acc + s.donnee_entree.surface_paroi_opaque; } else return acc; }, 0); let isolation_surfaces = surface_isolee > surface_non_isolee ? '1' : '0'; // presence joints menuiserie let surface_bv_avec_joint = bv_list.reduce((acc, bv) => { if (bv.donnee_entree.presence_joint) return acc + bv.donnee_entree.surface_totale_baie; else return acc; }, 0); surface_bv_avec_joint += porte_list.reduce((acc, porte) => { if (porte.donnee_entree.presence_joint) return acc + porte.donnee_entree.surface_porte; else return acc; }, 0); let surface_bv_sans_joint = bv_list.reduce((acc, bv) => { if (!bv.donnee_entree.presence_joint) return acc + bv.donnee_entree.surface_totale_baie; else return acc; }, 0); surface_bv_sans_joint += porte_list.reduce((acc, porte) => { if (!porte.donnee_entree.presence_joint) return acc + porte.donnee_entree.surface_porte; else return acc; }, 0); let pjt = surface_bv_avec_joint / (surface_bv_avec_joint + surface_bv_sans_joint) > 0.5 ? '1' : '0'; if (bug_for_bug_compat && de.tv_q4pa_conv_id) { const rowQ4paConv = tv('q4pa_conv', { tv_q4pa_conv_id: de.tv_q4pa_conv_id }); if (rowQ4paConv) { if (rowQ4paConv.isolation_surfaces !== isolation_surfaces) { console.error( `Calcul de hperm pour la ventilation ${de.description}. Le DPE considère isolation_surfaces = ${rowQ4paConv.isolation_surfaces} alors que ce devrait être isolation_surfaces = ${isolation_surfaces}. La valeur du DPE isolation_surfaces = ${rowQ4paConv.isolation_surfaces} est utilisée.` ); } if (rowQ4paConv.presence_joints_menuiserie !== pjt) { console.error( `Calcul de hperm pour la ventilation ${de.description}. Le DPE considère presence_joints_menuiserie = ${rowQ4paConv.presence_joints_menuiserie} alors que ce devrait être presence_joints_menuiserie = ${pjt}. La valeur du DPE presence_joints_menuiserie = ${rowQ4paConv.presence_joints_menuiserie} est utilisée.` ); } } } const matcher = { enum_periode_construction_id: cg.enum_periode_construction_id, enum_methode_application_dpe_log_id: cg.enum_methode_application_dpe_log_id, isolation_surfaces, presence_joints_menuiserie: pjt }; const row = tv('q4pa_conv', matcher); if (row) { di.q4pa_conv = Number(row.q4pa_conv); de.tv_q4pa_conv_id = Number(row.tv_q4pa_conv_id); } else { console.error('!! pas de valeur forfaitaire trouvée pour q4pa_conv !!'); } } const e_tab = { 1: 0.07, 0: 0.02 }; const f_tab = { 1: 15, 0: 20 }; function calc_hperm(di, surface_ventile, Hsp, Sdep, pfe) { const e = e_tab[pfe]; const f = f_tab[pfe]; const Q4pa_env = di.q4pa_conv * Sdep; const Q4pa = Q4pa_env + 0.45 * di.smea_conv * surface_ventile; const n50 = Q4pa / ((4 / 50) ** (2 / 3) * Hsp * surface_ventile); const Qvinf = (Hsp * surface_ventile * n50 * e) / (1 + (f / e) * ((di.qvasouf_conv - di.qvarep_conv) / (Hsp * n50)) ** 2); di.hperm = 0.34 * Qvinf; } export default function calc_ventilation( vt, cg, th, Sdep, Sh, mur_list, ph_list, porte_list, bv_list ) { const de = vt.donnee_entree; const du = {}; const di = {}; let surface_ventile = requestInput(de, du, 'surface_ventile', 'float'); if (!surface_ventile) { surface_ventile = Sh; } else if (surface_ventile !== Sh) { // S'il y a une répartition alors c'est que la vmc est collective. La surface à prendre en compte est la surface de l'immeuble surface_ventile /= de.cle_repartition_ventilation || 1; } const Hsp = cg.hsp; tv_debits_ventilation(di, de, du); // 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 (de.q4pa_conv_saisi) { di.q4pa_conv = de.q4pa_conv_saisi; } else { tv_q4pa_conv(di, de, cg, mur_list, ph_list, porte_list, bv_list); } di.hvent = 0.34 * di.qvarep_conv * surface_ventile; let pfe = requestInput(de, du, 'plusieurs_facade_exposee', 'bool'); /** * Si une fiche technique pour cette variable est présente, elle est prise en compte * Les valeurs de plusieurs_facade_exposee n'étant pas toujours utilisées de la même manière * dans tous les DPEs (parfois 0 = 'Oui', d'autres 0 = 'Non') */ if (de.ficheTechniqueFacadesExposees) { const pfeFicheTechnique = ['non', 'une'].includes( de.ficheTechniqueFacadesExposees.valeur.toLowerCase() ) ? 0 : 1; if (pfeFicheTechnique !== pfe) { console.error( `La valeur de la variable plusieurs_facade_exposee ne correspond pas à celle présente dans la fiche technique "${de.ficheTechniqueFacadesExposees.description}". La valeur de la fiche technique est prise en compte.` ); } pfe = pfeFicheTechnique; } /** * Si une fiche technique pour cette variable est présente, elle est prise en compte * Les valeurs de ventilation_post_2012 n'étant pas toujours utilisées de la même manière * dans tous les DPEs (parfois 0 = 'Oui', d'autres 0 = 'Non') */ if (de.ficheTechniqueVentilationPost2012 && de.ventilation_post_2012 === 0) { console.error( `La valeur de la variable ventilation_post_2012 ne correspond pas à celle présente dans la fiche technique "${de.ficheTechniqueVentilationPost2012.description}". La valeur de la fiche technique est prise en compte.` ); de.ventilation_post_2012 = 1; } calc_hperm(di, surface_ventile, Hsp, Sdep, pfe); calc_pvent(di, de, du, th); delete di.qvarep_conv; delete di.qvasouf_conv; delete di.smea_conv; vt.donnee_intermediaire = di; vt.donnee_utilisateur = du; }