@open3cl/engine
Version:
Open Source 3CL-DPE engine
176 lines (145 loc) • 5.71 kB
JavaScript
import { inject } from 'dioma';
import { ContexteBuilder } from './contexte.builder.js';
import { DeperditionEnveloppeService } from './enveloppe/deperdition-enveloppe.service.js';
import { logger } from '../../../core/util/logger/log-service.js';
import { ApportEtBesoinService } from './apport_et_besoin/apport-et-besoin.service.js';
import { ConsoService } from './conso/conso.service.js';
export class EngineService {
/**
* @type {DeperditionEnveloppeService}
*/
#deperditionService;
/**
* @type {ApportEtBesoinService}
*/
#apportEtBesoinService;
/**
* @type {ConsoService}
*/
#consoService;
/**
* @type {ContexteBuilder}
*/
#contextBuilder;
/**
* @param deperditionService {DeperditionEnveloppeService}
* @param apportEtBesoinService {ApportEtBesoinService}
* @param consoService {ConsoService}
* @param contextBuilder {ContexteBuilder}
*/
constructor(
deperditionService = inject(DeperditionEnveloppeService),
apportEtBesoinService = inject(ApportEtBesoinService),
consoService = inject(ConsoService),
contextBuilder = inject(ContexteBuilder)
) {
this.#deperditionService = deperditionService;
this.#apportEtBesoinService = apportEtBesoinService;
this.#consoService = consoService;
this.#contextBuilder = contextBuilder;
}
/**
* Applique la méthode 3CL à l'entrée du DPE
* @param dpe {Dpe}
* @return {Dpe} Nouveau DPE avec les données intermédiaires et les sorties calculées
*/
execute(dpe) {
/** @type {Dpe} */
const proceededDpe = this.#removeComputedData(JSON.parse(JSON.stringify(dpe)));
logger.info(`Process DPE ${proceededDpe.numero_dpe}`);
proceededDpe.logement.sortie = {
deperdition: undefined,
apport_et_besoin: undefined,
ef_conso: undefined,
ep_conso: undefined,
emission_ges: undefined,
cout: undefined,
production_electricite: undefined,
sortie_par_energie_collection: undefined,
confort_ete: undefined,
qualite_isolation: undefined
};
proceededDpe.logement.donnees_de_calcul = {
apportsInterne: [],
apportsInterneDepensier: [],
apportsInterneCh: [],
apportsSolaire: [],
besoinChauffageHP: [],
besoinChauffageDepensierHP: []
};
const ctx = this.#contextBuilder.fromDpe(proceededDpe);
// Calcul de l'inertie
// Calcul des déperditions
proceededDpe.logement.sortie.deperdition = this.#deperditionService.deperditions(
ctx,
proceededDpe.logement
);
proceededDpe.logement.sortie.apport_et_besoin = this.#apportEtBesoinService.execute(
ctx,
proceededDpe.logement
);
// Calcul des déperditions par renouvellement de l'air
// Calcul de l'intermittence
// Calcul des apports gratuit
// Calcul des besoins de chauffage
// Calcul des rendements des installations
// Calcul des rendements des générations
// Calcul des rendements des générateurs ECS
// Calcul des consommations chauffage
// Calcul des consommations de froid
this.#consoService.execute(ctx, proceededDpe.logement);
// Calcul des consommations ECS
// Calcul des consommations d'auxiliaires des installations de chauffage et ECS
// Calcul des consommations d'auxiliaires de ventilation
// Calcul des consommations éclairage et production d'électricités
// Calcul du DPE dans le collectif
delete proceededDpe.logement.donnees_de_calcul;
return proceededDpe;
}
/**
* Supprime toutes les données calculées d'un DPE
* Utilisé en particulier pour les DPE déjà existant.
* @param dpe {Dpe}
* @return {Dpe} DPE sans les données intermédiaires et les sorties calculées
*/
#removeComputedData(dpe) {
delete dpe.logement.sortie;
dpe.logement.enveloppe.mur_collection.mur?.map((m) => delete m.donnee_intermediaire);
dpe.logement.enveloppe.baie_vitree_collection.baie_vitree?.map((m) => {
delete m.baie_vitree_double_fenetre?.donnee_intermediaire;
delete m.donnee_intermediaire;
});
delete dpe.logement.enveloppe.ets_collection.ets?.donnee_intermediaire;
dpe.logement.enveloppe.plancher_bas_collection.plancher_bas?.map(
(m) => delete m.donnee_intermediaire
);
dpe.logement.enveloppe.plancher_haut_collection.plancher_haut?.map(
(m) => delete m.donnee_intermediaire
);
dpe.logement.enveloppe.pont_thermique_collection.pont_thermique?.map(
(m) => delete m.donnee_intermediaire
);
dpe.logement.enveloppe.porte_collection.porte?.map((m) => delete m.donnee_intermediaire);
dpe.logement.climatisation_collection.climatisation?.map((m) => delete m.donnee_intermediaire);
dpe.logement.ventilation_collection.ventilation?.map((m) => delete m.donnee_intermediaire);
dpe.logement.ventilation_collection.ventilation?.map((m) => delete m.donnee_intermediaire);
dpe.logement.installation_ecs_collection.installation_ecs?.map((m) => {
m.generateur_ecs_collection.generateur_ecs?.map((n) => {
delete n.donnee_intermediaire;
});
delete m.donnee_intermediaire;
});
dpe.logement.installation_chauffage_collection.installation_chauffage?.map((m) => {
m.emetteur_chauffage_collection.emetteur_chauffage?.map((n) => {
delete n.donnee_intermediaire;
});
// @todo calculer les données intermédiaires (notamment pn et qp0)
/*m.generateur_chauffage_collection.generateur_chauffage?.map((n) => {
delete n.donnee_intermediaire;
});*/
delete m.donnee_intermediaire;
});
delete dpe.logement.production_elec_enr?.donnee_intermediaire;
return dpe;
}
}