@open3cl/engine 1.0.6 → 1.0.8
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/11_nadeq.spec.js +3 -2
- package/16.2_production_enr.spec.js +1 -0
- package/3.2.1_mur.spec.js +1 -0
- package/3.2.2_plancher_bas.spec.js +1 -0
- package/3.3_baie_vitree.spec.js +1 -0
- package/6.1_apport_gratuit.spec.js +1 -0
- package/7_inertie.spec.js +4 -3
- package/9_chauffage.spec.js +1 -0
- package/9_conso_ch.spec.js +1 -0
- package/9_generateur_ch.spec.js +1 -0
- package/conso.spec.js +1 -0
- package/core/assets/domain/synchronize-assets.spec.js +9 -9
- package/core/assets/domain/synchronize-c1-tables.spec.js +4 -4
- package/core/assets/domain/synchronize-dpe-ges-limit-values-tables.spec.js +6 -6
- package/core/assets/domain/synchronize-enum-tables.spec.js +10 -10
- package/core/assets/domain/synchronize-solicitations-tables.spec.js +6 -6
- package/core/assets/domain/synchronize-valeur-tables.spec.js +14 -14
- package/core/file/infrastructure/adapter/file.store.spec.js +5 -4
- package/core/tv/infrastructure/tvs.store.spec.js +3 -2
- package/core/util/infrastructure/object-util.spec.js +2 -1
- package/core/util/logger/log-service.js +47 -0
- package/features/dpe/domain/models/baie-ets.model.ts +12 -0
- package/features/dpe/domain/models/baie-vitree.model.ts +97 -0
- package/features/dpe/domain/models/climatisation.model.ts +25 -0
- package/features/dpe/domain/models/dpe.model.ts +194 -0
- package/features/dpe/domain/models/ets.model.ts +19 -0
- package/features/dpe/domain/models/installation-chauffage.model.ts +101 -0
- package/features/dpe/domain/models/installation-ecs.model.ts +76 -0
- package/features/dpe/domain/models/mur.model.ts +37 -0
- package/features/dpe/domain/models/plancher-bas.model.ts +38 -0
- package/features/dpe/domain/models/plancher-haut.model.ts +33 -0
- package/features/dpe/domain/models/pont-thermique.model.ts +21 -0
- package/features/dpe/domain/models/porte.model.ts +31 -0
- package/features/dpe/domain/models/production-elec-enr.model.ts +27 -0
- package/features/dpe/domain/models/sortie.model.ts +178 -0
- package/features/dpe/domain/models/type-habitation.model.js +8 -0
- package/features/dpe/domain/models/type-ventilation.model.js +8 -0
- package/features/dpe/domain/models/ventilation.model.ts +33 -0
- package/features/dpe/infrastructure/baieVitreeTv.store.js +292 -0
- package/features/dpe/infrastructure/baieVitreeTv.store.spec.js +352 -0
- package/features/dpe/infrastructure/tv.store.js +356 -0
- package/features/dpe/infrastructure/tv.store.spec.js +607 -0
- package/features/engine/domain/constants.js +1 -0
- package/features/engine/domain/contexte.builder.js +140 -0
- package/features/engine/domain/contexte.builder.spec.js +152 -0
- package/features/engine/domain/engine.service.js +139 -0
- package/features/engine/domain/engine.service.spec.js +7 -0
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.js +292 -0
- package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +484 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.js +278 -0
- package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +282 -0
- package/features/engine/domain/enveloppe/deperdition.service.js +101 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.js +168 -0
- package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +345 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.js +169 -0
- package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +200 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.js +136 -0
- package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +211 -0
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.js +56 -0
- package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +116 -0
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.js +338 -0
- package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +442 -0
- package/features/engine/domain/models/contexte.model.ts +10 -0
- package/features/engine/domain/models/deperdition.model.ts +8 -0
- package/features/normalizer/domain/dpe-normalizer.service.js +24 -0
- package/features/normalizer/domain/dpe-normalizer.service.spec.js +3 -0
- package/ficheTechnique.spec.js +4 -3
- package/output.js +1 -0
- package/package.json +9 -8
- package/tv-v2.js +79121 -0
- package/utils.js +2 -2
- package/utils.spec.js +4 -3
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { DeperditionService } from '../deperdition.service.js';
|
|
2
|
+
import { inject } from 'dioma';
|
|
3
|
+
import { BaieVitreeTvStore } from '../../../../dpe/infrastructure/baieVitreeTv.store.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Calcul des déperditions des baies vitrées
|
|
7
|
+
* Chapitre 3.3 Calcul des parois vitrées
|
|
8
|
+
*
|
|
9
|
+
* Méthode de calcul 3CL-DPE 2021
|
|
10
|
+
* Octobre 2021
|
|
11
|
+
* @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf
|
|
12
|
+
*/
|
|
13
|
+
export class DeperditionBaieVitreeService extends DeperditionService {
|
|
14
|
+
/**
|
|
15
|
+
* @param tvStore {BaieVitreeTvStore}
|
|
16
|
+
*/
|
|
17
|
+
constructor(tvStore = inject(BaieVitreeTvStore)) {
|
|
18
|
+
super(tvStore);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param ctx {Contexte}
|
|
23
|
+
* @param bv {BaieVitree}
|
|
24
|
+
* @return {BaieVitreeDI}
|
|
25
|
+
*/
|
|
26
|
+
execute(ctx, bv) {
|
|
27
|
+
const bvDE = bv.donnee_entree;
|
|
28
|
+
|
|
29
|
+
const b = this.b({
|
|
30
|
+
enumTypeAdjacenceId: bvDE.enum_type_adjacence_id,
|
|
31
|
+
surfaceAiu: bvDE.surface_aiu,
|
|
32
|
+
surfaceAue: bvDE.surface_aue,
|
|
33
|
+
enumCfgIsolationLncId: bvDE.enum_cfg_isolation_lnc_id,
|
|
34
|
+
zoneClimatiqueId: ctx.zoneClimatiqueId
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
let sw = this.sw(bv);
|
|
38
|
+
const ug = this.ug(bvDE);
|
|
39
|
+
let uw = this.uw(bv, ug);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Si le type de fermeture n'est pas '1: abscence de fermeture pour la baie vitrée',
|
|
43
|
+
* c'est qu'il y a présence d'une fermeture devant la fenêtre. Il faut prendre en compte la résistance de cette fermeture
|
|
44
|
+
*/
|
|
45
|
+
let u_menuiserie = uw;
|
|
46
|
+
let ujn;
|
|
47
|
+
if (parseInt(bvDE.enum_type_fermeture_id) !== 1) {
|
|
48
|
+
ujn = this.ujn(bvDE, uw);
|
|
49
|
+
u_menuiserie = ujn;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const [fe1, fe2] = this.fe(bvDE);
|
|
53
|
+
|
|
54
|
+
/** @type {BaieVitreeDI} */
|
|
55
|
+
return {
|
|
56
|
+
b,
|
|
57
|
+
ug,
|
|
58
|
+
uw,
|
|
59
|
+
ujn,
|
|
60
|
+
u_menuiserie,
|
|
61
|
+
sw,
|
|
62
|
+
fe1,
|
|
63
|
+
fe2
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Coefficient de transmission thermique du vitrage (W/(m².K))
|
|
69
|
+
*
|
|
70
|
+
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
|
|
71
|
+
* @return {number|undefined}
|
|
72
|
+
*/
|
|
73
|
+
ug(bvDE) {
|
|
74
|
+
if (bvDE.ug_saisi) {
|
|
75
|
+
return bvDE.ug_saisi;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Pas de valeur ug pour les parois en brique de verre ou polycarbonate
|
|
79
|
+
if (parseInt(bvDE.enum_type_baie_id) < 4) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const enumTypeVitrageId = bvDE.enum_type_vitrage_id;
|
|
84
|
+
let e, enumTypeGazLameId, enumInclinaisonVitrageId, enumVitrageVir;
|
|
85
|
+
|
|
86
|
+
// Pas de type_gaz_lame, inclinaison_vitrage ou vitrage_vir pour un simple vitrage
|
|
87
|
+
if (enumTypeVitrageId !== '1') {
|
|
88
|
+
e = Math.min(bvDE.epaisseur_lame, 20);
|
|
89
|
+
|
|
90
|
+
const availableEpaisseurs = this.tvStore.getEpaisseurAvailableForUg();
|
|
91
|
+
if (e && !availableEpaisseurs.includes(e)) {
|
|
92
|
+
// 3.3.1 Détermination de la performance du vitrage Ug
|
|
93
|
+
// Attention : si la valeur de l’épaisseur de la lame d’air n’est pas dans le tableau présenté, prendre la valeur directement
|
|
94
|
+
// inférieure qui s’y trouve.
|
|
95
|
+
e = availableEpaisseurs.reduce(
|
|
96
|
+
(closest, num) => (num < e && num > closest ? num : closest),
|
|
97
|
+
-Infinity
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
enumTypeGazLameId = bvDE.enum_type_gaz_lame_id;
|
|
102
|
+
enumInclinaisonVitrageId = bvDE.enum_inclinaison_vitrage_id;
|
|
103
|
+
enumVitrageVir = bvDE.vitrage_vir;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Le Ug d’un survitrage est déterminé en apportant une majoration de 0,1 W/(m².K) au Ug du double vitrage rempli à
|
|
108
|
+
* l’air sec ayant la même épaisseur de lame d’air. Les épaisseurs des lames d’air pour le survitrage sont plafonnées à
|
|
109
|
+
* 20mm. C'est-à-dire que toute lame d’air d’un survitrage d’épaisseur supérieure à 20mm sera traitée dans les calculs
|
|
110
|
+
* comme une lame d’air de 20mm d’épaisseur.
|
|
111
|
+
*/
|
|
112
|
+
if (enumTypeVitrageId === '4') {
|
|
113
|
+
const ug = this.tvStore.getUg('2', '1', enumInclinaisonVitrageId, enumVitrageVir, e);
|
|
114
|
+
|
|
115
|
+
return ug + 0.1;
|
|
116
|
+
} else {
|
|
117
|
+
return this.tvStore.getUg(
|
|
118
|
+
enumTypeVitrageId,
|
|
119
|
+
enumTypeGazLameId,
|
|
120
|
+
enumInclinaisonVitrageId,
|
|
121
|
+
enumVitrageVir,
|
|
122
|
+
e
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Proportion d’énergie solaire incidente qui pénètre dans le logement par la paroi vitrée en prenant en compte
|
|
129
|
+
* les doubles-fenêtres si existantes
|
|
130
|
+
*
|
|
131
|
+
* @param bv {BaieVitree}
|
|
132
|
+
* @return {number|undefined}
|
|
133
|
+
*/
|
|
134
|
+
sw(bv) {
|
|
135
|
+
const bvDE = bv.donnee_entree;
|
|
136
|
+
let sw = this.#sw(bvDE);
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* S'il existe une double-fenêtre, calcul des facteurs sw et uw équivalents
|
|
140
|
+
* 6.2.1 Détermination du facteur solaire
|
|
141
|
+
*/
|
|
142
|
+
if (bvDE.double_fenetre === 1 && bv.baie_vitree_double_fenetre) {
|
|
143
|
+
sw *= this.#sw(bv.baie_vitree_double_fenetre.donnee_entree) || 1;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return sw;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Proportion d’énergie solaire incidente qui pénètre dans le logement par la paroi vitrée
|
|
151
|
+
*
|
|
152
|
+
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
|
|
153
|
+
* @return {number|undefined}
|
|
154
|
+
*/
|
|
155
|
+
#sw(bvDE) {
|
|
156
|
+
if (bvDE.sw_saisi) {
|
|
157
|
+
return bvDE.sw_saisi;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* 6.2.1 Détermination du facteur solaire
|
|
162
|
+
* Les champs vitrage_vir et enum_type_pose_id ne sont pas présentes pour les matériaux 'brique de verre' et 'polycarbonate'
|
|
163
|
+
*
|
|
164
|
+
* enum_type_materiaux_menuiserie_id
|
|
165
|
+
* 1 - brique de verre
|
|
166
|
+
* 2 - polycarbonate
|
|
167
|
+
*/
|
|
168
|
+
let vitrageVir, typePose;
|
|
169
|
+
const typeMateriaux = bvDE.enum_type_materiaux_menuiserie_id;
|
|
170
|
+
|
|
171
|
+
if (![1, 2].includes(parseInt(typeMateriaux))) {
|
|
172
|
+
vitrageVir = bvDE.vitrage_vir;
|
|
173
|
+
typePose = bvDE.enum_type_pose_id;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return this.tvStore.getSw(
|
|
177
|
+
bvDE.enum_type_vitrage_id,
|
|
178
|
+
bvDE.enum_type_baie_id,
|
|
179
|
+
typeMateriaux,
|
|
180
|
+
vitrageVir,
|
|
181
|
+
typePose
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Coefficient de transmission thermique de la fenêtre ou de la porte-fenêtre (vitrage + menuiserie) (W/(m².K)) en prenant en compte
|
|
187
|
+
* les doubles-fenêtres si existantes
|
|
188
|
+
*
|
|
189
|
+
* @param bv {BaieVitree}
|
|
190
|
+
* @param ug {number|undefined}
|
|
191
|
+
* @return {number|undefined}
|
|
192
|
+
*/
|
|
193
|
+
uw(bv, ug) {
|
|
194
|
+
const bvDE = bv.donnee_entree;
|
|
195
|
+
let uw = this.#uw(bvDE, ug);
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* S'il existe une double-fenêtre, calcul des facteurs sw et uw équivalents
|
|
199
|
+
* 3.3.2 Coefficients Uw des fenêtres / portes-fenêtres - Traitement des doubles fenêtre
|
|
200
|
+
*/
|
|
201
|
+
if (bvDE.double_fenetre === 1 && bv.baie_vitree_double_fenetre) {
|
|
202
|
+
const bvDoubleFenetreDE = bv.baie_vitree_double_fenetre.donnee_entree;
|
|
203
|
+
uw = 1 / (1 / uw + 1 / (this.#uw(bvDoubleFenetreDE, this.ug(bvDoubleFenetreDE)) || 1) + 0.07);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return uw;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Coefficient de transmission thermique de la fenêtre ou de la porte-fenêtre (vitrage + menuiserie) (W/(m².K))
|
|
211
|
+
*
|
|
212
|
+
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
|
|
213
|
+
* @param ug {number|undefined}
|
|
214
|
+
* @return {number|undefined}
|
|
215
|
+
*/
|
|
216
|
+
#uw(bvDE, ug) {
|
|
217
|
+
if (bvDE.uw_saisi) {
|
|
218
|
+
return bvDE.uw_saisi;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return this.tvStore.getUw(bvDE.enum_type_baie_id, bvDE.enum_type_materiaux_menuiserie_id, ug);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* 3.3.3 Coefficients Ujn des fenêtres/portes-fenêtres
|
|
226
|
+
* La présence de volets aux fenêtres et portes-fenêtres leur apporte un supplément d’isolation avec une résistance
|
|
227
|
+
* additionnelle ΔR
|
|
228
|
+
*
|
|
229
|
+
* @param bvDE {BaieVitreeDE}
|
|
230
|
+
* @param uw {number}
|
|
231
|
+
* @return {number|undefined}
|
|
232
|
+
*/
|
|
233
|
+
ujn(bvDE, uw) {
|
|
234
|
+
if (bvDE.ujn_saisi) {
|
|
235
|
+
return bvDE.ujn_saisi;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return this.tvStore.getUjn(bvDE.enum_type_fermeture_id, uw);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* 6.2.2 Détermination du facteur d’ensoleillement
|
|
243
|
+
* Prise en comptes des masques qui peuvent faire de l'ombre sur les baies vitrées et influencé le facteur d'ensoleillement
|
|
244
|
+
*
|
|
245
|
+
* @param bvDE {BaieVitreeDE}
|
|
246
|
+
*
|
|
247
|
+
* @return {number[]}
|
|
248
|
+
*/
|
|
249
|
+
fe(bvDE) {
|
|
250
|
+
let fe1 = 1,
|
|
251
|
+
fe2 = 1;
|
|
252
|
+
|
|
253
|
+
// Calcul des incidences des masques non homogènes
|
|
254
|
+
if (bvDE.masque_lointain_non_homogene_collection) {
|
|
255
|
+
let masquesLointainNonHomogene =
|
|
256
|
+
bvDE.masque_lointain_non_homogene_collection.masque_lointain_non_homogene || [];
|
|
257
|
+
|
|
258
|
+
if (!Array.isArray(masquesLointainNonHomogene)) {
|
|
259
|
+
masquesLointainNonHomogene = [masquesLointainNonHomogene];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
fe2 = Math.max(
|
|
263
|
+
0,
|
|
264
|
+
masquesLointainNonHomogene.reduce(
|
|
265
|
+
(acc, masqueLointainNonHomogene) => acc - this.calcOmbre(masqueLointainNonHomogene) / 100,
|
|
266
|
+
1
|
|
267
|
+
)
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Calcul des incidences des masques proches
|
|
272
|
+
if (bvDE.tv_coef_masque_proche_id) {
|
|
273
|
+
fe1 = this.tvStore.getMasqueProche(bvDE.tv_coef_masque_proche_id);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Calcul des incidences des masques proches
|
|
277
|
+
if (bvDE.tv_coef_masque_lointain_homogene_id) {
|
|
278
|
+
fe2 = this.tvStore.getMasqueLointainHomogene(bvDE.tv_coef_masque_lointain_homogene_id);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return [fe1, fe2];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Calcul de l'ombre apportée par un masque lointain non homogène
|
|
286
|
+
* @param masqueLointainNonHomogene {MasqueLointainNonHomogene}
|
|
287
|
+
* @returns {number}
|
|
288
|
+
*/
|
|
289
|
+
calcOmbre(masqueLointainNonHomogene) {
|
|
290
|
+
return this.tvStore.getOmbre(masqueLointainNonHomogene.tv_coef_masque_lointain_non_homogene_id);
|
|
291
|
+
}
|
|
292
|
+
}
|