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