Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ Il existe actuellement 8 corpus (avec 10000 dpe analysés dans chaque corpus) :
Par défaut, le corpus utilisé est présent ici : [test/corpus/corpus_dpe.csv](test/corpus/files/corpus_dpe.csv)
- `npm run test:corpus -- dpes-folder-path=/home/user/dpes`. Chemin vers le dossier ou les DPE seront téléchargés. Si un
fichier DPE est déjà présent dans ce dossier, il ne sera pas retéléchargé.
- `npm run test:corpus -- dpes-code=2592E1233185X`. Execution du corpus sur le dpe spécifié.
- Si le dpe n'est pas présent en local, il sera téléchargé sur le site de l'ADEME.

### Résultats corpus

Expand Down
2 changes: 1 addition & 1 deletion dist/reports/corpus/corpus_list_main.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
"dpe_appartement_individuel_chauffage_individuel_2025.csv",
"dpe_appartement_individuel_chauffage_collectif_2025.csv"
],
"branches": ["main", "issue_23"]
"branches": ["main", "fix_issue_132"]
}
2 changes: 0 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,3 @@ import {
getVersion
} from './src/index.js';
export { calcul_3cl, get_classe_ges_dpe, get_conso_coeff_1_9_2026, getVersion };
import { Umur, Uph, Upb, Uporte, Ubv, Upt, calc_deperdition } from './src/3_deperdition.js';
export { Umur, Uph, Upb, Uporte, Ubv, Upt, calc_deperdition };
67 changes: 46 additions & 21 deletions src/16.2_production_enr.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import enums from './enums.js';
import { mois_liste, tv } from './utils.js';
import tvs from './tv.js';
import { COEFF_EP, PREVIOUS_COEFF_EP } from './conso.js';

export class ProductionENR {
#taplpi = {
Expand All @@ -19,7 +20,7 @@ export class ProductionENR {
* @param productionElecEnr
* @param Sh {string}
*/
calculateEnr(productionElecEnr, conso, Sh, th, zc_id) {
calculateEnr(productionElecEnr, conso, Sh, th, zc_id, use_previous_coeff_ch_elec) {
const productionElectricite = {
conso_elec_ac: 0,
production_pv: 0,
Expand All @@ -44,7 +45,7 @@ export class ProductionENR {
this.updateEfConso(productionElectricite, conso, Sh);

// Mise à jour des consommations d'énergie primaire en minorant l'énergie consommée par l'énergie autoconsommée par le poste
this.updateEPConso(productionElectricite, conso, Sh);
this.updateEPConso(productionElectricite, conso, Sh, use_previous_coeff_ch_elec);
}

return {
Expand Down Expand Up @@ -179,26 +180,50 @@ export class ProductionENR {
* Mise à jour des consommations ef en minorant l'énergie primaire consommée par l'énergie autoconsommée par chaque enveloppe
* @param productionElectricite
* @param conso {{ep_conso: Ep_conso}}
* @param Sh
* @param Sh {number}
* @param use_previous_coeff_ch_elec {boolean} "true" pour ne pas utiliser le dernier coeff de chauffage électrique
*/
updateEPConso(productionElectricite, conso, Sh) {
conso.ep_conso.ep_conso_ecs -= 2.3 * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= 2.3 * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= 2.3 * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_eclairage -= 2.3 * productionElectricite.conso_elec_ac_eclairage;
conso.ep_conso.ep_conso_totale_auxiliaire -=
2.3 * productionElectricite.conso_elec_ac_auxiliaire;

const conso_elec =
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.ep_conso.ep_conso_5_usages -= 2.3 * conso_elec;

conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
updateEPConso(productionElectricite, conso, Sh, use_previous_coeff_ch_elec) {
if (use_previous_coeff_ch_elec) {
conso.ep_conso.ep_conso_ecs -= PREVIOUS_COEFF_EP * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= PREVIOUS_COEFF_EP * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= PREVIOUS_COEFF_EP * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_eclairage -=
PREVIOUS_COEFF_EP * productionElectricite.conso_elec_ac_eclairage;
conso.ep_conso.ep_conso_totale_auxiliaire -=
PREVIOUS_COEFF_EP * productionElectricite.conso_elec_ac_auxiliaire;

const conso_elec =
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.ep_conso.previous_ep_conso_5_usages -= PREVIOUS_COEFF_EP * conso_elec;

conso.ep_conso.previous_ep_conso_5_usages_m2 = Math.floor(
conso.ep_conso.previous_ep_conso_5_usages / Sh
);
} else {
conso.ep_conso.ep_conso_ecs -= COEFF_EP * productionElectricite.conso_elec_ac_ecs;
conso.ep_conso.ep_conso_ch -= COEFF_EP * productionElectricite.conso_elec_ac_ch;
conso.ep_conso.ep_conso_fr -= COEFF_EP * productionElectricite.conso_elec_ac_fr;
conso.ep_conso.ep_conso_eclairage -= COEFF_EP * productionElectricite.conso_elec_ac_eclairage;
conso.ep_conso.ep_conso_totale_auxiliaire -=
COEFF_EP * productionElectricite.conso_elec_ac_auxiliaire;

const conso_elec =
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.ep_conso.ep_conso_5_usages -= COEFF_EP * conso_elec;

conso.ep_conso.ep_conso_5_usages_m2 = Math.floor(conso.ep_conso.ep_conso_5_usages / Sh);
}
}

/**
Expand Down
49 changes: 36 additions & 13 deletions src/conso.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,36 @@ import calc_conso_eclairage from './16_conso_eclairage.js';
import tvs from './tv.js';
import { tv } from './utils.js';

const coef_ep = {
'électricité ch': 2.3,
'électricité ecs': 2.3,
'électricité fr': 2.3,
'électricité éclairage': 2.3,
'électricité auxiliaire': 2.3
export const PREVIOUS_COEFF_EP = 2.3;
export const COEFF_EP = 1.9;

/**
* Coeff de chauffage 1.9 au 01/01/2026
* @link {https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052134589}
*/
export const coef_ep = {
'électricité ch': COEFF_EP,
'électricité ecs': COEFF_EP,
'électricité fr': COEFF_EP,
'électricité éclairage': COEFF_EP,
'électricité auxiliaire': COEFF_EP
};

// 31 mars 2021
// https://www.legifrance.gouv.fr/download/pdf?id=doxMrRr0wbfJVvtWjfDP4gHzzERt1iX0PtobthCE6A0=
/**
* Coeff de chauffage 2.3 avant le 01/01/2026
*/
export const coef_ep_2_3 = {
'électricité ch': PREVIOUS_COEFF_EP,
'électricité ecs': PREVIOUS_COEFF_EP,
'électricité fr': PREVIOUS_COEFF_EP,
'électricité éclairage': PREVIOUS_COEFF_EP,
'électricité auxiliaire': PREVIOUS_COEFF_EP
};

/**
* Au 31 mars 2021
* @link {https://www.legifrance.gouv.fr/download/pdf?id=doxMrRr0wbfJVvtWjfDP4gHzzERt1iX0PtobthCE6A0=}
*/
const coef_ges = {
'bois – bûches': 0.03,
'bois – granulés (pellets) ou briquettes': 0.03,
Expand All @@ -32,8 +52,11 @@ const coef_ges = {
'électricité auxiliaire': 0.064
};

// annexe 7
// https://www.legifrance.gouv.fr/download/file/doxMrRr0wbfJVvtWjfDP4qE7zNsiFZL-4wqNyqoY-CA=/JOE_TEXTE
/**
* Annexe 7
* @link {https://www.legifrance.gouv.fr/download/file/doxMrRr0wbfJVvtWjfDP4qE7zNsiFZL-4wqNyqoY-CA=/JOE_TEXTE}
* @link {https://www.legifrance.gouv.fr/download/pdf?id=7hpbVyq228foxHzNM7WleDImAyXlPNb9zULelSY01V8=}
*/
const coef_cout = {
'fioul domestique': 0.09142,
'réseau de chauffage urbain': 0.0787,
Expand All @@ -44,7 +67,6 @@ const coef_cout = {
'bois – bûches': 0.03201,
'bois – plaquettes forestières': 0.03201,
'bois – plaquettes d’industrie': 0.03201,
// https://www.legifrance.gouv.fr/download/pdf?id=7hpbVyq228foxHzNM7WleDImAyXlPNb9zULelSY01V8=
'gaz naturel': cout_gaz_naturel,
"électricité d'origine renouvelable utilisée dans le bâtiment": cout_electricite,
'électricité ch': cout_electricite,
Expand Down Expand Up @@ -161,7 +183,8 @@ export default function calc_conso(
fr,
prorataECS,
prorataChauffage,
dateDpe
dateDpe,
coeffEp
) {
const gen_ch = ch.reduce((acc, ch) => {
const generateur_chauffage = ch.generateur_chauffage_collection.generateur_chauffage;
Expand Down Expand Up @@ -217,7 +240,7 @@ export default function calc_conso(
gen_ecs,
fr,
'ep_conso',
coef_ep,
coeffEp,
prorataECS,
prorataChauffage
),
Expand Down
56 changes: 46 additions & 10 deletions src/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import calc_besoin_ch from './9_besoin_ch.js';
import calc_chauffage, { tauxChargeForGenerator } from './9_chauffage.js';
import calc_confort_ete from './2021_04_13_confort_ete.js';
import calc_qualite_isolation from './2021_04_13_qualite_isolation.js';
import calc_conso, { classe_bilan_dpe, classe_emission_ges } from './conso.js';
import calc_conso, {
classe_bilan_dpe,
classe_emission_ges,
coef_ep,
coef_ep_2_3
} from './conso.js';
import {
add_references,
bug_for_bug_compat,
Expand Down Expand Up @@ -38,6 +43,10 @@ export function getVersion() {
return LIB_VERSION;
}

/**
* @param dpe {FullDpe}
* @return {FullDpe}
*/
export function calcul_3cl(dpe) {
sanitize_dpe(dpe);
const modele = enums.modele_dpe[dpe.administratif.enum_modele_dpe_id];
Expand Down Expand Up @@ -507,17 +516,35 @@ export function calcul_3cl(dpe) {
clim,
prorataECS,
prorataChauffage,
dateDpe
dateDpe,
coef_ep
);

const production_electricite = productionENR.calculateEnr(
dpe.logement.production_elec_enr,
conso,
Sh,
th,
zc_id
zc_id,
false
);

const conso2_3 = calc_conso(
Sh,
zc_id,
ca_id,
vt_list,
instal_ch,
ecs,
clim,
prorataECS,
prorataChauffage,
dateDpe,
coef_ep_2_3
);

productionENR.calculateEnr(dpe.logement.production_elec_enr, conso2_3, Sh, th, zc_id, true);

// get all baie_vitree orientations
const ph_list = env.plancher_haut_collection.plancher_haut || [];
logement.sortie = {
Expand All @@ -529,8 +556,17 @@ export function calcul_3cl(dpe) {
...conso
};

const conso_coeff_1_9 = get_conso_coeff_1_9_2026(dpe);
logement.sortie.ep_conso = { ...logement.sortie.ep_conso, ...conso_coeff_1_9 };
logement.sortie.ep_conso = {
...logement.sortie.ep_conso,
previous_classe_bilan_dpe: conso2_3.ep_conso.classe_bilan_dpe,
previous_ep_conso_5_usages: conso2_3.ep_conso.ep_conso_5_usages,
previous_ep_conso_5_usages_m2: conso2_3.ep_conso.ep_conso_5_usages_m2
};

logement.sortie.ep_conso.classe_bilan_dpe_2026 = logement.sortie.ep_conso.classe_bilan_dpe;
logement.sortie.ep_conso.ep_conso_5_usages_2026 = logement.sortie.ep_conso.ep_conso_5_usages;
logement.sortie.ep_conso.ep_conso_5_usages_2026_m2 =
logement.sortie.ep_conso.ep_conso_5_usages_m2;

return dpe;
}
Expand Down Expand Up @@ -568,14 +604,14 @@ export function get_classe_ges_dpe(dpe) {
* {@link https://www.ecologie.gouv.fr/actualites/evolutions-du-calcul-du-dpe-reponses-vos-questions#:~:text=Les%20DPE%20r%C3%A9alis%C3%A9s%20avant%20le,%2DAudit%20de%20l'Ademe.}
*
* @param dpe {FullDpe}
* @returns {{ep_conso_5_usages_2026: number; ep_conso_5_usages_2026_m2: number; classe_bilan_dpe_2026: string}}
* @returns {{ep_conso_5_usages: number; ep_conso_5_usages_m2: number; classe_bilan_dpe: string}}
*/
export function get_conso_coeff_1_9_2026(dpe) {
const zc_id = dpe.logement.meteo.enum_zone_climatique_id;
const ca_id = dpe.logement.meteo.enum_classe_altitude_id;
const th = calc_th(dpe.logement.caracteristique_generale.enum_methode_application_dpe_log_id);

const ep_conso_5_usages_2026 =
const ep_conso_5_usages =
(0.9 / 1.3) *
(Number(dpe.logement.sortie.ep_conso.ep_conso_5_usages) -
Number(dpe.logement.sortie.ef_conso.conso_5_usages)) +
Expand All @@ -587,8 +623,8 @@ export function get_conso_coeff_1_9_2026(dpe) {
else if (th === 'immeuble')
Sh = Number(dpe.logement.caracteristique_generale.surface_habitable_immeuble);

const ep_conso_5_usages_2026_m2 = Math.floor(ep_conso_5_usages_2026 / Sh);
const classe_bilan_dpe_2026 = classe_bilan_dpe(ep_conso_5_usages_2026_m2, zc_id, ca_id, Sh);
const ep_conso_5_usages_m2 = Math.floor(ep_conso_5_usages / Sh);
const classe_dpe = classe_bilan_dpe(ep_conso_5_usages_m2, zc_id, ca_id, Sh);

return { classe_bilan_dpe_2026, ep_conso_5_usages_2026_m2, ep_conso_5_usages_2026 };
return { classe_bilan_dpe: classe_dpe, ep_conso_5_usages_m2, ep_conso_5_usages };
}
Loading
Loading