Source code for honeybee_energy.result.eui

"""Module to parse End Use Intensity (EUI) from EnergyPlus results."""
import os
from collections import OrderedDict

from ladybug.sql import SQLiteResult


[docs]def eui_from_sql(sql_results): """Get a dictionary of End Use Intensity (EUI) results from EnergyPlus SQLs. Args: sql_results: The file path of the SQL result file that has been generated from an energy simulation. This can also be a list of SQL result files in which case EUI will be computed across all files. Lastly, it can be a directory or list of directories containing results, in which case, EUI will be calculated form all files ending in .sql. Returns: A dictionary with several keys. - eui -- A number for the total end use intensity. Specifically, this is the sum of all electricity, fuel, district heating/cooling, etc. divided by the gross floor area (including both conditioned and unconditioned spaces). Units are kWh/m2. - total_floor_area -- A number for the gross floor area of the building in m2. This excludes Rooms with True exclude_floor_area property. - conditioned_floor_area -- A number for the conditioned floor area of the building in m2. This excludes Rooms with True exclude_floor_area property. - total_energy -- A number for the total energy use of the building in kWh. - end_uses -- A dictionary with the end use intensity for each of the end uses of the building (eg. heating, cooling, lighting, etc.). """ # set initial values that will be computed based on results total_floor_area, conditioned_floor_area, total_energy = 0, 0, 0 end_uses = OrderedDict() # create a list of sql file path that were either passed directly or are # contained within passed folders if not isinstance(sql_results, (list, tuple)): sql_results = [sql_results] sql_paths = [] for file_or_folder_path in sql_results: if os.path.isdir(file_or_folder_path): for file_path in os.listdir(file_or_folder_path): if file_path.endswith('.sql'): sql_paths.append(os.path.join(file_or_folder_path, file_path)) else: sql_paths.append(file_or_folder_path) # loop through the sql files and add the energy use for sql_path in sql_paths: # parse the SQL file sql_obj = SQLiteResult(sql_path) # get the total floor area of the model area_dict = sql_obj.tabular_data_by_name('Building Area') areas = tuple(area_dict.values()) try: total_floor_area += areas[0][0] conditioned_floor_area += areas[1][0] except IndexError: msg = 'Failed to find the "Building Area" table in the .sql file.' raise ValueError(msg) # get the energy use eui_dict = sql_obj.tabular_data_by_name('End Uses By Subcategory') for category, vals in eui_dict.items(): total_use = sum([val for val in vals[:12]]) if total_use != 0: total_energy += total_use cat, sub_cat = category.split(':') eu_cat = cat if sub_cat == 'General' or sub_cat == 'Other' \ else sub_cat try: end_uses[eu_cat] += total_use except KeyError: end_uses[eu_cat] = total_use # assemble all of the results into a final dictionary if total_floor_area != 0: result_dict = { 'eui': round(total_energy / total_floor_area, 3), 'total_floor_area': total_floor_area, 'conditioned_floor_area': conditioned_floor_area, 'total_energy': round(total_energy, 3) } result_dict['end_uses'] = OrderedDict( [(key, round(val / total_floor_area, 3)) for key, val in end_uses.items()] ) else: result_dict = { 'eui': 0.0, 'total_floor_area': total_floor_area, 'conditioned_floor_area': conditioned_floor_area, 'total_energy': round(total_energy, 3) } result_dict['end_uses'] = OrderedDict([(key, 0.0) for key in end_uses.keys()]) return result_dict