83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
import configuration as c
|
|
import xmltodict
|
|
import json
|
|
from urllib.request import urlopen
|
|
|
|
|
|
print('start opaque surfaces')
|
|
|
|
def process_formula(formula, hdd):
|
|
formula = formula.replace('( hdd < ', '').replace(') ', '').split(':')
|
|
for equation in formula:
|
|
values = equation.split('? ')
|
|
if len(values) == 2:
|
|
if float(values[0]) > hdd:
|
|
return float(values[1])
|
|
else:
|
|
return float(equation)
|
|
|
|
|
|
def create_virtual_no_mass_material(u_value, name, materials, construction):
|
|
r_value = 0
|
|
for key in construction:
|
|
if key != 'virtual_no_mass':
|
|
material_thickness = construction[key]
|
|
material_conductivity = 0
|
|
for material in materials:
|
|
if key in material.keys():
|
|
material_conductivity = material[key]['conductivity']
|
|
if material_conductivity != 0:
|
|
r_value += (material_thickness/material_conductivity)
|
|
else:
|
|
r_value += 0
|
|
r_value = 1/u_value - r_value
|
|
new_virtual_no_mass_material = {
|
|
name: {
|
|
"no_mass": True,
|
|
"thermal_resistance": r_value
|
|
}
|
|
}
|
|
materials.append(new_virtual_no_mass_material)
|
|
|
|
|
|
with open(c.nrcan_urls, 'r') as f:
|
|
urls = xmltodict.parse(f.read(), force_list=['standard'])
|
|
|
|
base_url_construction = urls['nrcan']['@base_url_construction']
|
|
dictionary = {"opaque_surfaces": []}
|
|
no_mass_index = 0
|
|
materials = c.materials['materials']
|
|
for standard in urls['nrcan']['standards_per_period']['standard']:
|
|
constructions_location = standard['constructions_location']
|
|
url = f'{base_url_construction}/{constructions_location}'
|
|
_json = json.loads(urlopen(url).read())
|
|
for climate_zone in c.hdd_canadian_climate_zones.keys():
|
|
for table in _json['tables']['surface_thermal_transmittance']['table']:
|
|
if table['surface'] in c.opaque_surfaces:
|
|
u_value = process_formula(table['formula'], c.hdd_canadian_climate_zones[climate_zone])
|
|
layers = {}
|
|
construction = c.surface_types[table['surface']][c.heavy_light[standard["@period_of_construction"]]]
|
|
for key in construction:
|
|
if key != 'virtual_no_mass':
|
|
layers[key] = construction[key]
|
|
else:
|
|
material_name = f'virtual_no_mass_{no_mass_index}'
|
|
layers[material_name] = 0
|
|
no_mass_index += 1
|
|
create_virtual_no_mass_material(u_value,material_name, materials, construction)
|
|
opaque_surface = {
|
|
f'{standard["@period_of_construction"]}_{climate_zone}': {
|
|
"period_of_construction": f'{standard["@period_of_construction"]}',
|
|
"climate_zone": f'{climate_zone}',
|
|
"type": f"{table['boundary_condition']}{table['surface']}",
|
|
"u_value": u_value,
|
|
"layers": layers
|
|
}
|
|
}
|
|
dictionary['opaque_surfaces'].append(
|
|
opaque_surface
|
|
)
|
|
output_dictionary = {"opaque_surfaces": dictionary['opaque_surfaces'], "materials": materials}
|
|
with open(f'{c.output_path}/opaque_surfaces.json', 'w') as f:
|
|
json.dump(output_dictionary, f, indent=2)
|