Coverage for teaser/data/output/teaserjson_output.py: 100%
201 statements
« prev ^ index » next coverage.py v7.4.4, created at 2025-04-29 16:01 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2025-04-29 16:01 +0000
1"""Saves alls Project data into a json."""
3import json
4import collections
5import teaser
8def save_teaser_json(path, project):
9 """Save a project to a JSON file.
11 The function needs to be written.
13 Parameters
14 ----------
15 path: string
16 complete path to the output file
17 project: Project()
18 Teaser instance of Project()
20 """
21 if path.endswith("json"):
22 path = path
23 else:
24 path = path + ".json"
26 prj_out = collections.OrderedDict()
27 prj_out["project"] = collections.OrderedDict()
28 prj_out["project"]["version"] = teaser.__version__
29 prj_out["project"]["name"] = project.name
30 prj_out["project"]["weather_file_path"] = project.weather_file_path
31 prj_out["project"]["t_soil_mode"] = project.t_soil_mode
32 prj_out["project"]["t_soil_file_path"] = project.t_soil_file_path
33 prj_out["project"]["number_of_elements_calc"] = project.number_of_elements_calc
34 prj_out["project"]["merge_windows_calc"] = project.merge_windows_calc
35 prj_out["project"]["used_library_calc"] = project.used_library_calc
36 prj_out["project"]["modelica_info"] = collections.OrderedDict()
37 prj_out["project"]["modelica_info"]["start_time"] = project.modelica_info.start_time
38 prj_out["project"]["modelica_info"]["stop_time"] = project.modelica_info.stop_time
39 prj_out["project"]["modelica_info"][
40 "interval_output"
41 ] = project.modelica_info.interval_output
42 prj_out["project"]["modelica_info"][
43 "current_solver"
44 ] = project.modelica_info.current_solver
45 prj_out["project"]["modelica_info"][
46 "equidistant_output"
47 ] = project.modelica_info.equidistant_output
48 prj_out["project"]["modelica_info"][
49 "results_at_events"
50 ] = project.modelica_info.results_at_events
51 prj_out["project"]["modelica_info"]["version"] = project.modelica_info.version
52 prj_out["project"]["buildings"] = collections.OrderedDict()
53 __building_class = {
54 "Building": {"construction_data": "undefined", "geometry_data": "undefined"},
55 "Office": {"construction_data": "bmvbs", "geometry_data": "bmvbs_office"},
56 "Institute": {"construction_data": "bmvbs", "geometry_data": "bmvbs_institute"},
57 "Institute4": {"construction_data": "bmvbs", "geometry_data": "bmvbs_institute4"},
58 "Institute8": {"construction_data": "bmvbs", "geometry_data": "bmvbs_institute8"},
59 "SingleFamilyDwelling": {"construction_data": "iwu", "geometry_data": "iwu_single_family_dwelling"},
60 "SingleFamilyHouse": {"construction_data": "tabula_de_standard", "geometry_data": "tabula_de_single_family_house"},
61 "TerracedHouse": {"construction_data": "tabula_de_standard", "geometry_data": "tabula_de_terraced_house"},
62 "MultiFamilyHouse": {"construction_data": "tabula_de_standard", "geometry_data": "tabula_de_multi_family_house"},
63 "ApartmentBlock": {"construction_data": "tabula_de_standard", "geometry_data": "tabula_de_apartment_block"},
64 }
66 for bldg in project.buildings:
67 prj_out["project"]["buildings"][bldg.name] = collections.OrderedDict()
68 prj_out["project"]["buildings"][bldg.name][
69 "classification"
70 ] = collections.OrderedDict()
71 prj_out["project"]["buildings"][bldg.name]["classification"]["class"] = type(
72 bldg
73 ).__name__
74 prj_out["project"]["buildings"][bldg.name]["classification"][
75 "construction_data"
76 ] = __building_class[type(bldg).__name__]["construction_data"]
77 prj_out["project"]["buildings"][bldg.name]["street_name"] = bldg.street_name
78 prj_out["project"]["buildings"][bldg.name]["city"] = bldg.city
79 prj_out["project"]["buildings"][bldg.name][
80 "year_of_construction"
81 ] = bldg.year_of_construction
82 prj_out["project"]["buildings"][bldg.name][
83 "year_of_retrofit"
84 ] = bldg.year_of_retrofit
85 prj_out["project"]["buildings"][bldg.name][
86 "number_of_floors"
87 ] = bldg.number_of_floors
88 prj_out["project"]["buildings"][bldg.name][
89 "height_of_floors"
90 ] = bldg.height_of_floors
91 prj_out["project"]["buildings"][bldg.name][
92 "net_leased_area"
93 ] = bldg.net_leased_area
94 prj_out["project"]["buildings"][bldg.name]["outer_area"] = bldg.outer_area
95 prj_out["project"]["buildings"][bldg.name]["window_area"] = bldg.window_area
96 prj_out["project"]["buildings"][bldg.name]["inner_wall_approximation_approach"] = bldg.inner_wall_approximation_approach
97 if bldg.central_ahu is not None:
98 ahu_out = collections.OrderedDict()
99 ahu_out["heating"] = bldg.central_ahu.heating
100 ahu_out["cooling"] = bldg.central_ahu.cooling
101 ahu_out["dehumidification"] = bldg.central_ahu.dehumidification
102 ahu_out["humidification"] = bldg.central_ahu.humidification
103 ahu_out["heat_recovery"] = bldg.central_ahu.heat_recovery
104 ahu_out[
105 "by_pass_dehumidification"
106 ] = bldg.central_ahu.by_pass_dehumidification
107 ahu_out["efficiency_recovery"] = bldg.central_ahu.efficiency_recovery
108 ahu_out[
109 "efficiency_recovery_false"
110 ] = bldg.central_ahu.efficiency_recovery_false
111 ahu_out[
112 "min_relative_humidity_profile"
113 ] = bldg.central_ahu.min_relative_humidity_profile
114 ahu_out[
115 "max_relative_humidity_profile"
116 ] = bldg.central_ahu.max_relative_humidity_profile
117 ahu_out["v_flow_profile"] = bldg.central_ahu.v_flow_profile
118 ahu_out["temperature_profile"] = bldg.central_ahu.temperature_profile
119 prj_out["project"]["buildings"][bldg.name]["central_ahu"] = ahu_out
120 else:
121 pass
122 prj_out["project"]["buildings"][bldg.name][
123 "thermal_zones"
124 ] = collections.OrderedDict()
125 for zone in bldg.thermal_zones:
127 zone_out = collections.OrderedDict()
129 zone_out["area"] = zone.area
130 zone_out["volume"] = zone.volume
131 zone_out["number_of_floors"] = zone.number_of_floors
132 zone_out["height_of_floors"] = zone.height_of_floors
133 zone_out["t_ground"] = zone.t_ground
134 zone_out["t_ground_amplitude"] = zone.t_ground_amplitude
135 zone_out["time_to_minimal_t_ground"] = zone.time_to_minimal_t_ground
136 zone_out["use_conditions"] = collections.OrderedDict()
137 zone_out["use_conditions"]["usage"] = zone.use_conditions.usage
139 zone_out["use_conditions"][
140 "typical_length"
141 ] = zone.use_conditions.typical_length
142 zone_out["use_conditions"][
143 "typical_width"
144 ] = zone.use_conditions.typical_width
145 zone_out["use_conditions"][
146 "with_heating"
147 ] = zone.use_conditions.with_heating
148 zone_out["use_conditions"][
149 "with_ideal_thresholds"
150 ] = zone.use_conditions.with_ideal_thresholds
151 zone_out["use_conditions"][
152 "T_threshold_heating"
153 ] = zone.use_conditions.T_threshold_heating
154 zone_out["use_conditions"][
155 "T_threshold_cooling"
156 ] = zone.use_conditions.T_threshold_cooling
157 zone_out["use_conditions"][
158 "with_cooling"
159 ] = zone.use_conditions.with_cooling
160 zone_out["use_conditions"][
161 "fixed_heat_flow_rate_persons"
162 ] = zone.use_conditions.fixed_heat_flow_rate_persons
163 zone_out["use_conditions"][
164 "activity_degree_persons"
165 ] = zone.use_conditions.activity_degree_persons
166 zone_out["use_conditions"]["persons"] = zone.use_conditions.persons
167 zone_out["use_conditions"][
168 "internal_gains_moisture_no_people"
169 ] = zone.use_conditions.internal_gains_moisture_no_people
170 zone_out["use_conditions"][
171 "ratio_conv_rad_persons"
172 ] = zone.use_conditions.ratio_conv_rad_persons
173 zone_out["use_conditions"]["machines"] = zone.use_conditions.machines
174 zone_out["use_conditions"][
175 "ratio_conv_rad_machines"
176 ] = zone.use_conditions.ratio_conv_rad_machines
178 zone_out["use_conditions"][
179 "lighting_power"
180 ] = zone.use_conditions.lighting_power
181 zone_out["use_conditions"][
182 "fixed_lighting_power"
183 ] = zone.use_conditions.fixed_lighting_power
184 zone_out["use_conditions"][
185 "use_maintained_illuminance"
186 ] = zone.use_conditions.use_maintained_illuminance
187 zone_out["use_conditions"][
188 "ratio_conv_rad_lighting"
189 ] = zone.use_conditions.ratio_conv_rad_lighting
190 zone_out["use_conditions"][
191 "maintained_illuminance"
192 ] = zone.use_conditions.maintained_illuminance
193 zone_out["use_conditions"][
194 "lighting_efficiency_lumen"
195 ] = zone.use_conditions.lighting_efficiency_lumen
197 zone_out["use_conditions"][
198 "use_constant_infiltration"
199 ] = zone.use_conditions.use_constant_infiltration
200 zone_out["use_conditions"][
201 "base_infiltration"
202 ] = zone.use_conditions.base_infiltration
203 zone_out["use_conditions"][
204 "max_user_infiltration"
205 ] = zone.use_conditions.max_user_infiltration
206 zone_out["use_conditions"][
207 "max_overheating_infiltration"
208 ] = zone.use_conditions.max_overheating_infiltration
209 zone_out["use_conditions"][
210 "max_summer_infiltration"
211 ] = zone.use_conditions.max_summer_infiltration
212 zone_out["use_conditions"][
213 "winter_reduction_infiltration"
214 ] = zone.use_conditions.winter_reduction_infiltration
215 zone_out["use_conditions"]["min_ahu"] = zone.use_conditions.min_ahu
216 zone_out["use_conditions"]["max_ahu"] = zone.use_conditions.max_ahu
217 zone_out["use_conditions"]["with_ahu"] = zone.use_conditions.with_ahu
218 zone_out["use_conditions"][
219 "heating_profile"
220 ] = zone.use_conditions.heating_profile
221 zone_out["use_conditions"][
222 "cooling_profile"
223 ] = zone.use_conditions.cooling_profile
224 zone_out["use_conditions"][
225 "persons_profile"
226 ] = zone.use_conditions.persons_profile
227 zone_out["use_conditions"][
228 "machines_profile"
229 ] = zone.use_conditions.machines_profile
230 zone_out["use_conditions"][
231 "lighting_profile"
232 ] = zone.use_conditions.lighting_profile
234 zone_out["outer_walls"] = collections.OrderedDict()
235 zone_out["doors"] = collections.OrderedDict()
236 zone_out["rooftops"] = collections.OrderedDict()
237 zone_out["ground_floors"] = collections.OrderedDict()
238 zone_out["windows"] = collections.OrderedDict()
239 zone_out["inner_walls"] = collections.OrderedDict()
240 zone_out["floors"] = collections.OrderedDict()
241 zone_out["ceilings"] = collections.OrderedDict()
242 zone_out["interzonal_walls"] = collections.OrderedDict()
243 zone_out["interzonal_floors"] = collections.OrderedDict()
244 zone_out["interzonal_ceilings"] = collections.OrderedDict()
246 for out_wall in zone.outer_walls:
247 zone_out["outer_walls"][out_wall.name] = collections.OrderedDict()
248 set_basic_data(zone_out["outer_walls"][out_wall.name], out_wall)
249 set_layer_data(zone_out["outer_walls"][out_wall.name], out_wall)
250 for door in zone.doors:
251 zone_out["doors"][door.name] = collections.OrderedDict()
252 set_basic_data(zone_out["doors"][door.name], door)
253 set_layer_data(zone_out["doors"][door.name], door)
254 for roof in zone.rooftops:
255 zone_out["rooftops"][roof.name] = collections.OrderedDict()
256 set_basic_data(zone_out["rooftops"][roof.name], roof)
257 set_layer_data(zone_out["rooftops"][roof.name], roof)
258 for gf in zone.ground_floors:
259 zone_out["ground_floors"][gf.name] = collections.OrderedDict()
260 set_basic_data(zone_out["ground_floors"][gf.name], gf)
261 set_layer_data(zone_out["ground_floors"][gf.name], gf)
262 for win in zone.windows:
263 zone_out["windows"][win.name] = collections.OrderedDict()
264 set_basic_data(zone_out["windows"][win.name], win)
265 set_layer_data(zone_out["windows"][win.name], win)
266 for iw in zone.inner_walls:
267 zone_out["inner_walls"][iw.name] = collections.OrderedDict()
268 set_basic_data(zone_out["inner_walls"][iw.name], iw)
269 set_layer_data(zone_out["inner_walls"][iw.name], iw)
270 for floor in zone.floors:
271 zone_out["floors"][floor.name] = collections.OrderedDict()
272 set_basic_data(zone_out["floors"][floor.name], floor)
273 set_layer_data(zone_out["floors"][floor.name], floor)
274 for ceil in zone.ceilings:
275 zone_out["ceilings"][ceil.name] = collections.OrderedDict()
276 set_basic_data(zone_out["ceilings"][ceil.name], ceil)
277 set_layer_data(zone_out["ceilings"][ceil.name], ceil)
278 for izw in zone.interzonal_walls:
279 zone_out["interzonal_walls"][izw.name] \
280 = collections.OrderedDict()
281 zone_out["interzonal_walls"][izw.name]["other_side"] \
282 = izw.other_side.name
283 set_basic_data(zone_out["interzonal_walls"][izw.name], izw)
284 set_layer_data(zone_out["interzonal_walls"][izw.name], izw)
285 for izf in zone.interzonal_floors:
286 zone_out["interzonal_floors"][izf.name] \
287 = collections.OrderedDict()
288 zone_out["interzonal_floors"][izf.name]["other_side"] \
289 = izf.other_side.name
290 set_basic_data(zone_out["interzonal_floors"][izf.name], izf)
291 set_layer_data(zone_out["interzonal_floors"][izf.name], izf)
292 for izc in zone.interzonal_ceilings:
293 zone_out["interzonal_ceilings"][izc.name] \
294 = collections.OrderedDict()
295 zone_out["interzonal_ceilings"][izc.name]["other_side"] \
296 = izc.other_side.name
297 set_basic_data(zone_out["interzonal_ceilings"][izc.name], izc)
298 set_layer_data(zone_out["interzonal_ceilings"][izc.name], izc)
300 prj_out["project"]["buildings"][bldg.name]["thermal_zones"][
301 zone.name
302 ] = zone_out
304 with open(path, "w") as file:
305 file.write(json.dumps(prj_out, indent=4, separators=(",", ": ")))
308def set_basic_data(wall_out, element):
309 """Set basic data of building elements.
311 Parameters
312 ----------
313 wall_out : collection.OrderedDict
314 OrderedDict for walls
316 element : TEASERClass
317 teaser class representation of a building element
319 """
320 wall_out["year_of_construction"] = element.year_of_construction
321 wall_out["year_of_retrofit"] = element.year_of_retrofit
322 wall_out["construction_data"] = element.construction_data
324 wall_out["area"] = element.area
325 wall_out["tilt"] = element.tilt
326 wall_out["orientation"] = element.orientation
328 wall_out["inner_radiation"] = element.inner_radiation
329 wall_out["inner_convection"] = element.inner_convection
331 if (
332 type(element).__name__ == "OuterWall"
333 or type(element).__name__ == "Rooftop"
334 or type(element).__name__ == "Door"
335 or type(element).__name__ == "InterzonalWall"
336 or type(element).__name__ == "InterzonalCeiling"
337 or type(element).__name__ == "InterzonalFloor"
338 ):
340 wall_out["outer_radiation"] = element.outer_radiation
341 wall_out["outer_convection"] = element.outer_convection
343 elif type(element).__name__ == "Window":
345 wall_out["outer_radiation"] = element.outer_radiation
346 wall_out["outer_convection"] = element.outer_convection
347 wall_out["g_value"] = element.g_value
348 wall_out["a_conv"] = element.a_conv
349 wall_out["shading_g_total"] = element.shading_g_total
350 wall_out["shading_max_irr"] = element.shading_max_irr
352 if (
353 type(element).__name__ == "InterzonalWall"
354 or type(element).__name__ == "InterzonalCeiling"
355 or type(element).__name__ == "InterzonalFloor"
356 ):
357 try:
358 wall_out["other_side"] = wall_out.other_side.name
359 except AttributeError:
360 pass
363def set_layer_data(wall_out, element):
364 """Set layer data of building element.
366 Parameters
367 ----------
368 wall_out : collection.OrderedDict
369 OrderedDict for walls
371 element : TEASERClass
372 teaser class representation of a building element
374 """
375 layer_dict = collections.OrderedDict()
376 for layer in element.layer:
378 layer_dict[layer.id] = collections.OrderedDict()
379 layer_dict[layer.id]["thickness"] = layer.thickness
380 layer_dict[layer.id]["material"] = collections.OrderedDict()
381 layer_dict[layer.id]["material"]["name"] = layer.material.name
382 layer_dict[layer.id]["material"]["density"] = layer.material.density
383 layer_dict[layer.id]["material"][
384 "thermal_conduc"
385 ] = layer.material.thermal_conduc
386 layer_dict[layer.id]["material"]["heat_capac"] = layer.material.heat_capac
387 layer_dict[layer.id]["material"]["solar_absorp"] = layer.material.solar_absorp
388 layer_dict[layer.id]["material"]["ir_emissivity"] = layer.material.ir_emissivity
390 wall_out["layer"] = layer_dict