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

1"""Saves alls Project data into a json.""" 

2 

3import json 

4import collections 

5import teaser 

6 

7 

8def save_teaser_json(path, project): 

9 """Save a project to a JSON file. 

10 

11 The function needs to be written. 

12 

13 Parameters 

14 ---------- 

15 path: string 

16 complete path to the output file 

17 project: Project() 

18 Teaser instance of Project() 

19 

20 """ 

21 if path.endswith("json"): 

22 path = path 

23 else: 

24 path = path + ".json" 

25 

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 } 

65 

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: 

126 

127 zone_out = collections.OrderedDict() 

128 

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 

138 

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 

177 

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 

196 

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 

233 

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() 

245 

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) 

299 

300 prj_out["project"]["buildings"][bldg.name]["thermal_zones"][ 

301 zone.name 

302 ] = zone_out 

303 

304 with open(path, "w") as file: 

305 file.write(json.dumps(prj_out, indent=4, separators=(",", ": "))) 

306 

307 

308def set_basic_data(wall_out, element): 

309 """Set basic data of building elements. 

310 

311 Parameters 

312 ---------- 

313 wall_out : collection.OrderedDict 

314 OrderedDict for walls 

315 

316 element : TEASERClass 

317 teaser class representation of a building element 

318 

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 

323 

324 wall_out["area"] = element.area 

325 wall_out["tilt"] = element.tilt 

326 wall_out["orientation"] = element.orientation 

327 

328 wall_out["inner_radiation"] = element.inner_radiation 

329 wall_out["inner_convection"] = element.inner_convection 

330 

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 ): 

339 

340 wall_out["outer_radiation"] = element.outer_radiation 

341 wall_out["outer_convection"] = element.outer_convection 

342 

343 elif type(element).__name__ == "Window": 

344 

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 

351 

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 

361 

362 

363def set_layer_data(wall_out, element): 

364 """Set layer data of building element. 

365 

366 Parameters 

367 ---------- 

368 wall_out : collection.OrderedDict 

369 OrderedDict for walls 

370 

371 element : TEASERClass 

372 teaser class representation of a building element 

373 

374 """ 

375 layer_dict = collections.OrderedDict() 

376 for layer in element.layer: 

377 

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 

389 

390 wall_out["layer"] = layer_dict