openstudio-load-flexibility-measures 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/LICENSE.md +7 -21
  4. data/README.md +4 -3
  5. data/Rakefile +5 -0
  6. data/doc_templates/LICENSE.md +7 -21
  7. data/doc_templates/copyright_erb.txt +2 -32
  8. data/doc_templates/copyright_js.txt +2 -2
  9. data/doc_templates/copyright_ruby.txt +3 -33
  10. data/lib/measures/ShiftScheduleByType/LICENSE.md +7 -21
  11. data/lib/measures/ShiftScheduleByType/measure.rb +2 -32
  12. data/lib/measures/ShiftScheduleByType/measure.xml +5 -5
  13. data/lib/measures/ShiftScheduleByType/tests/ShiftScheduleByType_Test.rb +2 -32
  14. data/lib/measures/add_central_ice_storage/LICENSE.md +7 -21
  15. data/lib/measures/add_central_ice_storage/measure.rb +2 -32
  16. data/lib/measures/add_central_ice_storage/measure.xml +6 -6
  17. data/lib/measures/add_central_ice_storage/resources/OsLib_Schedules.rb +2 -32
  18. data/lib/measures/add_central_ice_storage/tests/add_central_ice_storage_test.rb +2 -32
  19. data/lib/measures/add_hpwh/LICENSE.md +7 -21
  20. data/lib/measures/add_hpwh/measure.rb +2 -32
  21. data/lib/measures/add_hpwh/measure.xml +5 -5
  22. data/lib/measures/add_hpwh/tests/add_hpwh_test.rb +2 -32
  23. data/lib/measures/add_packaged_ice_storage/LICENSE.md +7 -21
  24. data/lib/measures/add_packaged_ice_storage/measure.rb +9 -37
  25. data/lib/measures/add_packaged_ice_storage/measure.xml +23 -11
  26. data/lib/measures/add_packaged_ice_storage/tests/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw +8768 -0
  27. data/lib/measures/add_packaged_ice_storage/tests/add_packaged_ice_storage_test.rb +160 -35
  28. data/lib/measures/add_packaged_ice_storage/tests/single_speed_dx_350.osm +4316 -0
  29. data/lib/openstudio/load_flexibility_measures/version.rb +3 -33
  30. data/lib/openstudio/load_flexibility_measures.rb +2 -32
  31. data/openstudio-load-flexibility-measures.gemspec +2 -2
  32. metadata +8 -6
@@ -1,36 +1,6 @@
1
1
  # *******************************************************************************
2
- # OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC.
3
- # All rights reserved.
4
- # Redistribution and use in source and binary forms, with or without
5
- # modification, are permitted provided that the following conditions are met:
6
- #
7
- # (1) Redistributions of source code must retain the above copyright notice,
8
- # this list of conditions and the following disclaimer.
9
- #
10
- # (2) Redistributions in binary form must reproduce the above copyright notice,
11
- # this list of conditions and the following disclaimer in the documentation
12
- # and/or other materials provided with the distribution.
13
- #
14
- # (3) Neither the name of the copyright holder nor the names of any contributors
15
- # may be used to endorse or promote products derived from this software without
16
- # specific prior written permission from the respective party.
17
- #
18
- # (4) Other than as required in clauses (1) and (2), distributions in any form
19
- # of modifications or other derivative works may not use the "OpenStudio"
20
- # trademark, "OS", "os", or any other confusingly similar designation without
21
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
24
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25
- # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
27
- # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
28
- # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
30
- # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32
- # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33
- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2
+ # OpenStudio(R), Copyright (c) Alliance for Sustainable Energy, LLC.
3
+ # See also https://openstudio.net/license
34
4
  # *******************************************************************************
35
5
 
36
6
  require 'openstudio'
@@ -46,6 +16,107 @@ class AddPackagedIceStorageTest < MiniTest::Test
46
16
  # def teardown
47
17
  # end
48
18
 
19
+ # Runs an annual simulation of IDF
20
+ #
21
+ # code based on model_run_simulation_and_log_errors from OpenStudio Standards
22
+ # Maybe update method above to optionally take IDF instead of OSM or add another method
23
+ #
24
+ # @param IDF OpenStudio workspace IDF object
25
+ # @param run_dir [String] file path location for the annual run, defaults to 'Run' in the current directory
26
+ # @return [Bool] returns true if successful, false if not
27
+ def model_run_simulation_and_log_errors(workspace, run_dir = "#{Dir.pwd}/Run")
28
+ # Make the directory if it doesn't exist
29
+ unless Dir.exist?(run_dir)
30
+ FileUtils.mkdir_p(run_dir)
31
+ end
32
+
33
+ # Save workspace IDF
34
+ idf_name = 'in.idf'
35
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.model.Model', "Starting simulation here: #{run_dir}.")
36
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Running simulation #{run_dir}.")
37
+ idf_path = OpenStudio::Path.new("#{run_dir}/#{idf_name}")
38
+ workspace.save(idf_path, true)
39
+
40
+ # Set up the simulation
41
+ # Find the weather file
42
+ epw_path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw")
43
+
44
+ sql_path = nil
45
+
46
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.model.Model', 'Running with RunManager.')
47
+
48
+ # Find EnergyPlus
49
+ ep_path = OpenStudio.getEnergyPlusExecutable
50
+
51
+ puts "EnergyPlus is: #{ep_path}"
52
+ job = "energyplus -w #{epw_path.to_s} -d #{run_dir} #{idf_path.to_s}"
53
+ puts job
54
+ system(job)
55
+
56
+ sql_path = OpenStudio::Path.new("#{run_dir}/eplusout.sql")
57
+
58
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished run.')
59
+
60
+ # @todo Delete the eplustbl.htm and other files created by the run for cleanliness.
61
+
62
+ if OpenStudio.exists(sql_path)
63
+ sql = OpenStudio::SqlFile.new(sql_path)
64
+ # Check to make sure the sql file is readable,
65
+ # which won't be true if EnergyPlus crashed during simulation.
66
+ unless sql.connectionOpen
67
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "The run failed, cannot create model. Look at the eplusout.err file in #{File.dirname(sql_path.to_s)} to see the cause.")
68
+ return false
69
+ end
70
+ else
71
+ # If the sql file does not exist, it is likely that EnergyPlus crashed,
72
+ # in which case the useful errors are inside the eplusout.err file.
73
+ err_file_path_string = "#{run_dir}/run/eplusout.err"
74
+ err_file_path = OpenStudio::Path.new(err_file_path_string)
75
+ if OpenStudio.exists(err_file_path)
76
+ if __dir__[0] == ':' # Running from OpenStudio CLI
77
+ errs = EmbeddedScripting.getFileAsString(err_file_path_string)
78
+ else
79
+ errs = File.read(err_file_path_string)
80
+ end
81
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "The run did not finish because of the following errors: #{errs}")
82
+ return false
83
+ else
84
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Results for the run couldn't be found here: #{sql_path}.")
85
+ return false
86
+ end
87
+ end
88
+
89
+ # todo - figure out how to get code below to work so method returns false when simulation fails
90
+
91
+ # # Report severe or fatal errors in the run
92
+ # error_query = "SELECT ErrorMessage
93
+ # FROM Errors
94
+ # WHERE ErrorType in(1,2)"
95
+ # errs = model.sqlFile.get.execAndReturnVectorOfString(error_query)
96
+ # if errs.is_initialized
97
+ # errs = errs.get
98
+ # end
99
+
100
+ # # Check that the run completed successfully
101
+ # end_file_stringpath = "#{run_dir}/run/eplusout.end"
102
+ # end_file_path = OpenStudio::Path.new(end_file_stringpath)
103
+ # if OpenStudio.exists(end_file_path)
104
+ # endstring = File.read(end_file_stringpath)
105
+ # end
106
+
107
+ # if !endstring.include?('EnergyPlus Completed Successfully')
108
+ # OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "The run did not finish and had following errors: #{errs.join('\n')}")
109
+ # return false
110
+ # end
111
+
112
+ # # Log any severe errors that did not cause simulation to fail
113
+ # unless errs.empty?
114
+ # OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "The run completed but had the following severe errors: #{errs.join('\n')}")
115
+ # end
116
+
117
+ return true
118
+ end
119
+
49
120
  def test_good_argument_values
50
121
  # create an instance of the measure
51
122
  measure = AddPackagedIceStorage.new
@@ -82,14 +153,68 @@ class AddPackagedIceStorageTest < MiniTest::Test
82
153
 
83
154
  # run the measure
84
155
  measure.run(workspace, runner, argument_map)
156
+
157
+ # run the annual simulation
158
+ output_file_path = "#{File.dirname(__FILE__)}/output/test_good_argument_values/Run"
159
+ #sim_results = self.model_run_simulation_and_log_errors(workspace, output_file_path)
160
+ #assert(sim_results)
161
+ # todo - need to add code so test fails if simulation fails
162
+
85
163
  result = runner.result
86
164
  assert_equal('Success', result.value.valueName)
87
165
 
88
166
  show_output(result)
89
167
 
90
- # save the workspace to output directory
91
- output_file_path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/output/test_output.idf")
92
- workspace.save(output_file_path, true)
168
+ true
169
+ end
170
+
171
+ def test_single_speed_dx
172
+ # create an instance of the measure
173
+ measure = AddPackagedIceStorage.new
174
+
175
+ # create runner with empty OSW
176
+ osw = OpenStudio::WorkflowJSON.new
177
+ runner = OpenStudio::Measure::OSRunner.new(osw)
178
+
179
+ # load the test model
180
+ translator = OpenStudio::OSVersion::VersionTranslator.new
181
+ path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/single_speed_dx_350.osm")
182
+ model = translator.loadModel(path)
183
+ assert(!model.empty?)
184
+ model = model.get
185
+
186
+ # forward translate OSM file to IDF file
187
+ ft = OpenStudio::EnergyPlus::ForwardTranslator.new
188
+ workspace = ft.translateModel(model)
189
+
190
+ # get arguments
191
+ arguments = measure.arguments(workspace)
192
+ argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
193
+
194
+ # create hash of argument values
195
+ args_hash = {}
196
+ #args_hash['ice_cap'] = '40,50'
197
+
198
+ # populate argument with specified has value if set
199
+ arguments.each do |arg|
200
+ temp_arg_var = arg.clone
201
+ assert(temp_arg_var.setValue(args_hash[arg.name])) if args_hash[arg.name]
202
+ argument_map[arg.name] = temp_arg_var
203
+ end
204
+
205
+ # run the measure
206
+ measure.run(workspace, runner, argument_map)
207
+
208
+ # run the annual simulation
209
+ output_file_path = "#{File.dirname(__FILE__)}/output/single_speed_dx/Run"
210
+ #sim_results = self.model_run_simulation_and_log_errors(workspace, output_file_path)
211
+ #assert(sim_results)
212
+ # todo - need to add code so test fails if simulation fails
213
+
214
+ result = runner.result
215
+ assert_equal('Success', result.value.valueName)
216
+
217
+ show_output(result)
93
218
 
94
219
  true
95
220
  end