urbanopt-reporting 0.5.0 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/nightly_build.yml +41 -0
  3. data/CHANGELOG.md +22 -1
  4. data/LICENSE.md +17 -17
  5. data/README.md +4 -2
  6. data/doc_templates/LICENSE.md +17 -17
  7. data/doc_templates/copyright_erb.txt +2 -2
  8. data/doc_templates/copyright_js.txt +2 -2
  9. data/doc_templates/copyright_ruby.txt +1 -1
  10. data/docs/package-lock.json +15720 -1410
  11. data/lib/measures/.rubocop.yml +4 -2
  12. data/lib/measures/default_feature_reports/measure.rb +221 -16
  13. data/lib/measures/export_modelica_loads/measure.rb +1 -1
  14. data/lib/measures/export_time_series_modelica/measure.rb +1 -1
  15. data/lib/measures/export_time_series_modelica/resources/os_lib_helper_methods.rb +1 -1
  16. data/lib/urbanopt/reporting/default_reports/construction_cost.rb +1 -1
  17. data/lib/urbanopt/reporting/default_reports/date.rb +1 -1
  18. data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +20 -2
  19. data/lib/urbanopt/reporting/default_reports/end_use.rb +1 -1
  20. data/lib/urbanopt/reporting/default_reports/end_uses.rb +1 -1
  21. data/lib/urbanopt/reporting/default_reports/extension.rb +1 -1
  22. data/lib/urbanopt/reporting/default_reports/feature_report.rb +2 -2
  23. data/lib/urbanopt/reporting/default_reports/generator.rb +1 -2
  24. data/lib/urbanopt/reporting/default_reports/location.rb +1 -1
  25. data/lib/urbanopt/reporting/default_reports/logger.rb +1 -1
  26. data/lib/urbanopt/reporting/default_reports/power_distribution.rb +21 -6
  27. data/lib/urbanopt/reporting/default_reports/program.rb +1 -1
  28. data/lib/urbanopt/reporting/default_reports/reporting_period.rb +44 -3
  29. data/lib/urbanopt/reporting/default_reports/scenario_power_distribution.rb +148 -0
  30. data/lib/urbanopt/reporting/default_reports/scenario_report.rb +7 -3
  31. data/lib/urbanopt/reporting/default_reports/schema/scenario_csv_columns.txt +24 -0
  32. data/lib/urbanopt/reporting/default_reports/schema/scenario_schema.json +265 -6
  33. data/lib/urbanopt/reporting/default_reports/solar_pv.rb +42 -3
  34. data/lib/urbanopt/reporting/default_reports/storage.rb +1 -1
  35. data/lib/urbanopt/reporting/default_reports/thermal_storage.rb +1 -1
  36. data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +1 -1
  37. data/lib/urbanopt/reporting/default_reports/validator.rb +1 -1
  38. data/lib/urbanopt/reporting/default_reports/wind.rb +11 -2
  39. data/lib/urbanopt/reporting/default_reports.rb +1 -1
  40. data/lib/urbanopt/reporting/derived_extension.rb +1 -1
  41. data/lib/urbanopt/reporting/version.rb +2 -2
  42. data/lib/urbanopt/reporting.rb +1 -1
  43. data/urbanopt-reporting-gem.gemspec +3 -0
  44. metadata +32 -2
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2022, 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,
@@ -57,14 +57,22 @@ module URBANopt
57
57
  :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,
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
- :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:
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,
61
+ :emissions, :future_annual_electricity_emissions_mt, :future_hourly_electricity_emissions_mt, :historical_annual_electricity_emissions_mt, :historical_hourly_electricity_emissions_mt,
62
+ :future_annual_electricity_emissions_intensity_kg_per_ft2, :future_hourly_electricity_emissions_intensity_kg_per_ft2, :historical_annual_electricity_emissions_intensity_kg_per_ft2, :historical_hourly_electricity_emissions_intensity_kg_per_ft2 ,
63
+ :natural_gas_emissions_mt, :natural_gas_emissions_intensity_kg_per_ft2, :propane_emissions_mt, :propane_emissions_intensity_kg_per_ft2,
64
+ :fueloil_no2_emissions_mt, :fueloil_no2_emissions_intensity_kg_per_ft2 #:nodoc:
61
65
 
62
66
  # ReportingPeriod class initializes the reporting period attributes:
63
67
  # +: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+,
64
68
  # +: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+ ,
65
69
  # +:district_heating_kwh+ , +:water_qbft+ , +:electricity_produced_kwh+ , +:end_uses+ , +:energy_production_kwh+ , +:photovoltaic_kwh+ ,
66
70
  # +:fuel_type+ , +:total_cost_dollar+ , +:usage_cost_dollar+ , +:demand_cost_dollar+ , +:comfort_result+ , +:time_setpoint_not_met_during_occupied_cooling+ ,
67
- # +:time_setpoint_not_met_during_occupied_heating+ , +:time_setpoint_not_met_during_occupied_hours+
71
+ # +: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+ ,
72
+ # +:emissions, +:future_annual_electricity_emissions_mt+, +:future_hourly_electricity_emissions_mt+, +:historical_annual_electricity_emissions_mt+, +:historical_hourly_electricity_emissions_mt+,
73
+ # +:future_annual_electricity_emissions_intensity_kg_per_ft2+, +:future_hourly_electricity_emissions_intensity_kg_per_ft2+, +:historical_annual_electricity_emissions_intensity_kg_per_ft2+, +:historical_hourly_electricity_emissions_intensity_kg_per_ft2+,
74
+ # +:natural_gas_emissions_mt+, +:natural_gas_emissions_intensity_kg_per_ft2+, +:propane_emissions_mt+, +:propane_emissions_intensity_kg_per_ft2+,
75
+ # +:fueloil_no2_emissions_mt+, +:fueloil_no2_emissions_intensity_kg_per_ft2+
68
76
  ##
69
77
  # [parameters:]
70
78
  # +hash+ - _Hash_ - A hash which may contain a deserialized reporting_period.
@@ -106,6 +114,8 @@ module URBANopt
106
114
 
107
115
  @comfort_result = hash[:comfort_result]
108
116
 
117
+ @emissions = hash[:emissions]
118
+
109
119
  # initialize class variables @@validator and @@schema
110
120
  @@validator ||= Validator.new
111
121
  @@schema ||= @@validator.schema
@@ -147,6 +157,12 @@ module URBANopt
147
157
  hash[:utility_costs_dollar] = [{ fuel_type: nil, total_cost_dollar: nil, usage_cost_dollar: nil, demand_cost_dollar: nil }]
148
158
  hash[:comfort_result] = { time_setpoint_not_met_during_occupied_cooling: nil, time_setpoint_not_met_during_occupied_heating: nil,
149
159
  time_setpoint_not_met_during_occupied_hours: nil, hours_out_of_comfort_bounds_PMV: nil, hours_out_of_comfort_bounds_PPD: nil }
160
+ hash[:emissions] = { future_annual_electricity_emissions_mt: nil, future_hourly_electricity_emissions_mt: nil, historical_annual_electricity_emissions_mt: nil,
161
+ historical_hourly_electricity_emissions_mt: nil, future_annual_electricity_emissions_intensity_kg_per_ft2: nil,
162
+ future_hourly_electricity_emissions_intensity_kg_per_ft2: nil, historical_annual_electricity_emissions_intensity_kg_per_ft2: nil,
163
+ historical_hourly_electricity_emissions_intensity_kg_per_ft2: nil, natural_gas_emissions_mt: nil,
164
+ natural_gas_emissions_intensity_kg_per_ft2: nil, propane_emissions_mt: nil, propane_emissions_intensity_kg_per_ft2: nil,
165
+ fueloil_no2_emissions_mt: nil, fueloil_no2_emissions_intensity_kg_per_ft2: nil }
150
166
 
151
167
  return hash
152
168
  end
@@ -205,6 +221,10 @@ module URBANopt
205
221
  comfort_result_hash.delete_if { |k, v| v.nil? }
206
222
  result[:comfort_result] = comfort_result_hash if @comfort_result
207
223
 
224
+ emissions_hash = @emissions if @emissions
225
+ emissions_hash.delete_if { |k, v| v.nil? }
226
+ result[:emissions] = emissions_hash if @emissions
227
+
208
228
  # validates +reporting_period+ properties against schema for reporting period.
209
229
  if @@validator.validate(@@schema[:definitions][:ReportingPeriod][:properties], result).any?
210
230
  raise "feature_report properties does not match schema: #{@@validator.validate(@@schema[:definitions][:ReportingPeriod][:properties], result)}"
@@ -278,6 +298,27 @@ module URBANopt
278
298
  existing_period.comfort_result[:hours_out_of_comfort_bounds_PPD] = add_values(existing_period.comfort_result[:hours_out_of_comfort_bounds_PPD], new_period.comfort_result[:hours_out_of_comfort_bounds_PPD])
279
299
  end
280
300
 
301
+ if existing_period.emissions
302
+ existing_period.emissions[:future_annual_electricity_emissions_mt] = add_values(existing_period.emissions[:future_annual_electricity_emissions_mt], new_period.emissions[:future_annual_electricity_emissions_mt])
303
+ existing_period.emissions[:future_hourly_electricity_emissions_mt] = add_values(existing_period.emissions[:future_hourly_electricity_emissions_mt], new_period.emissions[:future_hourly_electricity_emissions_mt])
304
+ existing_period.emissions[:historical_annual_electricity_emissions_mt] = add_values(existing_period.emissions[:historical_annual_electricity_emissions_mt], new_period.emissions[:historical_annual_electricity_emissions_mt])
305
+ existing_period.emissions[:historical_hourly_electricity_emissions_mt] = add_values(existing_period.emissions[:historical_hourly_electricity_emissions_mt], new_period.emissions[:historical_hourly_electricity_emissions_mt])
306
+
307
+ existing_period.emissions[:natural_gas_emissions_mt] = add_values(existing_period.emissions[:natural_gas_emissions_mt], new_period.emissions[:natural_gas_emissions_mt])
308
+ existing_period.emissions[:propane_emissions_mt] = add_values(existing_period.emissions[:propane_emissions_mt], new_period.emissions[:propane_emissions_mt])
309
+ existing_period.emissions[:fueloil_no2_emissions_mt] = add_values(existing_period.emissions[:fueloil_no2_emissions_mt], new_period.emissions[:fueloil_no2_emissions_mt])
310
+
311
+ existing_period.emissions[:future_annual_electricity_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:future_annual_electricity_emissions_intensity_kg_per_ft2], new_period.emissions[:future_annual_electricity_emissions_intensity_kg_per_ft2])
312
+ existing_period.emissions[:future_hourly_electricity_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:future_hourly_electricity_emissions_intensity_kg_per_ft2], new_period.emissions[:future_hourly_electricity_emissions_intensity_kg_per_ft2])
313
+ existing_period.emissions[:historical_annual_electricity_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:historical_annual_electricity_emissions_intensity_kg_per_ft2], new_period.emissions[:historical_annual_electricity_emissions_intensity_kg_per_ft2])
314
+ existing_period.emissions[:historical_hourly_electricity_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:historical_hourly_electricity_emissions_intensity_kg_per_ft2], new_period.emissions[:historical_hourly_electricity_emissions_intensity_kg_per_ft2])
315
+
316
+ existing_period.emissions[:natural_gas_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:natural_gas_emissions_intensity_kg_per_ft2], new_period.emissions[:natural_gas_emissions_intensity_kg_per_ft2])
317
+ existing_period.emissions[:propane_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:propane_emissions_intensity_kg_per_ft2], new_period.emissions[:propane_emissions_intensity_kg_per_ft2])
318
+ existing_period.emissions[:fueloil_no2_emissions_intensity_kg_per_ft2] = add_values(existing_period.emissions[:fueloil_no2_emissions_intensity_kg_per_ft2], new_period.emissions[:fueloil_no2_emissions_intensity_kg_per_ft2])
319
+
320
+ end
321
+
281
322
  return existing_period
282
323
  end
283
324
 
@@ -0,0 +1,148 @@
1
+ # *********************************************************************************
2
+ # URBANopt™, Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
29
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
30
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
37
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
38
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
39
+ # *********************************************************************************
40
+
41
+ require_relative 'validator'
42
+
43
+ require 'json'
44
+ require 'json-schema'
45
+
46
+ module URBANopt
47
+ module Reporting
48
+ module DefaultReports
49
+ ##
50
+ # scenario_power_distribution include eletrical power distribution systems information.
51
+ ##
52
+ class ScenarioPowerDistribution
53
+ attr_accessor :substations, :distribution_lines, :capacitors
54
+
55
+ ##
56
+ # ScenarioPowerDistribution class initialize all scenario_power_distribution attributes:
57
+ # +:substations+ , +:distribution_lines+
58
+ ##
59
+ # [parameters:]
60
+ # +hash+ - _Hash_ - A hash which may contain a deserialized power_distribution.
61
+ ##
62
+ def initialize(hash = {})
63
+ hash.delete_if { |k, v| v.nil? }
64
+ hash = defaults.merge(hash)
65
+
66
+ @substations = hash[:substations]
67
+ @distribution_lines = hash[:distribution_lines]
68
+ @capacitors = hash[:capacitors]
69
+
70
+ # initialize class variables @@validator and @@schema
71
+ @@validator ||= Validator.new
72
+ @@schema ||= @@validator.schema
73
+ end
74
+
75
+ ##
76
+ # Assigns default values if attribute values do not exist.
77
+ ##
78
+ def defaults
79
+ hash = {}
80
+ hash[:substations] = []
81
+ hash[:distribution_lines] = []
82
+ hash[:capacitors] = []
83
+
84
+ return hash
85
+ end
86
+
87
+ ##
88
+ # Converts to a Hash equivalent for JSON serialization.
89
+ ##
90
+ # - Exclude attributes with nil values.
91
+ # - Validate power_distribution hash properties against schema.
92
+ ##
93
+ def to_hash
94
+ result = {}
95
+ result[:substations] = @substations if @substations
96
+ result[:distribution_lines] = @distribution_lines if @distribution_lines
97
+ result[:capacitors] = @capacitors if @capacitors
98
+
99
+ # validate power_distribution properties against schema
100
+ if @@validator.validate(@@schema[:definitions][:ScenarioPowerDistribution][:properties], result).any?
101
+ raise "scenario_power_distribution properties does not match schema: #{@@validator.validate(@@schema[:definitions][:ScenarioPowerDistribution][:properties], result)}"
102
+ end
103
+
104
+ return result
105
+ end
106
+
107
+ ##
108
+ # Add a substation
109
+ ##
110
+ def add_substation(hash = {})
111
+ hash.delete_if { |k, v| v.nil? }
112
+ hash = defaults.merge(hash)
113
+ # field: nominal_voltage
114
+ substation = {}
115
+ substation['nominal_voltage'] = hash[:nominal_voltage]
116
+ @substations << substation
117
+ end
118
+
119
+ ##
120
+ # Add a line
121
+ ##
122
+ def add_line(hash = {})
123
+ hash.delete_if { |k, v| v.nil? }
124
+ hash = defaults.merge(hash)
125
+ # fields: length, ampacity, commercial_line_type
126
+ line = {}
127
+ line['length'] = hash[:length]
128
+ line['ampacity'] = hash[:ampacity]
129
+ line['commercial_line_type'] = hash[:commercial_line_type]
130
+
131
+ @distribution_lines << line
132
+ end
133
+
134
+ ##
135
+ # Add a capacitor
136
+ ##
137
+ def add_capacitor(hash = {})
138
+ hash.delete_if { |k, v| v.nil? }
139
+ hash = defaults.merge(hash)
140
+ # fields: nominal_capacity
141
+ cap = {}
142
+ cap['nominal_capacity'] = hash[:nominal_capacity]
143
+ cap
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2022, 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,
@@ -46,6 +46,7 @@ require_relative 'reporting_period'
46
46
  require_relative 'timeseries_csv'
47
47
  require_relative 'distributed_generation'
48
48
  require_relative 'validator'
49
+ require_relative 'scenario_power_distribution'
49
50
 
50
51
  require 'json'
51
52
  require 'json-schema'
@@ -62,7 +63,8 @@ module URBANopt
62
63
  class ScenarioReport
63
64
  attr_accessor :id, :name, :directory_name, :timesteps_per_hour, :number_of_not_started_simulations,
64
65
  :number_of_started_simulations, :number_of_complete_simulations, :number_of_failed_simulations,
65
- :timeseries_csv, :location, :program, :construction_costs, :reporting_periods, :feature_reports, :distributed_generation # :nodoc:
66
+ :timeseries_csv, :location, :program, :construction_costs, :reporting_periods, :feature_reports, :distributed_generation,
67
+ :scenario_power_distribution # :nodoc:
66
68
 
67
69
  # ScenarioReport class intializes the scenario report attributes:
68
70
  # +:id+ , +:name+ , +:directory_name+, +:timesteps_per_hour+ , +:number_of_not_started_simulations+ ,
@@ -90,10 +92,11 @@ module URBANopt
90
92
  @location = Location.new(hash[:location])
91
93
  @program = Program.new(hash[:program])
92
94
  @distributed_generation = DistributedGeneration.new(hash[:distributed_generation] || {})
95
+ @scenario_power_distribution = ScenarioPowerDistribution.new(hash[:scenario_power_distribution] || {})
93
96
 
94
97
  @construction_costs = []
95
98
  hash[:construction_costs].each do |cc|
96
- @constructiion_costs << ConstructionCost.new(cc)
99
+ @construction_costs << ConstructionCost.new(cc)
97
100
  end
98
101
 
99
102
  @reporting_periods = []
@@ -229,6 +232,7 @@ module URBANopt
229
232
  result[:location] = @location.to_hash if @location
230
233
  result[:program] = @program.to_hash if @program
231
234
  result[:distributed_generation] = @distributed_generation.to_hash if @distributed_generation
235
+ result[:scenario_power_distribution] = @scenario_power_distribution.to_hash if @scenario_power_distribution
232
236
 
233
237
  result[:construction_costs] = []
234
238
  @construction_costs&.each { |cc| result[:construction_costs] << cc.to_hash }
@@ -50,3 +50,27 @@ Net Power
50
50
  Net Apparent Power
51
51
  Ice Thermal Storage End Fraction
52
52
  Cooling Coil Ice Thermal Storage End Fraction
53
+ Future_Annual_Electricity_Emissions
54
+ Future_Hourly_Electricity_Emissions
55
+ Historical_Annual_Electricity_Emissions
56
+ Historical_Hourly_Electricity_Emissions
57
+ Future_Annual_Electricity_Emissions_Intensity
58
+ Future_Hourly_Electricity_Emissions_Intensity
59
+ Historical_Annual_Electricity_Emissions_Intensity
60
+ Historical_Hourly_Electricity_Emissions_Intensity
61
+ Natural_Gas_Emissions
62
+ Natural_Gas_Emissions_Intensity
63
+ Propane_Emissions
64
+ Propane_Emissions_Intensity
65
+ FuelOilNo2_Emissions
66
+ FuelOilNo2_Emissions_Intensity
67
+ Curtailed EV Power
68
+ Daily EV Charge Energy Capacity
69
+ EV Charge Ratio
70
+ Total Charged EV Energy
71
+ Total Curtailed EV Energy
72
+ Total Scheduled EV Energy
73
+ Emission Intensity Schedule Output
74
+ EV Charging Effective Schedule
75
+ EV Charging Original Schedule
76
+ EV Charging Original Load
@@ -66,6 +66,12 @@
66
66
  },
67
67
  "thermal_storage": {
68
68
  "$ref": "#/definitions/ThermalStorage"
69
+ },
70
+ "rnm_results": {
71
+ "$ref": "#definitions/RnmResults"
72
+ },
73
+ "scenario_power_distribution": {
74
+ "$ref": "#definitions/ScenarioPowerDistribution"
69
75
  }
70
76
  },
71
77
  "required": [
@@ -81,9 +87,59 @@
81
87
  ],
82
88
  "additionalProperties": false
83
89
  },
90
+ "ScenarioPowerDistribution": {
91
+ "type": "object",
92
+ "properties": {
93
+ "substations": {
94
+ "description": "Array of electrical substations",
95
+ "type": "array",
96
+ "items": {
97
+ "type": "object",
98
+ "properties": {
99
+ "nominal_voltage": {
100
+ "description": "Nominal Voltage (V)",
101
+ "type": "number"
102
+ }
103
+ }
104
+ }
105
+ },
106
+ "distribution_lines": {
107
+ "description": "Array of distribution lines",
108
+ "type": "array",
109
+ "items": {
110
+ "type": "object",
111
+ "properties": {
112
+ "length": {
113
+ "description": "Length of the line (m)",
114
+ "type": "number"
115
+ },
116
+ "ampacity": {
117
+ "description": "Maximum ampacity of the line (A)",
118
+ "type": "number"
119
+ },
120
+ "commercial_line_type": {
121
+ "description": "Array of the wire types that make up the line",
122
+ "type": "array",
123
+ "items": {
124
+ "type": "string"
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ },
84
132
  "DistributedGeneration": {
85
133
  "type": "object",
86
134
  "properties": {
135
+ "reopt_assumptions_file_path": {
136
+ "description": "File path of REopt assumptions file used to generate results, if known",
137
+ "type": "string"
138
+ },
139
+ "annual_renewable_electricity_pct": {
140
+ "description": "Percentage of annual renewable electricity generation",
141
+ "type": "number"
142
+ },
87
143
  "lcc_us_dollars": {
88
144
  "description": "Optimal lifecycle cost",
89
145
  "type": "number"
@@ -127,7 +183,7 @@
127
183
  "properties": {
128
184
  "size_kw": {
129
185
  "description": "rated power in kW",
130
- "type": "string"
186
+ "type": "number"
131
187
  },
132
188
  "location": {
133
189
  "description": "Location of PV. Available options are roof, ground or both.",
@@ -137,6 +193,14 @@
137
193
  "ground",
138
194
  "both"
139
195
  ]
196
+ },
197
+ "tilt": {
198
+ "description": "PV system tilt",
199
+ "type": "number"
200
+ },
201
+ "azimuth": {
202
+ "description": "PV azimuth angle",
203
+ "type": "number"
140
204
  }
141
205
  }
142
206
  },
@@ -145,6 +209,14 @@
145
209
  "properties": {
146
210
  "size_kw": {
147
211
  "description": "rated power in kW",
212
+ "type": "number"
213
+ },
214
+ "average_yearly_energy_produced_kwh": {
215
+ "description": "average yearly energy produced in kWh",
216
+ "type": "number"
217
+ },
218
+ "size_class": {
219
+ "description": "Turbine size-class. One of [residential, commercial, medium, large]",
148
220
  "type": "string"
149
221
  }
150
222
  }
@@ -154,7 +226,7 @@
154
226
  "properties": {
155
227
  "size_kw": {
156
228
  "description": "rated power in kW",
157
- "type": "string"
229
+ "type": "number"
158
230
  }
159
231
  }
160
232
  },
@@ -163,14 +235,139 @@
163
235
  "properties": {
164
236
  "size_kw": {
165
237
  "description": "rated power in kW",
166
- "type": "string"
238
+ "type": "number"
167
239
  },
168
- "size_kw": {
240
+ "size_kwh": {
169
241
  "description": "rated capacity in kWh",
170
- "type": "string"
242
+ "type": "number"
243
+ }
244
+ }
245
+ },
246
+ "RnmResults": {
247
+ "type": "object",
248
+ "properties": {
249
+ "demand_generation_planning": {
250
+ "description": "Demand generation planning",
251
+ "type": "array",
252
+ "items": {
253
+ "$ref": "#/definitions/DemandGenPlanning"
254
+ }
255
+ },
256
+ "electrical_lines_length": {
257
+ "description": "Electrical lines length",
258
+ "type": "object",
259
+ "properties": {
260
+ "low_voltage": {
261
+ "description": "Low voltage electrical lines length",
262
+ "type": "object",
263
+ "properties": {
264
+ "$ref": "#/definitions/LineLength"
265
+ }
266
+ },
267
+ "medium_voltage": {
268
+ "description": "Medium voltage electrical lines length",
269
+ "type": "object",
270
+ "properties": {
271
+ "$ref": "#/definitions/LineLength"
272
+ }
273
+ }
274
+ }
275
+ },
276
+ "distribution_transformers_capacity_kva": {
277
+ "description": "Distribution transformers capacity in kVA",
278
+ "type": "number"
279
+ },
280
+ "costs": {
281
+ "description": "Costs",
282
+ "type": "object",
283
+ "properties": {
284
+ "investment": {
285
+ "description": "Investment cost",
286
+ "type": "object",
287
+ "properties": {
288
+ "$ref": "#/definitions/RnmCost"
289
+ }
290
+ },
291
+ "yearly_maintenance": {
292
+ "description": "Yearly maintenance cost",
293
+ "type": "object",
294
+ "properties": {
295
+ "$ref": "#/definitions/RnmCost"
296
+ }
297
+ }
298
+ }
299
+ },
300
+ "reliability_indexes": {
301
+ "description": "Reliability Indexes",
302
+ "type": "object",
303
+ "properties": {
304
+ "SAIDI": {
305
+ "description": "System Average Interruption Duration Index",
306
+ "type": "number"
307
+ },
308
+ "SAIFI": {
309
+ "description": "System Average Interruption Frequency Index",
310
+ "type": "number"
311
+ }
312
+ }
171
313
  }
172
314
  }
173
315
  },
316
+ "DemandGenPlanning": {
317
+ "type": "object",
318
+ "properties": {
319
+ "type": {
320
+ "description": "Type of demand generation planning",
321
+ "type": "string",
322
+ "enum": [
323
+ "Low Voltage (LV) Consumers",
324
+ "Medium Voltage (MV) Consumers",
325
+ "Low Voltage (LV) Distributed generators",
326
+ "Medium Voltage (MV) Distributed generators"
327
+ ]
328
+ },
329
+ "peak_demand_kw": {
330
+ "description": "Peak demand in kw for this type",
331
+ "type": "number"
332
+ },
333
+ "number_of_nodes_in_network": {
334
+ "description": "Number of nodes of this type in the network",
335
+ "type": "number"
336
+ }
337
+ }
338
+ },
339
+ "LineLength": {
340
+ "overhead_mi": {
341
+ "description": "Length of overhead lines (miles)",
342
+ "type": "number"
343
+ },
344
+ "underground_mi": {
345
+ "description": "Length of underground lines (miles)",
346
+ "type": "number"
347
+ }
348
+ },
349
+ "RnmCost": {
350
+ "low_voltage_network": {
351
+ "description": "Low Voltage Network Cost ($)",
352
+ "type": "number"
353
+ },
354
+ "distribution_transformers": {
355
+ "description": "Distribution Transformers Cost ($)",
356
+ "type": "number"
357
+ },
358
+ "medium_voltage_network": {
359
+ "description": "Medium Voltage Network Cost ($)",
360
+ "type": "number"
361
+ },
362
+ "primary_substations": {
363
+ "description": "Primary Substations Cost ($)",
364
+ "type": "number"
365
+ },
366
+ "total": {
367
+ "description": "Total Cost ($)",
368
+ "type": "number"
369
+ }
370
+ },
174
371
  "FeatureReport": {
175
372
  "type": "object",
176
373
  "properties": {
@@ -371,6 +568,68 @@
371
568
  },
372
569
  "comfort_result": {
373
570
  "$ref": "#/definitions/ComfortResult"
571
+ },
572
+ "emissions": {
573
+ "type": "object",
574
+ "properties": {
575
+ "future_annual_electricity_emissions_mt": {
576
+ "description": "Future emissions in metric ton (mt) calculated based on an annual emission factor value for the selected future year",
577
+ "type": "number"
578
+ },
579
+ "future_hourly_electricity_emissions_mt": {
580
+ "description": "Future emissions in metric ton (mt) calculated based on hourly emission factor values for the selected future year",
581
+ "type": "number"
582
+ },
583
+ "historical_annual_electricity_emissions_mt": {
584
+ "description": "Historical emissions in metric ton (mt) calculated based on an annual emission factor value for the selected historical year",
585
+ "type": "number"
586
+ },
587
+ "historical_hourly_electricity_emissions_mt": {
588
+ "description": "Historical emissions in metric ton (mt) calculated based on hourly emission factor values for the selected historical year",
589
+ "type": "number"
590
+ },
591
+ "future_annual_electricity_emissions_intensity_kg_per_ft2": {
592
+ "description": "Future emissions intensity in kg/ft2 calculated based on an annual emission factor value for the selected future year",
593
+ "type": "number"
594
+ },
595
+ "future_hourly_electricity_emissions_intensity_kg_per_ft2": {
596
+ "description": "Future emissions intensity in kg/ft2 calculated based on hourly emission factor values for the selected future year",
597
+ "type": "number"
598
+ },
599
+ "historical_annual_electricity_emissions_intensity_kg_per_ft2": {
600
+ "description": "Historical emissions intensity in kg/ft2 calculated based on an annual emission factor value for the selected historical year",
601
+ "type": "number"
602
+ },
603
+ "historical_hourly_electricity_emissions_intensity_kg_per_ft2": {
604
+ "description": "Historical emissions intensity in kg/ft2 calculated based on hourly emission factor values for the selected historical year",
605
+ "type": "number"
606
+ },
607
+ "natural_gas_emissions_mt": {
608
+ "description": "Natural Gas emissions in mt calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
609
+ "type": "number"
610
+ },
611
+ "natural_gas_emissions_intensity_kg_per_ft2": {
612
+ "description": "Natural Gas emissions intensity in kg/ft2 calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
613
+ "type": "number"
614
+ },
615
+ "propane_emissions_mt": {
616
+ "description": "Propane emissions in mt calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
617
+ "type": "number"
618
+ },
619
+ "propane_emissions_intensity_kg_per_ft2": {
620
+ "description": "Propane emissions intensity in kg/ft2 calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
621
+ "type": "number"
622
+ },
623
+ "fueloil_no2_emissions_mt": {
624
+ "description": "FuelOilNo2 emissions in mt calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
625
+ "type": "number"
626
+ },
627
+ "fueloil_no2_emissions_intensity_kg_per_ft2": {
628
+ "description": "FuelOilNo2 emissions intensity in kg/ft2 calculated based on EPA eGRID data and calculated using 20-year GWP horizon based on ASHRAE 189.1",
629
+ "type": "number"
630
+ }
631
+
632
+ }
374
633
  }
375
634
  },
376
635
  "additionalProperties": false
@@ -913,4 +1172,4 @@
913
1172
  }
914
1173
  }
915
1174
  }
916
- }
1175
+ }