UNPKG

@jzck/open3cl

Version:

Open Source 3CL-DPE engine

258 lines (223 loc) 9.98 kB
import enums from './enums.js'; import tvs from './tv.js'; import { mois_liste, Tbase } from './utils.js'; const G_CHAUDIERE = 20; const G_RADIATEURS_GAZ = 40; const G_CHAUDIERE_BOIS = 73.3; const H_CHAUDIERE = 1.6; const H_GENERATEUR_AIR_CHAUD = 4; const H_CHAUDIERE_BOIS = 10.5; /** * 15.1 Consommation des auxiliaires de génération * @param di {Donnee_intermediaire} * @param de {Donnee_entree} * @param type {'ecs'|'ch'} * @param besoin {number} Besoin en chauffage ou ecs pour ce générateur * @param besoin_dep {number} Besoin en chauffage ou ecs pour ce générateur (mode dépensier) * @param Sh {number} Surface habitable du logement */ export function conso_aux_gen(di, de, type, besoin, besoin_dep, Sh) { const typeGenerateur = parseInt(de[`enum_type_generateur_${type}_id`]); const presenceVentilateur = de.presenceVentilateur || 0; const g = getG(type, typeGenerateur, presenceVentilateur === 1); const h = getH(type, typeGenerateur, presenceVentilateur === 1); let pe = di.pn / (de.ratio_virtualisation || 1); // Pour les chaudières gaz ou fioul : si Pn > 400 kW alors Pn = 400 kW if (g === G_CHAUDIERE && pe > 400000) { pe = 400000; } // Pour les générateurs d’air chaud : si Pn > 300 kW alors Pn = 300 kW if (h === H_GENERATEUR_AIR_CHAUD && pe > 300000) { pe = 300000; } // Pour les chaudières bois : si Pn > 70 kW alors Pn = 70 kW if (g === G_CHAUDIERE_BOIS && pe > 70000) { pe = 70000; } const Paux_g_ch = g + (h * (pe / 1000)) / (de.ratio_virtualisation || 1); let ratio = 1; // Pour le chauffage, le besoin de chauffage est proratisé à la surface chauffée if (type === 'ch') { const Sc = de.surface_chauffee || Sh; ratio = Sc / Sh; } di[`conso_auxiliaire_generation_${type}`] = ((de.ratio_virtualisation || 1) * (Paux_g_ch * besoin * ratio)) / pe || 0; di[`conso_auxiliaire_generation_${type}_depensier`] = (Paux_g_ch * besoin_dep * ratio) / di.pn || 0; } /** * Récupération du facteur G en fonction du type de générateur * @param type {'ecs'|'ch'} * @param id {number} * @param presenceVentilateur {boolean} - Seules les chaudières bois assistées par ventilateur sont concernées */ function getG(type, id, presenceVentilateur) { const values = { ch: [ { min: 85, max: 97, value: G_CHAUDIERE }, // Chaudières à gaz { min: 148, max: 149, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gaz { min: 127, max: 139, value: G_CHAUDIERE }, // Chaudière gpl/propane/butane { min: 160, max: 161, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane { min: 75, max: 84, value: G_CHAUDIERE }, // Chaudières fioul { min: 150, max: 151, value: G_CHAUDIERE }, // PAC hybride : partie chaudière fioul { min: 53, max: 54, value: G_RADIATEURS_GAZ }, // Radiateur à gaz { min: 55, max: 74, value: G_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur { min: 152, max: 156, value: G_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois ], ecs: [ { min: 45, max: 57, value: G_CHAUDIERE }, // Chaudières à gaz { min: 120, max: 121, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gaz { min: 92, max: 104, value: G_CHAUDIERE }, // Chaudière gpl/propane/butane { min: 132, max: 133, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane { min: 35, max: 44, value: G_CHAUDIERE }, // Chaudières fioul { min: 122, max: 123, value: G_CHAUDIERE }, // PAC hybride : partie chaudière fioul { min: 13, max: 34, value: G_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur { min: 122, max: 123, value: G_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois ] }; return getFacteur(values, type, id, presenceVentilateur); } /** * Récupération du facteur H en fonction du type de générateur * @param type {'ecs'|'ch'} * @param id {number} * @param presenceVentilateur {boolean} - Seules les chaudières bois assistées par ventilateur sont concernées */ function getH(type, id, presenceVentilateur) { const values = { ch: [ { min: 85, max: 97, value: H_CHAUDIERE }, // Chaudières à gaz { min: 148, max: 149, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gaz { min: 127, max: 139, value: H_CHAUDIERE }, // Chaudière gpl/propane/butane { min: 160, max: 161, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane { min: 75, max: 84, value: H_CHAUDIERE }, // Chaudières fioul { min: 150, max: 151, value: H_CHAUDIERE }, // PAC hybride : partie chaudière fioul { min: 50, max: 52, value: H_GENERATEUR_AIR_CHAUD }, // Générateurs à air chaud { min: 55, max: 74, value: H_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur { min: 152, max: 156, value: H_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois ], ecs: [ { min: 45, max: 57, value: H_CHAUDIERE }, // Chaudières à gaz { min: 120, max: 121, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gaz { min: 92, max: 104, value: H_CHAUDIERE }, // Chaudière gpl/propane/butane { min: 132, max: 133, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane { min: 35, max: 44, value: H_CHAUDIERE }, // Chaudières fioul { min: 122, max: 123, value: H_CHAUDIERE }, // PAC hybride : partie chaudière fioul { min: 13, max: 34, value: H_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur { min: 122, max: 123, value: H_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois ] }; return getFacteur(values, type, id, presenceVentilateur); } function getFacteur(values, type, id, presenceVentilateur) { const ranges = values[type] || []; for (const range of ranges) { if (id >= range.min && id <= range.max) { if (!range.withVentilateur || presenceVentilateur) { return range.value; } } } return 0; } /** * Calcul de la consommation des auxiliaires de distribution de chauffage * @param em_ch { EmetteurChauffageItem[]} * @param de {Donnee_entree} donnée du générateur de chauffage * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage * @param du {object} donnée utilisateur du générateur de chauffage * @param surfaceHabitable {number} * @param zcId {number} id de la zone climatique du bien * @param caId {number} id de la classe d'altitude du bien * @param ilpa {number} 1 si bien à inertie lourde, 0 sinon * @param GV {number} déperdition de l'enveloppe */ export function conso_aux_distribution_ch( em_ch, de, di, du, surfaceHabitable, zcId, caId, ilpa, GV ) { const ca = enums.classe_altitude[caId]; const zc = enums.zone_climatique[zcId]; const Nref19 = tvs.nref19[ilpa]; let nref19 = 0; for (const mois of mois_liste) { nref19 += Nref19[ca][mois][zc]; } const Pcircem19 = getPuissanceCirculateur( em_ch, de, di, du, surfaceHabitable, GV, Tbase[ca][zc.slice(0, 2)] ); di[`conso_auxiliaire_distribution_ch`] = (Pcircem19 * nref19) / 1000; } /** * 15.2.1 Puissance des circulateurs de chauffage * @param em_ch { EmetteurChauffageItem[]} * @param de {Donnee_entree} donnée du générateur de chauffage * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage * @param du {object} donnée utilisateur du générateur de chauffage * @param surfaceHabitable {number} * @param GV {number} déperdition de l'enveloppe * @param Tbase {number} température */ function getPuissanceCirculateur(em_ch, de, di, du, surfaceHabitable, GV, Tbase) { const typeEmetteur = parseInt(em_ch[0].donnee_entree.enum_type_emission_distribution_id); const temperatureEmetteur = parseInt(em_ch[0].donnee_entree.enum_temp_distribution_ch_id); // Perte de charge de l’émetteur let deltaPem = 35; let Fcot = 0.802; /** * 15.2.1 Puissance des circulateurs de chauffage * Plancher/plafond chauffant => deltaPemnom = 15 * Radiateurs monotube => deltaPemnom = 30 * Radiateurs autres => deltaPemnom = 10 */ if ([6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 43, 44].includes(typeEmetteur)) { deltaPem = 15; Fcot = 0.156; } else if ([24, 25, 26, 27, 28, 29, 30, 31].includes(typeEmetteur)) { deltaPem = 30; } else if ([10, 19, 32, 33, 34, 35, 36, 37, 38, 39, 45].includes(typeEmetteur)) { deltaPem = 10; } /** * En présence de plusieurs types d’émetteurs, le coefficient Fcot le plus défavorable sera pris, c’est-à-dire pour * l’émetteur « Autre ». */ if (em_ch.length > 1) { Fcot = 0.802; } const nbNiveauChauffage = de.nombre_niveau_installation_ch || 1; // Calcul de la longueur du réseau le plus défavorisé const Lem = 5 * Fcot * (nbNiveauChauffage + (surfaceHabitable / nbNiveauChauffage) ** 0.5); // Pertes de charge du réseau (kPa) const deltaPemnom = 0.15 * Lem + deltaPem; // Ratio du besoin couvert par l’équipement const nbGenerateurCascade = du.nbGenerateurCascade || 1; const ratioSurfaceChauffage = (de.surface_chauffee || surfaceHabitable) / (surfaceHabitable * nbGenerateurCascade); // Chute nominale de température de dimensionnement // 4 - température de distribution de chauffage haute const deltaDim = temperatureEmetteur === 4 ? 15 : 7.5; // Puissance nominale en chaud (kW) const Pnc = 10 ** -3 * GV * (20 - Tbase); const Qvemnom = (Pnc * ratioSurfaceChauffage) / (1.163 * deltaDim); return Math.max( 30, 6.44 * ((deltaPemnom * Qvemnom) / Math.max(1, surfaceHabitable / 400)) ** 0.676 * Math.max(1, surfaceHabitable / 400) ); }