@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.
- package/10_besoin_fr.js +76 -0
- package/10_clim.js +45 -0
- package/11_besoin_ecs.js +25 -0
- package/11_ecs.js +95 -0
- package/11_nadeq.js +87 -0
- package/11_nadeq.spec.js +55 -0
- package/12.4_pac.js +54 -0
- package/13.2_generateur_combustion.js +295 -0
- package/13.2_generateur_combustion_bouilleur.js +173 -0
- package/13.2_generateur_combustion_ch.js +195 -0
- package/13.2_generateur_combustion_chaudiere.js +151 -0
- package/13.2_generateur_pac.js +36 -0
- package/13_rendement_distribution_ecs.js +12 -0
- package/14_generateur_ecs.js +388 -0
- package/15_conso_aux.js +257 -0
- package/16.2_production_enr.js +328 -0
- package/16.2_production_enr.spec.js +251 -0
- package/16_conso_eclairage.js +37 -0
- package/2021_04_13_confort_ete.js +61 -0
- package/2021_04_13_qualite_isolation.js +174 -0
- package/3.1_b.js +141 -0
- package/3.2.1_mur.js +331 -0
- package/3.2.1_mur.spec.js +46 -0
- package/3.2.2_plancher_bas.js +259 -0
- package/3.2.2_plancher_bas.spec.js +88 -0
- package/3.2.3_plancher_haut.js +158 -0
- package/3.3.1.4_porte.js +32 -0
- package/3.3_baie_vitree.js +308 -0
- package/3.3_baie_vitree.spec.js +333 -0
- package/3.4_pont_thermique.js +463 -0
- package/3_deperdition.js +258 -0
- package/4_ventilation.js +197 -0
- package/5_conso_ventilation.js +127 -0
- package/6.1_apport_gratuit.js +61 -0
- package/6.1_apport_gratuit.spec.js +181 -0
- package/6.2_surface_sud_equivalente.js +109 -0
- package/7_inertie.js +178 -0
- package/7_inertie.spec.js +263 -0
- package/8_intermittence.js +5 -0
- package/9_besoin_ch.js +198 -0
- package/9_chauffage.js +291 -0
- package/9_chauffage.spec.js +101 -0
- package/9_conso_ch.js +95 -0
- package/9_conso_ch.spec.js +255 -0
- package/9_emetteur_ch.js +122 -0
- package/9_generateur_ch.js +230 -0
- package/9_generateur_ch.spec.js +87 -0
- package/README.md +43 -0
- package/apport_et_besoin.js +55 -0
- package/conso.js +529 -0
- package/conso.spec.js +90 -0
- package/core/assets/domain/add-additionnal-ue-values-tables.js +57 -0
- package/core/assets/domain/synchronize-assets.js +29 -0
- package/core/assets/domain/synchronize-assets.spec.js +37 -0
- package/core/assets/domain/synchronize-c1-tables.js +61 -0
- package/core/assets/domain/synchronize-c1-tables.spec.js +35 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.js +73 -0
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +72 -0
- package/core/assets/domain/synchronize-enum-tables.js +77 -0
- package/core/assets/domain/synchronize-enum-tables.spec.js +31 -0
- package/core/assets/domain/synchronize-solicitations-tables.js +72 -0
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +47 -0
- package/core/assets/domain/synchronize-valeur-tables.js +146 -0
- package/core/assets/domain/synchronize-valeur-tables.spec.js +54 -0
- package/core/conf/infrastructure/application.config.js +33 -0
- package/core/file/infrastructure/adapter/file.store.js +75 -0
- package/core/file/infrastructure/adapter/file.store.spec.js +30 -0
- package/core/tv/infrastructure/assets/additional-ue-values.js +69 -0
- package/core/tv/infrastructure/tvs.store.js +40 -0
- package/core/tv/infrastructure/tvs.store.spec.js +34 -0
- package/core/util/infrastructure/object-util.js +23 -0
- package/core/util/infrastructure/object-util.spec.js +25 -0
- package/engine.js +503 -0
- package/enums.js +1155 -0
- package/ficheTechnique.js +86 -0
- package/ficheTechnique.spec.js +181 -0
- package/index.js +4 -0
- package/package.json +87 -0
- package/tv/18.2_sollicitations_ext.ods +0 -0
- package/tv/18.5_c1.ods +0 -0
- package/tv/dpe_ges_limit_values.ods +0 -0
- package/tv.js +80811 -0
- package/tvs.d.ts +7 -0
- package/utils.js +500 -0
- package/utils.spec.js +36 -0
package/15_conso_aux.js
ADDED
|
@@ -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
|
+
}
|