Skip to content

fix(plancher-bas): calculer ue plancher par plancher (#46) - #234

Merged
michaeldesigaud merged 1 commit into
mainfrom
fix/issue-46-ue-plancher-par-plancher
Oct 4, 2026
Merged

michaeldesigaud merged 1 commit into
mainfrom
fix/issue-46-ue-plancher-par-plancher

Conversation

@elliot-redfroggy

Copy link
Copy Markdown
Collaborator

Résumé

Closes #46

tv_ue calculait le rapport 2S/P du tableau ue en sommant surface_ue || surface_paroi_opaque et perimetre_ue de tous les planchers bas de même enum_type_adjacence_id. Sur 2187E0982591I, le plancher 1 (terre-plein, S 44,8 / P 12,8) était ainsi évalué avec 2S/P = 2 × 55,3 / 22,8 ≈ 5 au lieu de 7 → ue 0,4538 au lieu de 0,3854 (valeur ADEME).

Correctif

Calcul plancher par plancher (option validée) : 2S/P = 2 × S / P avec S = surface_ue || surface_paroi_opaque et P = perimetre_ue du seul plancher courant, que surface_ue soit présent ou non.

  • Legacy : src/3.2.2_plancher_bas.js (tv_ue).
  • Nouvelle archi : src/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js (#upbFinal), gardée cohérente avec le legacy.
  • La liste des planchers n'étant plus utilisée, le paramètre pb_list / plancherBas est retiré de calc_pb, DeperditionPlancherBasService.execute et de leurs appelants (3_deperdition.js, deperdition-enveloppe.service.js) : diff limité à 2 lignes d'appel, évite un paramètre mort.
  • perimetre_ue absent : comportement inchangé (legacy : division par 0 → 2S/P ramené à 1 ; features : 2S/P = 1).

Références méthode

  • Méthode 3CL-DPE 2021 §3.2.2, tableau ue (2S/P × Upb) : « Les données ne figurant pas dans le tableau peuvent être obtenues par interpolation et extrapolation en traçant des droites entre les valeurs les plus proches présentes dans le tableau ».
  • Discussion de l'issue avec @jungoliv : DPE test 2544E0709022Y (surface_ue + perimetre_ue présents) → planchers 1/2/3 reproduisent désormais les ue ADEME (0,49684 / 0,273 / 0,326 ; main : 0,45895 / 0,316 / 0,316), déperdition planchers bas 53,773 = ADEME. 2362E1093836C (cas « fusionné ») : inchangé et toujours conforme (2S/P identique dans les deux modes).

Impact mesuré

Corpus corpus219_dpes (9 999 DPE), moteur main (0b4d066) vs branche, bug_for_bug_compat + tv_match_optimized_version. OK = deperdition_plancher_bas à ±1 % d'ADEME.

Périmètre DPE OK main OK branche KO→OK OK→KO
≥ 2 planchers calcul_ue=1 de même adjacence 661 432 524 98 6
dont avec surface_ue 239 119 193 80 6
dont sans surface_ue 422 313 331 18 0
Corpus complet 9 999 8 360 8 452
  • OK→KO (6) : 2275E3205470G, 2292E2979676N, 2292E2982473C, 2367E2090663U, 2412E3782622B, 2415E2214116A — logiciels ayant sommé les planchers de même adjacence (main collait par construction) ; à classer en DPE non conformes à la méthode.
  • ep_conso_5_usages_m2 ±5 % (661 DPE) : 246 → 244 (2420E2910606H 147→146 vs 154,5 ; 2488E2713818D 299→297 vs 313,7 ; déjà en limite −4,9 % → −5,5 %).
  • Hors périmètre : 9 338 DPE sans planchers multiples de même adjacence → 0 changement (hash de logement.sortie identique au bit près).
  • Autotests CSTB (50 cas) : 0 changement.

Tests

  • 3.2.2_plancher_bas.spec.js : nouveau bloc « calcul plancher par plancher (Calcul de la déperdition des planchers bas non conforme avec 2187E0982591I #46) » — 2187E0982591I plancher 1 (2S/P 7, ue 0,385384615 malgré un autre terre-plein dans la liste, matcher tv('ue') vérifié), deux planchers même adjacence → ue différents, fallback surface_paroi_opaque, priorité surface_ue, perimetre_ue absent.
    • Le test existant « terre-plein, bâtiment avant 2001 » encodait la somme par adjacence (S 20 + 4, P 12 + 0) : mis à jour (perimetre_ue porté par le plancher courant, même 2S/P = 4 et même ue), commentaire explicatif ajouté.
  • Nouveau deperdition-plancher-bas.service.spec.js (tvStore doublé) : Upb0, Upb, Ue plancher par plancher (mêmes cas), typeIsolation.
  • deperdition-enveloppe.service.spec.js : délégation sans la liste des planchers.
  • Couverture 100 % des fichiers modifiés ; ESLint + Prettier OK ; vitest run src : 1750 verts (main 1717) ; vitest run test : échecs préexistants identiques à main.

Hors périmètre

2187E0982591I planchers 2 (sous-sol, o3cl 0,356 vs ADEME 0,266) et 3 (terre-plein, 0,598 vs 0,55) restent en écart : ils ne s'expliquent ni par la somme ni par le calcul plancher par plancher, à analyser séparément. Déperdition planchers bas du DPE : 27,02 → 25,47 (ADEME 24,48).

Le 2S/P du tableau ue (§3.2.2) est désormais calculé avec la surface (surface_ue, à défaut
surface_paroi_opaque) et le perimetre_ue du seul plancher courant, au lieu de sommer tous
les planchers bas de même adjacence. Correctif appliqué au legacy (3.2.2_plancher_bas.js)
et à la nouvelle architecture (deperdition-plancher-bas.service.js) ; la liste des
planchers n'étant plus utilisée, le paramètre est retiré des deux signatures.

Closes #46
@michaeldesigaud
michaeldesigaud self-requested a review October 4, 2026 10:58
@michaeldesigaud michaeldesigaud added bug Something isn't working auto_tests_cstb labels Oct 4, 2026
@michaeldesigaud
michaeldesigaud merged commit 45a49e9 into main Oct 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Calcul de la déperdition des planchers bas non conforme avec 2187E0982591I

2 participants