Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Map ResStock outputs to Scout inputs #298

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ namespace :test do
t.warning = false
t.verbose = true
end

desc 'Test creating measure osws'
Rake::TestTask.new('measures_osw') do |t|
t.libs << 'test'
Expand Down
116 changes: 116 additions & 0 deletions measures/ScoutInputReport/measure.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
require 'openstudio'
if File.exists? File.absolute_path(File.join(File.dirname(__FILE__), "../../lib/resources/measures/HPXMLtoOpenStudio/resources")) # Hack to run ResStock on AWS
resources_path = File.absolute_path(File.join(File.dirname(__FILE__), "../../lib/resources/measures/HPXMLtoOpenStudio/resources"))
elsif File.exists? File.absolute_path(File.join(File.dirname(__FILE__), "../../resources/measures/HPXMLtoOpenStudio/resources")) # Hack to run ResStock unit tests locally
resources_path = File.absolute_path(File.join(File.dirname(__FILE__), "../../resources/measures/HPXMLtoOpenStudio/resources"))
elsif File.exists? File.join(OpenStudio::BCLMeasure::userMeasuresDir.to_s, "HPXMLtoOpenStudio/resources") # Hack to run measures in the OS App since applied measures are copied off into a temporary directory
resources_path = File.join(OpenStudio::BCLMeasure::userMeasuresDir.to_s, "HPXMLtoOpenStudio/resources")
else
resources_path = File.absolute_path(File.join(File.dirname(__FILE__), "../HPXMLtoOpenStudio/resources"))
end

# start the measure
class ScoutInputReport < OpenStudio::Measure::ReportingMeasure
# define the name that a user will see, this method may be deprecated as
# the display name in PAT comes from the name field in measure.xml
def name
# Measure name should be the title case of the class name.
return "Scout Input Report"
end

def description
return "Create Scout inputs from ResStock outputs."
end

# define the arguments that the user will input
def arguments
args = OpenStudio::Measure::OSArgumentVector.new

return args
end # end the arguments method

# return a vector of IdfObject's to request EnergyPlus objects needed by the run method
def energyPlusOutputRequests(runner, user_arguments)
super(runner, user_arguments)

results = OpenStudio::IdfObjectVector.new

# TODO

return results
end

def outputs
scout_inputs = [
"heating",
"cooling",
"ventilation",
"lighting",
"refrigeration",
"water_heating",
"mels",
"pcs"
] # TODO

result = OpenStudio::Measure::OSOutputVector.new
scout_inputs.each do |output|
result << OpenStudio::Measure::OSOutput.makeDoubleOutput(output)
end
return result
end

# define what happens when the measure is run
def run(runner, user_arguments)
super(runner, user_arguments)

# use the built-in error checking
if not runner.validateUserArguments(arguments(), user_arguments)
return false
end

# get the last model and sql file
model = runner.lastOpenStudioModel
if model.empty?
runner.registerError("Cannot find last model.")
return false
end
model = model.get

sqlFile = runner.lastEnergyPlusSqlFile
if sqlFile.empty?
runner.registerError("Cannot find last sql file.")
return false
end
sqlFile = sqlFile.get
model.setSqlFile(sqlFile)

# TODO: below is for testing on buildstockbatch
report_sim_output(runner, "heating", 1, "GJ", "GJ")
report_sim_output(runner, "cooling", 2, "GJ", "GJ")
report_sim_output(runner, "ventilation", 3, "GJ", "GJ")
report_sim_output(runner, "lighting", 4, "GJ", "GJ")
report_sim_output(runner, "refrigeration", 5, "GJ", "GJ")
report_sim_output(runner, "water_heating", 6, "GJ", "GJ")
report_sim_output(runner, "MELS", 7, "GJ", "GJ")
report_sim_output(runner, "PCs", 8, "GJ", "GJ")

# close the sql file
sqlFile.close

return true
end # end the run method

def report_sim_output(runner, name, total_val, os_units, desired_units, percent_of_val = 1.0)
total_val = total_val * percent_of_val
if os_units.nil? or desired_units.nil? or os_units == desired_units
valInUnits = total_val
else
valInUnits = UnitConversions.convert(total_val, os_units, desired_units)
end
runner.registerValue(name, valInUnits)
runner.registerInfo("Registering #{valInUnits.round(2)} for #{name}.")
end
end

# register the measure to be used by the application
ScoutInputReport.new.registerWithApplication
101 changes: 101 additions & 0 deletions measures/ScoutInputReport/measure.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<measure>
<schema_version>3.0</schema_version>
<name>scout_input_report</name>
<uid>8eac2843-d645-435d-89fd-e1fad6fd0520</uid>
<version_id>70d147af-4e4d-4739-b9f9-7b85664948b2</version_id>
<version_modified>20190724T224447Z</version_modified>
<xml_checksum>15BF4E57</xml_checksum>
<class_name>ScoutInputReport</class_name>
<display_name>Scout Input Report</display_name>
<description>Create Scout inputs from ResStock outputs.</description>
<modeler_description>TODO</modeler_description>
<arguments/>
<outputs>
<output>
<name>heating</name>
<display_name>heating</display_name>
<short_name>heating</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>cooling</name>
<display_name>cooling</display_name>
<short_name>cooling</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>ventilation</name>
<display_name>ventilation</display_name>
<short_name>ventilation</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>lighting</name>
<display_name>lighting</display_name>
<short_name>lighting</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>refrigeration</name>
<display_name>refrigeration</display_name>
<short_name>refrigeration</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>water_heating</name>
<display_name>water_heating</display_name>
<short_name>water_heating</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>MELS</name>
<display_name>MELS</display_name>
<short_name>MELS</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
<output>
<name>PCs</name>
<display_name>PCs</display_name>
<short_name>PCs</short_name>
<type>Double</type>
<model_dependent>false</model_dependent>
</output>
</outputs>
<provenances/>
<tags>
<tag>Reporting.QAQC</tag>
</tags>
<attributes>
<attribute>
<name>Measure Type</name>
<value>ReportingMeasure</value>
<datatype>string</datatype>
</attribute>
</attributes>
<files>
<file>
<version>
<software_program>OpenStudio</software_program>
<identifier>2.8.1</identifier>
<min_compatible>2.8.1</min_compatible>
</version>
<filename>measure.rb</filename>
<filetype>rb</filetype>
<usage_type>script</usage_type>
<checksum>2DEC0AFA</checksum>
</file>
<file>
<filename>scout_input_report.rb</filename>
<filetype>rb</filetype>
<usage_type>test</usage_type>
<checksum>7ADD31B7</checksum>
</file>
</files>
</measure>
24 changes: 24 additions & 0 deletions measures/ScoutInputReport/tests/scout_input_report.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
require_relative '../../../test/minitest_helper'
require 'openstudio'
require 'openstudio/ruleset/ShowRunnerOutput'
require 'minitest/autorun'
require_relative '../measure.rb'
require 'fileutils'

class ScoutInputReportTest < MiniTest::Test
def test
end

private

def _test_cost_multipliers(osm_file, cost_multipliers)
# load the test model
model = get_model(File.dirname(__FILE__), osm_file)

# create an instance of the measure
measure = SimulationOutputReport.new

# create an instance of a runner
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
end
end
16 changes: 8 additions & 8 deletions resources/measures/HPXMLtoOpenStudio/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
<schema_version>3.0</schema_version>
<name>hpxml_translator</name>
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
<version_id>c29662fb-a712-46d1-9e6c-8d2172375948</version_id>
<version_modified>20190715T222817Z</version_modified>
<version_id>05590eeb-e8d0-4232-8fcc-c957bdb9c173</version_id>
<version_modified>20190724T224449Z</version_modified>
<xml_checksum>D8922A73</xml_checksum>
<class_name>HPXMLTranslator</class_name>
<display_name>HPXML Translator</display_name>
Expand Down Expand Up @@ -405,12 +405,6 @@
<usage_type>resource</usage_type>
<checksum>303BBC7F</checksum>
</file>
<file>
<filename>geometry.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>5E186703</checksum>
</file>
<file>
<filename>weather.rb</filename>
<filetype>rb</filetype>
Expand Down Expand Up @@ -489,5 +483,11 @@
<usage_type>resource</usage_type>
<checksum>B67B4B21</checksum>
</file>
<file>
<filename>geometry.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>7597B2E5</checksum>
</file>
</files>
</measure>
10 changes: 5 additions & 5 deletions test/test_measures_osw.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def test_measures_osw
FileUtils.rm_rf(File.join(parent_dir, "run"))
FileUtils.rm_rf(File.join(parent_dir, "reports"))
end

def run_and_check(in_osw, parent_dir, measures_osw_dir, building_id)
# Create measures.osw
cli_path = OpenStudio.getOpenStudioCLI
Expand All @@ -54,10 +54,10 @@ def run_and_check(in_osw, parent_dir, measures_osw_dir, building_id)
end

def create_buildstock_csv(project_dir, num_samples)
outfile = File.join("..", "test", "test_measures_osw", "buildstock.csv")
outfile = File.join("..", "test", "test_measures_osw", "buildstock.csv")
r = RunSampling.new
r.run(project_dir, num_samples, outfile)

return outfile
end

Expand All @@ -80,12 +80,12 @@ def create_weather_folder(parent_dir, project_dir)

return des
end

def change_building_id(osw, building_id)
json = JSON.parse(File.read(osw), symbolize_names: true)
json[:steps].each do |measure|
next if measure[:measure_dir_name] != "BuildExistingModel"

measure[:arguments][:building_id] = "#{building_id}"
end
File.open(osw, "w") do |f|
Expand Down