UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

329 lines (280 loc) 12.7 kB
import enums from './enums.js'; import { mois_liste, tv } from './utils.js'; import tvs from './tv.js'; export class ProductionENR { #taplpi = { chauffage: 0.02, ecs: 0.05, refroidissement: 0.25, eclairage: 0.05, auxiliaire_ventilation: 0.5, auxiliaire_distribution: 0.05, autres: 0.45 }; /** * Calcul des consommations d'électricité auto-consommée par enveloppe * Mise à jour des conso ef en prenant en compte ces auto-consommations * @param productionElecEnr * @param Sh {string} */ calculateEnr(productionElecEnr, conso, Sh, th, zc_id) { const productionElectricite = { conso_elec_ac: 0, production_pv: 0, conso_elec_ac_ch: 0, conso_elec_ac_auxiliaire_generation_ch: 0, conso_elec_ac_ecs: 0, conso_elec_ac_auxiliaire_generation_ecs: 0, conso_elec_ac_fr: 0, conso_elec_ac_ventilation: 0, conso_elec_ac_eclairage: 0, conso_elec_ac_auxiliaire_distribution_ecs: 0, conso_elec_ac_auxiliaire_distribution_ch: 0, conso_elec_ac_auxiliaire: 0, conso_elec_ac_autre_usage: 0 }; if (productionElecEnr && productionElecEnr.donnee_entree?.presence_production_pv === 1) { // Calcul de l'électricité auto-consommée pour chaque enveloppe this.calculateConsoElecAc(productionElectricite, productionElecEnr, conso, zc_id, th, Sh); // Mise à jour des consommations ef en minorant l'énergie consommée par l'énergie autoconsommée par le poste this.updateEfConso(productionElectricite, conso, Sh); } return { production_pv: productionElectricite.production_pv, conso_elec_ac: productionElectricite.conso_elec_ac, conso_elec_ac_ch: productionElectricite.conso_elec_ac_ch, conso_elec_ac_ecs: productionElectricite.conso_elec_ac_ecs, conso_elec_ac_fr: productionElectricite.conso_elec_ac_fr, conso_elec_ac_eclairage: productionElectricite.conso_elec_ac_eclairage, conso_elec_ac_auxiliaire: productionElectricite.conso_elec_ac_auxiliaire, conso_elec_ac_autre_usage: productionElectricite.conso_elec_ac_autre_usage }; } /** * Calcul de l'électricité auto-consommée pour chaque enveloppe * @param productionElectricite production ENR totale du logement * @param productionElecEnr installation ENR * @param conso * @param zc_id * @param th * @param Sh */ calculateConsoElecAc(productionElectricite, productionElecEnr, conso, zc_id, th, Sh) { // Production d’électricité par des capteurs photovoltaïques Ppv (en kWh/m²) const Ppv = this.getPpv(productionElecEnr, zc_id); // Consommation annuelle d’électricité pour les autres usages (kWhef/an) const CelecTotAu = this.getCelecAu(th, Sh); /** * Récupération des consommations électriques pour ch et ecs * @type {SortieParEnergieItem} */ let consoElec = conso.sortie_par_energie_collection.sortie_par_energie.find( (sortie) => sortie.enum_type_energie_id === '1' ); /** * Consommation totale annuelle d’électricité pour les 5 usages réglementaires et les usages mobiliers (kWhef/an) */ const Celec_tot = consoElec.conso_5_usages + CelecTotAu; // Autoconsommation proratisée à chaque usage const production = this.getTapl(conso.ef_conso, consoElec, CelecTotAu, Celec_tot); /** * Coefficient de calage représentant le taux d’auto-production maximum pouvant être atteint lorsque * la production d’électricité renouvelable augmente */ const Tapl = Object.values(production).reduce((acc, valeur) => acc + valeur, 0); /** * Taux de couverture, correspondant au ratio entre la production totale du site et la consommation * annuelle tous usages (%) */ const Tcv = Ppv / Celec_tot; /** * Taux d’autoproduction, correspondant au rapport entre la production d’électricité autoconsommée et la * consommation d’énergie (tous usages) du bâtiment (%) */ const Tap = 1 / (1 / Tcv + 1 / Tapl); // Electricité photovoltaïque autoconsommée (kWhef/an) const consoElecAc = Celec_tot * Tap; // Mise à jour des données intermédiaires pour l'installation ENR productionElecEnr.donnee_intermediaire = productionElecEnr.donnee_intermediaire ? productionElecEnr.donnee_intermediaire : {}; productionElecEnr.donnee_intermediaire.conso_elec_ac = consoElecAc; productionElecEnr.donnee_intermediaire.taux_autoproduction = Tap; productionElecEnr.donnee_intermediaire.production_pv = Ppv; productionElectricite.conso_elec_ac = consoElecAc; productionElectricite.production_pv = Ppv; productionElectricite.conso_elec_ac_ch = (consoElecAc * production.conso_elec_ac_ch) / Tapl; productionElectricite.conso_elec_ac_auxiliaire_generation_ch = (consoElecAc * production.conso_elec_ac_auxiliaire_generation_ch) / Tapl; productionElectricite.conso_elec_ac_ecs = (consoElecAc * production.conso_elec_ac_ecs) / Tapl; productionElectricite.conso_elec_ac_auxiliaire_generation_ecs = (consoElecAc * production.conso_elec_ac_auxiliaire_generation_ecs) / Tapl; productionElectricite.conso_elec_ac_fr = (consoElecAc * production.conso_elec_ac_fr) / Tapl; productionElectricite.conso_elec_ac_eclairage = (consoElecAc * production.conso_elec_ac_eclairage) / Tapl; productionElectricite.conso_elec_ac_ventilation = (consoElecAc * production.conso_elec_ac_ventilation) / Tapl; productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs = (consoElecAc * production.conso_elec_ac_auxiliaire_distribution_ecs) / Tapl; productionElectricite.conso_elec_ac_auxiliaire_distribution_ch = (consoElecAc * production.conso_elec_ac_auxiliaire_distribution_ch) / Tapl; productionElectricite.conso_elec_ac_autre_usage = CelecTotAu * production.conso_elec_ac_autre_usage; // Energies autoconsommée par les auxiliaires const consoAcAuxiliaires = productionElectricite.conso_elec_ac_auxiliaire_generation_ch + productionElectricite.conso_elec_ac_auxiliaire_generation_ecs + productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs + productionElectricite.conso_elec_ac_auxiliaire_distribution_ch + productionElectricite.conso_elec_ac_ventilation; productionElectricite.conso_elec_ac_auxiliaire = consoAcAuxiliaires; } /** * Mise à jour des consommations ef en minorant l'énergie consommée par l'énergie autoconsommée par chaque enveloppe * @param productionElectricite * @param conso * @param Sh */ updateEfConso(productionElectricite, conso, Sh) { conso.ef_conso.conso_ecs -= productionElectricite.conso_elec_ac_ecs; conso.ef_conso.conso_ch -= productionElectricite.conso_elec_ac_ch; conso.ef_conso.conso_fr -= productionElectricite.conso_elec_ac_fr; conso.ef_conso.conso_eclairage -= productionElectricite.conso_elec_ac_eclairage; conso.ef_conso.conso_totale_auxiliaire -= productionElectricite.conso_elec_ac_auxiliaire; conso.ef_conso.conso_5_usages -= productionElectricite.conso_elec_ac_ecs + productionElectricite.conso_elec_ac_ch + productionElectricite.conso_elec_ac_fr + productionElectricite.conso_elec_ac_eclairage + productionElectricite.conso_elec_ac_auxiliaire; conso.ef_conso.conso_5_usages_m2 = Math.floor(conso.ef_conso.conso_5_usages / Sh); } /** * Calcul des taux d'autoproduction consommés pour chaque enveloppe * @param efConso {Ef_conso} * @param consoElec * @param ccom {number} * @param consoElecTotale {number} */ getTapl(efConso, consoElec, ccom, consoElecTotale) { const productionElectricite = { conso_elec_ac_ch: 0, conso_elec_ac_auxiliaire_generation_ch: 0, conso_elec_ac_ecs: 0, conso_elec_ac_auxiliaire_generation_ecs: 0, conso_elec_ac_fr: 0, conso_elec_ac_ventilation: 0, conso_elec_ac_eclairage: 0, conso_elec_ac_auxiliaire_distribution_ecs: 0, conso_elec_ac_auxiliaire_distribution_ch: 0, conso_elec_ac_autre_usage: 0 }; // Consommation de chauffage récupérée directement depuis les consommations par énergie "électricité" const chauffage = consoElec?.conso_ch; if (chauffage) { productionElectricite.conso_elec_ac_ch = (this.#taplpi.chauffage * chauffage) / consoElecTotale; } const auxiliaireGenerationCh = efConso.conso_auxiliaire_generation_ch; if (auxiliaireGenerationCh) { productionElectricite.conso_elec_ac_auxiliaire_generation_ch = (this.#taplpi.chauffage * auxiliaireGenerationCh) / consoElecTotale; } // Consommation ECS récupérée directement depuis les consommations par énergie "électricité" const ecs = consoElec?.conso_ecs; if (ecs) { productionElectricite.conso_elec_ac_ecs = (this.#taplpi.ecs * ecs) / consoElecTotale; } const auxiliaireGenerationEcs = efConso.conso_auxiliaire_generation_ecs; if (auxiliaireGenerationEcs) { productionElectricite.conso_elec_ac_auxiliaire_generation_ecs = (this.#taplpi.ecs * auxiliaireGenerationEcs) / consoElecTotale; } const refroidissement = efConso.conso_fr; if (refroidissement) { productionElectricite.conso_elec_ac_fr = (this.#taplpi.refroidissement * refroidissement) / consoElecTotale; } const eclairage = efConso.conso_eclairage; if (eclairage) { productionElectricite.conso_elec_ac_eclairage = (this.#taplpi.eclairage * eclairage) / consoElecTotale; } const auxiliaireVentilation = efConso.conso_auxiliaire_ventilation; if (auxiliaireVentilation) { productionElectricite.conso_elec_ac_ventilation = (this.#taplpi.auxiliaire_ventilation * auxiliaireVentilation) / consoElecTotale; } const auxiliaireDistributionEcs = efConso.conso_auxiliaire_distribution_ecs; if (auxiliaireDistributionEcs) { productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs = (this.#taplpi.auxiliaire_distribution * auxiliaireDistributionEcs) / consoElecTotale; } const auxiliaireDistributionCh = efConso.conso_auxiliaire_distribution_ch; if (auxiliaireDistributionCh) { productionElectricite.conso_elec_ac_auxiliaire_distribution_ch = (this.#taplpi.auxiliaire_distribution * auxiliaireDistributionCh) / consoElecTotale; } productionElectricite.conso_elec_ac_autre_usage = (this.#taplpi.autres * ccom) / consoElecTotale; return productionElectricite; } /** * Consommation annuelle d’électricité pour "autres usages" (kWhef/an) * @param th * @param Sh * @returns {number} */ getCelecAu(th, Sh) { /** * Cum : consommation annuelle d’électricité des usages mobiliers * Maison individuelle 29 * Immeuble collectif 27 */ const Cum = th === 'maison' ? 29 : 27; // Consommation annuelle d’éclairage des parties communes en logement collectif const CcomEcl = th === 'maison' ? 0 : 1.1; return (CcomEcl + Cum) * Sh; } /** * Production d’électricité par l'ensemble des capteurs photovoltaïques Ppv (en kWh/m²) * * @param productionElecEnr * @param zc_id * @returns {number} */ getPpv(productionElecEnr, zc_id) { const ePvValues = tvs.e_pv; const zc = enums.zone_climatique[zc_id]; let panneaux_pv_collection = productionElecEnr.panneaux_pv_collection?.panneaux_pv || []; if (!Array.isArray(panneaux_pv_collection)) { panneaux_pv_collection = [panneaux_pv_collection]; } return panneaux_pv_collection.reduce((acc, panneaux_pv) => { const row = tv('coef_orientation_pv', { enum_orientation_pv_id: panneaux_pv.enum_orientation_pv_id, enum_inclinaison_pv_id: panneaux_pv.enum_inclinaison_pv_id }); if (!row) { return acc; } /** * Coefficient de pondération prenant en compte l’altération par rapport à l’orientation optimale (30° auSud) * des panneaux photovoltaïques */ const k = row.coef_orientation_pv; // Surface des panneaux photovoltaïques orientés et inclinés de la même manière (m²) const Scapteur = 1.6 * panneaux_pv.nombre_module || panneaux_pv.surface_totale_capteurs; // Rendement moyen des modules const r = 0.17; // Coefficient de perte const C = 0.86; for (const mois of mois_liste) { // Ensoleillement en kWh/m² pour le mois const Epv = ePvValues[mois][zc]; acc += k * Scapteur * r * Epv * C; } return acc; }, 0); } }