def get_results_windows(sql_files):
    # set initial values that will be computed based on results
    total_floor_area, total_energy = 0, 0
    end_uses = OrderedDict()

    # loop through the sql files in the directory and add the energy use
    for result_file in sql_files:
        # parse the SQL file
        sql_obj = SQLiteResult(result_file)
        # get the total floor area of the model
        area_dict = sql_obj.tabular_data_by_name('Building Area')
        areas = tuple(area_dict.values())
        total_floor_area += areas[0][0]
        # get the energy use
        eui_dict = sql_obj.tabular_data_by_name('End Uses By Subcategory')
        for catgory, 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 = catgory.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
    eui = round(total_energy / total_floor_area, 3)
    gross_floor = round(total_floor_area, 3)
    end_use_pairs = OrderedDict([(key, round(val / total_floor_area, 3))
                                 for key, val in end_uses.items()])
    return eui, gross_floor, end_use_pairs
Пример #2
0
def get_results_windows(sql_files):
    # set initial values that will be computed based on results
    total_floor_area, total_energy = 0, 0
    all_uses = \
        ('heating', 'cooling', 'interior_lighting', 'exterior_lighting',
         'interior_equipment', 'exterior_equipment', 'fans', 'pumps',
         'heat_rejection', 'humidification', 'heat_recovery', 'water_systems',
          'refrigeration', 'generators')
    end_uses = OrderedDict()
    for use in all_uses:
        end_uses[use] = 0

    # loop through the sql files in the directory and add the energy use
    for result_file in sql_files:
        # parse the SQL file
        sql_obj = SQLiteResult(result_file)
        # get the total floor area of the model
        area_dict = sql_obj.tabular_data_by_name('Building Area')
        areas = tuple(area_dict.values())
        total_floor_area += areas[0][0]
        # get the energy use
        eui_dict = sql_obj.tabular_data_by_name('End Uses')
        euis = tuple(eui_dict.values())
        total_energy += sum([val for val in euis[-2][:12]])
        end_uses['heating'] += sum([val for val in euis[0][:12]])
        end_uses['cooling'] += sum([val for val in euis[1][:12]])
        end_uses['interior_lighting'] += sum([val for val in euis[2][:12]])
        end_uses['exterior_lighting'] += sum([val for val in euis[3][:12]])
        end_uses['interior_equipment'] += sum([val for val in euis[4][:12]])
        end_uses['exterior_equipment'] += sum([val for val in euis[5][:12]])
        end_uses['fans'] += sum([val for val in euis[6][:12]])
        end_uses['pumps'] += sum([val for val in euis[7][:12]])
        end_uses['heat_rejection'] += sum([val for val in euis[8][:12]])
        end_uses['humidification'] += sum([val for val in euis[9][:12]])
        end_uses['heat_recovery'] += sum([val for val in euis[10][:12]])
        end_uses['water_systems'] += sum([val for val in euis[11][:12]])
        end_uses['refrigeration'] += sum([val for val in euis[12][:12]])
        end_uses['generators'] += sum([val for val in euis[13][:12]])

    # assemble all of the results into a final dictionary
    eui = round(total_energy / total_floor_area, 3)
    gross_floor = round(total_floor_area, 3)
    end_use_pairs = OrderedDict([(key, round(val / total_floor_area, 3))
                                 for key, val in end_uses.items() if val != 0])
    return eui, gross_floor, end_use_pairs
Пример #3
0
def test_sqlite_tabular_data():
    """Test the tabular_data_by_name method."""
    sql_path = './tests/assets/sql/eplusout_monthly.sql'
    sql_obj = SQLiteResult(sql_path)

    data = sql_obj.tabular_data_by_name(
        'Utility Use Per Conditioned Floor Area')
    assert len(data) == 4
    assert len(data['Lighting']) == 6
    col_names = sql_obj.tabular_column_names(
        'Utility Use Per Conditioned Floor Area')
    assert len(col_names) == 6
    assert 'Electricity Intensity' in col_names[0]
Пример #4
0
def tabular_data(result_sql, table_name, output_file):
    """Get all the data within a table of a Summary Report using the table name.

    \b
    Args:
        result_sql: Full path to an SQLite file that was generated by EnergyPlus.
        table_name: Text string for the name of a table within a summary
            report. (eg. 'General').
    """
    try:
        sql_obj = SQLiteResult(result_sql)
        table_dict = sql_obj.tabular_data_by_name(str(table_name))
        output_file.write(json.dumps(list(table_dict.values())))
    except Exception as e:
        _logger.exception('Failed to retrieve table data from sql file.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)
Пример #5
0
def tabular_metadata(result_sql, table_name, output_file):
    """Get a dictionary with the names of a table's rows and columns.

    \b
    Args:
        result_sql: Full path to an SQLite file that was generated by EnergyPlus.
        table_name: Text string for the name of a table within a summary
            report. (eg. 'General').
    """
    try:
        sql_obj = SQLiteResult(result_sql)
        table_dict = sql_obj.tabular_data_by_name(str(table_name))
        row_names = list(table_dict.keys())
        col_names = sql_obj.tabular_column_names(str(table_name))
        output_file.write(json.dumps(
            {'row_names': row_names, 'column_names': col_names}))
    except Exception as e:
        _logger.exception('Failed to retrieve table data from sql file.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)
    raise ImportError('\nFailed to import ladybug:\n\t{}'.format(e))

try:
    from honeybee.config import folders
except ImportError as e:
    raise ImportError('\nFailed to import honeybee:\n\t{}'.format(e))

try:
    from ladybug_rhino.grasshopper import all_required_inputs, list_to_data_tree
except ImportError as e:
    raise ImportError('\nFailed to import ladybug_rhino:\n\t{}'.format(e))

if all_required_inputs(ghenv.Component):
    if os.name == 'nt':  # we are on windows; use IronPython like usual
        sql_obj = SQLiteResult(_sql)  # create the SQL result parsing object
        results = sql_obj.tabular_data_by_name(_table_name)
        values = list_to_data_tree(list(results.values()))
        row_names = list(results.keys())
        col_names = sql_obj.tabular_column_names(_table_name)

    else:  # we are on Mac; sqlite3 module doesn't work in Mac IronPython
        # Execute the honybee CLI to obtain the results via CPython
        cmds = [
            folders.python_exe_path, '-m', 'honeybee_energy', 'result',
            'tabular-data', _sql, _table_name
        ]
        process = subprocess.Popen(cmds, stdout=subprocess.PIPE)
        stdout = process.communicate()
        results = json.loads(stdout[0])
        values = list_to_data_tree(results)
        cmds = [
Пример #7
0
def energy_use_intensity(result_paths, si, output_file):
    """Get information about energy use intensity and an EUI breakdown by end use.

    \b
    Args:
        result_paths: Path to one or more SQLite files that were generated by
            EnergyPlus or folders containing such files. Folders can be from a
            single EnergyPlus simulation or may contain multiple SQLite files.
            EUI will be computed across all files provided.
    """
    try:
        # set initial values that will be computed based on results
        total_floor_area, conditioned_floor_area, total_energy = 0, 0, 0
        all_uses = \
            ('heating', 'cooling', 'interior_lighting', 'exterior_lighting',
             'interior_equipment', 'exterior_equipment', 'fans', 'pumps',
             'heat_rejection', 'humidification', 'heat_recovery', 'water_systems',
             'refrigeration', 'generators')
        end_uses = {}
        for use in all_uses:
            end_uses[use] = 0

        # create a list of sql file path that were either passed directly or are
        # contained within passed folders
        sql_paths = []
        for file_or_folder_path in result_paths:
            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))
            elif file_or_folder_path.endswith('.sql'):
                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())
            total_floor_area += areas[0][0]
            conditioned_floor_area += areas[1][0]
            # get the energy use
            eui_dict = sql_obj.tabular_data_by_name('End Uses')
            euis = tuple(eui_dict.values())
            total_energy += sum([val for val in euis[-2][:12]])
            end_uses['heating'] += sum([val for val in euis[0][:12]])
            end_uses['cooling'] += sum([val for val in euis[1][:12]])
            end_uses['interior_lighting'] += sum([val for val in euis[2][:12]])
            end_uses['exterior_lighting'] += sum([val for val in euis[3][:12]])
            end_uses['interior_equipment'] += sum([val for val in euis[4][:12]])
            end_uses['exterior_equipment'] += sum([val for val in euis[5][:12]])
            end_uses['fans'] += sum([val for val in euis[6][:12]])
            end_uses['pumps'] += sum([val for val in euis[7][:12]])
            end_uses['heat_rejection'] += sum([val for val in euis[8][:12]])
            end_uses['humidification'] += sum([val for val in euis[9][:12]])
            end_uses['heat_recovery'] += sum([val for val in euis[10][:12]])
            end_uses['water_systems'] += sum([val for val in euis[11][:12]])
            end_uses['refrigeration'] += sum([val for val in euis[12][:12]])
            end_uses['generators'] += sum([val for val in euis[13][:12]])

        # assemble all of the results into a final dictionary
        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'] = {key: round(val / total_floor_area, 3)
                                   for key, val in end_uses.items() if val != 0}

        # convert data to IP if requested
        if not si:
            eui_typ, a_typ, e_typ = EnergyIntensity(), Area(), Energy()
            result_dict['eui'] = \
                round(eui_typ.to_ip([result_dict['eui']], 'kWh/m2')[0][0], 3)
            result_dict['total_floor_area'] = \
                round(a_typ.to_ip([result_dict['total_floor_area']], 'm2')[0][0], 3)
            result_dict['conditioned_floor_area'] = \
                round(a_typ.to_ip(
                    [result_dict['conditioned_floor_area']], 'm2')[0][0], 3)
            result_dict['total_energy'] = \
                round(e_typ.to_ip([result_dict['total_energy']], 'kWh')[0][0], 3)
            result_dict['end_uses'] = \
                {key: round(eui_typ.to_ip([val], 'kWh/m2')[0][0], 3)
                 for key, val in result_dict['end_uses'].items()}

        # write everthing into the output file
        output_file.write(json.dumps(result_dict, indent=4))
    except Exception as e:
        _logger.exception('Failed to compute EUI from sql files.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)