urbanopt-reporting 0.4.3 → 0.5.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 +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: []
|