def test_measure_compatible_model_json(): """Test measure_compatible_model_json.""" room = Room.from_box('TinyHouseZone', 120, 240, 96) inches_conversion = Model.conversion_factor_to_meters('Inches') model = Model('TinyHouse', [room], units='Inches') model_json_path = './tests/simulation/model_inches.json' with open(model_json_path, 'w') as fp: json.dump(model.to_dict(included_prop=['energy']), fp) osm_model_json = measure_compatible_model_json(model_json_path) assert os.path.isfile(osm_model_json) with open(osm_model_json) as json_file: data = json.load(json_file) parsed_model = Model.from_dict(data) assert parsed_model.rooms[0].floor_area == \ pytest.approx(120 * 240 * (inches_conversion ** 2), rel=1e-3) assert parsed_model.rooms[0].volume == \ pytest.approx(120 * 240 * 96 * (inches_conversion ** 3), rel=1e-3) assert parsed_model.units == 'Meters' os.remove(model_json_path) os.remove(osm_model_json)
def model_to_osm(model_json, sim_par_json, folder, check_model, log_file): """Translate a Model JSON file into an OpenStudio Model and corresponding IDF. \n Args: model_json: Full path to a Model JSON file. """ try: # check that the model JSON is there assert os.path.isfile(model_json), \ 'No Model JSON file found at {}.'.format(model_json) # set the default folder if it's not specified if folder is None: folder = os.path.dirname(os.path.abspath(model_json)) # check that the simulation parameters are there if sim_par_json is not None: assert os.path.isfile(sim_par_json), \ 'No simulation parameter file found at {}.'.format(sim_par_json) else: sim_par = SimulationParameter() sim_par.output.add_zone_energy_use() sim_par.output.add_hvac_energy_use() sim_par_dict = sim_par.to_dict() sp_json = os.path.abspath( os.path.join(folder, 'simulation_parameter.json')) with open(sp_json, 'w') as fp: json.dump(sim_par_dict, fp) # run the Model re-serialization and check if specified if check_model: model_json = measure_compatible_model_json(model_json, folder) # Write the osw file to translate the model to osm osw = to_openstudio_osw(folder, model_json, sim_par_json) # run the measure to translate the model JSON to an openstudio measure if osw is not None and os.path.isfile(osw): osm, idf = run_osw(osw) # run the resulting idf through EnergyPlus if idf is not None and os.path.isfile(idf): log_file.write(json.dumps([osm, idf])) else: raise Exception('Running OpenStudio CLI failed.') else: raise Exception('Writing OSW file failed.') except Exception as e: _logger.exception('Model translation failed.\n{}'.format(e)) sys.exit(1) else: sys.exit(0)
def model_to_gbxml(model_json, osw_folder, check_model, minimal, output_file): """Translate a Honeybee Model (HBJSON) to a gbXML file. \b Args: model_json: Full path to a Honeybee Model JSON file (HBJSON). """ try: # set the default folder if it's not specified out_path = None out_directory = os.path.join( hb_folders.default_simulation_folder, 'temp_translate') if output_file.endswith('-'): f_name = os.path.basename(model_json).lower() f_name = f_name.replace('.hbjson', '.xml').replace('.json', '.xml') out_path = os.path.join(out_directory, f_name) # run the Model re-serialization and check if specified if check_model: model_json = measure_compatible_model_json(model_json, out_directory) # Write the osw file and translate the model to gbXML out_f = out_path if output_file.endswith('-') else output_file osw = to_gbxml_osw(model_json, out_f, osw_folder) if minimal: _run_translation_osw(osw, out_path) else: _, idf = run_osw(osw, silent=True) if idf is not None and os.path.isfile(idf): hb_model = Model.from_hbjson(model_json) add_gbxml_space_boundaries(out_f, hb_model) if out_path is not None: # load the JSON string to stdout with open(out_path) as json_file: print(json_file.read()) else: raise Exception('Running OpenStudio CLI failed.') except Exception as e: _logger.exception('Model translation failed.\n{}'.format(e)) sys.exit(1) else: sys.exit(0)
def simulate_model(model_json, epw_file, sim_par_json, base_osw, folder, check_model, log_file): """Simulate a Model JSON file in EnergyPlus. \b Args: model_json: Full path to a Model JSON file. epw_file: Full path to an .epw file. """ try: # get a ddy variable that might get used later epw_folder, epw_file_name = os.path.split(epw_file) ddy_file = os.path.join(epw_folder, epw_file_name.replace('.epw', '.ddy')) # set the default folder to the default if it's not specified if folder is None: proj_name = \ os.path.basename(model_json).replace('.json', '').replace('.hbjson', '') folder = os.path.join(folders.default_simulation_folder, proj_name, 'OpenStudio') preparedir(folder, remove_content=False) # process the simulation parameters and write new ones if necessary def ddy_from_epw(epw_file, sim_par): """Produce a DDY from an EPW file.""" epw_obj = EPW(epw_file) des_days = [ epw_obj.approximate_design_day('WinterDesignDay'), epw_obj.approximate_design_day('SummerDesignDay') ] sim_par.sizing_parameter.design_days = des_days def write_sim_par(sim_par): """Write simulation parameter object to a JSON.""" sim_par_dict = sim_par.to_dict() sp_json = os.path.abspath( os.path.join(folder, 'simulation_parameter.json')) with open(sp_json, 'w') as fp: json.dump(sim_par_dict, fp) return sp_json if sim_par_json is None: # generate some default simulation parameters sim_par = SimulationParameter() sim_par.output.add_zone_energy_use() sim_par.output.add_hvac_energy_use() else: with open(sim_par_json) as json_file: data = json.load(json_file) sim_par = SimulationParameter.from_dict(data) if len(sim_par.sizing_parameter.design_days) == 0 and os.path.isfile( ddy_file): try: sim_par.sizing_parameter.add_from_ddy_996_004(ddy_file) except AssertionError: # no design days within the DDY file ddy_from_epw(epw_file, sim_par) elif len(sim_par.sizing_parameter.design_days) == 0: ddy_from_epw(epw_file, sim_par) sim_par_json = write_sim_par(sim_par) # run the Model re-serialization and check if specified if check_model: model_json = measure_compatible_model_json(model_json, folder) # Write the osw file to translate the model to osm osw = to_openstudio_osw(folder, model_json, sim_par_json, base_osw=base_osw, epw_file=epw_file) # run the measure to translate the model JSON to an openstudio measure if osw is not None and os.path.isfile(osw): gen_files = [osw] if base_osw is None: # separate the OS CLI run from the E+ run osm, idf = run_osw(osw) # run the resulting idf through EnergyPlus if idf is not None and os.path.isfile(idf): gen_files.extend([osm, idf]) sql, eio, rdd, html, err = run_idf(idf, epw_file) if err is not None and os.path.isfile(err): gen_files.extend([sql, eio, rdd, html, err]) else: raise Exception('Running EnergyPlus failed.') else: raise Exception('Running OpenStudio CLI failed.') else: # run the whole simulation with the OpenStudio CLI osm, idf = run_osw(osw, measures_only=False) if idf is not None and os.path.isfile(idf): gen_files.extend([osm, idf]) else: raise Exception('Running OpenStudio CLI failed.') sql, eio, rdd, html, err = output_energyplus_files( os.path.dirname(idf)) if os.path.isfile(err): gen_files.extend([sql, eio, rdd, html, err]) else: raise Exception('Running EnergyPlus failed.') log_file.write(json.dumps(gen_files)) else: raise Exception('Writing OSW file failed.') except Exception as e: _logger.exception('Model simulation failed.\n{}'.format(e)) sys.exit(1) else: sys.exit(0)
def simulate_model(model_json, epw_file, sim_par_json, base_osw, folder, check_model, log_file): """Simulate a Model JSON file in EnergyPlus. \n Args: model_json: Full path to a Model JSON file.\n epw_file: Full path to an .epw file. """ try: # check that the model JSON and the EPW file is there assert os.path.isfile(model_json), \ 'No Model JSON file found at {}.'.format(model_json) assert os.path.isfile(epw_file), \ 'No EPW file found at {}.'.format(epw_file) # ddy variable that might get used later epw_folder, epw_file_name = os.path.split(epw_file) ddy_file = os.path.join(epw_folder, epw_file_name.replace('.epw', '.ddy')) # set the default folder to the default if it's not specified if folder is None: proj_name = os.path.basename(model_json).replace('.json', '') folder = os.path.join(folders.default_simulation_folder, proj_name, 'OpenStudio') preparedir(folder, remove_content=False) # process the simulation parameters and write new ones if necessary def write_sim_par(sim_par): """Write simulation parameter object to a JSON.""" sim_par_dict = sim_par.to_dict() sp_json = os.path.abspath( os.path.join(folder, 'simulation_parameter.json')) with open(sp_json, 'w') as fp: json.dump(sim_par_dict, fp) return sp_json if sim_par_json is None: # generate some default simulation parameters sim_par = SimulationParameter() sim_par.output.add_zone_energy_use() sim_par.output.add_hvac_energy_use() if os.path.isfile(ddy_file): sim_par.sizing_parameter.add_from_ddy_996_004(ddy_file) else: raise ValueError( 'No sim-par-json was input and there is no .ddy file next to ' 'the .epw.\nAt least one of these two cirtieria must be satisfied ' 'for a successful simulation.') sim_par_json = write_sim_par(sim_par) else: assert os.path.isfile(sim_par_json), \ 'No simulation parameter file found at {}.'.format(sim_par_json) with open(sim_par_json) as json_file: data = json.load(json_file) sim_par = SimulationParameter.from_dict(data) if len(sim_par.sizing_parameter.design_days ) == 0 and os.path.isfile(ddy_file): sim_par.sizing_parameter.add_from_ddy_996_004(ddy_file) sim_par_json = write_sim_par(sim_par) elif len(sim_par.sizing_parameter.design_days) == 0: raise ValueError( 'No design days were found in the input sim-par-json and there is ' 'no .ddy file next to the .epw.\nAt least one of these two cirtieria ' 'must be satisfied for a successful simulation.') # run the Model re-serialization and check if specified if check_model: model_json = measure_compatible_model_json(model_json, folder) # Write the osw file to translate the model to osm osw = to_openstudio_osw(folder, model_json, sim_par_json, base_osw=base_osw, epw_file=epw_file) # run the measure to translate the model JSON to an openstudio measure if osw is not None and os.path.isfile(osw): gen_files = [osw] if base_osw is None: # separate the OS CLI run from the E+ run osm, idf = run_osw(osw) # run the resulting idf through EnergyPlus if idf is not None and os.path.isfile(idf): gen_files.extend([osm, idf]) sql, eio, rdd, html, err = run_idf(idf, epw_file) if err is not None and os.path.isfile(err): gen_files.extend([sql, eio, rdd, html, err]) else: raise Exception('Running EnergyPlus failed.') else: raise Exception('Running OpenStudio CLI failed.') else: # run the whole simulation with the OpenStudio CLI osm, idf = run_osw(osw, measures_only=False) if idf is not None and os.path.isfile(idf): gen_files.extend([osm, idf]) else: raise Exception('Running OpenStudio CLI failed.') sql, eio, rdd, html, err = output_energyplus_files( os.path.dirname(idf)) if os.path.isfile(err): gen_files.extend([sql, eio, rdd, html, err]) else: raise Exception('Running EnergyPlus failed.') log_file.write(json.dumps(gen_files)) else: raise Exception('Writing OSW file failed.') except Exception as e: _logger.exception('Model simulation failed.\n{}'.format(e)) sys.exit(1) else: sys.exit(0)