urbanopt-reporting 0.1.0 → 0.3.1

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +19 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.rdoc_options +36 -0
  6. data/CHANGELOG.md +39 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.md +1 -1
  9. data/RDOC_MAIN.md +10 -0
  10. data/README.md +1 -1
  11. data/Rakefile +1 -1
  12. data/deploy_docs.sh +5 -0
  13. data/doc_templates/LICENSE.md +1 -1
  14. data/doc_templates/copyright_erb.txt +1 -1
  15. data/doc_templates/copyright_js.txt +1 -1
  16. data/doc_templates/copyright_ruby.txt +1 -1
  17. data/docs/.gitignore +3 -0
  18. data/docs/.vuepress/components/InnerJsonSchema.vue +76 -0
  19. data/docs/.vuepress/components/JsonSchema.vue +12 -0
  20. data/docs/.vuepress/components/ScenarioSchema.vue +12 -0
  21. data/docs/.vuepress/components/StaticLink.vue +8 -0
  22. data/docs/.vuepress/config.js +25 -0
  23. data/docs/.vuepress/highlight.js +8 -0
  24. data/docs/.vuepress/json-schema-deref-loader.js +22 -0
  25. data/docs/.vuepress/public/custom_rdoc_styles.css +78 -0
  26. data/docs/.vuepress/styles/palette.styl +1 -0
  27. data/docs/.vuepress/utils.js +17 -0
  28. data/docs/README.md +9 -0
  29. data/docs/package-lock.json +10018 -0
  30. data/docs/package.json +30 -0
  31. data/docs/schemas/scenario-schema.md +3 -0
  32. data/lib/measures/default_feature_reports/LICENSE.md +1 -1
  33. data/lib/measures/default_feature_reports/measure.rb +261 -88
  34. data/lib/measures/default_feature_reports/measure.xml +11 -11
  35. data/lib/urbanopt/reporting.rb +1 -1
  36. data/lib/urbanopt/reporting/default_reports.rb +1 -1
  37. data/lib/urbanopt/reporting/default_reports/construction_cost.rb +1 -1
  38. data/lib/urbanopt/reporting/default_reports/date.rb +1 -1
  39. data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +119 -6
  40. data/lib/urbanopt/reporting/default_reports/end_use.rb +1 -1
  41. data/lib/urbanopt/reporting/default_reports/end_uses.rb +53 -39
  42. data/lib/urbanopt/reporting/default_reports/extension.rb +30 -0
  43. data/lib/urbanopt/reporting/default_reports/feature_report.rb +52 -21
  44. data/lib/urbanopt/reporting/default_reports/generator.rb +2 -2
  45. data/lib/urbanopt/reporting/default_reports/location.rb +12 -12
  46. data/lib/urbanopt/reporting/default_reports/logger.rb +1 -1
  47. data/lib/urbanopt/reporting/default_reports/power_distribution.rb +1 -1
  48. data/lib/urbanopt/reporting/default_reports/program.rb +87 -87
  49. data/lib/urbanopt/reporting/default_reports/reporting_period.rb +87 -79
  50. data/lib/urbanopt/reporting/default_reports/scenario_report.rb +1 -1
  51. data/lib/urbanopt/reporting/default_reports/schema/README.md +1 -1
  52. data/lib/urbanopt/reporting/default_reports/schema/scenario_csv_columns.txt +18 -1
  53. data/lib/urbanopt/reporting/default_reports/schema/scenario_schema.json +117 -82
  54. data/lib/urbanopt/reporting/default_reports/solar_pv.rb +2 -2
  55. data/lib/urbanopt/reporting/default_reports/storage.rb +2 -2
  56. data/lib/urbanopt/reporting/default_reports/thermal_storage.rb +111 -0
  57. data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +1 -1
  58. data/lib/urbanopt/reporting/default_reports/validator.rb +1 -1
  59. data/lib/urbanopt/reporting/default_reports/wind.rb +2 -2
  60. data/lib/urbanopt/reporting/derived_extension.rb +1 -1
  61. data/lib/urbanopt/reporting/version.rb +2 -2
  62. data/urbanopt-reporting-gem.gemspec +4 -4
  63. metadata +37 -15
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -43,16 +43,16 @@ module URBANopt
43
43
  # ReportingPeriod includes all the results of a specific reporting period.
44
44
  ##
45
45
  class ReportingPeriod
46
- attr_accessor :id, :name, :multiplier, :start_date, :end_date, :month, :day_of_month, :year, :total_site_energy, :total_source_energy,
47
- :net_site_energy, :net_source_energy, :total_utility_cost, :net_utility_cost, :utility_costs, :electricity, :natural_gas, :additional_fuel, :district_cooling,
48
- :district_heating, :water, :electricity_produced, :end_uses, :energy_production, :photovoltaic,
49
- :fuel_type, :total_cost, :usage_cost, :demand_cost, :comfort_result, :time_setpoint_not_met_during_occupied_cooling,
46
+ attr_accessor :id, :name, :multiplier, :start_date, :end_date, :month, :day_of_month, :year, :total_site_energy_kwh, :total_source_energy_kwh,
47
+ :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,
48
+ :district_heating_kwh, :water_qbft, :electricity_produced_kwh, :end_uses, :energy_production_kwh, :photovoltaic,
49
+ :fuel_type, :total_cost_dollar, :usage_cost_dollar, :demand_cost_dollar, :comfort_result, :time_setpoint_not_met_during_occupied_cooling,
50
50
  :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:
51
51
  # ReportingPeriod class initializes the reporting period attributes:
52
- # +:id+ , +:name+ , +:multiplier+ , +:start_date+ , +:end_date+ , +:month+ , +:day_of_month+ , +:year+ , +:total_site_energy+ , +:total_source_energy+ ,
53
- # +:net_site_energy+ , +:net_source_energy+ , +:total_utility_cost , +:net_utility_cost+ , +:utility_costs+ , +:electricity+ , +:natural_gas+ , +:additional_fuel+ , +:district_cooling+ ,
54
- # +:district_heating+ , +:water+ , +:electricity_produced+ , +:end_uses+ , +:energy_production+ , +:photovoltaic+ ,
55
- # +:fuel_type+ , +:total_cost+ , +:usage_cost+ , +:demand_cost+ , +:comfort_result+ , +:time_setpoint_not_met_during_occupied_cooling+ ,
52
+ # +:id+ , +:name+ , +:multiplier+ , +:start_date+ , +:end_date+ , +:month+ , +:day_of_month+ , +:year+ , +:total_site_energy_kwh+ , +:total_source_energy_kwh+ ,
53
+ # +: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+ ,
54
+ # +:district_heating_kwh+ , +:water_qbft+ , +:electricity_produced_kwh+ , +:end_uses+ , +:energy_production_kwh+ , +:photovoltaic_kwh+ ,
55
+ # +:fuel_type+ , +:total_cost_dollar+ , +:usage_cost_dollar+ , +:demand_cost_dollar+ , +:comfort_result+ , +:time_setpoint_not_met_during_occupied_cooling+ ,
56
56
  # +:time_setpoint_not_met_during_occupied_heating+ , +:time_setpoint_not_met_during_occupied_hours+
57
57
  ##
58
58
  # [parameters:]
@@ -68,24 +68,26 @@ module URBANopt
68
68
  @start_date = Date.new(hash[:start_date])
69
69
  @end_date = Date.new(hash[:end_date])
70
70
 
71
- @total_site_energy = hash[:total_site_energy]
72
- @total_source_energy = hash[:total_source_energy]
73
- @net_site_energy = hash [:net_site_energy]
74
- @net_source_energy = hash [:net_source_energy]
75
- @net_utility_cost = hash [:net_utility_cost]
76
- @total_utility_cost = hash [:total_utility_cost]
77
- @electricity = hash [:electricity]
78
- @natural_gas = hash [:natural_gas]
79
- @additional_fuel = hash [:additional_fuel]
80
- @district_cooling = hash [:district_cooling]
81
- @district_heating = hash[:district_heating]
82
- @water = hash[:water]
83
- @electricity_produced = hash[:electricity_produced]
71
+ @total_site_energy_kwh = hash[:total_site_energy_kwh]
72
+ @total_source_energy_kwh = hash[:total_source_energy_kwh]
73
+ @net_site_energy_kwh = hash[:net_site_energy_kwh]
74
+ @net_source_energy_kwh = hash[:net_source_energy_kwh]
75
+ @net_utility_cost_dollar = hash[:net_utility_cost_dollar]
76
+ @total_utility_cost_dollar = hash[:total_utility_cost_dollar]
77
+ @electricity_kwh = hash[:electricity_kwh]
78
+ @natural_gas_kwh = hash[:natural_gas_kwh]
79
+ @propane_kwh = hash[:propane_kwh]
80
+ @fuel_oil_kwh = hash[:fuel_oil_kwh]
81
+ @other_fuels_kwh = hash[:other_fuels_kwh]
82
+ @district_cooling_kwh = hash[:district_cooling_kwh]
83
+ @district_heating_kwh = hash[:district_heating_kwh]
84
+ @water_qbft = hash[:water_qbft]
85
+ @electricity_produced_kwh = hash[:electricity_produced_kwh]
84
86
  @end_uses = EndUses.new(hash[:end_uses])
85
87
 
86
- @energy_production = hash[:energy_production]
88
+ @energy_production_kwh = hash[:energy_production_kwh]
87
89
 
88
- @utility_costs = hash[:utility_costs]
90
+ @utility_costs_dollar = hash[:utility_costs_dollar]
89
91
 
90
92
  @comfort_result = hash[:comfort_result]
91
93
 
@@ -106,22 +108,24 @@ module URBANopt
106
108
  hash[:start_date] = Date.new.to_hash
107
109
  hash[:end_date] = Date.new.to_hash
108
110
 
109
- hash[:total_site_energy] = nil
110
- hash[:total_source_energy] = nil
111
- hash [:net_site_energy] = nil
112
- hash [:net_source_energy] = nil
113
- hash [:net_utility_cost] = nil
114
- hash [:total_utility_cost] = nil
115
- hash [:electricity] = nil
116
- hash [:natural_gas] = nil
117
- hash [:additional_fuel] = nil
118
- hash [:district_cooling] = nil
119
- hash[:district_heating] = nil
120
-
121
- hash[:electricity_produced] = nil
111
+ hash[:total_site_energy_kwh] = nil
112
+ hash[:total_source_energy_kwh] = nil
113
+ hash[:net_site_energy_kwh] = nil
114
+ hash[:net_source_energy_kwh] = nil
115
+ hash[:net_utility_cost_dollar] = nil
116
+ hash[:total_utility_cost_dollar] = nil
117
+ hash[:electricity_kwh] = nil
118
+ hash[:natural_gas_kwh] = nil
119
+ hash[:propane_kwh] = nil
120
+ hash[:fuel_oil_kwh] = nil
121
+ hash[:other_fuels_kwh] = nil
122
+ hash[:district_cooling_kwh] = nil
123
+ hash[:district_heating_kwh] = nil
124
+
125
+ hash[:electricity_produced_kwh] = nil
122
126
  hash[:end_uses] = EndUses.new.to_hash
123
- hash[:energy_production] = { electricity_produced: { photovoltaic: nil } }
124
- hash[:utility_costs] = [{ fuel_type: nil, total_cost: nil, usage_cost: nil, demand_cost: nil }]
127
+ hash[:energy_production_kwh] = { electricity_produced: { photovoltaic: nil } }
128
+ hash[:utility_costs_dollar] = [{ fuel_type: nil, total_cost_dollar: nil, usage_cost_dollar: nil, demand_cost_dollar: nil }]
125
129
  hash[:comfort_result] = { time_setpoint_not_met_during_occupied_cooling: nil, time_setpoint_not_met_during_occupied_heating: nil,
126
130
  time_setpoint_not_met_during_occupied_hours: nil, hours_out_of_comfort_bounds_PMV: nil, hours_out_of_comfort_bounds_PPD: nil }
127
131
 
@@ -142,32 +146,34 @@ module URBANopt
142
146
  result[:multiplier] = @multiplier if @multiplier
143
147
  result[:start_date] = @start_date.to_hash if @start_date
144
148
  result[:end_date] = @end_date.to_hash if @end_date
145
- result[:total_site_energy] = @total_site_energy if @total_site_energy
146
- result[:total_source_energy] = @total_source_energy if @total_source_energy
147
- result[:net_site_energy] = @net_site_energy if @net_site_energy
148
- result[:net_source_energy] = @net_source_energy if @net_source_energy
149
- result[:net_utility_cost] = @net_utility_cost if @net_utility_cost
150
- result[:total_utility_cost] = @total_utility_cost if @total_utility_cost
151
- result[:electricity] = @electricity if @electricity
152
- result[:natural_gas] = @natural_gas if @natural_gas
153
- result[:additional_fuel] = @additional_fuel if @additional_fuel
154
- result[:district_cooling] = @district_cooling if @district_cooling
155
- result[:district_heating] = @district_heating if @district_heating
156
- result[:water] = @water if @water
157
- result[:electricity_produced] = @electricity_produced if @electricity_produced
149
+ result[:total_site_energy_kwh] = @total_site_energy_kwh if @total_site_energy_kwh
150
+ result[:total_source_energy_kwh] = @total_source_energy_kwh if @total_source_energy_kwh
151
+ result[:net_site_energy_kwh] = @net_site_energy_kwh if @net_site_energy_kwh
152
+ result[:net_source_energy_kwh] = @net_source_energy_kwh if @net_source_energy_kwh
153
+ result[:net_utility_cost_dollar] = @net_utility_cost_dollar if @net_utility_cost_dollar
154
+ result[:total_utility_cost_dollar] = @total_utility_cost_dollar if @total_utility_cost_dollar
155
+ result[:electricity_kwh] = @electricity_kwh if @electricity_kwh
156
+ result[:natural_gas_kwh] = @natural_gas_kwh if @natural_gas_kwh
157
+ result[:propane_kwh] = @propane_kwh if @propane_kwh
158
+ result[:fuel_oil_kwh] = @fuel_oil_kwh if @fuel_oil_kwh
159
+ result[:other_fuels_kwh] = @other_fuels_kwh if @other_fuels_kwh
160
+ result[:district_cooling_kwh] = @district_cooling_kwh if @district_cooling_kwh
161
+ result[:district_heating_kwh] = @district_heating_kwh if @district_heating_kwh
162
+ result[:water_qbft] = @water_qbft if @water_qbft
163
+ result[:electricity_produced_kwh] = @electricity_produced_kwh if @electricity_produced_kwh
158
164
  result[:end_uses] = @end_uses.to_hash if @end_uses
159
165
 
160
- energy_production_hash = @energy_production if @energy_production
161
- energy_production_hash.delete_if { |k, v| v.nil? }
162
- energy_production_hash.each do |eph|
166
+ energy_production_kwh_hash = @energy_production_kwh if @energy_production_kwh
167
+ energy_production_kwh_hash.delete_if { |k, v| v.nil? }
168
+ energy_production_kwh_hash.each do |eph|
163
169
  eph.delete_if { |k, v| v.nil? }
164
170
  end
165
171
 
166
- result[:energy_production] = energy_production_hash if @energy_production
172
+ result[:energy_production_kwh] = energy_production_kwh_hash if @energy_production_kwh
167
173
 
168
- if @utility_costs.any?
169
- result[:utility_costs] = @utility_costs
170
- @utility_costs.each do |uc|
174
+ if @utility_costs_dollar.any?
175
+ result[:utility_costs_dollar] = @utility_costs_dollar
176
+ @utility_costs_dollar.each do |uc|
171
177
  uc&.delete_if { |k, v| v.nil? }
172
178
  end
173
179
  end
@@ -211,34 +217,36 @@ module URBANopt
211
217
  ##
212
218
  def self.merge_reporting_period(existing_period, new_period)
213
219
  # modify the existing_period by summing up the results
214
- existing_period.total_site_energy = add_values(existing_period.total_site_energy, new_period.total_site_energy)
215
- existing_period.total_source_energy = add_values(existing_period.total_source_energy, new_period.total_source_energy)
216
- existing_period.net_source_energy = add_values(existing_period.net_source_energy, new_period.net_source_energy)
217
- existing_period.net_utility_cost = add_values(existing_period.net_utility_cost, new_period.net_utility_cost)
218
- existing_period.total_utility_cost = add_values(existing_period.total_utility_cost, new_period.total_utility_cost)
219
- existing_period.electricity = add_values(existing_period.electricity, new_period.electricity)
220
- existing_period.natural_gas = add_values(existing_period.natural_gas, new_period.natural_gas)
221
- existing_period.additional_fuel = add_values(existing_period.additional_fuel, new_period.additional_fuel)
222
- existing_period.district_cooling = add_values(existing_period.district_cooling, new_period.district_cooling)
223
- existing_period.district_heating = add_values(existing_period.district_heating, new_period.district_heating)
224
- existing_period.water = add_values(existing_period.water, new_period.water)
225
- existing_period.electricity_produced = add_values(existing_period.electricity_produced, new_period.electricity_produced)
220
+ existing_period.total_site_energy_kwh = add_values(existing_period.total_site_energy_kwh, new_period.total_site_energy_kwh)
221
+ existing_period.total_source_energy_kwh = add_values(existing_period.total_source_energy_kwh, new_period.total_source_energy_kwh)
222
+ existing_period.net_source_energy_kwh = add_values(existing_period.net_source_energy_kwh, new_period.net_source_energy_kwh)
223
+ existing_period.net_utility_cost_dollar = add_values(existing_period.net_utility_cost_dollar, new_period.net_utility_cost_dollar)
224
+ existing_period.total_utility_cost_dollar = add_values(existing_period.total_utility_cost_dollar, new_period.total_utility_cost_dollar)
225
+ existing_period.electricity_kwh = add_values(existing_period.electricity_kwh, new_period.electricity_kwh)
226
+ existing_period.natural_gas_kwh = add_values(existing_period.natural_gas_kwh, new_period.natural_gas_kwh)
227
+ existing_period.propane_kwh = add_values(existing_period.propane_kwh, new_period.propane_kwh)
228
+ existing_period.fuel_oil_kwh = add_values(existing_period.fuel_oil_kwh, new_period.fuel_oil_kwh)
229
+ existing_period.other_fuels_kwh = add_values(existing_period.other_fuels_kwh, new_period.other_fuels_kwh)
230
+ existing_period.district_cooling_kwh = add_values(existing_period.district_cooling_kwh, new_period.district_cooling_kwh)
231
+ existing_period.district_heating_kwh = add_values(existing_period.district_heating_kwh, new_period.district_heating_kwh)
232
+ existing_period.water_qbft = add_values(existing_period.water_qbft, new_period.water_qbft)
233
+ existing_period.electricity_produced_kwh = add_values(existing_period.electricity_produced_kwh, new_period.electricity_produced_kwh)
226
234
 
227
235
  # merge end uses
228
236
  new_end_uses = new_period.end_uses
229
237
  existing_period.end_uses&.merge_end_uses!(new_end_uses)
230
238
 
231
- if existing_period.energy_production
232
- if existing_period.energy_production[:electricity_produced]
233
- existing_period.energy_production[:electricity_produced][:photovoltaic] = add_values(existing_period.energy_production[:electricity_produced][:photovoltaic], new_period.energy_production[:electricity_produced][:photovoltaic])
239
+ if existing_period.energy_production_kwh
240
+ if existing_period.energy_production_kwh[:electricity_produced_kwh]
241
+ 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])
234
242
  end
235
243
  end
236
244
 
237
- existing_period.utility_costs&.each_with_index do |item, i|
238
- existing_period.utility_costs[i][:fuel_type] = existing_period.utility_costs[i][:fuel_type]
239
- existing_period.utility_costs[i][:total_cost] = add_values(existing_period.utility_costs[i][:total_cost], new_period.utility_costs[i][:total_cost])
240
- existing_period.utility_costs[i][:usage_cost] = add_values(existing_period.utility_costs[i][:usage_cost], new_period.utility_costs[i][:usage_cost])
241
- existing_period.utility_costs[i][:demand_cost] = add_values(existing_period.utility_costs[i][:demand_cost], new_period.utility_costs[i][:demand_cost])
245
+ existing_period.utility_costs_dollar&.each_with_index do |item, i|
246
+ existing_period.utility_costs_dollar[i][:fuel_type] = existing_period.utility_costs_dollar[i][:fuel_type]
247
+ existing_period.utility_costs_dollar[i][:total_cost] = add_values(existing_period.utility_costs_dollar[i][:total_cost], new_period.utility_costs_dollar[i][:total_cost])
248
+ existing_period.utility_costs_dollar[i][:usage_cost] = add_values(existing_period.utility_costs_dollar[i][:usage_cost], new_period.utility_costs_dollar[i][:usage_cost])
249
+ existing_period.utility_costs_dollar[i][:demand_cost] = add_values(existing_period.utility_costs_dollar[i][:demand_cost], new_period.utility_costs_dollar[i][:demand_cost])
242
250
  end
243
251
 
244
252
  if existing_period.comfort_result
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -1,6 +1,6 @@
1
1
  # URBANopt Scenario Schema
2
2
 
3
- The URBANopt Scenario Gem includes functionality for defining scenarios, running simulations, and post-processing results. An URBANopt Scenario describes a specific set of options to apply to each Feature in a FeatureFile (e.g. each GeoJSON Feature in an URBANopt GeoJSON File). User defined SimulationMapper classes translate each Feature to a SimulationDir which is a directory containing simulation input files. A ScenarioRunner is used to perform simulations for each SimulationDir. Finally, a ScenarioPostProcessor can run on a Scenario to generate scenario level results. The [URBANopt Scenario Gem Design Document](https://docs.google.com/document/d/1ExcGuHliaSvPlrYevAJTSV8XAtTQXz_KQqH3p4iQDwg/edit) describes the gem in more detail. The [URBANopt Example Project](https://github.com/urbanopt/urbanopt-example-project) demonstrates how to use the URBANopt Scenario Gem to perform a scenario analysis.
3
+ The URBANopt <sup>&trade;</sup> Scenario Gem includes functionality for defining scenarios, running simulations, and post-processing results. An URBANopt Scenario describes a specific set of options to apply to each Feature in a FeatureFile (e.g. each GeoJSON Feature in an URBANopt GeoJSON File). User defined SimulationMapper classes translate each Feature to a SimulationDir which is a directory containing simulation input files. A ScenarioRunner is used to perform simulations for each SimulationDir. Finally, a ScenarioPostProcessor can run on a Scenario to generate scenario level results. The [URBANopt Scenario Gem Design Document](https://docs.google.com/document/d/1ExcGuHliaSvPlrYevAJTSV8XAtTQXz_KQqH3p4iQDwg/edit) describes the gem in more detail. The [URBANopt Example Project](https://github.com/urbanopt/urbanopt-example-project) demonstrates how to use the URBANopt Scenario Gem to perform a scenario analysis.
4
4
 
5
5
  ## Reporting output units
6
6
 
@@ -2,6 +2,9 @@ Datetime
2
2
  Electricity:Facility
3
3
  ElectricityProduced:Facility
4
4
  Gas:Facility
5
+ Propane:Facility
6
+ FuelOil#2:Facility
7
+ OtherFuels:Facility
5
8
  Cooling:Electricity
6
9
  Heating:Electricity
7
10
  InteriorLights:Electricity
@@ -15,6 +18,18 @@ HeatRejection:Gas
15
18
  Heating:Gas
16
19
  WaterSystems:Gas
17
20
  InteriorEquipment:Gas
21
+ HeatRejection:Propane
22
+ Heating:Propane
23
+ WaterSystems:Propane
24
+ InteriorEquipment:Propane
25
+ HeatRejection:FuelOil#2
26
+ Heating:FuelOil#2
27
+ WaterSystems:FuelOil#2
28
+ InteriorEquipment:FuelOil#2
29
+ HeatRejection:OtherFuels
30
+ Heating:OtherFuels
31
+ WaterSystems:OtherFuels
32
+ InteriorEquipment:OtherFuels
18
33
  DistrictCooling:Facility
19
34
  DistrictHeating:Facility
20
35
  District Cooling Chilled Water Rate
@@ -31,4 +46,6 @@ ElectricityProduced:Facility Power
31
46
  Electricity:Facility Apparent Power
32
47
  ElectricityProduced:Facility Apparent Power
33
48
  Net Power
34
- Net Apparent Power
49
+ Net Apparent Power
50
+ Ice Thermal Storage End Fraction
51
+ Cooling Coil Ice Thermal Storage End Fraction
@@ -63,6 +63,9 @@
63
63
  },
64
64
  "distributed_generation": {
65
65
  "$ref": "#/definitions/DistributedGeneration"
66
+ },
67
+ "thermal_storage": {
68
+ "$ref": "#/definitions/ThermalStorage"
66
69
  }
67
70
  },
68
71
  "required": [
@@ -216,6 +219,9 @@
216
219
  },
217
220
  "power_distribution": {
218
221
  "$ref": "#/definitions/PowerDistribution"
222
+ },
223
+ "thermal_storage": {
224
+ "$ref": "#/definitions/ThermalStorage"
219
225
  }
220
226
  },
221
227
  "required": [
@@ -257,69 +263,77 @@
257
263
  "end_date": {
258
264
  "$ref": "#/definitions/Date"
259
265
  },
260
- "total_site_energy": {
261
- "description": "Total energy used on site, does not include generation (kBtu)",
266
+ "total_site_energy_kwh": {
267
+ "description": "Total energy used on site, does not include generation (kWh)",
262
268
  "type": "number"
263
269
  },
264
- "total_source_energy": {
265
- "description": "Total source energy used, does not include generation (kBtu)",
270
+ "total_source_energy_kwh": {
271
+ "description": "Total source energy used, does not include generation (kWh)",
266
272
  "type": "number"
267
273
  },
268
- "net_site_energy": {
269
- "description": "Net site energy (kBtu)",
274
+ "net_site_energy_kwh": {
275
+ "description": "Net site energy (kWh)",
270
276
  "type": "number"
271
277
  },
272
- "net_source_energy": {
273
- "description": "Net source energy (kBtu)",
278
+ "net_source_energy_kwh": {
279
+ "description": "Net source energy (kWh)",
274
280
  "type": "number"
275
281
  },
276
- "total_utility_cost": {
277
- "description": "Total utility cost",
282
+ "total_utility_cost_dollar": {
283
+ "description": "Total utility cost ($)",
278
284
  "type": "number"
279
285
  },
280
- "net_utility_cost": {
281
- "description": "Net utility cost for reporting period includes generation",
286
+ "net_utility_cost_dollar": {
287
+ "description": "Net utility cost for reporting period includes generation ($)",
282
288
  "type": "number"
283
289
  },
284
- "utility_costs": {
290
+ "utility_costs_dollar": {
285
291
  "type": "array",
286
292
  "items": {
287
293
  "$ref": "#/definitions/UtilityCost"
288
294
  }
289
295
  },
290
- "electricity": {
296
+ "electricity_kwh": {
291
297
  "description": "Sum of all electricity used, does not include electricity produced (kWh)",
292
298
  "type": "number"
293
299
  },
294
- "natural_gas": {
295
- "description": "Sum of all natural gas end uses consumption (kBtu)",
300
+ "natural_gas_kwh": {
301
+ "description": "Sum of all natural gas end uses consumption (kWh)",
296
302
  "type": "number"
297
303
  },
298
- "additional_fuel": {
299
- "description": "Sum of all additional fuel end uses consumption (kBtu)",
304
+ "propane_kwh": {
305
+ "description": "Sum of all propane end uses consumption (kWh)",
306
+ "type": "number"
307
+ },
308
+ "fuel_oil_kwh": {
309
+ "description": "Sum of all fuel oil #2 end uses consumption (kWh)",
310
+ "type": "number"
311
+ },
312
+ "other_fuels_kwh": {
313
+ "description": "Sum of all other (fuel oil #1, diesel, gasoline, coal, steam) fuel end uses consumption (kWh)",
300
314
  "type": "number"
301
315
  },
302
- "district_cooling": {
303
- "description": "Sum of all distric cooling end uses consumption (kBtu)",
316
+ "district_cooling_kwh": {
317
+ "description": "Sum of all distric cooling end uses consumption (kWh)",
304
318
  "type": "number"
305
319
  },
306
- "district_heating": {
307
- "description": "Sum of all distric heating end uses consumption (kBtu)",
320
+ "district_heating_kwh": {
321
+ "description": "Sum of all distric heating end uses consumption (kWh)",
308
322
  "type": "number"
309
323
  },
310
- "water": {
324
+ "water_qbft": {
311
325
  "description": "Sum of all water end uses consumption (ft^3)",
312
326
  "type": "number"
313
327
  },
314
- "electricity_produced": {
328
+ "electricity_produced_kwh": {
315
329
  "description": "Sum of all electricity produced (kWh)",
316
330
  "type": "number"
317
331
  },
318
332
  "end_uses": {
319
333
  "$ref": "#/definitions/EndUses"
320
334
  },
321
- "energy_production": {
322
- "description": "Energy produced for reporting period. Electricity reported in kWh, water in m^3, all others in kBtu.",
335
+ "energy_production_kwh": {
336
+ "description": "Energy produced for reporting period. Water reported in m^3, all others in kWh.",
323
337
  "type": "object",
324
338
  "properties": {
325
339
  "electricity_produced": {
@@ -356,25 +370,31 @@
356
370
  "additionalProperties": false
357
371
  },
358
372
  "EndUses": {
359
- "description": "End uses for reporting period. Does not include energy produced. Electricity reported in kWh, water in m^3, all others in kBtu.",
373
+ "description": "End uses for reporting period. Does not include energy produced. Water reported in m^3, all others in kWh.",
360
374
  "type": "object",
361
375
  "properties": {
362
- "electricity": {
376
+ "electricity_kwh": {
363
377
  "$ref": "#/definitions/EndUse"
364
378
  },
365
- "natural_gas": {
379
+ "natural_gas_kwh": {
366
380
  "$ref": "#/definitions/EndUse"
367
381
  },
368
- "additional_fuel": {
382
+ "propane_kwh": {
383
+ "$ref": "#/definitions/EndUse"
384
+ },
385
+ "fuel_oil_kwh": {
386
+ "$ref": "#/definitions/EndUse"
387
+ },
388
+ "other_fuels_kwh": {
369
389
  "$ref": "#/definitions/EndUse"
370
390
  },
371
- "district_cooling": {
391
+ "district_cooling_kwh": {
372
392
  "$ref": "#/definitions/EndUse"
373
393
  },
374
- "district_heating": {
394
+ "district_heating_kwh": {
375
395
  "$ref": "#/definitions/EndUse"
376
396
  },
377
- "water": {
397
+ "water_qbft": {
378
398
  "$ref": "#/definitions/EndUse"
379
399
  }
380
400
  },
@@ -516,9 +536,11 @@
516
536
  "enum": [
517
537
  "Electricity",
518
538
  "Natural Gas",
539
+ "Propane",
540
+ "Fuel Oil",
519
541
  "District Cooling",
520
542
  "District Heating",
521
- "Additional Fuel",
543
+ "Other Fuels",
522
544
  "Water"
523
545
  ]
524
546
  },
@@ -540,15 +562,15 @@
540
562
  "Location": {
541
563
  "type": "object",
542
564
  "properties": {
543
- "latitude": {
544
- "description": "(deg)",
565
+ "latitude_deg": {
566
+ "description": "latitude for the centroid of the feature (deg)",
545
567
  "type": "number"
546
568
  },
547
- "longitude": {
548
- "description": "(deg)",
569
+ "longitude_deg": {
570
+ "description": "longitude for the centroid of the feature (deg)",
549
571
  "type": "number"
550
572
  },
551
- "surface_elevation": {
573
+ "surface_elevation_ft": {
552
574
  "description": "The surface elevation (above NAVD88 datum) (ft).",
553
575
  "type": "number"
554
576
  },
@@ -567,27 +589,27 @@
567
589
  "Program": {
568
590
  "type": "object",
569
591
  "properties": {
570
- "site_area": {
592
+ "site_area_sqft": {
571
593
  "description": "Area of the entire site or lot (ft^2)",
572
594
  "type": "number"
573
595
  },
574
- "floor_area": {
596
+ "floor_area_sqft": {
575
597
  "description": "Building gross floor area (ft^2)",
576
598
  "type": "number"
577
599
  },
578
- "conditioned_area": {
600
+ "conditioned_area_sqft": {
579
601
  "description": "Building conditioned floor area (ft^2)",
580
602
  "type": "number"
581
603
  },
582
- "unconditioned_area": {
604
+ "unconditioned_area_sqft": {
583
605
  "description": "Building unconditioned floor area (ft^2)",
584
606
  "type": "number"
585
607
  },
586
- "footprint_area": {
608
+ "footprint_area_sqft": {
587
609
  "description": "Building floorprint area (ft^2)",
588
610
  "type": "number"
589
611
  },
590
- "maximum_roof_height": {
612
+ "maximum_roof_height_ft": {
591
613
  "description": "Maximum height of the roof relative to surface elevation (ft)",
592
614
  "type": "number"
593
615
  },
@@ -599,7 +621,7 @@
599
621
  "description": "The maximum number of building stories above ground",
600
622
  "type": "number"
601
623
  },
602
- "parking_area": {
624
+ "parking_area_sqft": {
603
625
  "description": "Parking gross area (ft^2)",
604
626
  "type": "number"
605
627
  },
@@ -611,11 +633,11 @@
611
633
  "description": "Number of parking spaces with electric vehicle charging",
612
634
  "type": "number"
613
635
  },
614
- "parking_footprint_area": {
636
+ "parking_footprint_area_sqft": {
615
637
  "description": "Parking floorprint area (ft^2)",
616
638
  "type": "number"
617
639
  },
618
- "maximum_parking_height": {
640
+ "maximum_parking_height_ft": {
619
641
  "description": "Maximum height of the parking structure relative to surface elevation (ft)",
620
642
  "type": "number"
621
643
  },
@@ -637,84 +659,84 @@
637
659
  "$ref": "#/definitions/BuildingType"
638
660
  }
639
661
  },
640
- "window_area": {
662
+ "window_area_sqft": {
641
663
  "description": "Exterior windows gross area (ft^2)",
642
664
  "type": "object",
643
665
  "properties": {
644
- "north_window_area": {
666
+ "north_window_area_sqft": {
645
667
  "type": "number"
646
668
  },
647
- "south_window_area": {
669
+ "south_window_area_sqft": {
648
670
  "type": "number"
649
671
  },
650
- "east_window_area": {
672
+ "east_window_area_sqft": {
651
673
  "type": "number"
652
674
  },
653
- "west_window_area": {
675
+ "west_window_area_sqft": {
654
676
  "type": "number"
655
677
  },
656
- "total_window_area": {
678
+ "total_window_area_sqft": {
657
679
  "type": "number"
658
680
  }
659
681
  },
660
682
  "required": [
661
- "total_window_area"
683
+ "total_window_area_sqft"
662
684
  ],
663
685
  "additionalProperties": false
664
686
  },
665
- "wall_area": {
687
+ "wall_area_sqft": {
666
688
  "description": "exterior walls gross area (ft^2)",
667
689
  "type": "object",
668
690
  "properties": {
669
- "north_wall_area": {
691
+ "north_wall_area_sqft": {
670
692
  "type": "number"
671
693
  },
672
- "south_wall_area": {
694
+ "south_wall_area_sqft": {
673
695
  "type": "number"
674
696
  },
675
- "east_wall_area": {
697
+ "east_wall_area_sqft": {
676
698
  "type": "number"
677
699
  },
678
- "west_wall_area": {
700
+ "west_wall_area_sqft": {
679
701
  "type": "number"
680
702
  },
681
- "total_wall_area": {
703
+ "total_wall_area_sqft": {
682
704
  "type": "number"
683
705
  }
684
706
  },
685
707
  "required": [
686
- "north_wall_area",
687
- "south_wall_area",
688
- "east_wall_area",
689
- "west_wall_area",
690
- "total_wall_area"
708
+ "north_wall_area_sqft",
709
+ "south_wall_area_sqft",
710
+ "east_wall_area_sqft",
711
+ "west_wall_area_sqft",
712
+ "total_wall_area_sqft"
691
713
  ],
692
714
  "additionalProperties": false
693
715
  },
694
- "roof_area": {
716
+ "roof_area_sqft": {
695
717
  "type": "object",
696
718
  "properties": {
697
- "equipment_roof_area": {
719
+ "equipment_roof_area_sqft": {
698
720
  "type": "number"
699
721
  },
700
- "photovoltaic_roof_area": {
722
+ "photovoltaic_roof_area_sqft": {
701
723
  "type": "number"
702
724
  },
703
- "available_roof_area": {
725
+ "available_roof_area_sqft": {
704
726
  "description": "gross roof area (ft^2)",
705
727
  "type": "number"
706
728
  },
707
- "total_roof_area": {
729
+ "total_roof_area_sqft": {
708
730
  "description": "Exterior roofs gross area (ft^2)",
709
731
  "type": "number"
710
732
  }
711
733
  },
712
734
  "required": [
713
- "total_roof_area"
735
+ "total_roof_area_sqft"
714
736
  ],
715
737
  "additionalProperties": false
716
738
  },
717
- "orientation": {
739
+ "orientation_deg": {
718
740
  "description": "Rotation of longest axis from East-West,about up axis (deg)",
719
741
  "type": "number"
720
742
  },
@@ -722,22 +744,22 @@
722
744
  "description": "Ratio of longest to shortest axis",
723
745
  "type": "number"
724
746
  },
725
- "total_construction_cost": {
747
+ "total_construction_cost_dollar": {
726
748
  "description": "total construction cost calculated from the defined cost per floor area ($)",
727
749
  "type": "number"
728
750
  }
729
751
  },
730
752
  "required": [
731
- "floor_area",
732
- "conditioned_area",
733
- "unconditioned_area",
734
- "footprint_area",
735
- "maximum_roof_height",
753
+ "floor_area_sqft",
754
+ "conditioned_area_sqft",
755
+ "unconditioned_area_sqft",
756
+ "footprint_area_sqft",
757
+ "maximum_roof_height_ft",
736
758
  "number_of_residential_units",
737
759
  "building_types",
738
- "window_area",
739
- "wall_area",
740
- "roof_area"
760
+ "window_area_sqft",
761
+ "wall_area_sqft",
762
+ "roof_area_sqft"
741
763
  ],
742
764
  "additionalProperties": false
743
765
  },
@@ -852,6 +874,19 @@
852
874
  "type": "number"
853
875
  }
854
876
  }
877
+ },
878
+ "ThermalStorage": {
879
+ "type": "object",
880
+ "properties": {
881
+ "its_size": {
882
+ "description": "Total central plant TES capacity in kWh",
883
+ "type": "number"
884
+ },
885
+ "ptes_size": {
886
+ "description": "Total distributed/packaged TES capacity in kWh",
887
+ "type": "number"
888
+ }
889
+ }
855
890
  }
856
891
  }
857
892
  }