@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,257 @@
1
+ import enums from './enums.js';
2
+ import tvs from './tv.js';
3
+ import { mois_liste, Tbase } from './utils.js';
4
+
5
+ const G_CHAUDIERE = 20;
6
+ const G_RADIATEURS_GAZ = 40;
7
+ const G_CHAUDIERE_BOIS = 73.3;
8
+ const H_CHAUDIERE = 1.6;
9
+ const H_GENERATEUR_AIR_CHAUD = 4;
10
+ const H_CHAUDIERE_BOIS = 10.5;
11
+
12
+ /**
13
+ * 15.1 Consommation des auxiliaires de génération
14
+ * @param di {Donnee_intermediaire}
15
+ * @param de {Donnee_entree}
16
+ * @param type {'ecs'|'ch'}
17
+ * @param besoin {number} Besoin en chauffage ou ecs pour ce générateur
18
+ * @param besoin_dep {number} Besoin en chauffage ou ecs pour ce générateur (mode dépensier)
19
+ * @param Sh {number} Surface habitable du logement
20
+ */
21
+ export function conso_aux_gen(di, de, type, besoin, besoin_dep, Sh) {
22
+ const typeGenerateur = parseInt(de[`enum_type_generateur_${type}_id`]);
23
+
24
+ const presenceVentilateur = de.presenceVentilateur || 0;
25
+
26
+ const g = getG(type, typeGenerateur, presenceVentilateur === 1);
27
+ const h = getH(type, typeGenerateur, presenceVentilateur === 1);
28
+
29
+ let pe = di.pn / (de.ratio_virtualisation || 1);
30
+
31
+ // Pour les chaudières gaz ou fioul : si Pn > 400 kW alors Pn = 400 kW
32
+ if (g === G_CHAUDIERE && pe > 400000) {
33
+ pe = 400000;
34
+ }
35
+ // Pour les générateurs d’air chaud : si Pn > 300 kW alors Pn = 300 kW
36
+ if (h === H_GENERATEUR_AIR_CHAUD && pe > 300000) {
37
+ pe = 300000;
38
+ }
39
+ // Pour les chaudières bois : si Pn > 70 kW alors Pn = 70 kW
40
+ if (g === G_CHAUDIERE_BOIS && pe > 70000) {
41
+ pe = 70000;
42
+ }
43
+
44
+ const Paux_g_ch = g + (h * (pe / 1000)) / (de.ratio_virtualisation || 1);
45
+
46
+ let ratio = 1;
47
+
48
+ // Pour le chauffage, le besoin de chauffage est proratisé à la surface chauffée
49
+ if (type === 'ch') {
50
+ const Sc = de.surface_chauffee || Sh;
51
+ ratio = Sc / Sh;
52
+ }
53
+
54
+ di[`conso_auxiliaire_generation_${type}`] =
55
+ ((de.ratio_virtualisation || 1) * (Paux_g_ch * besoin * ratio)) / pe || 0;
56
+ di[`conso_auxiliaire_generation_${type}_depensier`] =
57
+ (Paux_g_ch * besoin_dep * ratio) / di.pn || 0;
58
+ }
59
+
60
+ /**
61
+ * Récupération du facteur G en fonction du type de générateur
62
+ * @param type {'ecs'|'ch'}
63
+ * @param id {number}
64
+ * @param presenceVentilateur {boolean} - Seules les chaudières bois assistées par ventilateur sont concernées
65
+ */
66
+ function getG(type, id, presenceVentilateur) {
67
+ const values = {
68
+ ch: [
69
+ { min: 85, max: 97, value: G_CHAUDIERE }, // Chaudières à gaz
70
+ { min: 148, max: 149, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gaz
71
+ { min: 127, max: 139, value: G_CHAUDIERE }, // Chaudière gpl/propane/butane
72
+ { min: 160, max: 161, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane
73
+ { min: 75, max: 84, value: G_CHAUDIERE }, // Chaudières fioul
74
+ { min: 150, max: 151, value: G_CHAUDIERE }, // PAC hybride : partie chaudière fioul
75
+ { min: 53, max: 54, value: G_RADIATEURS_GAZ }, // Radiateur à gaz
76
+ { min: 55, max: 74, value: G_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur
77
+ { min: 152, max: 156, value: G_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois
78
+ ],
79
+ ecs: [
80
+ { min: 45, max: 57, value: G_CHAUDIERE }, // Chaudières à gaz
81
+ { min: 120, max: 121, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gaz
82
+ { min: 92, max: 104, value: G_CHAUDIERE }, // Chaudière gpl/propane/butane
83
+ { min: 132, max: 133, value: G_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane
84
+ { min: 35, max: 44, value: G_CHAUDIERE }, // Chaudières fioul
85
+ { min: 122, max: 123, value: G_CHAUDIERE }, // PAC hybride : partie chaudière fioul
86
+ { min: 13, max: 34, value: G_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur
87
+ { min: 122, max: 123, value: G_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois
88
+ ]
89
+ };
90
+
91
+ return getFacteur(values, type, id, presenceVentilateur);
92
+ }
93
+
94
+ /**
95
+ * Récupération du facteur H en fonction du type de générateur
96
+ * @param type {'ecs'|'ch'}
97
+ * @param id {number}
98
+ * @param presenceVentilateur {boolean} - Seules les chaudières bois assistées par ventilateur sont concernées
99
+ */
100
+ function getH(type, id, presenceVentilateur) {
101
+ const values = {
102
+ ch: [
103
+ { min: 85, max: 97, value: H_CHAUDIERE }, // Chaudières à gaz
104
+ { min: 148, max: 149, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gaz
105
+ { min: 127, max: 139, value: H_CHAUDIERE }, // Chaudière gpl/propane/butane
106
+ { min: 160, max: 161, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane
107
+ { min: 75, max: 84, value: H_CHAUDIERE }, // Chaudières fioul
108
+ { min: 150, max: 151, value: H_CHAUDIERE }, // PAC hybride : partie chaudière fioul
109
+ { min: 50, max: 52, value: H_GENERATEUR_AIR_CHAUD }, // Générateurs à air chaud
110
+ { min: 55, max: 74, value: H_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur
111
+ { min: 152, max: 156, value: H_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois
112
+ ],
113
+ ecs: [
114
+ { min: 45, max: 57, value: H_CHAUDIERE }, // Chaudières à gaz
115
+ { min: 120, max: 121, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gaz
116
+ { min: 92, max: 104, value: H_CHAUDIERE }, // Chaudière gpl/propane/butane
117
+ { min: 132, max: 133, value: H_CHAUDIERE }, // PAC hybride : partie chaudière gpl/propane/butane
118
+ { min: 35, max: 44, value: H_CHAUDIERE }, // Chaudières fioul
119
+ { min: 122, max: 123, value: H_CHAUDIERE }, // PAC hybride : partie chaudière fioul
120
+ { min: 13, max: 34, value: H_CHAUDIERE_BOIS, withVentilateur: true }, // Chaudières bois assistées par ventilateur
121
+ { min: 122, max: 123, value: H_CHAUDIERE_BOIS, withVentilateur: true } // PAC hybride : partie chaudière bois
122
+ ]
123
+ };
124
+
125
+ return getFacteur(values, type, id, presenceVentilateur);
126
+ }
127
+
128
+ function getFacteur(values, type, id, presenceVentilateur) {
129
+ const ranges = values[type] || [];
130
+ for (const range of ranges) {
131
+ if (id >= range.min && id <= range.max) {
132
+ if (!range.withVentilateur || presenceVentilateur) {
133
+ return range.value;
134
+ }
135
+ }
136
+ }
137
+
138
+ return 0;
139
+ }
140
+
141
+ /**
142
+ * Calcul de la consommation des auxiliaires de distribution de chauffage
143
+ * @param em_ch { EmetteurChauffageItem[]}
144
+ * @param de {Donnee_entree} donnée du générateur de chauffage
145
+ * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage
146
+ * @param du {object} donnée utilisateur du générateur de chauffage
147
+ * @param surfaceHabitable {number}
148
+ * @param zcId {number} id de la zone climatique du bien
149
+ * @param caId {number} id de la classe d'altitude du bien
150
+ * @param ilpa {number} 1 si bien à inertie lourde, 0 sinon
151
+ * @param GV {number} déperdition de l'enveloppe
152
+ */
153
+ export function conso_aux_distribution_ch(
154
+ em_ch,
155
+ de,
156
+ di,
157
+ du,
158
+ surfaceHabitable,
159
+ zcId,
160
+ caId,
161
+ ilpa,
162
+ GV
163
+ ) {
164
+ const ca = enums.classe_altitude[caId];
165
+ const zc = enums.zone_climatique[zcId];
166
+
167
+ const Nref19 = tvs.nref19[ilpa];
168
+
169
+ let nref19 = 0;
170
+
171
+ for (const mois of mois_liste) {
172
+ nref19 += Nref19[ca][mois][zc];
173
+ }
174
+
175
+ const Pcircem19 = getPuissanceCirculateur(
176
+ em_ch,
177
+ de,
178
+ di,
179
+ du,
180
+ surfaceHabitable,
181
+ GV,
182
+ Tbase[ca][zc.slice(0, 2)]
183
+ );
184
+
185
+ di[`conso_auxiliaire_distribution_ch`] = (Pcircem19 * nref19) / 1000;
186
+ }
187
+
188
+ /**
189
+ * 15.2.1 Puissance des circulateurs de chauffage
190
+ * @param em_ch { EmetteurChauffageItem[]}
191
+ * @param de {Donnee_entree} donnée du générateur de chauffage
192
+ * @param di {Donnee_intermediaire} donnée intermédiaire du générateur de chauffage
193
+ * @param du {object} donnée utilisateur du générateur de chauffage
194
+ * @param surfaceHabitable {number}
195
+ * @param GV {number} déperdition de l'enveloppe
196
+ * @param Tbase {number} température
197
+ */
198
+ function getPuissanceCirculateur(em_ch, de, di, du, surfaceHabitable, GV, Tbase) {
199
+ const typeEmetteur = parseInt(em_ch[0].donnee_entree.enum_type_emission_distribution_id);
200
+ const temperatureEmetteur = parseInt(em_ch[0].donnee_entree.enum_temp_distribution_ch_id);
201
+
202
+ // Perte de charge de l’émetteur
203
+ let deltaPem = 35;
204
+ let Fcot = 0.802;
205
+
206
+ /**
207
+ * 15.2.1 Puissance des circulateurs de chauffage
208
+ * Plancher/plafond chauffant => deltaPemnom = 15
209
+ * Radiateurs monotube => deltaPemnom = 30
210
+ * Radiateurs autres => deltaPemnom = 10
211
+ */
212
+ if ([6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 43, 44].includes(typeEmetteur)) {
213
+ deltaPem = 15;
214
+ Fcot = 0.156;
215
+ } else if ([24, 25, 26, 27, 28, 29, 30, 31].includes(typeEmetteur)) {
216
+ deltaPem = 30;
217
+ } else if ([10, 19, 32, 33, 34, 35, 36, 37, 38, 39, 45].includes(typeEmetteur)) {
218
+ deltaPem = 10;
219
+ }
220
+
221
+ /**
222
+ * En présence de plusieurs types d’émetteurs, le coefficient Fcot le plus défavorable sera pris, c’est-à-dire pour
223
+ * l’émetteur « Autre ».
224
+ */
225
+ if (em_ch.length > 1) {
226
+ Fcot = 0.802;
227
+ }
228
+
229
+ const nbNiveauChauffage = de.nombre_niveau_installation_ch || 1;
230
+
231
+ // Calcul de la longueur du réseau le plus défavorisé
232
+ const Lem = 5 * Fcot * (nbNiveauChauffage + (surfaceHabitable / nbNiveauChauffage) ** 0.5);
233
+
234
+ // Pertes de charge du réseau (kPa)
235
+ const deltaPemnom = 0.15 * Lem + deltaPem;
236
+
237
+ // Ratio du besoin couvert par l’équipement
238
+ const nbGenerateurCascade = du.nbGenerateurCascade || 1;
239
+ const ratioSurfaceChauffage =
240
+ (de.surface_chauffee || surfaceHabitable) / (surfaceHabitable * nbGenerateurCascade);
241
+
242
+ // Chute nominale de température de dimensionnement
243
+ // 4 - température de distribution de chauffage haute
244
+ const deltaDim = temperatureEmetteur === 4 ? 15 : 7.5;
245
+
246
+ // Puissance nominale en chaud (kW)
247
+ const Pnc = 10 ** -3 * GV * (20 - Tbase);
248
+
249
+ const Qvemnom = (Pnc * ratioSurfaceChauffage) / (1.163 * deltaDim);
250
+
251
+ return Math.max(
252
+ 30,
253
+ 6.44 *
254
+ ((deltaPemnom * Qvemnom) / Math.max(1, surfaceHabitable / 400)) ** 0.676 *
255
+ Math.max(1, surfaceHabitable / 400)
256
+ );
257
+ }
@@ -0,0 +1,328 @@
1
+ import enums from './enums.js';
2
+ import { mois_liste, tv } from './utils.js';
3
+ import tvs from './tv.js';
4
+
5
+ export class ProductionENR {
6
+ #taplpi = {
7
+ chauffage: 0.02,
8
+ ecs: 0.05,
9
+ refroidissement: 0.25,
10
+ eclairage: 0.05,
11
+ auxiliaire_ventilation: 0.5,
12
+ auxiliaire_distribution: 0.05,
13
+ autres: 0.45
14
+ };
15
+
16
+ /**
17
+ * Calcul des consommations d'électricité auto-consommée par enveloppe
18
+ * Mise à jour des conso ef en prenant en compte ces auto-consommations
19
+ * @param productionElecEnr
20
+ * @param Sh {string}
21
+ */
22
+ calculateEnr(productionElecEnr, conso, Sh, th, zc_id) {
23
+ const productionElectricite = {
24
+ conso_elec_ac: 0,
25
+ production_pv: 0,
26
+ conso_elec_ac_ch: 0,
27
+ conso_elec_ac_auxiliaire_generation_ch: 0,
28
+ conso_elec_ac_ecs: 0,
29
+ conso_elec_ac_auxiliaire_generation_ecs: 0,
30
+ conso_elec_ac_fr: 0,
31
+ conso_elec_ac_ventilation: 0,
32
+ conso_elec_ac_eclairage: 0,
33
+ conso_elec_ac_auxiliaire_distribution_ecs: 0,
34
+ conso_elec_ac_auxiliaire_distribution_ch: 0,
35
+ conso_elec_ac_auxiliaire: 0,
36
+ conso_elec_ac_autre_usage: 0
37
+ };
38
+
39
+ if (productionElecEnr && productionElecEnr.donnee_entree.presence_production_pv === 1) {
40
+ // Calcul de l'électricité auto-consommée pour chaque enveloppe
41
+ this.calculateConsoElecAc(productionElectricite, productionElecEnr, conso, zc_id, th, Sh);
42
+
43
+ // Mise à jour des consommations ef en minorant l'énergie consommée par l'énergie autoconsommée par le poste
44
+ this.updateEfConso(productionElectricite, conso, Sh);
45
+ }
46
+
47
+ return {
48
+ production_pv: productionElectricite.production_pv,
49
+ conso_elec_ac: productionElectricite.conso_elec_ac,
50
+ conso_elec_ac_ch: productionElectricite.conso_elec_ac_ch,
51
+ conso_elec_ac_ecs: productionElectricite.conso_elec_ac_ecs,
52
+ conso_elec_ac_fr: productionElectricite.conso_elec_ac_fr,
53
+ conso_elec_ac_eclairage: productionElectricite.conso_elec_ac_eclairage,
54
+ conso_elec_ac_auxiliaire: productionElectricite.conso_elec_ac_auxiliaire,
55
+ conso_elec_ac_autre_usage: productionElectricite.conso_elec_ac_autre_usage
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Calcul de l'électricité auto-consommée pour chaque enveloppe
61
+ * @param productionElectricite production ENR totale du logement
62
+ * @param productionElecEnr installation ENR
63
+ * @param conso
64
+ * @param zc_id
65
+ * @param th
66
+ * @param Sh
67
+ */
68
+ calculateConsoElecAc(productionElectricite, productionElecEnr, conso, zc_id, th, Sh) {
69
+ // Production d’électricité par des capteurs photovoltaïques Ppv (en kWh/m²)
70
+ const Ppv = this.getPpv(productionElecEnr, zc_id);
71
+
72
+ // Consommation annuelle d’électricité pour les autres usages (kWhef/an)
73
+ const CelecTotAu = this.getCelecAu(th, Sh);
74
+
75
+ /**
76
+ * Récupération des consommations électriques pour ch et ecs
77
+ * @type {SortieParEnergieItem}
78
+ */
79
+ let consoElec = conso.sortie_par_energie_collection.sortie_par_energie.find(
80
+ (sortie) => sortie.enum_type_energie_id === '1'
81
+ );
82
+
83
+ /**
84
+ * Consommation totale annuelle d’électricité pour les 5 usages réglementaires et les usages mobiliers (kWhef/an)
85
+ */
86
+ const Celec_tot = consoElec.conso_5_usages + CelecTotAu;
87
+
88
+ // Autoconsommation proratisée à chaque usage
89
+ const production = this.getTapl(conso.ef_conso, consoElec, CelecTotAu, Celec_tot);
90
+
91
+ /**
92
+ * Coefficient de calage représentant le taux d’auto-production maximum pouvant être atteint lorsque
93
+ * la production d’électricité renouvelable augmente
94
+ */
95
+ const Tapl = Object.values(production).reduce((acc, valeur) => acc + valeur, 0);
96
+
97
+ /**
98
+ * Taux de couverture, correspondant au ratio entre la production totale du site et la consommation
99
+ * annuelle tous usages (%)
100
+ */
101
+ const Tcv = Ppv / Celec_tot;
102
+
103
+ /**
104
+ * Taux d’autoproduction, correspondant au rapport entre la production d’électricité autoconsommée et la
105
+ * consommation d’énergie (tous usages) du bâtiment (%)
106
+ */
107
+ const Tap = 1 / (1 / Tcv + 1 / Tapl);
108
+
109
+ // Electricité photovoltaïque autoconsommée (kWhef/an)
110
+ const consoElecAc = Celec_tot * Tap;
111
+
112
+ // Mise à jour des données intermédiaires pour l'installation ENR
113
+ productionElecEnr.donnee_intermediaire = productionElecEnr.donnee_intermediaire
114
+ ? productionElecEnr.donnee_intermediaire
115
+ : {};
116
+ productionElecEnr.donnee_intermediaire.conso_elec_ac = consoElecAc;
117
+ productionElecEnr.donnee_intermediaire.taux_autoproduction = Tap;
118
+ productionElecEnr.donnee_intermediaire.production_pv = Ppv;
119
+
120
+ productionElectricite.conso_elec_ac = consoElecAc;
121
+ productionElectricite.production_pv = Ppv;
122
+
123
+ productionElectricite.conso_elec_ac_ch = (consoElecAc * production.conso_elec_ac_ch) / Tapl;
124
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ch =
125
+ (consoElecAc * production.conso_elec_ac_auxiliaire_generation_ch) / Tapl;
126
+ productionElectricite.conso_elec_ac_ecs = (consoElecAc * production.conso_elec_ac_ecs) / Tapl;
127
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ecs =
128
+ (consoElecAc * production.conso_elec_ac_auxiliaire_generation_ecs) / Tapl;
129
+ productionElectricite.conso_elec_ac_fr = (consoElecAc * production.conso_elec_ac_fr) / Tapl;
130
+ productionElectricite.conso_elec_ac_eclairage =
131
+ (consoElecAc * production.conso_elec_ac_eclairage) / Tapl;
132
+ productionElectricite.conso_elec_ac_ventilation =
133
+ (consoElecAc * production.conso_elec_ac_ventilation) / Tapl;
134
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs =
135
+ (consoElecAc * production.conso_elec_ac_auxiliaire_distribution_ecs) / Tapl;
136
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ch =
137
+ (consoElecAc * production.conso_elec_ac_auxiliaire_distribution_ch) / Tapl;
138
+ productionElectricite.conso_elec_ac_autre_usage =
139
+ CelecTotAu * production.conso_elec_ac_autre_usage;
140
+
141
+ // Energies autoconsommée par les auxiliaires
142
+ const consoAcAuxiliaires =
143
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ch +
144
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ecs +
145
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs +
146
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ch +
147
+ productionElectricite.conso_elec_ac_ventilation;
148
+
149
+ productionElectricite.conso_elec_ac_auxiliaire = consoAcAuxiliaires;
150
+ }
151
+
152
+ /**
153
+ * Mise à jour des consommations ef en minorant l'énergie consommée par l'énergie autoconsommée par chaque enveloppe
154
+ * @param productionElectricite
155
+ * @param conso
156
+ * @param Sh
157
+ */
158
+ updateEfConso(productionElectricite, conso, Sh) {
159
+ conso.ef_conso.conso_ecs -= productionElectricite.conso_elec_ac_ecs;
160
+ conso.ef_conso.conso_ch -= productionElectricite.conso_elec_ac_ch;
161
+ conso.ef_conso.conso_fr -= productionElectricite.conso_elec_ac_fr;
162
+ conso.ef_conso.conso_eclairage -= productionElectricite.conso_elec_ac_eclairage;
163
+ conso.ef_conso.conso_totale_auxiliaire -= productionElectricite.conso_elec_ac_auxiliaire;
164
+
165
+ conso.ef_conso.conso_5_usages -=
166
+ productionElectricite.conso_elec_ac_ecs +
167
+ productionElectricite.conso_elec_ac_ch +
168
+ productionElectricite.conso_elec_ac_fr +
169
+ productionElectricite.conso_elec_ac_eclairage +
170
+ productionElectricite.conso_elec_ac_auxiliaire;
171
+
172
+ conso.ef_conso.conso_5_usages_m2 = Math.floor(conso.ef_conso.conso_5_usages / Sh);
173
+ }
174
+
175
+ /**
176
+ * Calcul des taux d'autoproduction consommés pour chaque enveloppe
177
+ * @param efConso {Ef_conso}
178
+ * @param consoElec
179
+ * @param ccom {number}
180
+ * @param consoElecTotale {number}
181
+ */
182
+ getTapl(efConso, consoElec, ccom, consoElecTotale) {
183
+ const productionElectricite = {
184
+ conso_elec_ac_ch: 0,
185
+ conso_elec_ac_auxiliaire_generation_ch: 0,
186
+ conso_elec_ac_ecs: 0,
187
+ conso_elec_ac_auxiliaire_generation_ecs: 0,
188
+ conso_elec_ac_fr: 0,
189
+ conso_elec_ac_ventilation: 0,
190
+ conso_elec_ac_eclairage: 0,
191
+ conso_elec_ac_auxiliaire_distribution_ecs: 0,
192
+ conso_elec_ac_auxiliaire_distribution_ch: 0,
193
+ conso_elec_ac_autre_usage: 0
194
+ };
195
+
196
+ // Consommation de chauffage récupérée directement depuis les consommations par énergie "électricité"
197
+ const chauffage = consoElec?.conso_ch;
198
+ if (chauffage) {
199
+ productionElectricite.conso_elec_ac_ch =
200
+ (this.#taplpi.chauffage * chauffage) / consoElecTotale;
201
+ }
202
+
203
+ const auxiliaireGenerationCh = efConso.conso_auxiliaire_generation_ch;
204
+ if (auxiliaireGenerationCh) {
205
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ch =
206
+ (this.#taplpi.chauffage * auxiliaireGenerationCh) / consoElecTotale;
207
+ }
208
+
209
+ // Consommation ECS récupérée directement depuis les consommations par énergie "électricité"
210
+ const ecs = consoElec?.conso_ecs;
211
+ if (ecs) {
212
+ productionElectricite.conso_elec_ac_ecs = (this.#taplpi.ecs * ecs) / consoElecTotale;
213
+ }
214
+
215
+ const auxiliaireGenerationEcs = efConso.conso_auxiliaire_generation_ecs;
216
+ if (auxiliaireGenerationEcs) {
217
+ productionElectricite.conso_elec_ac_auxiliaire_generation_ecs =
218
+ (this.#taplpi.ecs * auxiliaireGenerationEcs) / consoElecTotale;
219
+ }
220
+
221
+ const refroidissement = efConso.conso_fr;
222
+ if (refroidissement) {
223
+ productionElectricite.conso_elec_ac_fr =
224
+ (this.#taplpi.refroidissement * refroidissement) / consoElecTotale;
225
+ }
226
+
227
+ const eclairage = efConso.conso_eclairage;
228
+ if (eclairage) {
229
+ productionElectricite.conso_elec_ac_eclairage =
230
+ (this.#taplpi.eclairage * eclairage) / consoElecTotale;
231
+ }
232
+
233
+ const auxiliaireVentilation = efConso.conso_auxiliaire_ventilation;
234
+ if (auxiliaireVentilation) {
235
+ productionElectricite.conso_elec_ac_ventilation =
236
+ (this.#taplpi.auxiliaire_ventilation * auxiliaireVentilation) / consoElecTotale;
237
+ }
238
+
239
+ const auxiliaireDistributionEcs = efConso.conso_auxiliaire_distribution_ecs;
240
+ if (auxiliaireDistributionEcs) {
241
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ecs =
242
+ (this.#taplpi.auxiliaire_distribution * auxiliaireDistributionEcs) / consoElecTotale;
243
+ }
244
+
245
+ const auxiliaireDistributionCh = efConso.conso_auxiliaire_distribution_ch;
246
+ if (auxiliaireDistributionCh) {
247
+ productionElectricite.conso_elec_ac_auxiliaire_distribution_ch =
248
+ (this.#taplpi.auxiliaire_distribution * auxiliaireDistributionCh) / consoElecTotale;
249
+ }
250
+
251
+ productionElectricite.conso_elec_ac_autre_usage =
252
+ (this.#taplpi.autres * ccom) / consoElecTotale;
253
+
254
+ return productionElectricite;
255
+ }
256
+
257
+ /**
258
+ * Consommation annuelle d’électricité pour "autres usages" (kWhef/an)
259
+ * @param th
260
+ * @param Sh
261
+ * @returns {number}
262
+ */
263
+ getCelecAu(th, Sh) {
264
+ /**
265
+ * Cum : consommation annuelle d’électricité des usages mobiliers
266
+ * Maison individuelle 29
267
+ * Immeuble collectif 27
268
+ */
269
+ const Cum = th === 'maison' ? 29 : 27;
270
+
271
+ // Consommation annuelle d’éclairage des parties communes en logement collectif
272
+ const CcomEcl = th === 'maison' ? 0 : 1.1;
273
+
274
+ return (CcomEcl + Cum) * Sh;
275
+ }
276
+
277
+ /**
278
+ * Production d’électricité par l'ensemble des capteurs photovoltaïques Ppv (en kWh/m²)
279
+ *
280
+ * @param productionElecEnr
281
+ * @param zc_id
282
+ * @returns {number}
283
+ */
284
+ getPpv(productionElecEnr, zc_id) {
285
+ const ePvValues = tvs.e_pv;
286
+ const zc = enums.zone_climatique[zc_id];
287
+
288
+ let panneaux_pv_collection = productionElecEnr.panneaux_pv_collection?.panneaux_pv || [];
289
+
290
+ if (!Array.isArray(panneaux_pv_collection)) {
291
+ panneaux_pv_collection = [panneaux_pv_collection];
292
+ }
293
+
294
+ return panneaux_pv_collection.reduce((acc, panneaux_pv) => {
295
+ const row = tv('coef_orientation_pv', {
296
+ enum_orientation_pv_id: panneaux_pv.enum_orientation_pv_id,
297
+ enum_inclinaison_pv_id: panneaux_pv.enum_inclinaison_pv_id
298
+ });
299
+
300
+ if (!row) {
301
+ return acc;
302
+ }
303
+
304
+ /**
305
+ * Coefficient de pondération prenant en compte l’altération par rapport à l’orientation optimale (30° auSud)
306
+ * des panneaux photovoltaïques
307
+ */
308
+ const k = row.coef_orientation_pv;
309
+
310
+ // Surface des panneaux photovoltaïques orientés et inclinés de la même manière (m²)
311
+ const Scapteur = 1.6 * panneaux_pv.nombre_module || panneaux_pv.surface_totale_capteurs;
312
+
313
+ // Rendement moyen des modules
314
+ const r = 0.17;
315
+
316
+ // Coefficient de perte
317
+ const C = 0.86;
318
+
319
+ for (const mois of mois_liste) {
320
+ // Ensoleillement en kWh/m² pour le mois
321
+ const Epv = ePvValues[mois][zc];
322
+ acc += k * Scapteur * r * Epv * C;
323
+ }
324
+
325
+ return acc;
326
+ }, 0);
327
+ }
328
+ }