fix(ecs): répartir le besoin ecs d'un immeuble au prorata des surfaces des installations (#232) - #233
Merged
michaeldesigaud merged 1 commit intoOct 2, 2026
Conversation
…s des installations (#232) Pour un DPE immeuble avec au moins 2 installations ECS dont une collective, le besoin ECS (conventionnel et dépensier) de chaque installation vaut Sh_installation / Sh_immeuble / (rdim || 1), au lieu du besoin divisé par 2. Prorata brut, sans normalisation ni plafonnement (code Tribu Calcul_batiment.Calcul_Cecs). La consommation reste remultipliée par rdim dans conso.js (cle_repartition_ecs), comme Tribu (Calcul_Cecs_installation_2). Repli sur la division par 2 (§11.4) avec avertissement si une surface d'installation ou la surface de l'immeuble est absente ou nulle. Maison, appartement, cas virtualisés et immeuble tout individuel inchangés. Closes #232
michaeldesigaud
self-requested a review
October 2, 2026 22:20
michaeldesigaud
approved these changes
Oct 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Résumé
Closes #232
Dans
src/engine.js(§11.4), le besoin ECS était divisé par 2 dès qu'il y avait plus d'une installation ECS, sauf pour un immeuble dont toutes les installations sont individuelles. Le §11.4 vise un logement équipé de 2 systèmes. Pour un immeuble à plusieurs installations ECS collectives ou mixtes, le moteur de référence répartit le besoin au prorata de la surface habitable desservie par chaque installation.Règle validée dans l'avis thermique : #232 (comment)
Correctif
src/engine.js: nouveau casisImmeubleMultiEcs. Il s'applique quandth === 'immeuble', que les installations ne sont pas toutes individuelles, quesurface_habitable_immeuble > 0et que toutes lesinstallation_ecs.donnee_entree.surface_habitable > 0. Dans ce cas, le besoin n'est pas divisé par 2.console.warn. Tribu n'a pas de comportement exploitable dans ce cas (il produit des NaN).src/11_ecs.js: dans ce cas,ratio_besoin_ecs = surface_habitable / surface_habitable_immeuble / (rdim || 1). Le même ratio s'applique àbesoin_ecset àbesoin_ecs_depensier. C'est un prorata brut : ni normalisation ni plafonnement quand Σ Sh_ecs ≠ Sh.rdim: le besoin est calculé par unité dimensionnée (/ rdim), comme dans Tribu. La conso est déjà remultipliée parrdimà l'agrégation :conso.jsl.355-356 fixecle_repartition_ecs = (cle || 1) × (rdim || 1), puisgetEcsConsomultiplie par cette clé. Aucun autre changement de chaîne n'est donc nécessaire. Le traitement derdimhors de ce nouveau cas n'est pas modifié.cle_repartition_ecs), immeuble tout individuel.Nouvelle archi
src/features/: pas modifiée.InstallationEcsService.besoinEcsInstallationfait(surface_habitable || Sh)/Sh, mais ajouter/ (rdim || 1)ici serait incohérent sans la remultiplication côté conso :features/n'a aucune remultiplication parrdim(aucune occurrence derdimdanssrc/features/) ;perte-ecs-recup.service.js) n'en ont pas non plus, alors que Tribu appliqueQdw_ind_vc × Rdim(l.374).Diviser seul sous-estimerait la conso d'un facteur rdim. À traiter avec la migration de la chaîne conso ECS.
Références
Moteur_DPE.dll2025.11.1.0,DPE.Core/Calcul_batiment.cs) :Calcul_Cecs():Ratio = Sh_ecs × Rdim / SH ; Becs = Becs1 × Ratio ; Becs /= Rdim(individuelle en immeuble), sinonRatio = Sh_ecs / SH. Pas de division par 2, pas de normalisation.Calcul_Cecs_installation_2():Cecs1_unité = Becs1 × Ratio × (1-Fecs) × Iecs / Rdim, puisCecs1_bât += Cecs1_unité × Rdim.Becs_i / Becs = Sh_ecs_i / SH.Impact mesuré
Critères corpus : écart ≤ 5 % sur conso_ecs, conso_ch, ep et ges ; mode
bug_for_bug_compat+tv_match_optimized.dpe_immeuble_chauffage_mixtedpe_immeuble_chauffage_collectifdpe_immeuble_chauffage_individueldonnee_intermediaireECS)test/fixtures/*.jsonRemarque : le convertisseur des autotests ne produit qu'une installation ECS par cas, il ne teste donc pas le multi-ECS.
Le résultat est identique à la simulation de l'avis thermique (mêmes 306 DPE OK).
DPE passant de OK à KO (4) : le /2 masquait un autre écart, ou ADEME s'écarte de la règle.
2314E3266922M: installation collective conforme (0,4469 = Sh_i/Sh). L'installation individuelle (Sh 150, rdim 30) a un ratio ADEME de 0,0184 contre 0,0006 calculé, soit un autre écart à investiguer.2362E0245157P: ratios ADEME = Sh_i/Sh exactement (0,2766 et 0,1701). Le /2 compensait un autre écart (écart conso_ecs 50 %), à investiguer.2567E0137928R: erreur du logiciel, qui applique 0,5 par installation alors que Σ = Sh/2 (230,5 + 230,5 sur 922).2574E0297333X: ratios ADEME = Sh_i/Sh (0,1667 et 0,6667). Le /2 masquait un autre écart (écart conso_ecs 7,3 %, ep 2,9 %).Tests
src/11_ecs.spec.js: +8 tests. IC1-0-2 (20/155 sur 175 → 0,1143 et 0,8857), Σ < Sh (461/922 → 0,5 sans normalisation), Σ > Sh (sans plafond), immeuble mixte (installation individuelle Sh 800, rdim 13, sur 2400 → 0,02564), rdim absent ou nul,besoin_ecs_depensierau même ratio, priorité sur la virtualisation et sur le cas tout individuel, valeur par défaut. 37/37 ✅, couverture 100 %.src/engine.spec.js: +6 tests. Surfaces renseignées → besoin non divisé et indicateur transmis. Surface d'installation nulle, absente, ou surface immeuble nulle → repli /2 avec avertissement. Appartement avec 2 installations → /2 inchangé. Immeuble tout individuel → inchangé. 47/47 ✅, couverture 100 %.src: 1706 passed / 0 failed (main : 1692 / 0).test/: 35 échecs, les 35 mêmes que surmain(identifiants ADEME absents, données manquantes) : aucune régression.Hors périmètre
src/11_ecs.js, brancheisImmeubleSystemEcsIndividuelssansnombreAppartements) : elle divise parnombre_logement × nombreAppartements, ce qui est incohérent (et donne une division par 0 quandnombreAppartementsest absent). Je n'y ai pas touché.cle_repartition_ecs) : sans équivalent dans Tribu, à revoir séparément.features/: alignement derdim(besoin / rdim et remultiplication de la conso et des pertes récupérées) à faire avec la migration de la chaîne ECS.Sh_i/Sh/nombre_logement(versions 2.3/2.4) ou la surface chauffée du chauffage. On ne les suit pas.PR générée par Hermes.