@open3cl/engine
Version: 
Open Source 3CL-DPE engine
220 lines (186 loc) • 7.8 kB
JavaScript
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;
}