urbanopt-reporting 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b054eb35c606b016c477af8a6ef130f3ea17272ebce7b7c6ba0baf7654052842
4
- data.tar.gz: c113ced6a3818b22f73254f9374068de1f0365da03b4e0e7e2c503d08cf9e184
3
+ metadata.gz: ad3876bd40e8b43fd00b165d147f1ac0b4a00a9e6050f56d45b43f00cbed3857
4
+ data.tar.gz: 6cebd747f854d908d9d8a032832a03e0ce8fb3073c68c74e4ab25ec8ec2e6234
5
5
  SHA512:
6
- metadata.gz: 5a0234e8a7192d06723ef03c93e1d575f9f8a49600a1c1dd8108a52dc7b6f43267265b4b58c174b72f6ddb691b032fb16134939dcc1b86019cf8092cebdce256
7
- data.tar.gz: d01b29f21b8bfe8b2600d0146d401cbdeebaeb011d953bf87d94649112e610b38a4a48634a2b747785be65434171617ff09c92ae7e1a04776dffca613e745178
6
+ metadata.gz: '0114847b3946c896f6065126e314cece1ddce64a9b35d9f3f27c0504dcaa32cb024651c08c6e8049ca21e361301b20703d06ac1d4bf8c00a26e1c6b8aa2db775'
7
+ data.tar.gz: 0fd15dae815f7ce568e2946d8a1ec7aab98c03af519ac8ac705e112343be14c5313dd141f7aa4cce3a7a3c10ff54f6720be45284c8ea15fbbe30006a25da252b
data/.rubocop.yml CHANGED
@@ -3,8 +3,7 @@ AllCops:
3
3
  - gems/**/*
4
4
  - measures/**/*
5
5
  - spec/files/**/measures/**/*
6
-
6
+ require: rubocop-performance
7
7
 
8
8
  inherit_from:
9
- - http://s3.amazonaws.com/openstudio-resources/styles/rubocop_v3.yml
10
-
9
+ - http://s3.amazonaws.com/openstudio-resources/styles/rubocop_v4.yml
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # URBANopt Reporting Gem
2
2
 
3
+ ## Version 0.5.0
4
+ Date Range: 11/13/21 - 11/22/21
5
+
6
+ - Updated dependencies for OpenStudio 3.3
7
+
8
+ ## Version 0.4.3
9
+ Date Range: 10/16/21 - 11/12/21
10
+
11
+ - Fixed [#93]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/93 ), Fix aggregation of storage system typo
12
+
13
+ ## Version 0.4.2
14
+ Date Range: 07/01/21 - 10/15/21
15
+
16
+ - Fixed [#86]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/86 ), Add location of PV to Scenario and Feature optimization reopt reports #86
17
+ - Fixed [#77]( https://github.com/urbanopt/urbanopt-reporting-gem/issues/77 ), Fix test_with_openstudio model failures
18
+
19
+ ## Version 0.4.1
20
+ Date Range: 04/27/23 - 07/01/21
21
+
22
+ - Fixed [#80](https://github.com/urbanopt/urbanopt-reporting-gem/issues/80), Update rubocop configs to v4
23
+ -
3
24
  ## Version 0.4.0
4
25
 
5
26
  Date Range: 03/27/21 - 04/26/21
@@ -43,7 +43,7 @@ require 'csv'
43
43
  require 'benchmark'
44
44
  require 'logger'
45
45
 
46
- @@logger = Logger.new(STDOUT)
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 if ['Residential'].include?(building.standardsBuildingType.get) # conditioned floor area only
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
@@ -428,10 +429,12 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
428
429
  feature_report.program.maximum_roof_height_ft = feature_report.program.maximum_number_of_stories_above_ground * floor_to_floor_height
429
430
 
430
431
  # footprint_area
431
- if not ['Residential'].include?(building.standardsBuildingType.get)
432
- feature_report.program.footprint_area_sqft = feature_report.program.floor_area_sqft / number_of_stories
433
- else
434
- feature_report.program.footprint_area_sqft = convert_units(floor_area, 'm^2', 'ft^2') / building.additionalProperties.getFeatureAsInteger('NumberOfConditionedStories').get
432
+ if building.standardsBuildingType.is_initialized
433
+ if !['Residential'].include?(building.standardsBuildingType.get)
434
+ feature_report.program.footprint_area_sqft = feature_report.program.floor_area_sqft / number_of_stories
435
+ else
436
+ feature_report.program.footprint_area_sqft = convert_units(floor_area, 'm^2', 'ft^2') / building.additionalProperties.getFeatureAsInteger('NumberOfConditionedStories').get
437
+ end
435
438
  end
436
439
 
437
440
  # number_of_residential_units
@@ -457,6 +460,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
457
460
  building_type = building_type.get
458
461
  end
459
462
  next if ['Residential'].include?(building_type) # space types with empty building type fields will inherit from the building object
463
+
460
464
  space_type_areas[building_type] = 0 if space_type_areas[building_type].nil?
461
465
  space_type_areas[building_type] += convert_units(space_type.floorArea, 'm^2', 'ft^2')
462
466
  end
@@ -469,6 +473,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
469
473
  else
470
474
  building_type = space.spaceType.get.standardsBuildingType
471
475
  end
476
+
472
477
  if building_type.empty?
473
478
  building_type = 'unknown'
474
479
  else
@@ -687,15 +692,15 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
687
692
  # district_cooling
688
693
  district_cooling = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Cooling'")
689
694
  feature_report.reporting_periods[0].district_cooling_kwh = convert_units(district_cooling, 'GJ', 'kWh')
690
- if building.standardsBuildingType.is_initialized
691
- feature_report.reporting_periods[0].district_cooling_kwh = 0.0 if ['Residential'].include?(building.standardsBuildingType.get)
695
+ if building.standardsBuildingType.is_initialized && ['Residential'].include?(building.standardsBuildingType.get)
696
+ feature_report.reporting_periods[0].district_cooling_kwh = 0.0
692
697
  end
693
698
 
694
699
  # district_heating
695
700
  district_heating = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='Total End Uses' AND ColumnName='District Heating'")
696
701
  feature_report.reporting_periods[0].district_heating_kwh = convert_units(district_heating, 'GJ', 'kWh')
697
- if building.standardsBuildingType.is_initialized
698
- feature_report.reporting_periods[0].district_heating_kwh = 0.0 if ['Residential'].include?(building.standardsBuildingType.get)
702
+ if building.standardsBuildingType.is_initialized && ['Residential'].include?(building.standardsBuildingType.get)
703
+ feature_report.reporting_periods[0].district_heating_kwh = 0.0
699
704
  end
700
705
 
701
706
  # water
@@ -723,10 +728,10 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
723
728
  # report each query in its corresponding feature report obeject
724
729
  x = ft.tr(' ', '_').downcase
725
730
  if x.include? 'water'
726
- x_u = x + '_qbft'
727
- else
731
+ x_u = "#{x}_qbft"
732
+ else
728
733
  x = x.gsub('_#2', '')
729
- x_u = x + '_kwh'
734
+ x_u = "#{x}_kwh"
730
735
  end
731
736
  m = feature_report.reporting_periods[0].end_uses.send(x_u)
732
737
 
@@ -737,8 +742,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
737
742
  end
738
743
  sql_r = convert_units(sql_r, 'GJ', 'kWh')
739
744
 
740
- if building.standardsBuildingType.is_initialized
741
- sql_r = 0.0 if ['Residential'].include?(building.standardsBuildingType.get) && x_u.include?('district')
745
+ if building.standardsBuildingType.is_initialized && (['Residential'].include?(building.standardsBuildingType.get) && x_u.include?('district'))
746
+ sql_r = 0.0
742
747
  end
743
748
  m.send("#{y}=", sql_r)
744
749
  end
@@ -753,7 +758,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
753
758
  sql = sql_query(runner, sql_file, 'AnnualBuildingUtilityPerformanceSummary', "TableName='End Uses' AND RowName='#{eu}' AND ColumnName='#{ft}'")
754
759
 
755
760
  # ensure not nil so the equations below don't error out
756
- if not sql.nil?
761
+ if !sql.nil?
757
762
  sql_r += convert_units(sql, 'GJ', 'kWh')
758
763
  end
759
764
  end
@@ -802,10 +807,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
802
807
  ann_env_pd = nil
803
808
  sql_file.availableEnvPeriods.each do |env_pd|
804
809
  env_type = sql_file.environmentType(env_pd)
805
- if env_type.is_initialized
806
- if env_type.get == OpenStudio::EnvironmentType.new('WeatherRunPeriod')
807
- ann_env_pd = env_pd
808
- end
810
+ if env_type.is_initialized && (env_type.get == OpenStudio::EnvironmentType.new('WeatherRunPeriod'))
811
+ ann_env_pd = env_pd
809
812
  end
810
813
  end
811
814
 
@@ -952,7 +955,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
952
955
  # use key_value name
953
956
  # special case for Zone Thermal Comfort: use both timeseries_name and key_value
954
957
  if timeseries_name.include? 'Zone Thermal Comfort'
955
- new_timeseries_name = timeseries_name + ' ' + key_value
958
+ new_timeseries_name = "#{timeseries_name} #{key_value}"
956
959
  else
957
960
  new_timeseries_name = key_value
958
961
  end
@@ -980,8 +983,8 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
980
983
  end
981
984
 
982
985
  # residential considerations
983
- if building.standardsBuildingType.is_initialized
984
- values[key_cnt] = Array.new(n, 0) if ['DistrictCooling:Facility', 'DistrictHeating:Facility'].include?(timeseries_name) && ['Residential'].include?(building.standardsBuildingType.get)
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)
985
988
  end
986
989
 
987
990
  # unit conversion
@@ -999,7 +1002,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
999
1002
  'm3'
1000
1003
  when 'W'
1001
1004
  'W'
1002
- end
1005
+ end
1003
1006
  end
1004
1007
 
1005
1008
  # loop through each value and apply unit conversion
@@ -39,6 +39,7 @@
39
39
  # *********************************************************************************
40
40
 
41
41
  require 'erb'
42
+ require 'date'
42
43
 
43
44
  # This measure is originally from https://github.com/urbanopt/DES_HVAC
44
45
  # start the measure
@@ -336,6 +337,7 @@ class ExportModelicaLoads < OpenStudio::Measure::ReportingMeasure
336
337
  f << "double tab1(8760,4)\n"
337
338
  modelica_data.each_with_index do |row, index|
338
339
  next if index.zero?
340
+
339
341
  f << row.join(';') << "\n"
340
342
  end
341
343
  end
@@ -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__) + '/resources/*.rb'].each { |file| require 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
- chw_loop_name = OpenStudio::Measure::OSArgument.makeStringArgument('chw_loop_name', true)
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
- dec_places_mass_flow = OpenStudio::Measure::OSArgument.makeIntegerArgument('dec_places_mass_flow', true)
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
- ##Read in argumetns related to variables for output requests
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
- log "plant loop name #{plantLoop.name.get.to_s}"
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? 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
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
- result << OpenStudio::IdfObject.load('Output:Meter,Electricity:Facility,timestep;').get ##Using this for data at timestep interval
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
- column_name=str
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
- log "quick proc #{quick_proc}"
209
- while(x < len) #Round to the # of decimal places specified
210
- quick_proc[x]=(quick_proc[x]).round(dec_places)
211
- x=x+1
212
- end
213
- quick_proc=quick_proc.map(&:to_s)
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
- if arg == 'hhw_loop_name'
295
+ case arg
296
+ when 'hhw_loop_name'
296
297
  args[arg] = new_val.to_s
297
- elsif arg == 'chw_loop_name'
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
- "To resolve, simulate a building with electricity or remove this measure from your workflow.")
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
- selected_plant_loops[0]=plantLoop
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
- #Get plant loop information
379
- selected_plant_loops[1]=plantLoop
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("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
+ 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("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
+ 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
- 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.")
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
- if onlyYearFromStartZero == false || object_LCC.yearsFromStart == 0
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+
@@ -50,6 +50,7 @@ module URBANopt
50
50
  ##
51
51
  class Date
52
52
  attr_accessor :month, :day_of_month, :year #:nodoc:
53
+
53
54
  ##
54
55
  # Date class intialize all date attributes:
55
56
  # +:month+ , +:day_of_month+ , +:year+
@@ -234,7 +234,7 @@ module URBANopt
234
234
  @total_storage_kwh = nil
235
235
 
236
236
  @solar_pv = []
237
- if hash[:solar_pv].class == Hash
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].class == Hash
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].class == Hash
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].class == Hash
291
+ if hash[:storage].instance_of?(Hash)
292
292
  hash[:storage] = [hash[:storage]]
293
293
  elsif hash[:storage].nil?
294
294
  hash[:storage] = []
@@ -476,7 +476,7 @@ module URBANopt
476
476
 
477
477
  new_dgen.storage.each do |storage|
478
478
  existing_dgen.storage.push storage
479
- if existing_dgen.total_wind_kw.nil?
479
+ if existing_dgen.total_storage_kw.nil?
480
480
  existing_dgen.total_storage_kw = storage.size_kw
481
481
  existing_dgen.total_storage_kwh = storage.size_kwh
482
482
  else
@@ -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 + '.csv')
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 + '.json')
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 + '.csv')
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 + '.json')
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 + '.csv'))
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
  ##
@@ -43,7 +43,7 @@ require 'logger'
43
43
  module URBANopt
44
44
  module Reporting
45
45
  module DefaultReports
46
- @@logger = Logger.new(STDOUT)
46
+ @@logger = Logger.new($stdout)
47
47
  ##
48
48
  # Definining class variable "@@logger" to log errors, info and warning messages.
49
49
  def self.logger
@@ -51,6 +51,7 @@ module URBANopt
51
51
  ##
52
52
  class PowerDistribution
53
53
  attr_accessor :under_voltage_hours, :over_voltage_hours # :nodoc:
54
+
54
55
  ##
55
56
  # PowerDistrinution class intialize all power_distribution attributes:
56
57
  # +:under_voltage_hours+ , +:over_voltage_hours+
@@ -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
- if 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])
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 + '.json')
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 + '.csv')
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 + '.csv')
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 + '.json')
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 + '.csv')
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
- feature_report.save file_name
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
- if feature_report.simulation_status == 'Not Started'
296
+ case feature_report.simulation_status
297
+ when 'Not Started'
296
298
  @number_of_not_started_simulations += 1
297
- elsif feature_report.simulation_status == 'Started'
299
+ when 'Started'
298
300
  @number_of_started_simulations += 1
299
- elsif feature_report.simulation_status == 'Complete'
301
+ when 'Complete'
300
302
  @number_of_complete_simulations += 1
301
- elsif feature_report.simulation_status == 'Failed'
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}'"
@@ -128,6 +128,15 @@
128
128
  "size_kw": {
129
129
  "description": "rated power in kW",
130
130
  "type": "string"
131
+ },
132
+ "location": {
133
+ "description": "Location of PV. Available options are roof, ground or both.",
134
+ "type": "string",
135
+ "enum": [
136
+ "roof",
137
+ "ground",
138
+ "both"
139
+ ]
131
140
  }
132
141
  }
133
142
  },
@@ -52,6 +52,7 @@ module URBANopt
52
52
  # _Float_ - power capacity in kilowatts
53
53
  #
54
54
  attr_accessor :size_kw
55
+ attr_accessor :location
55
56
 
56
57
  ##
57
58
  # Initialize SolarPV attributes from a hash. Solar PV attributes currently are limited to power capacity.
@@ -65,6 +66,7 @@ module URBANopt
65
66
 
66
67
  @size_kw = hash[:size_kw]
67
68
  @id = hash[:id]
69
+ @location = hash[:location]
68
70
 
69
71
  # initialize class variables @@validator and @@schema
70
72
  @@validator ||= Validator.new
@@ -81,6 +83,7 @@ module URBANopt
81
83
  result = {}
82
84
 
83
85
  result[:size_kw] = @size_kw if @size_kw
86
+ result[:location] = @location if @location
84
87
 
85
88
  return result
86
89
  end
@@ -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'
@@ -40,6 +40,6 @@
40
40
 
41
41
  module URBANopt
42
42
  module Reporting
43
- VERSION = '0.4.0'.freeze
43
+ VERSION = '0.5.0'.freeze
44
44
  end
45
45
  end
@@ -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.7'
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 'openstudio-extension', '~> 0.4.2'
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.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-04-29 00:00:00.000000000 Z
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.7'
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.7'
55
+ version: '3.9'
56
56
  - !ruby/object:Gem::Dependency
57
- name: json-schema
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.8'
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.8'
69
+ version: '2.3'
70
70
  - !ruby/object:Gem::Dependency
71
- name: json_pure
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.3'
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.3'
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.4.2
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.4.2
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: []