@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,255 @@
1
+ import { conso_ch } from './9_conso_ch.js';
2
+
3
+ describe('Recherche de bugs dans le calcul de la consommation du chauffage', () => {
4
+ test('calcul de la consommation du chauffage pour 2475E2510509B', () => {
5
+ const di = {
6
+ rendement_generation: 1,
7
+ rg: 1,
8
+ rg_dep: 1,
9
+ conso_auxiliaire_generation_ch: 0,
10
+ conso_auxiliaire_generation_ch_depensier: 0
11
+ };
12
+
13
+ const de = {
14
+ description: 'Electrique - Convecteur électrique NFC, NF** et NF***',
15
+ reference: 'Generateur:2024_07_11_09_30_44_722898200737262#1',
16
+ reference_generateur_mixte: '',
17
+ ref_produit_generateur_ch: 'Sans Objet',
18
+ enum_type_generateur_ch_id: '98',
19
+ enum_usage_generateur_id: '1',
20
+ enum_type_energie_id: '1',
21
+ position_volume_chauffe: 1,
22
+ tv_rendement_generation_id: 29,
23
+ identifiant_reseau_chaleur: '',
24
+ enum_methode_saisie_carac_sys_id: '1',
25
+ enum_lien_generateur_emetteur_id: '1'
26
+ };
27
+
28
+ const du = {
29
+ enum_usage_generateur_id: ['1', '2', '3'],
30
+ enum_type_generateur_ch_id: [
31
+ '1',
32
+ '2',
33
+ '3',
34
+ '4',
35
+ '5',
36
+ '6',
37
+ '7',
38
+ '8',
39
+ '9',
40
+ '10',
41
+ '11',
42
+ '12',
43
+ '13',
44
+ '14',
45
+ '15',
46
+ '16',
47
+ '17',
48
+ '18',
49
+ '19',
50
+ '20',
51
+ '21',
52
+ '22',
53
+ '23',
54
+ '24',
55
+ '25',
56
+ '26',
57
+ '27',
58
+ '28',
59
+ '29',
60
+ '30',
61
+ '31',
62
+ '32',
63
+ '33',
64
+ '34',
65
+ '35',
66
+ '36',
67
+ '37',
68
+ '38',
69
+ '39',
70
+ '40',
71
+ '41',
72
+ '42',
73
+ '43',
74
+ '44',
75
+ '45',
76
+ '46',
77
+ '47',
78
+ '48',
79
+ '49',
80
+ '50',
81
+ '51',
82
+ '52',
83
+ '53',
84
+ '54',
85
+ '55',
86
+ '56',
87
+ '57',
88
+ '58',
89
+ '59',
90
+ '60',
91
+ '61',
92
+ '62',
93
+ '63',
94
+ '64',
95
+ '65',
96
+ '66',
97
+ '67',
98
+ '68',
99
+ '69',
100
+ '70',
101
+ '71',
102
+ '72',
103
+ '73',
104
+ '74',
105
+ '75',
106
+ '76',
107
+ '77',
108
+ '78',
109
+ '79',
110
+ '80',
111
+ '81',
112
+ '82',
113
+ '83',
114
+ '84',
115
+ '85',
116
+ '86',
117
+ '87',
118
+ '88',
119
+ '89',
120
+ '90',
121
+ '91',
122
+ '92',
123
+ '93',
124
+ '94',
125
+ '95',
126
+ '96',
127
+ '97',
128
+ '98',
129
+ '99',
130
+ '100',
131
+ '101',
132
+ '102',
133
+ '103',
134
+ '104',
135
+ '105',
136
+ '106',
137
+ '107',
138
+ '108',
139
+ '109',
140
+ '110',
141
+ '111',
142
+ '112',
143
+ '113',
144
+ '114',
145
+ '115',
146
+ '116',
147
+ '117',
148
+ '118',
149
+ '119',
150
+ '120',
151
+ '121',
152
+ '122',
153
+ '123',
154
+ '124',
155
+ '125',
156
+ '126',
157
+ '127',
158
+ '128',
159
+ '129',
160
+ '130',
161
+ '131',
162
+ '132',
163
+ '133',
164
+ '134',
165
+ '135',
166
+ '136',
167
+ '137',
168
+ '138',
169
+ '139',
170
+ '140',
171
+ '141',
172
+ '142',
173
+ '143',
174
+ '144',
175
+ '145',
176
+ '146',
177
+ '147',
178
+ '148',
179
+ '149',
180
+ '150',
181
+ '151',
182
+ '152',
183
+ '153',
184
+ '154',
185
+ '155',
186
+ '156',
187
+ '157',
188
+ '158',
189
+ '159',
190
+ '160',
191
+ '161',
192
+ '162',
193
+ '163',
194
+ '164',
195
+ '165',
196
+ '166',
197
+ '167',
198
+ '168',
199
+ '169',
200
+ '170',
201
+ '171'
202
+ ]
203
+ };
204
+ const _pos = 0;
205
+
206
+ const cfg_ch = 'installation de chauffage simple';
207
+
208
+ const em_list = [
209
+ {
210
+ donnee_entree: {
211
+ description: '',
212
+ reference: 'Emetteur:2024_07_11_09_30_44_722898200737262#1',
213
+ surface_chauffee: 22.76,
214
+ tv_rendement_emission_id: 1,
215
+ tv_rendement_distribution_ch_id: 1,
216
+ tv_rendement_regulation_id: 1,
217
+ enum_type_emission_distribution_id: '1',
218
+ tv_intermittence_id: 138,
219
+ reseau_distribution_isole: 0,
220
+ enum_equipement_intermittence_id: '4',
221
+ enum_type_regulation_id: '2',
222
+ enum_periode_installation_emetteur_id: '1',
223
+ enum_type_chauffage_id: '1',
224
+ enum_temp_distribution_ch_id: '1',
225
+ enum_lien_generateur_emetteur_id: '1'
226
+ },
227
+ donnee_intermediaire: {
228
+ rendement_distribution: 1,
229
+ rendement_emission: 0.95,
230
+ rendement_regulation: 0.99,
231
+ i0: 0.86
232
+ },
233
+ donnee_utilisateur: {}
234
+ }
235
+ ];
236
+
237
+ const GV = 150.18558182166174;
238
+ const Sh = 22.76;
239
+ const hsp = 2.5700000000000003;
240
+ const bch = 8001.0714;
241
+ const bch_dep = 9714.925476692655;
242
+
243
+ conso_ch(di, de, du, _pos, cfg_ch, em_list, GV, Sh, hsp, bch, bch_dep);
244
+
245
+ expect(di).toStrictEqual({
246
+ conso_auxiliaire_generation_ch: 0,
247
+ conso_auxiliaire_generation_ch_depensier: 0,
248
+ conso_ch: 6324.781622192915,
249
+ conso_ch_depensier: 7679.569278179351,
250
+ rendement_generation: 1,
251
+ rg: 1,
252
+ rg_dep: 1
253
+ });
254
+ });
255
+ });
@@ -0,0 +1,122 @@
1
+ import { bug_for_bug_compat, tv } from './utils.js';
2
+ import { TvsStore } from './core/tv/infrastructure/tvs.store.js';
3
+
4
+ const tvsStore = new TvsStore();
5
+
6
+ export function rendement_emission(em) {
7
+ const re = em.donnee_intermediaire.rendement_emission;
8
+ const rd = em.donnee_intermediaire.rendement_distribution;
9
+ const rr = em.donnee_intermediaire.rendement_regulation;
10
+ return re * rd * rr;
11
+ }
12
+
13
+ function tv_rendement_distribution_ch(di, de) {
14
+ let row;
15
+
16
+ row = tvsStore.getRendementDistributionCh(
17
+ de.enum_type_emission_distribution_id,
18
+ de.reseau_distribution_isole
19
+ );
20
+
21
+ if (!row && de.tv_rendement_distribution_ch_id) {
22
+ // Find rendement distribution by id if it exists
23
+ row = tvsStore.getRendementDistributionChById(de.tv_rendement_distribution_ch_id);
24
+ }
25
+
26
+ if (row) {
27
+ di.rendement_distribution = Number(row.rd);
28
+ de.tv_rendement_distribution_ch_id = Number(row.tv_rendement_distribution_ch_id);
29
+ } else {
30
+ console.error('!! pas de valeur forfaitaire trouvée pour rendement_distribution_ch !!');
31
+ }
32
+ }
33
+
34
+ function tv_rendement_emission(di, de) {
35
+ const matcher = {
36
+ enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
37
+ };
38
+ const row = tv('rendement_emission', matcher, de);
39
+ if (row) {
40
+ di.rendement_emission = Number(row.re);
41
+ de.tv_rendement_emission_id = Number(row.tv_rendement_emission_id);
42
+ } else {
43
+ console.error('!! pas de valeur forfaitaire trouvée pour rendement_emission !!');
44
+ }
45
+ }
46
+
47
+ function tv_rendement_regulation(di, de) {
48
+ const matcher = {
49
+ enum_type_emission_distribution_id: de.enum_type_emission_distribution_id
50
+ };
51
+ const row = tv('rendement_regulation', matcher, de);
52
+ if (row) {
53
+ di.rendement_regulation = Number(row.rr);
54
+ de.tv_rendement_regulation_id = Number(row.tv_rendement_regulation_id);
55
+ } else {
56
+ console.error('!! pas de valeur forfaitaire trouvée pour rendement_regulation !!');
57
+ }
58
+ }
59
+
60
+ function tv_intermittence(di, de, inst_ch_de, map_id, inertie_id) {
61
+ let hasComptage = false;
62
+ let row;
63
+
64
+ if (inst_ch_de.ficheTechniqueComptage) {
65
+ // Si une fiche technique permet de connaitre la présence ou non d'un comptage individuel pour le chauffage
66
+ const ficheTechniqueValue = inst_ch_de.ficheTechniqueComptage.valeur;
67
+ hasComptage =
68
+ ficheTechniqueValue &&
69
+ (Number.parseInt(ficheTechniqueValue) === 1 || ficheTechniqueValue.toLowerCase() === 'oui');
70
+ } else {
71
+ if (bug_for_bug_compat) {
72
+ // Si info inconnue, on se base sur tv_intermittence_id pour récupérer cette info
73
+ const inertie = {
74
+ tv_intermittence_id: de.tv_intermittence_id
75
+ };
76
+ row = tv('intermittence', inertie, de);
77
+
78
+ if (row && row.comptage_individuel) {
79
+ hasComptage = row.comptage_individuel.includes('Présence');
80
+ }
81
+ }
82
+ }
83
+
84
+ const matcher = {
85
+ enum_methode_application_dpe_log_id: map_id,
86
+ enum_type_installation_id: inst_ch_de.enum_type_installation_id,
87
+ enum_type_chauffage_id: de.enum_type_chauffage_id,
88
+ enum_equipement_intermittence_id: de.enum_equipement_intermittence_id,
89
+ enum_type_regulation_id: de.enum_type_regulation_id,
90
+ enum_type_emission_distribution_id: de.enum_type_emission_distribution_id,
91
+ comptage_individuel: hasComptage ? 'Présence' : 'Absence'
92
+ };
93
+
94
+ // Pas de valeur d'inertie pour les méthodes d'applications différentes de "dpe maison individuelle"
95
+ // dans le fichier de table de valeur sur l'onglet "intermittence", si on le précise on ne trouve aucune correspondance
96
+ // et la mauvaise valeur est sélectionnée
97
+ if (map_id === '1') {
98
+ matcher.enum_classe_inertie_id = inertie_id;
99
+ }
100
+
101
+ row = tv('intermittence', matcher, de);
102
+ if (row) {
103
+ di.i0 = Number(row.i0);
104
+ de.tv_intermittence_id = Number(row.tv_intermittence_id);
105
+ } else {
106
+ console.error('!! pas de valeur forfaitaire trouvée pour intermittence !!');
107
+ }
108
+ }
109
+
110
+ export function calc_emetteur_ch(em_ch, inst_ch_de, map_id, inertie_id) {
111
+ const de = em_ch.donnee_entree;
112
+ const di = {};
113
+ const du = {};
114
+
115
+ tv_rendement_distribution_ch(di, de);
116
+ tv_rendement_emission(di, de);
117
+ tv_rendement_regulation(di, de);
118
+ tv_intermittence(di, de, inst_ch_de, map_id, inertie_id);
119
+
120
+ em_ch.donnee_intermediaire = di;
121
+ em_ch.donnee_utilisateur = du;
122
+ }
@@ -0,0 +1,230 @@
1
+ import enums from './enums.js';
2
+ import { requestInput, requestInputID, tv, tvColumnIDs } from './utils.js';
3
+ import { conso_aux_distribution_ch, conso_aux_gen } from './15_conso_aux.js';
4
+ import { conso_ch } from './9_conso_ch.js';
5
+ import { calc_generateur_combustion_ch } from './13.2_generateur_combustion_ch.js';
6
+ import { scopOrCop } from './12.4_pac.js';
7
+ import { updateGenerateurCombustion } from './13.2_generateur_combustion.js';
8
+
9
+ function pertes_gen_ch(Bch_hp_j, pn) {
10
+ const pertes = (1.3 * Bch_hp_j) / (0.3 * pn);
11
+ return pertes;
12
+ }
13
+
14
+ function pertes_gen_ecs(nrefj) {
15
+ const pertes = (nrefj * 1790) / 8760;
16
+ return pertes;
17
+ }
18
+
19
+ export function calc_Qrec_gen_j(gen_ch, nrefj, Bch_hp_j) {
20
+ const de = gen_ch.donnee_entree;
21
+ const du = gen_ch.donnee_utilisateur || {};
22
+ const di = gen_ch.donnee_intermediaire;
23
+
24
+ if (de.position_volume_chauffe === 0) return 0;
25
+
26
+ const type_gen_ch = enums.type_generateur_ch[de.enum_type_generateur_ch_id];
27
+ if (type_gen_ch.includes('générateur à air chaud')) return 0;
28
+
29
+ let Cper;
30
+ if (de.presence_ventouse === 1) Cper = 0.75;
31
+ else Cper = 0.5;
32
+
33
+ const usage_generateur = requestInput(de, du, 'usage_generateur');
34
+
35
+ let Dperj;
36
+ if (usage_generateur === 'chauffage') Dperj = Math.min(nrefj, pertes_gen_ch(Bch_hp_j, di.pn));
37
+ else if (usage_generateur === 'ecs') Dperj = pertes_gen_ecs(nrefj);
38
+ else if (usage_generateur === 'chauffage + ecs') {
39
+ Dperj = Math.min(nrefj, pertes_gen_ch(Bch_hp_j, di.pn) + pertes_gen_ecs(nrefj));
40
+ }
41
+
42
+ gen_ch.donnee_utilisateur = du;
43
+ const Qrec_gen_j = 0.48 * Cper * di.qp0 * Dperj || 0;
44
+ return Qrec_gen_j;
45
+ }
46
+
47
+ function tv_rendement_generation(di, de, du) {
48
+ const matcher = {
49
+ enum_type_generateur_ch_id: requestInputID(de, du, 'type_generateur_ch')
50
+ };
51
+ const row = tv('rendement_generation', matcher, de);
52
+ if (row) {
53
+ di.rendement_generation = Number(row.rg);
54
+ di.rg = di.rendement_generation;
55
+ di.rg_dep = di.rendement_generation;
56
+ de.tv_rendement_generation_id = Number(row.tv_rendement_generation_id);
57
+ } else {
58
+ console.error('!! pas de valeur forfaitaire trouvée pour rendement_generation ch !!');
59
+ }
60
+ }
61
+
62
+ export function type_generateur_ch(di, de, du, usage_generateur) {
63
+ let type_generateur;
64
+ if (usage_generateur === 'chauffage') {
65
+ type_generateur = requestInputID(de, du, 'type_generateur_ch');
66
+ } else if (usage_generateur === 'chauffage + ecs') {
67
+ const generateur_ecs = enums.type_generateur_ecs;
68
+ const generateur_ch = enums.type_generateur_ch;
69
+ const generateurs_ch_ecs = Object.keys(generateur_ch).reduce((acc, key) => {
70
+ const gen_ch = generateur_ch[key];
71
+ if (Object.values(generateur_ecs).includes(gen_ch)) acc[key] = gen_ch;
72
+ return acc;
73
+ }, {});
74
+ type_generateur = requestInputID(de, du, 'type_generateur_ch', Object.keys(generateurs_ch_ecs));
75
+ } else {
76
+ console.warn("!! usage_generateur n'est pas 'chauffage' ou 'chauffage + ecs' !!");
77
+ }
78
+ return type_generateur;
79
+ }
80
+
81
+ /**
82
+ * Récupération du type de générateur
83
+ * @param dpe {FullDpe}
84
+ * @param de {Donnee_entree}
85
+ * @param di {Donnee_intermediaire}
86
+ * @param du {Object}
87
+ */
88
+ export function checkForGeneratorType(dpe, de, di, du) {
89
+ const combustion_ids = tvColumnIDs('generateur_combustion', 'type_generateur_ch');
90
+ const pac_ids = tvColumnIDs('scop', 'type_generateur_ch');
91
+
92
+ // Mise à jour du type de générateur si besoin
93
+ updateGenerateurCombustion(dpe, de, 'ch');
94
+
95
+ const usage_generateur = requestInput(de, du, 'usage_generateur');
96
+ const type_gen_ch_id = type_generateur_ch(di, de, du, usage_generateur);
97
+
98
+ let isPacGenerator = pac_ids.includes(type_gen_ch_id);
99
+ let isCombustionGenerator = combustion_ids.includes(type_gen_ch_id);
100
+
101
+ /**
102
+ * Pour le type de chauffage 119 - système collectif par défaut en abscence d'information : chaudière fioul pénalisante,
103
+ * détection en fonction des données d'entrées du type de générateur pour calculer les rendements de l'installation
104
+ *
105
+ * Si présence de tv_generateur_combustion_id dans les données d'entrée alors générateur à combustion
106
+ * Si présence de tv_scop_id dans les données d'entrée alors générateur pompe à chaleur
107
+ */
108
+ if (type_gen_ch_id === '119') {
109
+ isPacGenerator = false;
110
+ isCombustionGenerator = false;
111
+
112
+ if (de.tv_generateur_combustion_id) {
113
+ const row = tv('generateur_combustion', {
114
+ tv_generateur_combustion_id: de.tv_generateur_combustion_id
115
+ });
116
+
117
+ if (row) {
118
+ // On prend par défaut le premier type de générateur pour effectuer les calculs de rendement
119
+ const typeGenerateurCh = row.enum_type_generateur_ch_id?.split('|');
120
+
121
+ if (typeGenerateurCh && typeGenerateurCh.length) {
122
+ de.enum_type_generateur_ch_id = typeGenerateurCh[0];
123
+ }
124
+ }
125
+
126
+ isCombustionGenerator = true;
127
+ } else if (de.tv_scop_id) {
128
+ isPacGenerator = true;
129
+ } else {
130
+ const row = tv('rendement_generation', {
131
+ tv_rendement_generation_id: de.tv_rendement_generation_id
132
+ });
133
+
134
+ if (row) {
135
+ // On prend par défaut le premier type de générateur pour effectuer les calculs de rendement
136
+ const typeGenerateurCh = row.enum_type_generateur_ch_id?.split('|');
137
+
138
+ if (typeGenerateurCh && typeGenerateurCh.length) {
139
+ de.enum_type_generateur_ch_id = typeGenerateurCh[0];
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ du.isPacGenerator = isPacGenerator;
146
+ du.isCombustionGenerator = isCombustionGenerator;
147
+ }
148
+
149
+ export function calc_generateur_ch(
150
+ dpe,
151
+ gen_ch,
152
+ _pos,
153
+ em_ch,
154
+ cfg_ch,
155
+ bch,
156
+ bch_dep,
157
+ GV,
158
+ Sh,
159
+ hsp,
160
+ ca_id,
161
+ zc_id,
162
+ ilpa
163
+ ) {
164
+ const de = gen_ch.donnee_entree;
165
+ const du = gen_ch.donnee_utilisateur || {};
166
+ const di = gen_ch.donnee_intermediaire || {};
167
+
168
+ if (du.isPacGenerator) {
169
+ let em;
170
+
171
+ // Si un seul émetteur de chauffage décrit, on considère que cet émetteur est relié au générateur de chauffage
172
+ if (em_ch.length === 1) {
173
+ em = em_ch[0];
174
+ } else {
175
+ const gen_lge_id = requestInputID(de, du, 'lien_generateur_emetteur');
176
+ em = em_ch.find((em) => em.donnee_entree.enum_lien_generateur_emetteur_id === gen_lge_id);
177
+ }
178
+
179
+ if (em) {
180
+ const ed_id = em.donnee_entree.enum_type_emission_distribution_id;
181
+ scopOrCop(di, de, du, zc_id, ed_id, 'ch');
182
+ } else {
183
+ console.error(
184
+ `Emetteur de chauffage non trouvé pour le générateur ${de.description}, les valeurs intermédiaires saisies sont prises en compte`
185
+ );
186
+
187
+ di.rg = di.scop || di.cop;
188
+ di.rg_dep = di.scop || di.cop;
189
+ }
190
+ } else if (du.isCombustionGenerator) {
191
+ calc_generateur_combustion_ch(dpe, di, de, du);
192
+ } else {
193
+ tv_rendement_generation(di, de, du);
194
+ }
195
+
196
+ conso_aux_gen(di, de, 'ch', bch, bch_dep, Sh);
197
+
198
+ /**
199
+ * 15 Calcul des consommations d’auxiliaires des installations de chauffage (Caux_ch) et d’ECS (Caux_ecs)
200
+ */
201
+ if (hasConsoForAuxDistribution(de.enum_type_generateur_ch_id)) {
202
+ conso_aux_distribution_ch(em_ch, de, di, du, Sh, zc_id, ca_id, ilpa, GV);
203
+ }
204
+
205
+ conso_ch(di, de, du, _pos, cfg_ch, em_ch, GV, Sh, hsp, bch, bch_dep);
206
+
207
+ gen_ch.donnee_intermediaire = di;
208
+ gen_ch.donnee_utilisateur = du;
209
+ }
210
+
211
+ /**
212
+ * 15 Calcul des consommations d’auxiliaires des installations de chauffage (Caux_ch) et d’ECS (Caux_ecs)
213
+ *
214
+ * Les consommations des auxiliaires de distribution de chauffage et d’ECS sont prises nulles pour les installations
215
+ * individuelles en l’absence d’un circulateur externe au générateur. On exclut donc les générateurs suivants :
216
+ *
217
+ * >= 4 - exclusion des PAC air / air
218
+ * >= 20 && <= 47 - exclusion des poêles
219
+ * 53, 54 - exclusion des radiateurs gaz
220
+ * >= 98 && <= 105 - exclusion des émetteurs à effet joule, radiateurs électriques, plafonds / planchers électriques
221
+ *
222
+ */
223
+ export function hasConsoForAuxDistribution(enum_type_generateur_ch_id) {
224
+ return (
225
+ enum_type_generateur_ch_id >= 106 ||
226
+ (enum_type_generateur_ch_id >= 55 && enum_type_generateur_ch_id <= 97) ||
227
+ [48, 49, 50, 51, 52].includes(enum_type_generateur_ch_id) ||
228
+ (enum_type_generateur_ch_id >= 4 && enum_type_generateur_ch_id <= 19)
229
+ );
230
+ }
@@ -0,0 +1,87 @@
1
+ import { calc_generateur_ch } from './9_generateur_ch.js';
2
+
3
+ describe('Recherche de bugs dans le calcul de la consommation des generateurs de chauffage', () => {
4
+ test('calcul de la consommation des generateurs de chauffage pour 2475E2510509B', () => {
5
+ const gen_ch = {
6
+ donnee_entree: {
7
+ description: 'Electrique - Convecteur électrique NFC, NF** et NF***',
8
+ reference: 'Generateur:2024_07_11_09_30_44_722898200737262#1',
9
+ reference_generateur_mixte: '',
10
+ ref_produit_generateur_ch: 'Sans Objet',
11
+ enum_type_generateur_ch_id: '98',
12
+ enum_usage_generateur_id: '1',
13
+ enum_type_energie_id: '1',
14
+ position_volume_chauffe: 1,
15
+ tv_rendement_generation_id: 29,
16
+ identifiant_reseau_chaleur: '',
17
+ enum_methode_saisie_carac_sys_id: '1',
18
+ enum_lien_generateur_emetteur_id: '1'
19
+ }
20
+ };
21
+ const _pos = 0;
22
+ const em_ch = [
23
+ {
24
+ donnee_entree: {
25
+ description: '',
26
+ reference: 'Emetteur:2024_07_11_09_30_44_722898200737262#1',
27
+ surface_chauffee: 22.76,
28
+ tv_rendement_emission_id: 1,
29
+ tv_rendement_distribution_ch_id: 1,
30
+ tv_rendement_regulation_id: 1,
31
+ enum_type_emission_distribution_id: '1',
32
+ tv_intermittence_id: 138,
33
+ reseau_distribution_isole: 0,
34
+ enum_equipement_intermittence_id: '4',
35
+ enum_type_regulation_id: '2',
36
+ enum_periode_installation_emetteur_id: '1',
37
+ enum_type_chauffage_id: '1',
38
+ enum_temp_distribution_ch_id: '1',
39
+ enum_lien_generateur_emetteur_id: '1'
40
+ },
41
+ donnee_intermediaire: {
42
+ rendement_distribution: 1,
43
+ rendement_emission: 0.95,
44
+ rendement_regulation: 0.99,
45
+ i0: 0.86
46
+ },
47
+ donnee_utilisateur: {}
48
+ }
49
+ ];
50
+ const cfg_ch = 'installation de chauffage simple';
51
+ const bch = 8001.0714;
52
+ const bch_dep = 9714.925476692655;
53
+ const GV = 150.18558182166174;
54
+ const Sh = 22.76;
55
+ const Sc = 22.76;
56
+ const hsp = 2.5700000000000003;
57
+ const ca_id = 1;
58
+ const zc_id = 1;
59
+ const ac = 1;
60
+
61
+ calc_generateur_ch(
62
+ gen_ch,
63
+ _pos,
64
+ em_ch,
65
+ cfg_ch,
66
+ bch,
67
+ bch_dep,
68
+ GV,
69
+ Sh,
70
+ Sc,
71
+ hsp,
72
+ ca_id,
73
+ zc_id,
74
+ ac
75
+ );
76
+
77
+ expect(gen_ch.donnee_intermediaire).toStrictEqual({
78
+ conso_auxiliaire_generation_ch: 0,
79
+ conso_auxiliaire_generation_ch_depensier: 0,
80
+ conso_ch: 6324.781622192915, // 7315,978 trouvé par Olivier
81
+ conso_ch_depensier: 7679.569278179351,
82
+ rendement_generation: 1,
83
+ rg: 1,
84
+ rg_dep: 1
85
+ });
86
+ });
87
+ });