urbanopt-reporting 0.4.3 → 0.5.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 +5 -0
- data/lib/measures/default_feature_reports/measure.rb +23 -22
- data/lib/measures/export_modelica_loads/measure.rb +1 -0
- data/lib/measures/export_time_series_modelica/measure.rb +57 -58
- data/lib/measures/export_time_series_modelica/resources/os_lib_helper_methods.rb +2 -4
- data/lib/urbanopt/reporting/default_reports/construction_cost.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/date.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +4 -4
- data/lib/urbanopt/reporting/default_reports/end_uses.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/feature_report.rb +7 -6
- data/lib/urbanopt/reporting/default_reports/location.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/logger.rb +1 -1
- data/lib/urbanopt/reporting/default_reports/power_distribution.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/program.rb +1 -0
- data/lib/urbanopt/reporting/default_reports/reporting_period.rb +3 -4
- data/lib/urbanopt/reporting/default_reports/scenario_report.rb +13 -11
- data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +1 -0
- data/lib/urbanopt/reporting/version.rb +1 -1
- data/urbanopt-reporting-gem.gemspec +3 -4
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad3876bd40e8b43fd00b165d147f1ac0b4a00a9e6050f56d45b43f00cbed3857
|
4
|
+
data.tar.gz: 6cebd747f854d908d9d8a032832a03e0ce8fb3073c68c74e4ab25ec8ec2e6234
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0114847b3946c896f6065126e314cece1ddce64a9b35d9f3f27c0504dcaa32cb024651c08c6e8049ca21e361301b20703d06ac1d4bf8c00a26e1c6b8aa2db775'
|
7
|
+
data.tar.gz: 0fd15dae815f7ce568e2946d8a1ec7aab98c03af519ac8ac705e112343be14c5313dd141f7aa4cce3a7a3c10ff54f6720be45284c8ea15fbbe30006a25da252b
|
data/CHANGELOG.md
CHANGED
@@ -43,7 +43,7 @@ require 'csv'
|
|
43
43
|
require 'benchmark'
|
44
44
|
require 'logger'
|
45
45
|
|
46
|
-
@@logger = Logger.new(
|
46
|
+
@@logger = Logger.new($stdout)
|
47
47
|
|
48
48
|
# start the measure
|
49
49
|
class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
@@ -277,6 +277,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
277
277
|
if value.nil?
|
278
278
|
return nil
|
279
279
|
end
|
280
|
+
|
280
281
|
if from_units.nil? || to_units.nil?
|
281
282
|
@runner.registerError("Cannot convert units...from_units: #{from_units} or to_units: #{to_units} left blank.")
|
282
283
|
return nil
|
@@ -408,8 +409,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
408
409
|
# unconditioned_area
|
409
410
|
unconditioned_area = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='Building Area' AND RowName='Unconditioned Building Area' AND ColumnName='Area'")
|
410
411
|
feature_report.program.unconditioned_area_sqft = convert_units(unconditioned_area, 'm^2', 'ft^2')
|
411
|
-
if building.standardsBuildingType.is_initialized
|
412
|
-
floor_area -= unconditioned_area
|
412
|
+
if building.standardsBuildingType.is_initialized && ['Residential'].include?(building.standardsBuildingType.get)
|
413
|
+
floor_area -= unconditioned_area # conditioned floor area only
|
413
414
|
end
|
414
415
|
|
415
416
|
# maximum_number_of_stories
|
@@ -429,7 +430,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
429
430
|
|
430
431
|
# footprint_area
|
431
432
|
if building.standardsBuildingType.is_initialized
|
432
|
-
if
|
433
|
+
if !['Residential'].include?(building.standardsBuildingType.get)
|
433
434
|
feature_report.program.footprint_area_sqft = feature_report.program.floor_area_sqft / number_of_stories
|
434
435
|
else
|
435
436
|
feature_report.program.footprint_area_sqft = convert_units(floor_area, 'm^2', 'ft^2') / building.additionalProperties.getFeatureAsInteger('NumberOfConditionedStories').get
|
@@ -459,6 +460,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
459
460
|
building_type = building_type.get
|
460
461
|
end
|
461
462
|
next if ['Residential'].include?(building_type) # space types with empty building type fields will inherit from the building object
|
463
|
+
|
462
464
|
space_type_areas[building_type] = 0 if space_type_areas[building_type].nil?
|
463
465
|
space_type_areas[building_type] += convert_units(space_type.floorArea, 'm^2', 'ft^2')
|
464
466
|
end
|
@@ -471,6 +473,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
471
473
|
else
|
472
474
|
building_type = space.spaceType.get.standardsBuildingType
|
473
475
|
end
|
476
|
+
|
474
477
|
if building_type.empty?
|
475
478
|
building_type = 'unknown'
|
476
479
|
else
|
@@ -689,15 +692,15 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
689
692
|
# district_cooling
|
690
693
|
district_cooling = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Cooling'")
|
691
694
|
feature_report.reporting_periods[0].district_cooling_kwh = convert_units(district_cooling, 'GJ', 'kWh')
|
692
|
-
if building.standardsBuildingType.is_initialized
|
693
|
-
feature_report.reporting_periods[0].district_cooling_kwh = 0.0
|
695
|
+
if building.standardsBuildingType.is_initialized && ['Residential'].include?(building.standardsBuildingType.get)
|
696
|
+
feature_report.reporting_periods[0].district_cooling_kwh = 0.0
|
694
697
|
end
|
695
698
|
|
696
699
|
# district_heating
|
697
700
|
district_heating = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Heating'")
|
698
701
|
feature_report.reporting_periods[0].district_heating_kwh = convert_units(district_heating, 'GJ', 'kWh')
|
699
|
-
if building.standardsBuildingType.is_initialized
|
700
|
-
feature_report.reporting_periods[0].district_heating_kwh = 0.0
|
702
|
+
if building.standardsBuildingType.is_initialized && ['Residential'].include?(building.standardsBuildingType.get)
|
703
|
+
feature_report.reporting_periods[0].district_heating_kwh = 0.0
|
701
704
|
end
|
702
705
|
|
703
706
|
# water
|
@@ -725,10 +728,10 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
725
728
|
# report each query in its corresponding feature report obeject
|
726
729
|
x = ft.tr(' ', '_').downcase
|
727
730
|
if x.include? 'water'
|
728
|
-
x_u = x
|
729
|
-
else
|
731
|
+
x_u = "#{x}_qbft"
|
732
|
+
else
|
730
733
|
x = x.gsub('_#2', '')
|
731
|
-
x_u = x
|
734
|
+
x_u = "#{x}_kwh"
|
732
735
|
end
|
733
736
|
m = feature_report.reporting_periods[0].end_uses.send(x_u)
|
734
737
|
|
@@ -739,8 +742,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
739
742
|
end
|
740
743
|
sql_r = convert_units(sql_r, 'GJ', 'kWh')
|
741
744
|
|
742
|
-
if building.standardsBuildingType.is_initialized
|
743
|
-
sql_r = 0.0
|
745
|
+
if building.standardsBuildingType.is_initialized && (['Residential'].include?(building.standardsBuildingType.get) && x_u.include?('district'))
|
746
|
+
sql_r = 0.0
|
744
747
|
end
|
745
748
|
m.send("#{y}=", sql_r)
|
746
749
|
end
|
@@ -755,7 +758,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
755
758
|
sql = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='#{eu}' AND ColumnName='#{ft}'")
|
756
759
|
|
757
760
|
# ensure not nil so the equations below don't error out
|
758
|
-
if
|
761
|
+
if !sql.nil?
|
759
762
|
sql_r += convert_units(sql, 'GJ', 'kWh')
|
760
763
|
end
|
761
764
|
end
|
@@ -804,10 +807,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
804
807
|
ann_env_pd = nil
|
805
808
|
sql_file.availableEnvPeriods.each do |env_pd|
|
806
809
|
env_type = sql_file.environmentType(env_pd)
|
807
|
-
if env_type.is_initialized
|
808
|
-
|
809
|
-
ann_env_pd = env_pd
|
810
|
-
end
|
810
|
+
if env_type.is_initialized && (env_type.get == OpenStudio::EnvironmentType.new('WeatherRunPeriod'))
|
811
|
+
ann_env_pd = env_pd
|
811
812
|
end
|
812
813
|
end
|
813
814
|
|
@@ -954,7 +955,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
954
955
|
# use key_value name
|
955
956
|
# special case for Zone Thermal Comfort: use both timeseries_name and key_value
|
956
957
|
if timeseries_name.include? 'Zone Thermal Comfort'
|
957
|
-
new_timeseries_name = timeseries_name
|
958
|
+
new_timeseries_name = "#{timeseries_name} #{key_value}"
|
958
959
|
else
|
959
960
|
new_timeseries_name = key_value
|
960
961
|
end
|
@@ -982,8 +983,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
982
983
|
end
|
983
984
|
|
984
985
|
# residential considerations
|
985
|
-
if building.standardsBuildingType.is_initialized
|
986
|
-
values[key_cnt] = Array.new(n, 0)
|
986
|
+
if building.standardsBuildingType.is_initialized && (['DistrictCooling:Facility', 'DistrictHeating:Facility'].include?(timeseries_name) && ['Residential'].include?(building.standardsBuildingType.get))
|
987
|
+
values[key_cnt] = Array.new(n, 0)
|
987
988
|
end
|
988
989
|
|
989
990
|
# unit conversion
|
@@ -1001,7 +1002,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
1001
1002
|
'm3'
|
1002
1003
|
when 'W'
|
1003
1004
|
'W'
|
1004
|
-
|
1005
|
+
end
|
1005
1006
|
end
|
1006
1007
|
|
1007
1008
|
# loop through each value and apply unit conversion
|
@@ -40,11 +40,10 @@
|
|
40
40
|
|
41
41
|
require 'erb'
|
42
42
|
|
43
|
-
|
44
43
|
# This measure is originally from https://github.com/urbanopt/DES_HVAC
|
45
44
|
# start the measure
|
46
45
|
class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
47
|
-
Dir[File.dirname(__FILE__)
|
46
|
+
Dir["#{File.dirname(__FILE__)}/resources/*.rb"].sort.each { |file| require file }
|
48
47
|
include OsLib_HelperMethods
|
49
48
|
# human readable name
|
50
49
|
def name
|
@@ -75,12 +74,12 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
75
74
|
hhw_loop_name.setDefaultValue('hot')
|
76
75
|
args << hhw_loop_name
|
77
76
|
|
78
|
-
|
77
|
+
chw_loop_name = OpenStudio::Measure::OSArgument.makeStringArgument('chw_loop_name', true)
|
79
78
|
chw_loop_name.setDisplayName('Name or Partial Name of Chilled Water Loop, non-case-sensitive')
|
80
79
|
chw_loop_name.setDefaultValue('chilled')
|
81
80
|
args << chw_loop_name
|
82
81
|
|
83
|
-
|
82
|
+
dec_places_mass_flow = OpenStudio::Measure::OSArgument.makeIntegerArgument('dec_places_mass_flow', true)
|
84
83
|
dec_places_mass_flow.setDisplayName('Number of Decimal Places to Round Mass Flow Rate')
|
85
84
|
dec_places_mass_flow.setDescription('Number of decimal places to which mass flow rate will be rounded')
|
86
85
|
dec_places_mass_flow.setDefaultValue(3)
|
@@ -113,11 +112,11 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
113
112
|
# use the built-in error checking
|
114
113
|
return false unless runner.validateUserArguments(arguments(model), user_arguments)
|
115
114
|
|
116
|
-
|
115
|
+
# #Read in argumetns related to variables for output requests
|
117
116
|
hhw_loop_name = runner.getStringArgumentValue('hhw_loop_name', user_arguments)
|
118
117
|
chw_loop_name = runner.getStringArgumentValue('chw_loop_name', user_arguments)
|
119
118
|
|
120
|
-
#Identify key names for output variables.
|
119
|
+
# Identify key names for output variables.
|
121
120
|
plantloops = model.getPlantLoops
|
122
121
|
|
123
122
|
selected_plant_loops = []
|
@@ -128,19 +127,19 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
128
127
|
reporting_frequency = 'timestep'
|
129
128
|
|
130
129
|
plantloops.each do |plantLoop|
|
131
|
-
|
130
|
+
log "plant loop name #{plantLoop.name.get}"
|
132
131
|
if plantLoop.name.get.to_s.downcase.include? chw_loop_name.to_s
|
133
|
-
#Extract plant loop information
|
134
|
-
selected_plant_loops[0]=plantLoop
|
132
|
+
# Extract plant loop information
|
133
|
+
selected_plant_loops[0] = plantLoop
|
135
134
|
key_value_chw_outlet = selected_plant_loops[0].demandOutletNode.name.to_s
|
136
135
|
key_value_chw_inlet = selected_plant_loops[0].demandInletNode.name.to_s
|
137
136
|
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_outlet},#{variable_name2},timestep;").get
|
138
137
|
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_inlet},#{variable_name2},timestep;").get
|
139
138
|
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_chw_outlet},#{variable_name1},timestep;").get
|
140
139
|
end
|
141
|
-
if plantLoop.name.get.to_s.downcase.include?
|
142
|
-
#Extract plant loop information
|
143
|
-
selected_plant_loops[1]=plantLoop
|
140
|
+
if plantLoop.name.get.to_s.downcase.include?(hhw_loop_name.to_s) && !plantLoop.name.get.to_s.downcase.include?('service') && !plantLoop.name.get.to_s.downcase.include?('domestic')
|
141
|
+
# Extract plant loop information
|
142
|
+
selected_plant_loops[1] = plantLoop
|
144
143
|
key_value_hhw_outlet = selected_plant_loops[1].demandOutletNode.name.to_s
|
145
144
|
key_value_hhw_inlet = selected_plant_loops[1].demandInletNode.name.to_s
|
146
145
|
result << OpenStudio::IdfObject.load("Output:Variable,#{key_value_hhw_outlet},#{variable_name2},timestep;").get
|
@@ -153,7 +152,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
153
152
|
result << OpenStudio::IdfObject.load('Output:Variable,,Site Outdoor Air Drybulb Temperature,hourly;').get
|
154
153
|
result << OpenStudio::IdfObject.load('Output:Variable,,Site Outdoor Air Relative Humidity,hourly;').get
|
155
154
|
result << OpenStudio::IdfObject.load('Output:Meter,Cooling:Electricity,hourly;').get
|
156
|
-
|
155
|
+
result << OpenStudio::IdfObject.load('Output:Meter,Electricity:Facility,timestep;').get # #Using this for data at timestep interval
|
157
156
|
result << OpenStudio::IdfObject.load('Output:Meter,Heating:Electricity,hourly;').get
|
158
157
|
result << OpenStudio::IdfObject.load('Output:Meter,Heating:NaturalGas,hourly;').get
|
159
158
|
result << OpenStudio::IdfObject.load('Output:Meter,InteriorLights:Electricity,hourly;').get
|
@@ -171,15 +170,15 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
171
170
|
result
|
172
171
|
end
|
173
172
|
|
174
|
-
def extract_timeseries_into_matrix(sqlfile, data, variable_name, str, key_value = nil, default_if_empty = 0,dec_places, timestep)
|
173
|
+
def extract_timeseries_into_matrix(sqlfile, data, variable_name, str, key_value = nil, default_if_empty = 0, dec_places, timestep)
|
175
174
|
log "Executing query for #{variable_name}"
|
176
|
-
#column_name = variable_name
|
175
|
+
# column_name = variable_name
|
177
176
|
if key_value
|
178
177
|
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name, key_value)
|
179
|
-
#column_name += "_#{key_value}"
|
180
|
-
|
178
|
+
# column_name += "_#{key_value}"
|
179
|
+
column_name = str
|
181
180
|
else
|
182
|
-
#ts = sqlfile.timeSeries('RUN PERIOD 1', 'Hourly', variable_name)
|
181
|
+
# ts = sqlfile.timeSeries('RUN PERIOD 1', 'Hourly', variable_name)
|
183
182
|
ts = sqlfile.timeSeries('RUN PERIOD 1', 'Zone Timestep', variable_name)
|
184
183
|
end
|
185
184
|
log 'Iterating over timeseries'
|
@@ -201,16 +200,16 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
201
200
|
# end
|
202
201
|
|
203
202
|
quick_proc = ts.values.to_s.split(',')
|
204
|
-
quick_proc[0]=quick_proc[0].split('(', 2).last #cleanup necessary to remove opening paren
|
205
|
-
quick_proc=quick_proc.map(&:to_f)
|
203
|
+
quick_proc[0] = quick_proc[0].split('(', 2).last # cleanup necessary to remove opening paren
|
204
|
+
quick_proc = quick_proc.map(&:to_f)
|
206
205
|
x = 0
|
207
206
|
len = quick_proc.length
|
208
|
-
|
209
|
-
while
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
207
|
+
log "quick proc #{quick_proc}"
|
208
|
+
while x < len # Round to the # of decimal places specified
|
209
|
+
quick_proc[x] = (quick_proc[x]).round(dec_places)
|
210
|
+
x += 1
|
211
|
+
end
|
212
|
+
quick_proc = quick_proc.map(&:to_s)
|
214
213
|
|
215
214
|
# the first and last have some cleanup items because of the Vector method
|
216
215
|
quick_proc[0] = quick_proc[0].gsub(/^.*\(/, '')
|
@@ -232,7 +231,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
232
231
|
log "Finished extracting #{variable_name}"
|
233
232
|
end
|
234
233
|
|
235
|
-
def create_new_variable_sum(data, new_var_name, include_str, options=nil)
|
234
|
+
def create_new_variable_sum(data, new_var_name, include_str, options = nil)
|
236
235
|
var_info = {
|
237
236
|
name: new_var_name,
|
238
237
|
var_indexes: []
|
@@ -285,16 +284,18 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
285
284
|
|
286
285
|
# lookup and replace argument values from upstream measures
|
287
286
|
if args['use_upstream_args'] == true
|
288
|
-
args.each do |arg,value|
|
287
|
+
args.each do |arg, value|
|
289
288
|
next if arg == 'use_upstream_args' # this argument should not be changed
|
289
|
+
|
290
290
|
value_from_osw = OsLib_HelperMethods.check_upstream_measure_for_arg(runner, arg)
|
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
|
+
case arg
|
296
|
+
when 'hhw_loop_name'
|
296
297
|
args[arg] = new_val.to_s
|
297
|
-
|
298
|
+
when 'chw_loop_name'
|
298
299
|
args[arg] = new_val.to_s
|
299
300
|
else
|
300
301
|
args[arg] = new_val
|
@@ -314,8 +315,8 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
314
315
|
end
|
315
316
|
model = model.get
|
316
317
|
|
317
|
-
timesteps_per_hour=model.getTimestep.numberOfTimestepsPerHour.to_i
|
318
|
-
timestep=60/timesteps_per_hour #timestep in minutes
|
318
|
+
timesteps_per_hour = model.getTimestep.numberOfTimestepsPerHour.to_i
|
319
|
+
timestep = 60 / timesteps_per_hour # timestep in minutes
|
319
320
|
|
320
321
|
sqlFile = runner.lastEnergyPlusSqlFile
|
321
322
|
if sqlFile.empty?
|
@@ -342,7 +343,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
342
343
|
ts = sqlFile.timeSeries('RUN PERIOD 1', 'Zone Timestep', attribute_name)
|
343
344
|
if ts.empty?
|
344
345
|
runner.registerError("This feature does not have the attribute '#{attribute_name}' to enable this measure to work." \
|
345
|
-
|
346
|
+
'To resolve, simulate a building with electricity or remove this measure from your workflow.')
|
346
347
|
else
|
347
348
|
ts = ts.first
|
348
349
|
dt_base = nil
|
@@ -357,7 +358,7 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
357
358
|
dt.date.dayOfWeek.value,
|
358
359
|
dt.time.hours,
|
359
360
|
dt.time.minutes,
|
360
|
-
dt_current.to_time.to_i - dt_base.to_time.to_i + timestep*60
|
361
|
+
dt_current.to_time.to_i - dt_base.to_time.to_i + timestep * 60
|
361
362
|
]
|
362
363
|
end
|
363
364
|
end
|
@@ -367,52 +368,51 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
367
368
|
selected_plant_loops = []
|
368
369
|
i = 0
|
369
370
|
|
370
|
-
key_var={}
|
371
|
+
key_var = {}
|
371
372
|
|
372
373
|
plantloops.each do |plantLoop|
|
373
374
|
if plantLoop.name.get.to_s.downcase.include? chw_loop_name.to_str
|
374
|
-
#Extract plant loop information
|
375
|
-
|
375
|
+
# Extract plant loop information
|
376
|
+
selected_plant_loops[0] = plantLoop
|
376
377
|
end
|
377
378
|
if plantLoop.name.get.to_s.downcase.include? hhw_loop_name.to_str
|
378
|
-
|
379
|
-
|
379
|
+
# Get plant loop information
|
380
|
+
selected_plant_loops[1] = plantLoop
|
380
381
|
end
|
381
382
|
end
|
382
383
|
|
383
384
|
if !selected_plant_loops[1].nil?
|
384
|
-
#Set up variables for output
|
385
|
+
# Set up variables for output
|
385
386
|
key_value_hhw_outlet = selected_plant_loops[1].demandOutletNode.name.to_s
|
386
387
|
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
|
388
|
+
key_var['hhw_outlet_massflow'] = 'massFlowRateHeating'
|
389
|
+
key_var['hhw_outlet_temp'] = 'heatingReturnTemperature[C]'
|
390
|
+
key_var['hhw_inlet_temp'] = 'heatingSupplyTemperature[C]'
|
391
|
+
# Extract time series
|
391
392
|
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['hhw_outlet_temp'], key_value_hhw_outlet, 0, dec_places_temp, timestep)
|
392
393
|
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['hhw_inlet_temp'], key_value_hhw_inlet, 0, dec_places_temp, timestep)
|
393
394
|
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
395
|
else
|
395
|
-
runner.registerWarning(
|
396
|
+
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.')
|
396
397
|
end
|
397
398
|
|
398
399
|
if !selected_plant_loops[0].nil?
|
399
|
-
#Set up variables for outputs
|
400
|
+
# Set up variables for outputs
|
400
401
|
key_value_chw_outlet = selected_plant_loops[0].demandOutletNode.name.to_s
|
401
402
|
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)
|
403
|
+
key_var['chw_outlet_massflow'] = 'massFlowRateCooling'
|
404
|
+
key_var['chw_outlet_temp'] = 'ChilledWaterReturnTemperature[C]'
|
405
|
+
key_var['chw_inlet_temp'] = 'ChilledWaterSupplyTemperature[C]'
|
406
|
+
# Extract time series
|
407
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['chw_outlet_temp'], key_value_chw_outlet, 0, dec_places_temp, timestep)
|
408
|
+
extract_timeseries_into_matrix(sqlFile, rows, 'System Node Temperature', key_var['chw_inlet_temp'], key_value_chw_inlet, 0, dec_places_temp, timestep)
|
409
|
+
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
410
|
else
|
410
|
-
runner.registerWarning(
|
411
|
+
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
412
|
end
|
412
413
|
|
413
|
-
|
414
|
-
|
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.")
|
414
|
+
if selected_plant_loops[0].nil? && 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
416
|
end
|
417
417
|
|
418
418
|
if !selected_plant_loops.nil?
|
@@ -430,6 +430,5 @@ class ExportTimeSeriesLoadsCSV < OpenStudio::Measure::ReportingMeasure
|
|
430
430
|
end
|
431
431
|
end
|
432
432
|
|
433
|
-
|
434
433
|
# register the measure to be used by the application
|
435
434
|
ExportTimeSeriesLoadsCSV.new.registerWithApplication
|
@@ -358,10 +358,8 @@ module OsLib_HelperMethods
|
|
358
358
|
objectArray.each do |object|
|
359
359
|
object_LCCs = object.lifeCycleCosts
|
360
360
|
object_LCCs.each do |object_LCC|
|
361
|
-
if object_LCC.category == category
|
362
|
-
|
363
|
-
counter += object_LCC.totalCost
|
364
|
-
end
|
361
|
+
if object_LCC.category == category && (onlyYearFromStartZero == false || object_LCC.yearsFromStart == 0)
|
362
|
+
counter += object_LCC.totalCost
|
365
363
|
end
|
366
364
|
end
|
367
365
|
end
|
@@ -50,6 +50,7 @@ module URBANopt
|
|
50
50
|
##
|
51
51
|
class ConstructionCost
|
52
52
|
attr_accessor :category, :item_name, :unit_cost, :cost_units, :item_quantity, :total_cost # :nodoc:
|
53
|
+
|
53
54
|
##
|
54
55
|
# ConstructionCost class intialize all construction_cost attributes:
|
55
56
|
# +:category+ , +:item_name+ , +:unit_cost+ , +:cost_units+ , +:item_quantity+ , +:total_cost+
|
@@ -234,7 +234,7 @@ module URBANopt
|
|
234
234
|
@total_storage_kwh = nil
|
235
235
|
|
236
236
|
@solar_pv = []
|
237
|
-
if hash[:solar_pv].
|
237
|
+
if hash[:solar_pv].instance_of?(Hash)
|
238
238
|
hash[:solar_pv] = [hash[:solar_pv]]
|
239
239
|
elsif hash[:solar_pv].nil?
|
240
240
|
hash[:solar_pv] = []
|
@@ -252,7 +252,7 @@ module URBANopt
|
|
252
252
|
end
|
253
253
|
|
254
254
|
@wind = []
|
255
|
-
if hash[:wind].
|
255
|
+
if hash[:wind].instance_of?(Hash)
|
256
256
|
hash[:wind] = [hash[:wind]]
|
257
257
|
elsif hash[:wind].nil?
|
258
258
|
hash[:wind] = []
|
@@ -270,7 +270,7 @@ module URBANopt
|
|
270
270
|
end
|
271
271
|
|
272
272
|
@generator = []
|
273
|
-
if hash[:generator].
|
273
|
+
if hash[:generator].instance_of?(Hash)
|
274
274
|
hash[:generator] = [hash[:generator]]
|
275
275
|
elsif hash[:generator].nil?
|
276
276
|
hash[:generator] = []
|
@@ -288,7 +288,7 @@ module URBANopt
|
|
288
288
|
end
|
289
289
|
|
290
290
|
@storage = []
|
291
|
-
if hash[:storage].
|
291
|
+
if hash[:storage].instance_of?(Hash)
|
292
292
|
hash[:storage] = [hash[:storage]]
|
293
293
|
elsif hash[:storage].nil?
|
294
294
|
hash[:storage] = []
|
@@ -50,6 +50,7 @@ module URBANopt
|
|
50
50
|
##
|
51
51
|
class EndUses
|
52
52
|
attr_accessor :electricity_kwh, :natural_gas_kwh, :propane_kwh, :fuel_oil_kwh, :other_fuels_kwh, :district_cooling_kwh, :district_heating_kwh, :water_qbft # :nodoc:
|
53
|
+
|
53
54
|
##
|
54
55
|
# EndUses class intialize end_uses(fuel type) attributes: +:electricity_kwh+ , +:natural_gas_kwh+ , +:propane_kwh+ , +:fuel_oil_kwh+ , +:other_fuels_kwh+ ,
|
55
56
|
# +:district_cooling_kwh+ , +:district_heating_kwh+ , +:water_qbft+
|
@@ -65,6 +65,7 @@ module URBANopt
|
|
65
65
|
class FeatureReport
|
66
66
|
attr_accessor :id, :name, :directory_name, :feature_type, :timesteps_per_hour, :simulation_status,
|
67
67
|
:timeseries_csv, :location, :program, :design_parameters, :construction_costs, :reporting_periods, :distributed_generation, :power_distribution, :thermal_storage # :nodoc:
|
68
|
+
|
68
69
|
##
|
69
70
|
# Each FeatureReport object corresponds to a single Feature.
|
70
71
|
##
|
@@ -254,7 +255,7 @@ module URBANopt
|
|
254
255
|
# create feature reports directory
|
255
256
|
Dir.mkdir(results_dir_path) unless Dir.exist?(File.join(@directory_name, 'feature_reports'))
|
256
257
|
|
257
|
-
@timeseries_csv.path = File.join(@directory_name, 'feature_reports', file_name
|
258
|
+
@timeseries_csv.path = File.join(@directory_name, 'feature_reports', "#{file_name}.csv")
|
258
259
|
FileUtils.mkdir_p File.dirname(@timeseries_csv.path)
|
259
260
|
@timeseries_csv.save_data
|
260
261
|
|
@@ -262,7 +263,7 @@ module URBANopt
|
|
262
263
|
# feature_hash
|
263
264
|
feature_hash = to_hash
|
264
265
|
|
265
|
-
json_name_path = File.join(results_dir_path, file_name
|
266
|
+
json_name_path = File.join(results_dir_path, "#{file_name}.json")
|
266
267
|
|
267
268
|
File.open(json_name_path, 'w') do |f|
|
268
269
|
f.puts JSON.pretty_generate(feature_hash)
|
@@ -277,7 +278,7 @@ module URBANopt
|
|
277
278
|
if !old_timeseries_path.nil?
|
278
279
|
@timeseries_csv.path = old_timeseries_path
|
279
280
|
else
|
280
|
-
@timeseries_csv.path = File.join(@directory_name, file_name
|
281
|
+
@timeseries_csv.path = File.join(@directory_name, "#{file_name}.csv")
|
281
282
|
end
|
282
283
|
|
283
284
|
return true
|
@@ -312,7 +313,7 @@ module URBANopt
|
|
312
313
|
# feature_hash
|
313
314
|
feature_hash = to_hash
|
314
315
|
|
315
|
-
json_name_path = File.join(results_dir_path, file_name
|
316
|
+
json_name_path = File.join(results_dir_path, "#{file_name}.json")
|
316
317
|
|
317
318
|
File.open(json_name_path, 'w') do |f|
|
318
319
|
f.puts JSON.pretty_generate(feature_hash)
|
@@ -327,7 +328,7 @@ module URBANopt
|
|
327
328
|
|
328
329
|
##
|
329
330
|
# Saves the 'default_feature_report.csv' file to the results directory
|
330
|
-
# This method only copies the CSV feature reports from the folder generated by the reporting measure
|
331
|
+
# This method only copies the CSV feature reports from the folder generated by the reporting measure
|
331
332
|
# (<meausure number>_default_feature_reports/) to the new feature_reports/ folder
|
332
333
|
##
|
333
334
|
# [parameters]:
|
@@ -347,7 +348,7 @@ module URBANopt
|
|
347
348
|
# copy the CSV report to the new feature_reports folder
|
348
349
|
directory_folders.each do |f|
|
349
350
|
if f.include? '_default_feature_reports'
|
350
|
-
FileUtils.cp(File.join(f, 'default_feature_reports.csv'), File.join(results_dir_path, @file_name
|
351
|
+
FileUtils.cp(File.join(f, 'default_feature_reports.csv'), File.join(results_dir_path, "#{@file_name}.csv"))
|
351
352
|
end
|
352
353
|
end
|
353
354
|
end
|
@@ -50,6 +50,7 @@ module URBANopt
|
|
50
50
|
##
|
51
51
|
class Location
|
52
52
|
attr_accessor :latitude_deg, :longitude_deg, :surface_elevation_ft, :weather_filename #:nodoc:
|
53
|
+
|
53
54
|
##
|
54
55
|
# Location class initialize location attributes: +:latitude_deg+ , +:longitude_deg+ , +:surface_elevation_ft+ , +:weather_filename+
|
55
56
|
##
|
@@ -56,6 +56,7 @@ module URBANopt
|
|
56
56
|
:maximum_number_of_parking_stories_above_ground, :number_of_residential_units, :building_types, :building_type, :maximum_occupancy,
|
57
57
|
:area_sqft, :window_area_sqft, :north_window_area_sqft, :south_window_area_sqft, :east_window_area_sqft, :west_window_area_sqft, :wall_area_sqft, :roof_area_sqft, :equipment_roof_area_sqft,
|
58
58
|
:photovoltaic_roof_area_sqft, :available_roof_area_sqft, :total_roof_area_sqft, :orientation_deg, :aspect_ratio, :total_construction_cost_dollar # :nodoc:
|
59
|
+
|
59
60
|
# Program class initialize building program attributes: +:site_area_sqft+ , +:floor_area_sqft+ , +:conditioned_area_sqft+ , +:unconditioned_area_sqft+ ,
|
60
61
|
# +:footprint_area_sqft+ , +:maximum_roof_height_ft, +:maximum_number_of_stories+ , +:maximum_number_of_stories_above_ground+ , +:parking_area_sqft+ ,
|
61
62
|
# +:number_of_parking_spaces+ , +:number_of_parking_spaces_charging+ , +:parking_footprint_area_sqft+ , +:maximum_parking_height_ft+ , +:maximum_number_of_parking_stories+ ,
|
@@ -58,6 +58,7 @@ module URBANopt
|
|
58
58
|
:district_heating_kwh, :water_qbft, :electricity_produced_kwh, :end_uses, :energy_production_kwh, :photovoltaic,
|
59
59
|
:fuel_type, :total_cost_dollar, :usage_cost_dollar, :demand_cost_dollar, :comfort_result, :time_setpoint_not_met_during_occupied_cooling,
|
60
60
|
:time_setpoint_not_met_during_occupied_heating, :time_setpoint_not_met_during_occupied_hours, :hours_out_of_comfort_bounds_PMV, :hours_out_of_comfort_bounds_PPD #:nodoc:
|
61
|
+
|
61
62
|
# ReportingPeriod class initializes the reporting period attributes:
|
62
63
|
# +:id+ , +:name+ , +:multiplier+ , +:start_date+ , +:end_date+ , +:month+ , +:day_of_month+ , +:year+ , +:total_site_energy_kwh+ , +:total_source_energy_kwh+ , +:site_EUI_kwh_per_m2+, +:site_EUI_kbtu_per_ft2+, +:source_EUI_kwh_per_m2+, +:source_EUI_kbtu_per_ft2+,
|
63
64
|
# +:net_site_energy_kwh+ , +:net_source_energy_kwh+ , +:total_utility_cost_dollar , +:net_utility_cost_dollar+ , +:utility_costs_dollar+ , +:electricity_kwh+ , +:natural_gas_kwh+ , +:propane_kwh+ , +:fuel_oil_kwh+ , +:other_fuels_kwh+ , +:district_cooling_kwh+ ,
|
@@ -258,10 +259,8 @@ module URBANopt
|
|
258
259
|
new_end_uses = new_period.end_uses
|
259
260
|
existing_period.end_uses&.merge_end_uses!(new_end_uses)
|
260
261
|
|
261
|
-
if existing_period.energy_production_kwh
|
262
|
-
|
263
|
-
existing_period.energy_production_kwh[:electricity_produced_kwh][:photovoltaic_kwh] = add_values(existing_period.energy_production_kwh[:electricity_produced][:photovoltaic], new_period.energy_production_kwh[:electricity_produced_kwh][:photovoltaic_kwh])
|
264
|
-
end
|
262
|
+
if existing_period.energy_production_kwh && existing_period.energy_production_kwh[:electricity_produced_kwh]
|
263
|
+
existing_period.energy_production_kwh[:electricity_produced_kwh][:photovoltaic_kwh] = add_values(existing_period.energy_production_kwh[:electricity_produced][:photovoltaic], new_period.energy_production_kwh[:electricity_produced_kwh][:photovoltaic_kwh])
|
265
264
|
end
|
266
265
|
|
267
266
|
existing_period.utility_costs_dollar&.each_with_index do |item, i|
|
@@ -63,6 +63,7 @@ module URBANopt
|
|
63
63
|
attr_accessor :id, :name, :directory_name, :timesteps_per_hour, :number_of_not_started_simulations,
|
64
64
|
:number_of_started_simulations, :number_of_complete_simulations, :number_of_failed_simulations,
|
65
65
|
:timeseries_csv, :location, :program, :construction_costs, :reporting_periods, :feature_reports, :distributed_generation # :nodoc:
|
66
|
+
|
66
67
|
# ScenarioReport class intializes the scenario report attributes:
|
67
68
|
# +:id+ , +:name+ , +:directory_name+, +:timesteps_per_hour+ , +:number_of_not_started_simulations+ ,
|
68
69
|
# +:number_of_started_simulations+ , +:number_of_complete_simulations+ , +:number_of_failed_simulations+ ,
|
@@ -142,14 +143,14 @@ module URBANopt
|
|
142
143
|
# Gets the saved JSON file path.
|
143
144
|
##
|
144
145
|
def json_path
|
145
|
-
File.join(@directory_name, @file_name
|
146
|
+
File.join(@directory_name, "#{@file_name}.json")
|
146
147
|
end
|
147
148
|
|
148
149
|
##
|
149
150
|
# Gets the saved CSV file path.
|
150
151
|
##
|
151
152
|
def csv_path
|
152
|
-
File.join(@directory_name, @file_name
|
153
|
+
File.join(@directory_name, "#{@file_name}.csv")
|
153
154
|
end
|
154
155
|
|
155
156
|
##
|
@@ -167,7 +168,7 @@ module URBANopt
|
|
167
168
|
old_timeseries_path = @timeseries_csv.path
|
168
169
|
end
|
169
170
|
|
170
|
-
@timeseries_csv.path = File.join(@directory_name, file_name
|
171
|
+
@timeseries_csv.path = File.join(@directory_name, "#{file_name}.csv")
|
171
172
|
@timeseries_csv.save_data
|
172
173
|
|
173
174
|
hash = {}
|
@@ -177,7 +178,7 @@ module URBANopt
|
|
177
178
|
hash[:feature_reports] << feature_report.to_hash
|
178
179
|
end
|
179
180
|
|
180
|
-
json_name_path = File.join(@directory_name, file_name
|
181
|
+
json_name_path = File.join(@directory_name, "#{file_name}.json")
|
181
182
|
|
182
183
|
File.open(json_name_path, 'w') do |f|
|
183
184
|
f.puts JSON.pretty_generate(hash)
|
@@ -192,16 +193,16 @@ module URBANopt
|
|
192
193
|
if !old_timeseries_path.nil?
|
193
194
|
@timeseries_csv.path = old_timeseries_path
|
194
195
|
else
|
195
|
-
@timeseries_csv.path = File.join(@directory_name, file_name
|
196
|
+
@timeseries_csv.path = File.join(@directory_name, "#{file_name}.csv")
|
196
197
|
end
|
197
198
|
|
198
199
|
if save_feature_reports
|
199
200
|
if file_name == 'default_scenario_report'
|
200
201
|
file_name = 'default_feature_report'
|
201
202
|
end
|
202
|
-
#save the feature reports csv and json data
|
203
|
+
# save the feature reports csv and json data
|
203
204
|
@feature_reports.each do |feature_report|
|
204
|
-
|
205
|
+
feature_report.save file_name
|
205
206
|
end
|
206
207
|
end
|
207
208
|
|
@@ -292,13 +293,14 @@ module URBANopt
|
|
292
293
|
end
|
293
294
|
|
294
295
|
# check feature simulation status
|
295
|
-
|
296
|
+
case feature_report.simulation_status
|
297
|
+
when 'Not Started'
|
296
298
|
@number_of_not_started_simulations += 1
|
297
|
-
|
299
|
+
when 'Started'
|
298
300
|
@number_of_started_simulations += 1
|
299
|
-
|
301
|
+
when 'Complete'
|
300
302
|
@number_of_complete_simulations += 1
|
301
|
-
|
303
|
+
when 'Failed'
|
302
304
|
@number_of_failed_simulations += 1
|
303
305
|
else
|
304
306
|
raise "Unknown feature_report simulation_status = '#{feature_report.simulation_status}'"
|
@@ -291,6 +291,7 @@ module URBANopt
|
|
291
291
|
if current_values.size != new_values.size
|
292
292
|
raise 'Values of different sizes in add_timeseries_csv'
|
293
293
|
end
|
294
|
+
|
294
295
|
new_values.each_with_index do |value, i|
|
295
296
|
# aggregate all columns except Datime column
|
296
297
|
if column_name != 'Datetime'
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'urbanopt/reporting/version'
|
@@ -26,8 +25,8 @@ Gem::Specification.new do |spec|
|
|
26
25
|
|
27
26
|
spec.add_development_dependency 'bundler', '>= 2.1.0'
|
28
27
|
spec.add_development_dependency 'rake', '~> 13.0'
|
29
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
30
|
-
spec.add_runtime_dependency 'json-schema', '~> 2.8'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
31
29
|
spec.add_runtime_dependency 'json_pure', '~> 2.3'
|
32
|
-
spec.add_runtime_dependency '
|
30
|
+
spec.add_runtime_dependency 'json-schema', '~> 2.8'
|
31
|
+
spec.add_runtime_dependency 'openstudio-extension', '~> 0.5.1'
|
33
32
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: urbanopt-reporting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rawad El Kontar
|
8
8
|
- Dan Macumber
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -45,56 +45,56 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '3.
|
48
|
+
version: '3.9'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '3.
|
55
|
+
version: '3.9'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: json_pure
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '2.
|
62
|
+
version: '2.3'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '2.
|
69
|
+
version: '2.3'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: json-schema
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '2.
|
76
|
+
version: '2.8'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '2.
|
83
|
+
version: '2.8'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: openstudio-extension
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 0.
|
90
|
+
version: 0.5.1
|
91
91
|
type: :runtime
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: 0.
|
97
|
+
version: 0.5.1
|
98
98
|
description: Library include scenario default reporting measure and scenario defaults
|
99
99
|
reports schema and classes
|
100
100
|
email:
|
@@ -191,7 +191,7 @@ homepage: https://github.com/urbanopt
|
|
191
191
|
licenses:
|
192
192
|
- Nonstandard
|
193
193
|
metadata: {}
|
194
|
-
post_install_message:
|
194
|
+
post_install_message:
|
195
195
|
rdoc_options: []
|
196
196
|
require_paths:
|
197
197
|
- lib
|
@@ -207,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
207
|
version: '0'
|
208
208
|
requirements: []
|
209
209
|
rubygems_version: 3.1.4
|
210
|
-
signing_key:
|
210
|
+
signing_key:
|
211
211
|
specification_version: 4
|
212
212
|
summary: Library to report URBANopt results
|
213
213
|
test_files: []
|