urbanopt-reporting 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|