DHW bug solved. It had to do with the factor of the building surface. Now getting good results

This commit is contained in:
Oriol Gavalda 2023-04-25 08:24:56 -04:00
parent 3ccda97830
commit 78b21093bb
6 changed files with 17 additions and 17 deletions

View File

@ -20,7 +20,7 @@ from hub.catalog_factories.data_models.cost.cost_helper import CostHelper
class MontrealCustomCatalog(Catalog): class MontrealCustomCatalog(Catalog):
def __init__(self, path): def __init__(self, path):
path = str(path / 'montreal_costs.xml') path = 'C:/Users/JGAVALDA/PycharmProjects/hub/hub/data/costs/montreal_costs.xml'
with open(path) as xml: with open(path) as xml:
self._archetypes = xmltodict.parse(xml.read(), force_list='archetype') self._archetypes = xmltodict.parse(xml.read(), force_list='archetype')
@ -67,7 +67,6 @@ class MontrealCustomCatalog(Catalog):
item_description = self._item_with_refurbishment_values(shell['B30_roofing'], item_type) item_description = self._item_with_refurbishment_values(shell['B30_roofing'], item_type)
items_list.append(item_description) items_list.append(item_description)
general_chapters.append(Chapter('B_shell', items_list)) general_chapters.append(Chapter('B_shell', items_list))
items_list = [] items_list = []
item_type = 'D301010_photovoltaic_system' item_type = 'D301010_photovoltaic_system'
services = entry['D_services'] services = entry['D_services']
@ -82,7 +81,6 @@ class MontrealCustomCatalog(Catalog):
item_description = self._item_with_threesome(services['D50_electrical'], item_type) item_description = self._item_with_threesome(services['D50_electrical'], item_type)
items_list.append(item_description) items_list.append(item_description)
general_chapters.append(Chapter('D_services', items_list)) general_chapters.append(Chapter('D_services', items_list))
allowances = entry['Z_allowances_overhead_profit'] allowances = entry['Z_allowances_overhead_profit']
design_allowance = float(allowances['Z10_design_allowance']['#text']) / 100 design_allowance = float(allowances['Z10_design_allowance']['#text']) / 100
overhead_and_profit = float(allowances['Z20_overhead_profit']['#text']) / 100 overhead_and_profit = float(allowances['Z20_overhead_profit']['#text']) / 100
@ -127,9 +125,9 @@ class MontrealCustomCatalog(Catalog):
for archetype in archetypes: for archetype in archetypes:
function = archetype['@function'] function = archetype['@function']
municipality = archetype['@municipality'] municipality = archetype['@municipality']
country = archetype['@country'] country = 'CA'#archetype['@country']
lod = float(archetype['@lod']) lod = 0 #float(archetype['@lod'])
currency = archetype['currency'] currency = 'CAD'#archetype['currency']
capital_cost = self._get_capital_costs(archetype['capital_cost']) capital_cost = self._get_capital_costs(archetype['capital_cost'])
operational_cost = self._get_operational_costs(archetype['operational_cost']) operational_cost = self._get_operational_costs(archetype['operational_cost'])
end_of_life_cost = float(archetype['end_of_life_cost']['#text']) end_of_life_cost = float(archetype['end_of_life_cost']['#text'])

View File

@ -19,7 +19,7 @@ class CostCatalogFactory:
""" """
def __init__(self, file_type, base_path=None): def __init__(self, file_type, base_path=None):
if base_path is None: if base_path is None:
base_path = Path(Path(__file__).parent.parent / 'data/costs') base_path = 'C:/Users/JGAVALDA/PycharmProjects/hub/hub/data/costs'
self._catalog_type = '_' + file_type.lower() self._catalog_type = '_' + file_type.lower()
self._path = base_path self._path = base_path

View File

@ -429,7 +429,7 @@ class Idf:
method = 'Watts/Area' method = 'Watts/Area'
factor_size = thermal_zone.total_floor_area / thermal_zone.footprint_area factor_size = thermal_zone.total_floor_area / thermal_zone.footprint_area
# todo: revision of values of peak flow (too low). Added a factor, but to check original units # todo: revision of values of peak flow (too low). Added a factor, but to check original units
peak_flow_rate = thermal_zone.domestic_hot_water.peak_flow * factor_size * thermal_zone.total_floor_area peak_flow_rate = thermal_zone.domestic_hot_water.peak_flow * thermal_zone.total_floor_area
# = self._idf.newidfobject(self._DHW) # = self._idf.newidfobject(self._DHW)
# print(vars(_object)) # print(vars(_object))
self._idf.newidfobject(self._DHW, self._idf.newidfobject(self._DHW,
@ -502,7 +502,6 @@ class Idf:
self._add_lighting(thermal_zone, building.name) self._add_lighting(thermal_zone, building.name)
self._add_appliances(thermal_zone, building.name) self._add_appliances(thermal_zone, building.name)
self._add_DHW(thermal_zone, building.name) self._add_DHW(thermal_zone, building.name)
print('after schedules')
if self._export_type == "Surfaces": if self._export_type == "Surfaces":
if building.name in self._target_buildings or building.name in self._adjacent_buildings: if building.name in self._target_buildings or building.name in self._adjacent_buildings:
if building.internal_zones[0].thermal_zones is not None: if building.internal_zones[0].thermal_zones is not None:
@ -608,9 +607,8 @@ class Idf:
wind_exposure = 'WindExposed' wind_exposure = 'WindExposed'
outside_boundary_condition_object = None outside_boundary_condition_object = None
# TODO: set assumption in constants, to select minimun shared area # TODO: set assumption in constants, to select minimun shared area
print(f'wall {surface.name} {surface.percentage_shared}') #print(f'wall {surface.name} {surface.percentage_shared}')
if surface.percentage_shared is not None and surface.percentage_shared > 0: if surface.percentage_shared is not None and surface.percentage_shared > 0.1:
print(f'shared wall {surface.name}')
outside_boundary_condition = 'Surface' outside_boundary_condition = 'Surface'
outside_boundary_condition_object = surface.name outside_boundary_condition_object = surface.name
sun_exposure = 'NoSun' sun_exposure = 'NoSun'
@ -650,7 +648,7 @@ class Idf:
wind_exposure = 'WindExposed' wind_exposure = 'WindExposed'
outside_boundary_condition_object = '' outside_boundary_condition_object = ''
# TODO: set assumption in constants, to select minimun shared area # TODO: set assumption in constants, to select minimun shared area
if boundary.parent_surface.percentage_shared is not None and boundary.parent_surface.percentage_shared >= 0: if boundary.parent_surface.percentage_shared is not None and boundary.parent_surface.percentage_shared >= 0.1:
outside_boundary_condition = 'Surface' outside_boundary_condition = 'Surface'
outside_boundary_condition_object = boundary.parent_surface.name outside_boundary_condition_object = boundary.parent_surface.name
sun_exposure = 'NoSun' sun_exposure = 'NoSun'
@ -663,7 +661,7 @@ class Idf:
construction_name = f'{boundary.construction_name}_{boundary.parent_surface.vegetation.name}' construction_name = f'{boundary.construction_name}_{boundary.parent_surface.vegetation.name}'
else: else:
construction_name = boundary.construction_name construction_name = boundary.construction_name
print(f'shared wall {boundary.parent_surface.name} {outside_boundary_condition_object} {idf_surface_type}') #print(f'shared wall {boundary.parent_surface.name} {outside_boundary_condition_object} {idf_surface_type}')
surface = self._idf.newidfobject(self._SURFACE, Name=f'{boundary.parent_surface.name}', surface = self._idf.newidfobject(self._SURFACE, Name=f'{boundary.parent_surface.name}',
Surface_Type=idf_surface_type, Surface_Type=idf_surface_type,
Zone_Name=zone_name, Zone_Name=zone_name,

View File

@ -55,9 +55,9 @@ class EnergyBuildingsExportsFactory:
""" """
idf_data_path = (Path(__file__).parent / './building_energy/idf_files/').resolve() idf_data_path = (Path(__file__).parent / './building_energy/idf_files/').resolve()
# todo: create a get epw file function based on the city # todo: create a get epw file function based on the city
print('path', idf_data_path) #print('path', idf_data_path)
weather_path = (Path(__file__).parent / '../data/weather/epw/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw').resolve() weather_path = (Path(__file__).parent / '../data/weather/epw/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw').resolve()
print(weather_path) #print(weather_path)
return Idf(self._city, self._path, (idf_data_path / 'Minimal.idf'), (idf_data_path / 'Energy+.idd'), weather_path, return Idf(self._city, self._path, (idf_data_path / 'Minimal.idf'), (idf_data_path / 'Energy+.idd'), weather_path,
target_buildings=self._target_buildings, adjacent_buildings=self._adjacent_buildings) target_buildings=self._target_buildings, adjacent_buildings=self._adjacent_buildings)

View File

@ -162,7 +162,7 @@ class Geojson:
if point[2] < 0.5: if point[2] < 0.5:
ground_line.append(point) ground_line.append(point)
for entry in building_mapped: for entry in building_mapped:
if building_mapped[entry]['shared_points'] <= 3: if building_mapped[entry]['shared_points'] <= 2:
continue continue
line = [building_mapped[entry]['line_start'], building_mapped[entry]['line_end']] line = [building_mapped[entry]['line_start'], building_mapped[entry]['line_end']]
neighbour_line = [building_mapped[entry]['neighbour_line_start'], neighbour_line = [building_mapped[entry]['neighbour_line_start'],
@ -173,6 +173,8 @@ class Geojson:
GeometryHelper.distance_between_points(neighbour_line[0], neighbour_line[1]) - GeometryHelper.distance_between_points(neighbour_line[0], neighbour_line[1]) -
GeometryHelper.distance_between_points(line[1], neighbour_line[0]) - GeometryHelper.distance_between_points(line[1], neighbour_line[0]) -
GeometryHelper.distance_between_points(line[0], neighbour_line[1])) / 2 GeometryHelper.distance_between_points(line[0], neighbour_line[1])) / 2
print(line_shared)
print()
percentage_ground = line_shared / GeometryHelper.distance_between_points(line[0], line[1]) percentage_ground = line_shared / GeometryHelper.distance_between_points(line[0], line[1])
percentage_height = neighbour_height / building.max_height percentage_height = neighbour_height / building.max_height
if percentage_height > 1: if percentage_height > 1:

View File

@ -18,11 +18,13 @@ class TestCostsCatalog(TestCase):
self.assertIsNotNone(catalog, 'catalog is none') self.assertIsNotNone(catalog, 'catalog is none')
content = catalog.entries() content = catalog.entries()
self.assertTrue(len(content.archetypes) == 2) self.assertTrue(len(content.archetypes) == 2)
print(catalog)
# retrieving all the entries should not raise any exceptions # retrieving all the entries should not raise any exceptions
for category in catalog_categories: for category in catalog_categories:
for value in catalog_categories[category]: for value in catalog_categories[category]:
catalog.get_entry(value) catalog.get_entry(value)
print(value)
with self.assertRaises(IndexError): with self.assertRaises(IndexError):
catalog.get_entry('unknown') catalog.get_entry('unknown')