@open3cl/engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/10_besoin_fr.js +76 -0
  2. package/10_clim.js +45 -0
  3. package/11_besoin_ecs.js +25 -0
  4. package/11_ecs.js +95 -0
  5. package/11_nadeq.js +87 -0
  6. package/11_nadeq.spec.js +55 -0
  7. package/12.4_pac.js +54 -0
  8. package/13.2_generateur_combustion.js +295 -0
  9. package/13.2_generateur_combustion_bouilleur.js +173 -0
  10. package/13.2_generateur_combustion_ch.js +195 -0
  11. package/13.2_generateur_combustion_chaudiere.js +151 -0
  12. package/13.2_generateur_pac.js +36 -0
  13. package/13_rendement_distribution_ecs.js +12 -0
  14. package/14_generateur_ecs.js +388 -0
  15. package/15_conso_aux.js +257 -0
  16. package/16.2_production_enr.js +328 -0
  17. package/16.2_production_enr.spec.js +251 -0
  18. package/16_conso_eclairage.js +37 -0
  19. package/2021_04_13_confort_ete.js +61 -0
  20. package/2021_04_13_qualite_isolation.js +174 -0
  21. package/3.1_b.js +141 -0
  22. package/3.2.1_mur.js +331 -0
  23. package/3.2.1_mur.spec.js +46 -0
  24. package/3.2.2_plancher_bas.js +259 -0
  25. package/3.2.2_plancher_bas.spec.js +88 -0
  26. package/3.2.3_plancher_haut.js +158 -0
  27. package/3.3.1.4_porte.js +32 -0
  28. package/3.3_baie_vitree.js +308 -0
  29. package/3.3_baie_vitree.spec.js +333 -0
  30. package/3.4_pont_thermique.js +463 -0
  31. package/3_deperdition.js +258 -0
  32. package/4_ventilation.js +197 -0
  33. package/5_conso_ventilation.js +127 -0
  34. package/6.1_apport_gratuit.js +61 -0
  35. package/6.1_apport_gratuit.spec.js +181 -0
  36. package/6.2_surface_sud_equivalente.js +109 -0
  37. package/7_inertie.js +178 -0
  38. package/7_inertie.spec.js +263 -0
  39. package/8_intermittence.js +5 -0
  40. package/9_besoin_ch.js +198 -0
  41. package/9_chauffage.js +291 -0
  42. package/9_chauffage.spec.js +101 -0
  43. package/9_conso_ch.js +95 -0
  44. package/9_conso_ch.spec.js +255 -0
  45. package/9_emetteur_ch.js +122 -0
  46. package/9_generateur_ch.js +230 -0
  47. package/9_generateur_ch.spec.js +87 -0
  48. package/README.md +43 -0
  49. package/apport_et_besoin.js +55 -0
  50. package/conso.js +529 -0
  51. package/conso.spec.js +90 -0
  52. package/core/assets/domain/add-additionnal-ue-values-tables.js +57 -0
  53. package/core/assets/domain/synchronize-assets.js +29 -0
  54. package/core/assets/domain/synchronize-assets.spec.js +37 -0
  55. package/core/assets/domain/synchronize-c1-tables.js +61 -0
  56. package/core/assets/domain/synchronize-c1-tables.spec.js +35 -0
  57. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +73 -0
  58. package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +72 -0
  59. package/core/assets/domain/synchronize-enum-tables.js +77 -0
  60. package/core/assets/domain/synchronize-enum-tables.spec.js +31 -0
  61. package/core/assets/domain/synchronize-solicitations-tables.js +72 -0
  62. package/core/assets/domain/synchronize-solicitations-tables.spec.js +47 -0
  63. package/core/assets/domain/synchronize-valeur-tables.js +146 -0
  64. package/core/assets/domain/synchronize-valeur-tables.spec.js +54 -0
  65. package/core/conf/infrastructure/application.config.js +33 -0
  66. package/core/file/infrastructure/adapter/file.store.js +75 -0
  67. package/core/file/infrastructure/adapter/file.store.spec.js +30 -0
  68. package/core/tv/infrastructure/assets/additional-ue-values.js +69 -0
  69. package/core/tv/infrastructure/tvs.store.js +40 -0
  70. package/core/tv/infrastructure/tvs.store.spec.js +34 -0
  71. package/core/util/infrastructure/object-util.js +23 -0
  72. package/core/util/infrastructure/object-util.spec.js +25 -0
  73. package/engine.js +503 -0
  74. package/enums.js +1155 -0
  75. package/ficheTechnique.js +86 -0
  76. package/ficheTechnique.spec.js +181 -0
  77. package/index.js +4 -0
  78. package/package.json +87 -0
  79. package/tv/18.2_sollicitations_ext.ods +0 -0
  80. package/tv/18.5_c1.ods +0 -0
  81. package/tv/dpe_ges_limit_values.ods +0 -0
  82. package/tv.js +80811 -0
  83. package/tvs.d.ts +7 -0
  84. package/utils.js +500 -0
  85. package/utils.spec.js +36 -0
@@ -0,0 +1,151 @@
1
+ import getFicheTechnique from './ficheTechnique.js';
2
+
3
+ /**
4
+ * Pour les générateurs "Autre système à combustion", les calculs sont faits comme pour les chaudières standard
5
+ * @param dpe {FullDpe}
6
+ * @param de {Donnee_entree}
7
+ * @param type {'ch' | 'ecs'}
8
+ */
9
+ export function updateGenerateurChaudieres(dpe, de, type) {
10
+ /**
11
+ * enum_type_generateur_ecs_id
12
+ * 78 - autre système à combustion gaz
13
+ * 79 - autre système à combustion fioul
14
+ * 80 - autre système à combustion bois
15
+ * 81 - autre système à combustion autres energies fossiles (charbon,pétrole etc…)
16
+ */
17
+ let ids;
18
+
19
+ if (type === 'ecs') {
20
+ // Ids des chaudières bois équivalentes pour les différentes périodes d'installation
21
+ ids = {
22
+ 78: {
23
+ 1948: '45',
24
+ 1981: '46',
25
+ 1986: '47',
26
+ 1991: '48',
27
+ 2001: '49',
28
+ 2015: '50'
29
+ },
30
+ 79: {
31
+ 1948: '35',
32
+ 1970: '36',
33
+ 1976: '37',
34
+ 1981: '38',
35
+ 1991: '39',
36
+ 2015: '40'
37
+ },
38
+ 80: {
39
+ 1948: '15',
40
+ 1978: '16',
41
+ 1995: '17',
42
+ 2004: '18',
43
+ 2013: '19',
44
+ 2018: '20',
45
+ 2019: '21'
46
+ },
47
+ 81: {
48
+ 1948: '35',
49
+ 1970: '36',
50
+ 1976: '37',
51
+ 1981: '38',
52
+ 1991: '39',
53
+ 2015: '40'
54
+ }
55
+ };
56
+ } else {
57
+ /**
58
+ * enum_type_generateur_ch_id
59
+ * 113 - autre système à combustion gaz
60
+ * 114 - autre système à combustion fioul
61
+ * 115 - autre système à combustion bois
62
+ * 116 - autre système à combustion autres energies fossiles (charbon,pétrole etc…)
63
+ */
64
+ // Ids des chaudières bois équivalentes pour les différentes périodes d'installation
65
+ ids = {
66
+ 113: {
67
+ 1948: '85',
68
+ 1981: '86',
69
+ 1986: '87',
70
+ 1991: '88',
71
+ 2001: '89',
72
+ 2015: '90'
73
+ },
74
+ 114: {
75
+ 1948: '75',
76
+ 1970: '76',
77
+ 1976: '77',
78
+ 1981: '78',
79
+ 1991: '79',
80
+ 2015: '80'
81
+ },
82
+ 115: {
83
+ 1948: '55',
84
+ 1978: '56',
85
+ 1995: '57',
86
+ 2004: '58',
87
+ 2013: '59',
88
+ 2018: '60',
89
+ 2019: '61'
90
+ },
91
+ 116: {
92
+ 1948: '75',
93
+ 1970: '76',
94
+ 1976: '77',
95
+ 1981: '78',
96
+ 1991: '79',
97
+ 2015: '80'
98
+ }
99
+ };
100
+ }
101
+
102
+ updateGenerateurChaudiere(dpe, ids, de, type);
103
+ }
104
+
105
+ /**
106
+ * Récupération du générateur équivalent à utiliser à la place du générateur décrit
107
+ * La période du générateur équivalent est choisie par rapport à la date d'installation du générateur décrit
108
+ * Ex:
109
+ * - Pour un système 'autre système à combustion fioul' granulés installé en 2000, on prendra la chaudière gaz standard 2001-2015
110
+ * @param dpe {FullDpe}
111
+ * @param ids
112
+ * @param de {Donnee_entree}
113
+ * @param type {'ch' | 'ecs'}
114
+ */
115
+ function updateGenerateurChaudiere(dpe, ids, de, type) {
116
+ const enumType = `enum_type_generateur_${type}_id`;
117
+ let generateurId = de[enumType];
118
+
119
+ const steps = Object.keys(ids);
120
+
121
+ if (steps.includes(generateurId)) {
122
+ const values = ids[generateurId];
123
+ de[`previous_${enumType}`] = generateurId;
124
+
125
+ // Récupération de l'année d'installation du système ECS ou Chauffage dans les fiches techniques
126
+ const ficheTechnique = getFicheTechnique(dpe, type === 'ch' ? '7' : '8', 'année', [
127
+ 'Autre système à combustion'
128
+ ])?.valeur;
129
+
130
+ if (ficheTechnique) {
131
+ if (ficheTechnique.toString().toLowerCase() === 'avant 1948') {
132
+ generateurId = values[1948];
133
+ } else {
134
+ const installationDate = parseInt(ficheTechnique, 10);
135
+
136
+ const entries = Object.entries(values)
137
+ .map(([key, value]) => [key, value])
138
+ .sort((a, b) => b[0] - a[0]);
139
+
140
+ for (const [threshold, value] of entries) {
141
+ if (installationDate >= threshold) {
142
+ generateurId = value;
143
+ break;
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ de[enumType] = generateurId;
150
+ }
151
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Pour les générateurs "Autre système thermodynamique", les calculs sont faits comme pour les 'cet sur air ambiant'
3
+ * @param dpe {FullDpe}
4
+ * @param de {Donnee_entree}
5
+ * @param type {'ch' | 'ecs'}
6
+ */
7
+ export function updateGenerateurPacs(dpe, de, type) {
8
+ const periodeInstallation = de.enum_periode_installation_ecs_thermo_id;
9
+
10
+ if (periodeInstallation) {
11
+ const enumType = `enum_type_generateur_${type}_id`;
12
+ let generateurId = de[enumType];
13
+
14
+ if (type === 'ecs') {
15
+ /**
16
+ * enum_type_generateur_ecs_id
17
+ * 82 - autre système thermodynamique électrique
18
+ */
19
+ if (generateurId === '82') {
20
+ switch (periodeInstallation) {
21
+ case '1':
22
+ generateurId = '10';
23
+ break;
24
+ case '2':
25
+ generateurId = '11';
26
+ break;
27
+ case '3':
28
+ generateurId = '12';
29
+ break;
30
+ }
31
+ }
32
+ }
33
+
34
+ de[enumType] = generateurId;
35
+ }
36
+ }
@@ -0,0 +1,12 @@
1
+ import enums from './enums.js';
2
+
3
+ export default function rendement_distribution_ecs(ecs) {
4
+ const de = ecs.donnee_entree;
5
+
6
+ const type_installation = enums.type_installation[de.enum_type_installation_id];
7
+
8
+ switch (type_installation) {
9
+ case 'installation individuelle':
10
+ default:
11
+ }
12
+ }
@@ -0,0 +1,388 @@
1
+ import enums from './enums.js';
2
+ import {
3
+ bug_for_bug_compat,
4
+ getVolumeStockageFromDescription,
5
+ requestInput,
6
+ requestInputID,
7
+ Tbase,
8
+ tv,
9
+ tvColumnIDs
10
+ } from './utils.js';
11
+ import {
12
+ tv_generateur_combustion,
13
+ updateGenerateurCombustion
14
+ } from './13.2_generateur_combustion.js';
15
+ import { conso_aux_gen } from './15_conso_aux.js';
16
+ import { scopOrCop } from './12.4_pac.js';
17
+
18
+ function tv_pertes_stockage(di, de) {
19
+ let vb;
20
+ if (de.volume_stockage <= 100) vb = '≤ 100';
21
+ else if (de.volume_stockage <= 200) vb = '100 < ≤ 200';
22
+ else if (de.volume_stockage <= 300) vb = '200 < ≤ 300';
23
+ else vb = '> 300';
24
+
25
+ let matcher = {
26
+ enum_type_generateur_ecs_id: de.enum_type_generateur_ecs_id,
27
+ volume_ballon: vb
28
+ };
29
+
30
+ if (bug_for_bug_compat && de.enum_type_generateur_ecs_id === '84') {
31
+ matcher = {
32
+ tv_pertes_stockage_id: de.tv_pertes_stockage_id
33
+ };
34
+
35
+ console.error(
36
+ `Le générateur ECS est de type '84 - "système collectif par défaut en abscence d'information : chaudière fioul pénalisante"'.
37
+ On ne connait pas le type précis du générateur ECS permettant de récupérer les pertes de stockages. Utilisations de
38
+ tv_pertes_stockage_id ${de.tv_pertes_stockage_id} saisi.
39
+ `
40
+ );
41
+ }
42
+
43
+ const row = tv('pertes_stockage', matcher);
44
+ if (row) {
45
+ di.cr = Number(row.cr);
46
+ de.tv_pertes_stockage_id = Number(row.tv_pertes_stockage_id);
47
+ } else {
48
+ console.error('!! pas de valeur forfaitaire trouvée pour cr !!');
49
+ }
50
+ }
51
+
52
+ function tv_facteur_couverture_solaire(di, de, zc_id, th) {
53
+ /**
54
+ * 18.4 Facteur de couverture solaire
55
+ * Les facteurs de couverture solaire peuvent être saisi directement quand ils sont connus et peuvent être justifiés.
56
+ */
57
+ if (de.fecs_saisi) {
58
+ di.fecs = de.fecs_saisi;
59
+ return;
60
+ }
61
+
62
+ const matcher = {
63
+ enum_zone_climatique_id: zc_id,
64
+ type_installation_solaire:
65
+ enums.type_installation_solaire[de.enum_type_installation_solaire_id],
66
+ type_batiment: th === 'maison' ? 'maison' : 'immeuble'
67
+ };
68
+
69
+ const row = tv('facteur_couverture_solaire', matcher);
70
+ if (row) {
71
+ di.fecs = Number(row.facteur_couverture_solaire);
72
+ de.tv_facteur_couverture_solaire_id = Number(row.tv_facteur_couverture_solaire_id);
73
+ } else {
74
+ console.error('!! pas de valeur forfaitaire trouvée pour facteur_couverture_solaire !!');
75
+ }
76
+ }
77
+
78
+ // 15.2.3
79
+ export function calc_Qdw_j(instal_ecs, becs_j) {
80
+ const de = instal_ecs.donnee_entree;
81
+ const du = instal_ecs.donnee_utilisateur || {};
82
+
83
+ const type_installation = requestInput(de, du, 'type_installation');
84
+
85
+ let Qdw_ind_vc_j;
86
+ let Qdw_col_vc_j = 0;
87
+
88
+ const Rat_ecs = 1;
89
+ const Lvc = 0.2 * Rat_ecs;
90
+
91
+ Qdw_ind_vc_j = 0.5 * Lvc * becs_j;
92
+
93
+ if (type_installation.includes('installation collective')) {
94
+ Qdw_col_vc_j = 0.112 * becs_j;
95
+ }
96
+
97
+ instal_ecs.donnee_utilisateur = du;
98
+ return Qdw_col_vc_j + Qdw_ind_vc_j;
99
+ }
100
+
101
+ function calc_Qgw(di, de, du, ecs_de) {
102
+ const type_stockage_ecs = requestInput(de, du, 'type_stockage_ecs');
103
+
104
+ // stockage
105
+ if (type_stockage_ecs === "abscence de stockage d'ecs (production instantanée)") {
106
+ di.Qgw = 0;
107
+ return;
108
+ }
109
+ let Vs = requestInput(de, du, 'volume_stockage', 'float');
110
+ const gen_ecs_elec_ids = tvColumnIDs('pertes_stockage', 'type_generateur_ecs');
111
+
112
+ if (bug_for_bug_compat) {
113
+ /**
114
+ * Dans certains cas, le volume annoncé pour le ballon est proratisé à l'appartement
115
+ * alors qu'il est d'autres fois affiché pour l'immeuble.
116
+ * le volume étant souvent décrit dans la description, on vérifie si le volume a été proratisé
117
+ */
118
+ const VsFromDescription = getVolumeStockageFromDescription(ecs_de.description);
119
+
120
+ if (VsFromDescription === Math.round(Number.parseFloat(Vs) / de.ratio_virtualisation)) {
121
+ Vs = VsFromDescription;
122
+ }
123
+ }
124
+
125
+ let isElectric = gen_ecs_elec_ids.includes(de.enum_type_generateur_ecs_id);
126
+
127
+ /**
128
+ * Si le système ECS est inconnu -> on se base exclusivement sur le type d'énergie
129
+ * enum_type_generateur_ecs_id = 84 - "système collectif par défaut en abscence d'information : chaudière fioul pénalisante"
130
+ */
131
+ if (bug_for_bug_compat && de.enum_type_generateur_ecs_id === '84') {
132
+ isElectric = de.enum_type_energie_id === '1';
133
+ }
134
+
135
+ if (isElectric) {
136
+ tv_pertes_stockage(di, de, du);
137
+ di.Qgw = ((8592 * 45) / 24) * Vs * di.cr;
138
+ delete di.cr;
139
+ } else {
140
+ di.Qgw = 67662 * Vs ** 0.55;
141
+ }
142
+ }
143
+
144
+ function type_generateur_ecs(di, de, du, usage_generateur) {
145
+ let type_generateur;
146
+ if (usage_generateur === 'ecs') {
147
+ type_generateur = requestInputID(de, du, 'type_generateur_ecs');
148
+ } else if (usage_generateur === 'chauffage + ecs') {
149
+ const generateur_ecs = enums.type_generateur_ecs;
150
+ const generateur_ch = enums.type_generateur_ch;
151
+ const generateurs_ch_ecs = Object.keys(generateur_ecs).reduce((acc, key) => {
152
+ const gen_ecs = generateur_ecs[key];
153
+ if (Object.values(generateur_ch).includes(gen_ecs)) acc[key] = gen_ecs;
154
+ return acc;
155
+ }, {});
156
+ type_generateur = requestInputID(
157
+ de,
158
+ du,
159
+ 'type_generateur_ecs',
160
+ Object.keys(generateurs_ch_ecs)
161
+ );
162
+ } else {
163
+ console.warn("!! usage_generateur n'est pas 'ecs' ou 'chauffage + ecs' !!");
164
+ }
165
+ return type_generateur;
166
+ }
167
+
168
+ function rg_chauffe_eau_gaz(di, besoin_ecs) {
169
+ return (
170
+ 1 /
171
+ (1 / di.rpn + 1790 * (di.qp0 / (besoin_ecs * 1000)) + 6970 * (di.pveil / (besoin_ecs * 1000)))
172
+ );
173
+ }
174
+
175
+ function rgrs_chaudiere(di, besoin_ecs) {
176
+ return (
177
+ 1 /
178
+ (1 / di.rpn +
179
+ (1790 * di.qp0 + di.Qgw) / (besoin_ecs * 1000) +
180
+ (6970 * 0.5 * di.pveil) / (besoin_ecs * 1000))
181
+ );
182
+ }
183
+
184
+ function rg_accumulateur_gaz(di, besoin_ecs) {
185
+ return (
186
+ 1 /
187
+ (1 / di.rpn +
188
+ (8592 * di.qp0 + di.Qgw) / (besoin_ecs * 1000) +
189
+ (6970 * di.pveil) / (besoin_ecs * 1000))
190
+ );
191
+ }
192
+
193
+ function rgrsReseauUrbain(de) {
194
+ if (de.reseau_distribution_isole === 1) {
195
+ return 0.9;
196
+ }
197
+ return 0.75;
198
+ }
199
+
200
+ export default function calc_gen_ecs(dpe, gen_ecs, ecs_di, ecs_de, GV, ca_id, zc_id, th) {
201
+ const de = gen_ecs.donnee_entree;
202
+ const di = gen_ecs.donnee_intermediaire || {};
203
+ const du = {};
204
+
205
+ // Ratio de virtualisation à prendre en compte sur le rendement (17.2.1 Génération d’un DPE à l’appartement)
206
+ de.ratio_virtualisation = ecs_de.ratio_virtualisation || 1;
207
+
208
+ const besoin_ecs = ecs_di.besoin_ecs;
209
+ const besoin_ecs_dep = ecs_di.besoin_ecs_depensier;
210
+
211
+ // Mise à jour du type de générateur si besoin
212
+ updateGenerateurCombustion(dpe, de, 'ecs');
213
+
214
+ const usage_generateur = requestInput(de, du, 'usage_generateur');
215
+ const type_generateur_id = type_generateur_ecs(di, de, du, usage_generateur);
216
+ const type_energie = requestInput(de, du, 'type_energie');
217
+
218
+ const pac_ids = tvColumnIDs('scop', 'type_generateur_ecs');
219
+ const combustion_ids = tvColumnIDs('generateur_combustion', 'type_generateur_ecs');
220
+
221
+ let isCombustionGenerator = combustion_ids.includes(type_generateur_id);
222
+ let isPacGenerator = pac_ids.includes(type_generateur_id);
223
+ /**
224
+ * enum_type_installation_id = 3 => 'installation collective multi-bâtiment : modélisée comme un réseau de chaleur'
225
+ */
226
+ let isReseauChaleur =
227
+ type_energie === 'réseau de chauffage urbain' || ecs_de.enum_type_installation_id === '3';
228
+ let isElectric = type_energie === 'électricité';
229
+
230
+ /**
231
+ * Pour le type de générateur ECS 84 - système collectif par défaut en abscence d'information : chaudière fioul pénalisante,
232
+ * détection en fonction des données d'entrées du type de générateur pour calculer les rendements de l'installation
233
+ *
234
+ * Si présence de tv_generateur_combustion_id dans les données d'entrée alors générateur à combustion
235
+ * Si présence de tv_scop_id dans les données d'entrée alors générateur pompe à chaleur
236
+ */
237
+ if (type_generateur_id === '84') {
238
+ if (!isElectric && !isReseauChaleur) {
239
+ if (de.tv_generateur_combustion_id) {
240
+ const row = tv('generateur_combustion', {
241
+ tv_generateur_combustion_id: de.tv_generateur_combustion_id
242
+ });
243
+
244
+ if (row) {
245
+ // On prend par défaut le premier type de générateur pour effectuer les calculs de rendement
246
+ const typeGenerateurEcs = row.enum_type_generateur_ecs_id?.split('|');
247
+
248
+ if (typeGenerateurEcs && typeGenerateurEcs.length) {
249
+ de.enum_type_generateur_ecs_id = typeGenerateurEcs[0];
250
+ }
251
+ }
252
+
253
+ isCombustionGenerator = true;
254
+ } else if (de.tv_scop_id) {
255
+ isPacGenerator = true;
256
+ }
257
+ }
258
+ }
259
+
260
+ calc_Qgw(di, de, du, ecs_de);
261
+
262
+ /**
263
+ * Application du ratio uniquement pour les installations collectives
264
+ */
265
+ if (ecs_de.enum_type_installation_id !== '1') {
266
+ di.Qgw *= de.ratio_virtualisation;
267
+ }
268
+ let Iecs, Iecs_dep;
269
+
270
+ if (isPacGenerator) {
271
+ scopOrCop(di, de, du, zc_id, null, 'ecs');
272
+
273
+ const cop = di.scop || di.cop;
274
+ Iecs = 1 / cop;
275
+ Iecs_dep = 1 / cop;
276
+ } else if (isElectric) {
277
+ const rd = ecs_di.rendement_distribution;
278
+ di.rendement_stockage = 1 / (1 + (di.Qgw * rd) / (besoin_ecs * 1000));
279
+ di.rendement_stockage_depensier = 1 / (1 + (di.Qgw * rd) / (besoin_ecs_dep * 1000));
280
+ const type_generateur = enums.type_generateur_ecs[type_generateur_id];
281
+ if (type_generateur === 'ballon électrique à accumulation vertical catégorie c ou 3 étoiles') {
282
+ di.rendement_stockage *= 1.08;
283
+ di.rendement_stockage_depensier *= 1.08;
284
+ }
285
+ Iecs = 1 / di.rendement_stockage;
286
+ Iecs_dep = 1 / di.rendement_stockage_depensier;
287
+ } else if (isReseauChaleur) {
288
+ if (bug_for_bug_compat) {
289
+ if (di.rendement_generation_stockage === 0.9 && ecs_de.reseau_distribution_isole === 0) {
290
+ ecs_de.reseau_distribution_isole = 1;
291
+ console.warn(
292
+ `Correction reseau_distribution_isole pour le générateur ECS (1 au lieu de 0 en fonction de la valeur de rendement_generation_stockage saisi)`
293
+ );
294
+ }
295
+
296
+ if (di.rendement_generation_stockage === 0.75 && ecs_de.reseau_distribution_isole === 1) {
297
+ console.warn(`
298
+ La variable reseau_distribution_isole pour le générateur ECS ${de.description} n'est pas en accord avec la valeur utilisée par le DPE pour rendement_generation_stockage
299
+ `);
300
+ }
301
+ }
302
+
303
+ di.rendement_generation_stockage = rgrsReseauUrbain(ecs_de);
304
+ di.rendement_generation_stockage_depensier = rgrsReseauUrbain(ecs_de);
305
+
306
+ Iecs = 1 / di.rendement_generation_stockage;
307
+ Iecs_dep = 1 / di.rendement_generation_stockage_depensier;
308
+ } else if (isCombustionGenerator) {
309
+ const ca = enums.classe_altitude[ca_id];
310
+ const zc = enums.zone_climatique[zc_id];
311
+ const tbase = Tbase[ca][zc.slice(0, 2)];
312
+
313
+ const methodeSaisie = parseInt(de.enum_methode_saisie_carac_sys_id);
314
+ tv_generateur_combustion(dpe, di, de, 'ecs', GV, tbase, methodeSaisie);
315
+
316
+ if (bug_for_bug_compat) {
317
+ if (di.qp0 < 1) {
318
+ di.qp0 *= 1000;
319
+ console.warn(
320
+ `Correction di.qp0 pour le générateur ECS ${de.description}. Passage de la valeur en W`
321
+ );
322
+ }
323
+ }
324
+
325
+ // La puissance de la veilleuse est à prendre en compte seulement si elle est présente dans l'installation
326
+ if (!di.pveilleuse) {
327
+ di.pveil = 0;
328
+ }
329
+
330
+ const type_generateur = enums.type_generateur_ecs[type_generateur_id];
331
+ if (
332
+ type_generateur.includes('chauffe-eau gaz') ||
333
+ type_generateur.includes('chauffe-eau gpl/propane/butane')
334
+ ) {
335
+ di.rendement_generation = rg_chauffe_eau_gaz(di, besoin_ecs);
336
+ di.rendement_generation_depensier = rg_chauffe_eau_gaz(di, besoin_ecs_dep);
337
+ Iecs = 1 / di.rendement_generation;
338
+ Iecs_dep = 1 / di.rendement_generation_depensier;
339
+ } else if (type_generateur.includes('chaudière')) {
340
+ if (di.Qgw === 0) {
341
+ di.rendement_generation = rgrs_chaudiere(di, besoin_ecs);
342
+ di.rendement_generation_depensier = rgrs_chaudiere(di, besoin_ecs_dep);
343
+ Iecs = 1 / di.rendement_generation;
344
+ Iecs_dep = 1 / di.rendement_generation_depensier;
345
+ } else {
346
+ di.rendement_generation_stockage = rgrs_chaudiere(di, besoin_ecs);
347
+ di.rendement_generation_stockage_depensier = rgrs_chaudiere(di, besoin_ecs_dep);
348
+ Iecs = 1 / di.rendement_generation_stockage;
349
+ Iecs_dep = 1 / di.rendement_generation_stockage_depensier;
350
+ }
351
+ } else if (
352
+ type_generateur.includes('accumulateur gaz') ||
353
+ type_generateur.includes('accumulateur gpl/propane/butane')
354
+ ) {
355
+ // 14.1.3 - Accumulateur gaz
356
+ di.qp0 = (1.5 * di.pn) / 100;
357
+
358
+ di.rendement_generation = rg_accumulateur_gaz(di, besoin_ecs);
359
+ di.rendement_generation_depensier = rg_accumulateur_gaz(di, besoin_ecs_dep);
360
+ Iecs = 1 / di.rendement_generation;
361
+ Iecs_dep = 1 / di.rendement_generation_depensier;
362
+ } else {
363
+ console.warn(`!! type_generateur_ecs ${type_generateur} non implémenté !!`);
364
+ }
365
+ } else {
366
+ Iecs = 1;
367
+ Iecs_dep = 1;
368
+ }
369
+ conso_aux_gen(di, de, 'ecs', besoin_ecs, besoin_ecs_dep);
370
+
371
+ const rd = ecs_di.rendement_distribution;
372
+ Iecs = Iecs / rd;
373
+ Iecs_dep = Iecs_dep / rd;
374
+
375
+ // Système ECS avec solaire (paragraphe 11.3 de la doc Méthode de calcul 3CL-DPE 2021)
376
+ if (ecs_de.enum_type_installation_solaire_id) {
377
+ tv_facteur_couverture_solaire(ecs_di, ecs_de, zc_id, th);
378
+
379
+ di.conso_ecs = ecs_di.besoin_ecs * (1 - ecs_di.fecs) * Iecs;
380
+ di.conso_ecs_depensier = ecs_di.besoin_ecs_depensier * (1 - ecs_di.fecs) * Iecs_dep;
381
+ } else {
382
+ di.conso_ecs = besoin_ecs * Iecs;
383
+ di.conso_ecs_depensier = besoin_ecs_dep * Iecs_dep;
384
+ }
385
+
386
+ gen_ecs.donnee_intermediaire = di;
387
+ gen_ecs.donnee_utilisateur = du;
388
+ }