urbanopt-reporting 0.1.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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
  }