urbanopt-reporting 0.3.3 → 0.4.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/Rakefile +16 -6
- data/doc_templates/copyright_ruby.txt +17 -7
- data/lib/measures/default_feature_reports/measure.rb +121 -97
- data/lib/measures/default_feature_reports/measure.xml +11 -11
- data/lib/measures/export_modelica_loads/LICENSE.md +23 -23
- data/lib/measures/export_modelica_loads/measure.rb +93 -96
- data/lib/measures/export_modelica_loads/measure.xml +21 -21
- data/lib/measures/export_time_series_modelica/LICENSE.md +27 -1
- data/lib/measures/export_time_series_modelica/measure.rb +165 -163
- data/lib/measures/export_time_series_modelica/measure.xml +18 -18
- data/lib/measures/export_time_series_modelica/resources/os_lib_helper_methods.rb +40 -35
- data/lib/urbanopt/reporting.rb +16 -6
- data/lib/urbanopt/reporting/default_reports.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/construction_cost.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/date.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/end_use.rb +54 -23
- data/lib/urbanopt/reporting/default_reports/end_uses.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/extension.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/feature_report.rb +21 -7
- data/lib/urbanopt/reporting/default_reports/generator.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/location.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/logger.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/power_distribution.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/program.rb +17 -7
- data/lib/urbanopt/reporting/default_reports/reporting_period.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/scenario_report.rb +25 -13
- data/lib/urbanopt/reporting/default_reports/schema/scenario_csv_columns.txt +11 -10
- data/lib/urbanopt/reporting/default_reports/schema/scenario_schema.json +4 -1
- data/lib/urbanopt/reporting/default_reports/solar_pv.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/storage.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/thermal_storage.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +17 -7
- data/lib/urbanopt/reporting/default_reports/validator.rb +16 -6
- data/lib/urbanopt/reporting/default_reports/wind.rb +16 -6
- data/lib/urbanopt/reporting/derived_extension.rb +16 -6
- data/lib/urbanopt/reporting/version.rb +17 -7
- data/urbanopt-reporting-gem.gemspec +3 -3
- metadata +9 -9
@@ -1,41 +1,47 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# All rights reserved.
|
4
|
-
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
#
|
12
|
-
# and
|
13
|
-
#
|
14
|
-
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
19
|
-
# of
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
1
|
+
# *********************************************************************************
|
2
|
+
# URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
|
3
|
+
# contributors. All rights reserved.
|
4
|
+
|
5
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
# are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
# Redistributions of source code must retain the above copyright notice, this list
|
9
|
+
# of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
# Redistributions in binary form must reproduce the above copyright notice, this
|
12
|
+
# list of conditions and the following disclaimer in the documentation and/or other
|
13
|
+
# materials provided with the distribution.
|
14
|
+
|
15
|
+
# Neither the name of the copyright holder nor the names of its contributors may be
|
16
|
+
# used to endorse or promote products derived from this software without specific
|
17
|
+
# prior written permission.
|
18
|
+
|
19
|
+
# Redistribution of this software, without modification, must refer to the software
|
20
|
+
# by the same designation. Redistribution of a modified version of this software
|
21
|
+
# (i) may not refer to the modified version by the same designation, or by any
|
22
|
+
# confusingly similar designation, and (ii) must refer to the underlying software
|
23
|
+
# originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
|
24
|
+
# the term “URBANopt”, or any confusingly similar designation may not be used to
|
25
|
+
# refer to any modified version of this software or any modified version of the
|
26
|
+
# underlying software originally provided by Alliance without the prior written
|
27
|
+
# consent of Alliance.
|
28
|
+
|
29
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
30
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
31
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
32
|
+
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
33
|
+
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
34
|
+
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
35
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
36
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
37
|
+
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
38
|
+
# OF THE POSSIBILITY OF SUCH DAMAGE.
|
39
|
+
# *********************************************************************************
|
35
40
|
|
36
41
|
require 'erb'
|
37
42
|
|
38
43
|
|
44
|
+
# This measure is originally from https://github.com/urbanopt/DES_HVAC
|
39
45
|
# start the measure
|
40
46
|
class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
41
47
|
Dir[File.dirname(__FILE__) + '/resources/*.rb'].each { |file| require file }
|
@@ -61,25 +67,25 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
61
67
|
puts "#{Time.now}: #{str}"
|
62
68
|
end
|
63
69
|
|
64
|
-
def arguments(_model)
|
70
|
+
def arguments(_model)
|
65
71
|
args = OpenStudio::Measure::OSArgumentVector.new
|
66
|
-
|
72
|
+
|
67
73
|
hhw_loop_name = OpenStudio::Measure::OSArgument.makeStringArgument('hhw_loop_name', true)
|
68
74
|
hhw_loop_name.setDisplayName('Name or Partial Name of Heating Hot Water Loop, non-case-sensitive')
|
69
75
|
hhw_loop_name.setDefaultValue('hot')
|
70
76
|
args << hhw_loop_name
|
71
|
-
|
72
|
-
|
77
|
+
|
78
|
+
chw_loop_name = OpenStudio::Measure::OSArgument.makeStringArgument('chw_loop_name', true)
|
73
79
|
chw_loop_name.setDisplayName('Name or Partial Name of Chilled Water Loop, non-case-sensitive')
|
74
80
|
chw_loop_name.setDefaultValue('chilled')
|
75
81
|
args << chw_loop_name
|
76
|
-
|
77
|
-
|
82
|
+
|
83
|
+
dec_places_mass_flow = OpenStudio::Measure::OSArgument.makeIntegerArgument('dec_places_mass_flow', true)
|
78
84
|
dec_places_mass_flow.setDisplayName('Number of Decimal Places to Round Mass Flow Rate')
|
79
85
|
dec_places_mass_flow.setDescription('Number of decimal places to which mass flow rate will be rounded')
|
80
86
|
dec_places_mass_flow.setDefaultValue(3)
|
81
87
|
args << dec_places_mass_flow
|
82
|
-
|
88
|
+
|
83
89
|
dec_places_temp = OpenStudio::Measure::OSArgument.makeIntegerArgument('dec_places_temp', true)
|
84
90
|
dec_places_temp.setDisplayName('Number of Decimal Places to Round Temperature')
|
85
91
|
dec_places_temp.setDescription('Number of decimal places to which temperature will be rounded')
|
@@ -94,7 +100,6 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
94
100
|
super(runner, user_arguments)
|
95
101
|
|
96
102
|
result = OpenStudio::IdfObjectVector.new
|
97
|
-
|
98
103
|
|
99
104
|
# To use the built-in error checking we need the model...
|
100
105
|
# get the last model and sql file
|
@@ -107,53 +112,50 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
107
112
|
|
108
113
|
# use the built-in error checking
|
109
114
|
return false unless runner.validateUserArguments(arguments(model), user_arguments)
|
110
|
-
|
111
|
-
##Read in argumetns related to variables for output requests
|
112
|
-
hhw_loop_name = runner.getStringArgumentValue('hhw_loop_name', user_arguments)
|
113
|
-
chw_loop_name = runner.getStringArgumentValue('chw_loop_name', user_arguments)
|
114
|
-
|
115
115
|
|
116
|
-
|
117
|
-
|
116
|
+
##Read in argumetns related to variables for output requests
|
117
|
+
hhw_loop_name = runner.getStringArgumentValue('hhw_loop_name', user_arguments)
|
118
|
+
chw_loop_name = runner.getStringArgumentValue('chw_loop_name', user_arguments)
|
119
|
+
|
120
|
+
#Identify key names for output variables.
|
121
|
+
plantloops = model.getPlantLoops
|
118
122
|
|
119
123
|
selected_plant_loops = []
|
120
124
|
i = 0
|
121
|
-
|
122
|
-
variable_name1 = 'System Node Mass Flow Rate'
|
123
|
-
variable_name2 = 'System Node Temperature'
|
124
|
-
reporting_frequency = 'timestep'
|
125
125
|
|
126
|
-
|
126
|
+
variable_name1 = 'System Node Mass Flow Rate'
|
127
|
+
variable_name2 = 'System Node Temperature'
|
128
|
+
reporting_frequency = 'timestep'
|
129
|
+
|
127
130
|
plantloops.each do |plantLoop|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
131
|
+
log "plant loop name #{plantLoop.name.get.to_s}"
|
132
|
+
if plantLoop.name.get.to_s.downcase.include? chw_loop_name.to_s
|
133
|
+
#Extract plant loop information
|
134
|
+
selected_plant_loops[0]=plantLoop
|
135
|
+
key_value_chw_outlet = selected_plant_loops[0].demandOutletNode.name.to_s
|
136
|
+
key_value_chw_inlet = selected_plant_loops[0].demandInletNode.name.to_s
|
137
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_outlet},#{variable_name2},timestep;").get
|
138
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_inlet},#{variable_name2},timestep;").get
|
139
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_outlet},#{variable_name1},timestep;").get
|
140
|
+
end
|
141
|
+
if plantLoop.name.get.to_s.downcase.include? hhw_loop_name.to_s and !plantLoop.name.get.to_s.downcase.include? "service" and !plantLoop.name.get.to_s.downcase.include? "domestic"
|
142
|
+
#Extract plant loop information
|
143
|
+
selected_plant_loops[1]=plantLoop
|
144
|
+
key_value_hhw_outlet = selected_plant_loops[1].demandOutletNode.name.to_s
|
145
|
+
key_value_hhw_inlet = selected_plant_loops[1].demandInletNode.name.to_s
|
146
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_hhw_outlet},#{variable_name2},timestep;").get
|
147
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_hhw_inlet},#{variable_name2},timestep;").get
|
148
|
+
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_hhw_outlet},#{variable_name1},timestep;").get
|
149
|
+
end
|
150
|
+
end
|
149
151
|
|
150
152
|
result << OpenStudio::IdfObject.load('Output:Variable,,Site Mains Water Temperature,hourly;').get
|
151
153
|
result << OpenStudio::IdfObject.load('Output:Variable,,Site Outdoor Air Drybulb Temperature,hourly;').get
|
152
154
|
result << OpenStudio::IdfObject.load('Output:Variable,,Site Outdoor Air Relative Humidity,hourly;').get
|
153
155
|
result << OpenStudio::IdfObject.load('Output:Meter,Cooling:Electricity,hourly;').get
|
154
|
-
|
156
|
+
result << OpenStudio::IdfObject.load('Output:Meter,Electricity:Facility,timestep;').get ##Using this for data at timestep interval
|
155
157
|
result << OpenStudio::IdfObject.load('Output:Meter,Heating:Electricity,hourly;').get
|
156
|
-
result << OpenStudio::IdfObject.load('Output:Meter,Heating:
|
158
|
+
result << OpenStudio::IdfObject.load('Output:Meter,Heating:NaturalGas,hourly;').get
|
157
159
|
result << OpenStudio::IdfObject.load('Output:Meter,InteriorLights:Electricity,hourly;').get
|
158
160
|
result << OpenStudio::IdfObject.load('Output:Meter,Fans:Electricity,hourly;').get
|
159
161
|
result << OpenStudio::IdfObject.load('Output:Meter,InteriorEquipment:Electricity,hourly;').get # Joules
|
@@ -169,17 +171,16 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
169
171
|
result
|
170
172
|
end
|
171
173
|
|
172
|
-
def extract_timeseries_into_matrix(sqlfile, data, variable_name, str, key_value = nil, default_if_empty = 0,dec_places, timestep)
|
174
|
+
def extract_timeseries_into_matrix(sqlfile, data, variable_name, str, key_value = nil, default_if_empty = 0,dec_places, timestep)
|
173
175
|
log "Executing query for #{variable_name}"
|
174
176
|
#column_name = variable_name
|
175
177
|
if key_value
|
176
|
-
|
177
|
-
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name, key_value)
|
178
|
+
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name, key_value)
|
178
179
|
#column_name += "_#{key_value}"
|
179
|
-
|
180
|
+
column_name=str
|
180
181
|
else
|
181
182
|
#ts = sqlfile.timeSeries('RUN PERIOD 1', 'Hourly', variable_name)
|
182
|
-
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name)
|
183
|
+
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name)
|
183
184
|
end
|
184
185
|
log 'Iterating over timeseries'
|
185
186
|
column = [column_name.delete(':').delete(' ')] # Set the header of the data to the variable name, removing : and spaces
|
@@ -191,7 +192,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
191
192
|
else
|
192
193
|
ts = ts.get if ts.respond_to?(:get)
|
193
194
|
ts = ts.first if ts.respond_to?(:first)
|
194
|
-
|
195
|
+
|
195
196
|
start = Time.now
|
196
197
|
# Iterating in OpenStudio can take up to 60 seconds with 10min data. The quick_proc takes 0.03 seconds.
|
197
198
|
# for i in 0..ts.values.size - 1
|
@@ -200,24 +201,21 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
200
201
|
# end
|
201
202
|
|
202
203
|
quick_proc = ts.values.to_s.split(',')
|
203
|
-
|
204
|
-
|
205
|
-
|
204
|
+
quick_proc[0]=quick_proc[0].split('(', 2).last #cleanup necessary to remove opening paren
|
205
|
+
quick_proc=quick_proc.map(&:to_f)
|
206
|
+
x = 0
|
206
207
|
len = quick_proc.length
|
207
|
-
|
208
|
-
while(x < len) #Round to the # of decimal places specified
|
208
|
+
log "quick proc #{quick_proc}"
|
209
|
+
while(x < len) #Round to the # of decimal places specified
|
209
210
|
quick_proc[x]=(quick_proc[x]).round(dec_places)
|
210
211
|
x=x+1
|
211
|
-
|
212
|
-
|
212
|
+
end
|
213
|
+
quick_proc=quick_proc.map(&:to_s)
|
213
214
|
|
214
|
-
|
215
215
|
# the first and last have some cleanup items because of the Vector method
|
216
|
-
quick_proc[0] = quick_proc[0].gsub(/^.*\(/, '')
|
217
|
-
quick_proc[-1] = quick_proc[-1].delete(')')
|
216
|
+
quick_proc[0] = quick_proc[0].gsub(/^.*\(/, '')
|
217
|
+
quick_proc[-1] = quick_proc[-1].delete(')')
|
218
218
|
column += quick_proc
|
219
|
-
|
220
|
-
|
221
219
|
|
222
220
|
log "Took #{Time.now - start} to iterate"
|
223
221
|
end
|
@@ -279,9 +277,11 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
279
277
|
|
280
278
|
# use the built-in error checking
|
281
279
|
return false unless runner.validateUserArguments(arguments(model), user_arguments)
|
282
|
-
|
283
|
-
|
284
|
-
|
280
|
+
|
281
|
+
args = OsLib_HelperMethods.createRunVariables(runner, model, user_arguments, arguments(model))
|
282
|
+
if !args
|
283
|
+
return false
|
284
|
+
end
|
285
285
|
|
286
286
|
# lookup and replace argument values from upstream measures
|
287
287
|
if args['use_upstream_args'] == true
|
@@ -291,7 +291,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
291
291
|
if !value_from_osw.empty?
|
292
292
|
runner.registerInfo("Replacing argument named #{arg} from current measure with a value of #{value_from_osw[:value]} from #{value_from_osw[:measure_name]}.")
|
293
293
|
new_val = value_from_osw[:value]
|
294
|
-
#
|
294
|
+
# TODO: make code to handle non strings more robust. check_upstream_measure_for_arg could pass back the argument type
|
295
295
|
if arg == 'hhw_loop_name'
|
296
296
|
args[arg] = new_val.to_s
|
297
297
|
elsif arg == 'chw_loop_name'
|
@@ -303,9 +303,9 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
303
303
|
end
|
304
304
|
end
|
305
305
|
hhw_loop_name = args['hhw_loop_name']
|
306
|
-
|
307
|
-
|
308
|
-
|
306
|
+
chw_loop_name = args['chw_loop_name']
|
307
|
+
dec_places_temp = args['dec_places_temp']
|
308
|
+
dec_places_mass_flow = args['dec_places_mass_flow']
|
309
309
|
# get the last model and sql file
|
310
310
|
model = runner.lastOpenStudioModel
|
311
311
|
if model.empty?
|
@@ -313,10 +313,9 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
313
313
|
return false
|
314
314
|
end
|
315
315
|
model = model.get
|
316
|
-
|
317
316
|
|
318
|
-
|
319
|
-
|
317
|
+
timesteps_per_hour=model.getTimestep.numberOfTimestepsPerHour.to_i
|
318
|
+
timestep=60/timesteps_per_hour #timestep in minutes
|
320
319
|
|
321
320
|
sqlFile = runner.lastEnergyPlusSqlFile
|
322
321
|
if sqlFile.empty?
|
@@ -339,9 +338,12 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
339
338
|
]
|
340
339
|
|
341
340
|
# just grab one of the variables to get the date/time stamps
|
342
|
-
|
343
|
-
|
344
|
-
|
341
|
+
attribute_name = 'Electricity:Facility'
|
342
|
+
ts = sqlFile.timeSeries('RUN PERIOD 1', 'Zone Timestep', attribute_name)
|
343
|
+
if ts.empty?
|
344
|
+
runner.registerError("This feature does not have the attribute '#{attribute_name}' to enable this measure to work." \
|
345
|
+
"To resolve, simulate a building with electricity or remove this measure from your workflow.")
|
346
|
+
else
|
345
347
|
ts = ts.first
|
346
348
|
dt_base = nil
|
347
349
|
# Save off the date time values
|
@@ -355,7 +357,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
355
357
|
dt.date.dayOfWeek.value,
|
356
358
|
dt.time.hours,
|
357
359
|
dt.time.minutes,
|
358
|
-
dt_current.to_time.to_i - dt_base.to_time.to_i + timestep*60
|
360
|
+
dt_current.to_time.to_i - dt_base.to_time.to_i + timestep*60
|
359
361
|
]
|
360
362
|
end
|
361
363
|
end
|
@@ -364,69 +366,69 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
364
366
|
|
365
367
|
selected_plant_loops = []
|
366
368
|
i = 0
|
367
|
-
|
368
|
-
|
369
|
+
|
370
|
+
key_var={}
|
369
371
|
|
370
372
|
plantloops.each do |plantLoop|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
373
|
+
if plantLoop.name.get.to_s.downcase.include? chw_loop_name.to_str
|
374
|
+
#Extract plant loop information
|
375
|
+
selected_plant_loops[0]=plantLoop
|
376
|
+
end
|
377
|
+
if plantLoop.name.get.to_s.downcase.include? hhw_loop_name.to_str
|
378
|
+
#Get plant loop information
|
379
|
+
selected_plant_loops[1]=plantLoop
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
if !selected_plant_loops[1].nil?
|
384
|
+
#Set up variables for output
|
385
|
+
key_value_hhw_outlet = selected_plant_loops[1].demandOutletNode.name.to_s
|
386
|
+
key_value_hhw_inlet = selected_plant_loops[1].demandInletNode.name.to_s
|
387
|
+
key_var['hhw_outlet_massflow']='massFlowRateHeating'
|
388
|
+
key_var['hhw_outlet_temp']='heatingReturnTemperature[C]'
|
389
|
+
key_var['hhw_inlet_temp']='heatingSupplyTemperature[C]'
|
390
|
+
#Extract time series
|
391
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['hhw_outlet_temp'], key_value_hhw_outlet, 0, dec_places_temp, timestep)
|
392
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['hhw_inlet_temp'], key_value_hhw_inlet, 0, dec_places_temp, timestep)
|
393
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Mass Flow Rate', key_var['hhw_outlet_massflow'], key_value_hhw_outlet, 0, dec_places_mass_flow, timestep)
|
394
|
+
else
|
395
|
+
runner.registerWarning("No hot water loop found. If one is expected, make sure the hot water loop name argument provides a string present in its name.")
|
379
396
|
end
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
else
|
408
|
-
runner.registerWarning("No chilled water loop found. If one is expected, make sure the chilled water loop name argument provides a string present in its name.")
|
409
|
-
end
|
410
|
-
|
411
|
-
|
412
|
-
if selected_plant_loops[0].nil? and selected_plant_loops[1].nil?
|
413
|
-
runner.registerWarning("No HVAC plant loops found. If one or more plant loops are expected, make sure they follow the naming conventions mentioned in the previous warnings.")
|
414
|
-
end
|
415
|
-
|
416
|
-
if !selected_plant_loops.nil?
|
417
|
-
# convert this to CSV object
|
418
|
-
File.open('./building_loads.csv', 'w') do |f|
|
419
|
-
rows.each do |row|
|
420
|
-
f << row.join(',') << "\n"
|
397
|
+
|
398
|
+
if !selected_plant_loops[0].nil?
|
399
|
+
#Set up variables for outputs
|
400
|
+
key_value_chw_outlet = selected_plant_loops[0].demandOutletNode.name.to_s
|
401
|
+
key_value_chw_inlet = selected_plant_loops[0].demandInletNode.name.to_s
|
402
|
+
key_var['chw_outlet_massflow']='massFlowRateCooling'
|
403
|
+
key_var['chw_outlet_temp']='ChilledWaterReturnTemperature[C]'
|
404
|
+
key_var['chw_inlet_temp']='ChilledWaterSupplyTemperature[C]'
|
405
|
+
#Extract time series
|
406
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['chw_outlet_temp'], key_value_chw_outlet, 0, dec_places_temp,timestep)
|
407
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['chw_inlet_temp'], key_value_chw_inlet, 0, dec_places_temp,timestep)
|
408
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Mass Flow Rate', key_var['chw_outlet_massflow'], key_value_chw_outlet, 0, dec_places_mass_flow,timestep)
|
409
|
+
else
|
410
|
+
runner.registerWarning("No chilled water loop found. If one is expected, make sure the chilled water loop name argument provides a string present in its name.")
|
411
|
+
end
|
412
|
+
|
413
|
+
|
414
|
+
if selected_plant_loops[0].nil? and selected_plant_loops[1].nil?
|
415
|
+
runner.registerWarning("No HVAC plant loops found. If one or more plant loops are expected, make sure they follow the naming conventions mentioned in the previous warnings.")
|
416
|
+
end
|
417
|
+
|
418
|
+
if !selected_plant_loops.nil?
|
419
|
+
# convert this to CSV object
|
420
|
+
File.open('./building_loads.csv', 'w') do |f|
|
421
|
+
rows.each do |row|
|
422
|
+
f << row.join(',') << "\n"
|
423
|
+
end
|
421
424
|
end
|
422
|
-
|
423
|
-
end
|
425
|
+
end
|
424
426
|
|
425
427
|
true
|
426
428
|
ensure
|
427
429
|
sqlFile&.close
|
428
430
|
end
|
429
|
-
|
431
|
+
end
|
430
432
|
|
431
433
|
|
432
434
|
# register the measure to be used by the application
|