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
@@ -3,8 +3,8 @@
3
3
  <schema_version>3.0</schema_version>
4
4
  <name>default_feature_reports</name>
5
5
  <uid>9ee3135a-8070-4408-bfa1-b75fecf9dd4f</uid>
6
- <version_id>95706c7a-88ab-433b-b897-00435181a6dd</version_id>
7
- <version_modified>20200603T001228Z</version_modified>
6
+ <version_id>f9af7bd8-e9ce-41b4-b892-df29f235a9bd</version_id>
7
+ <version_modified>20201201T173130Z</version_modified>
8
8
  <xml_checksum>FB304155</xml_checksum>
9
9
  <class_name>DefaultFeatureReports</class_name>
10
10
  <display_name>DefaultFeatureReports</display_name>
@@ -126,17 +126,23 @@
126
126
  <usage_type>test</usage_type>
127
127
  <checksum>CC4BFFAF</checksum>
128
128
  </file>
129
+ <file>
130
+ <filename>README.md</filename>
131
+ <filetype>md</filetype>
132
+ <usage_type>readme</usage_type>
133
+ <checksum>0B68E96D</checksum>
134
+ </file>
129
135
  <file>
130
136
  <filename>LICENSE.md</filename>
131
137
  <filetype>md</filetype>
132
138
  <usage_type>license</usage_type>
133
- <checksum>EA283B74</checksum>
139
+ <checksum>BBD19F47</checksum>
134
140
  </file>
135
141
  <file>
136
142
  <filename>default_feature_reports_test.rb</filename>
137
143
  <filetype>rb</filetype>
138
144
  <usage_type>test</usage_type>
139
- <checksum>56E0804B</checksum>
145
+ <checksum>19681175</checksum>
140
146
  </file>
141
147
  <file>
142
148
  <version>
@@ -147,13 +153,7 @@
147
153
  <filename>measure.rb</filename>
148
154
  <filetype>rb</filetype>
149
155
  <usage_type>script</usage_type>
150
- <checksum>A00C8077</checksum>
151
- </file>
152
- <file>
153
- <filename>README.md</filename>
154
- <filetype>md</filetype>
155
- <usage_type>readme</usage_type>
156
- <checksum>0B68E96D</checksum>
156
+ <checksum>B1E43E26</checksum>
157
157
  </file>
158
158
  </files>
159
159
  </measure>
@@ -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,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,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,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,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,
@@ -29,10 +29,10 @@
29
29
  # *********************************************************************************
30
30
 
31
31
  require 'json'
32
- require_relative 'solar_pv'
33
- require_relative 'wind'
34
- require_relative 'generator'
35
- require_relative 'storage'
32
+ require 'urbanopt/reporting/default_reports/solar_pv'
33
+ require 'urbanopt/reporting/default_reports/wind'
34
+ require 'urbanopt/reporting/default_reports/generator'
35
+ require 'urbanopt/reporting/default_reports/storage'
36
36
  require 'json-schema'
37
37
 
38
38
  module URBANopt
@@ -47,6 +47,11 @@ module URBANopt
47
47
  #
48
48
  attr_accessor :lcc_us_dollars
49
49
 
50
+ ##
51
+ # _Float_ - Lifecycle costs for the complete distributed generation system in US Dollars
52
+ #
53
+ attr_accessor :lcc_bau_us_dollars
54
+
50
55
  ##
51
56
  # _Float_ - Net present value of the complete distributed generation system in US Dollars
52
57
  #
@@ -68,10 +73,40 @@ module URBANopt
68
73
  attr_accessor :year_one_bill_us_dollars
69
74
 
70
75
  ##
71
- # _Float_ - Total amount paid to the utility in US Dollars over the life of the system
76
+ # _Float_ - Total energy costs in US Dollars over the life of the system after tax
72
77
  #
73
78
  attr_accessor :total_energy_cost_us_dollars
74
79
 
80
+ ##
81
+ # _Float_ - Total demand costs in US Dollars over the life of the system after tax
82
+ #
83
+ attr_accessor :total_demand_cost_us_dollars
84
+
85
+ ##
86
+ # _Float_ - Year one energy cost in the business as usual scenario (i.e no new system) after tax, us dollars
87
+ #
88
+ attr_accessor :year_one_energy_cost_bau_us_dollars
89
+
90
+ ##
91
+ # _Float_ - Year one demand cost in the business as usual scenario (i.e no new system), us dollars
92
+ #
93
+ attr_accessor :year_one_demand_cost_bau_us_dollars
94
+
95
+ ##
96
+ # _Float_ - Year one demand energy bill in the business as usual scenario (i.e no new system), us dollars
97
+ #
98
+ attr_accessor :year_one_bill_bau_us_dollars
99
+
100
+ ##
101
+ # _Float_ - Total lifetime demand costs in the business as usual scenario (i.e no new system) after tax, us dollars
102
+ #
103
+ attr_accessor :total_demand_cost_bau_us_dollars
104
+
105
+ ##
106
+ # _Float_ - Total lifetime energy costs in the business as usual scenario (i.e no new system) after tax, us dollars
107
+ #
108
+ attr_accessor :total_energy_cost_bau_us_dollars
109
+
75
110
  ##
76
111
  # _Array_ - List of _SolarPV_ systems
77
112
  #
@@ -117,6 +152,36 @@ module URBANopt
117
152
  #
118
153
  attr_accessor :total_generator_kw
119
154
 
155
+ ##
156
+ # _Float_ - Minimum hour the system can support critical load during a grid outage
157
+ #
158
+ attr_accessor :resilience_hours_min
159
+
160
+ ##
161
+ # _Float_ - Maximum hour the system can support critical load during a grid outage
162
+ #
163
+ attr_accessor :resilience_hours_max
164
+
165
+ ##
166
+ # _Float_ - Average hour the system can support critical load during a grid outage
167
+ #
168
+ attr_accessor :resilience_hours_avg
169
+
170
+ ##
171
+ # _Float_ - Average probability the system can sustain critical load during a grid outage
172
+ #
173
+ attr_accessor :probs_of_surviving
174
+
175
+ ##
176
+ # _Float_ - Average monthly probabiliies that the system can sustain critical load during a grid outage
177
+ #
178
+ attr_accessor :probs_of_surviving_by_month
179
+
180
+ ##
181
+ # _Float_ - Average hourly probabiliies that the system can sustain critical load during a grid outage
182
+ #
183
+ attr_accessor :probs_of_surviving_by_hour_of_the_day
184
+
120
185
  ##
121
186
  # Initialize distributed generation system design and financial metrics.
122
187
  #
@@ -132,11 +197,25 @@ module URBANopt
132
197
  hash.delete_if { |k, v| v.nil? }
133
198
 
134
199
  @lcc_us_dollars = hash[:lcc_us_dollars]
200
+ @lcc_bau_us_dollars = hash[:lcc_bau_us_dollars]
135
201
  @npv_us_dollars = hash[:npv_us_dollars]
136
202
  @year_one_energy_cost_us_dollars = hash[:year_one_energy_cost_us_dollars]
203
+ @year_one_energy_cost_bau_us_dollars = hash[:year_one_energy_cost_bau_us_dollars]
137
204
  @year_one_demand_cost_us_dollars = hash[:year_one_demand_cost_us_dollars]
205
+ @year_one_demand_cost_bau_us_dollars = hash[:year_one_demand_cost_bau_us_dollars]
138
206
  @year_one_bill_us_dollars = hash[:year_one_bill_us_dollars]
207
+ @year_one_bill_bau_us_dollars = hash[:year_one_bill_bau_us_dollars]
139
208
  @total_energy_cost_us_dollars = hash[:total_energy_cost_us_dollars]
209
+ @total_energy_cost_bau_us_dollars = hash[:total_energy_cost_bau_us_dollars]
210
+ @total_demand_cost_us_dollars = hash[:total_demand_cost_us_dollars]
211
+ @total_demand_cost_bau_us_dollars = hash[:total_demand_cost_bau_us_dollars]
212
+
213
+ @resilience_hours_min = hash[:resilience_hours_min]
214
+ @resilience_hours_max = hash[:resilience_hours_max]
215
+ @resilience_hours_avg = hash[:resilience_hours_avg]
216
+ @probs_of_surviving = hash[:probs_of_surviving]
217
+ @probs_of_surviving_by_month = hash[:probs_of_surviving_by_month]
218
+ @probs_of_surviving_by_hour_of_the_day = hash[:probs_of_surviving_by_hour_of_the_day]
140
219
 
141
220
  @total_solar_pv_kw = nil
142
221
  @total_wind_kw = nil
@@ -276,16 +355,34 @@ module URBANopt
276
355
  result = {}
277
356
 
278
357
  result[:lcc_us_dollars] = @lcc_us_dollars if @lcc_us_dollars
358
+ result[:lcc_bau_us_dollars] = @lcc_bau_us_dollars if @lcc_bau_us_dollars
279
359
  result[:npv_us_dollars] = @npv_us_dollars if @npv_us_dollars
360
+
280
361
  result[:year_one_energy_cost_us_dollars] = @year_one_energy_cost_us_dollars if @year_one_energy_cost_us_dollars
281
362
  result[:year_one_demand_cost_us_dollars] = @year_one_demand_cost_us_dollars if @year_one_demand_cost_us_dollars
282
363
  result[:year_one_bill_us_dollars] = @year_one_bill_us_dollars if @year_one_bill_us_dollars
364
+ result[:total_demand_cost_us_dollars] = @total_demand_cost_us_dollars if @total_demand_cost_us_dollars
365
+ result[:total_energy_cost_us_dollars] = @total_energy_cost_us_dollars if @total_energy_cost_us_dollars
366
+
367
+ result[:year_one_energy_cost_bau_us_dollars] = @year_one_energy_cost_bau_us_dollars if @year_one_energy_cost_bau_us_dollars
368
+ result[:year_one_demand_cost_bau_us_dollars] = @year_one_demand_cost_bau_us_dollars if @year_one_demand_cost_bau_us_dollars
369
+ result[:year_one_bill_bau_us_dollars] = @year_one_bill_bau_us_dollars if @year_one_bill_bau_us_dollars
370
+ result[:total_energy_cost_bau_us_dollars] = @total_energy_cost_bau_us_dollars if @total_energy_cost_bau_us_dollars
371
+ result[:total_demand_cost_bau_us_dollars] = @total_demand_cost_bau_us_dollars if @total_demand_cost_bau_us_dollars
372
+
283
373
  result[:total_solar_pv_kw] = @total_solar_pv_kw if @total_solar_pv_kw
284
374
  result[:total_wind_kw] = @total_wind_kw if @total_wind_kw
285
375
  result[:total_generator_kw] = @total_generator_kw if @total_generator_kw
286
376
  result[:total_storage_kw] = @total_storage_kw if @total_storage_kw
287
377
  result[:total_storage_kwh] = @total_storage_kwh if @total_storage_kwh
288
378
 
379
+ result[:resilience_hours_min] = @resilience_hours_min if @resilience_hours_min
380
+ result[:resilience_hours_max] = @resilience_hours_max if @resilience_hours_max
381
+ result[:resilience_hours_avg] = @resilience_hours_avg if @resilience_hours_avg
382
+ result[:probs_of_surviving] = @probs_of_surviving if @probs_of_surviving
383
+ result[:probs_of_surviving_by_month] = @probs_of_surviving_by_month if @probs_of_surviving_by_month
384
+ result[:probs_of_surviving_by_hour_of_the_day] = @probs_of_surviving_by_hour_of_the_day if @probs_of_surviving_by_hour_of_the_day
385
+
289
386
  result[:solar_pv] = []
290
387
  @solar_pv.each do |pv|
291
388
  result[:solar_pv].push pv.to_hash
@@ -327,11 +424,27 @@ module URBANopt
327
424
  ##
328
425
  def self.merge_distributed_generation(existing_dgen, new_dgen)
329
426
  existing_dgen.lcc_us_dollars = add_values(existing_dgen.lcc_us_dollars, new_dgen.lcc_us_dollars)
427
+ existing_dgen.lcc_bau_us_dollars = add_values(existing_dgen.lcc_bau_us_dollars, new_dgen.lcc_bau_us_dollars)
330
428
  existing_dgen.npv_us_dollars = add_values(existing_dgen.npv_us_dollars, new_dgen.npv_us_dollars)
429
+
331
430
  existing_dgen.year_one_energy_cost_us_dollars = add_values(existing_dgen.year_one_energy_cost_us_dollars, new_dgen.year_one_energy_cost_us_dollars)
332
431
  existing_dgen.year_one_demand_cost_us_dollars = add_values(existing_dgen.year_one_demand_cost_us_dollars, new_dgen.year_one_demand_cost_us_dollars)
333
432
  existing_dgen.year_one_bill_us_dollars = add_values(existing_dgen.year_one_bill_us_dollars, new_dgen.year_one_bill_us_dollars)
334
433
  existing_dgen.total_energy_cost_us_dollars = add_values(existing_dgen.total_energy_cost_us_dollars, new_dgen.total_energy_cost_us_dollars)
434
+ existing_dgen.total_demand_cost_us_dollars = add_values(existing_dgen.total_demand_cost_us_dollars, new_dgen.total_demand_cost_us_dollars)
435
+
436
+ existing_dgen.year_one_energy_cost_bau_us_dollars = add_values(existing_dgen.year_one_energy_cost_bau_us_dollars, new_dgen.year_one_energy_cost_bau_us_dollars)
437
+ existing_dgen.year_one_demand_cost_bau_us_dollars = add_values(existing_dgen.year_one_demand_cost_bau_us_dollars, new_dgen.year_one_demand_cost_bau_us_dollars)
438
+ existing_dgen.year_one_bill_bau_us_dollars = add_values(existing_dgen.year_one_bill_bau_us_dollars, new_dgen.year_one_bill_bau_us_dollars)
439
+ existing_dgen.total_energy_cost_bau_us_dollars = add_values(existing_dgen.total_energy_cost_bau_us_dollars, new_dgen.total_energy_cost_bau_us_dollars)
440
+ existing_dgen.total_demand_cost_bau_us_dollars = add_values(existing_dgen.total_demand_cost_bau_us_dollars, new_dgen.total_demand_cost_bau_us_dollars)
441
+
442
+ existing_dgen.resilience_hours_min = add_values(existing_dgen.resilience_hours_min, new_dgen.resilience_hours_min)
443
+ existing_dgen.resilience_hours_max = add_values(existing_dgen.resilience_hours_max, new_dgen.resilience_hours_max)
444
+ existing_dgen.resilience_hours_avg = add_values(existing_dgen.resilience_hours_avg, new_dgen.resilience_hours_avg)
445
+ existing_dgen.probs_of_surviving = add_values(existing_dgen.probs_of_surviving, new_dgen.probs_of_surviving)
446
+ existing_dgen.probs_of_surviving_by_month = add_values(existing_dgen.probs_of_surviving_by_month, new_dgen.probs_of_surviving_by_month)
447
+ existing_dgen.probs_of_surviving_by_hour_of_the_day = add_values(existing_dgen.probs_of_surviving_by_hour_of_the_day, new_dgen.probs_of_surviving_by_hour_of_the_day)
335
448
 
336
449
  new_dgen.solar_pv.each do |pv|
337
450
  existing_dgen.solar_pv.push pv
@@ -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,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,
@@ -39,10 +39,10 @@ module URBANopt
39
39
  # Enduses class inlclude results for each fuel type.
40
40
  ##
41
41
  class EndUses
42
- attr_accessor :electricity, :natural_gas, :additional_fuel, :district_cooling, :district_heating, :water # :nodoc:
42
+ attr_accessor :electricity_kwh, :natural_gas_kwh, :propane_kwh, :fuel_oil_kwh, :other_fuels_kwh, :district_cooling_kwh, :district_heating_kwh, :water_qbft # :nodoc:
43
43
  ##
44
- # EndUses class intialize end_uses(fuel type) attributes: +:electricity+ , +:natural_gas+ , +:additional_fuel+ ,
45
- # +:district_cooling+ , +:district_heating+ , +:water+
44
+ # EndUses class intialize end_uses(fuel type) attributes: +:electricity_kwh+ , +:natural_gas_kwh+ , +:propane_kwh+ , +:fuel_oil_kwh+ , +:other_fuels_kwh+ ,
45
+ # +:district_cooling_kwh+ , +:district_heating_kwh+ , +:water_qbft+
46
46
  ##
47
47
  # [parameters:]
48
48
  # +hash+ - _Hash_ - A hash which may contain a deserialized end_uses.
@@ -51,12 +51,14 @@ module URBANopt
51
51
  hash.delete_if { |k, v| v.nil? }
52
52
  hash = defaults.merge(hash)
53
53
 
54
- @electricity = EndUse.new(hash[:electricity])
55
- @natural_gas = EndUse.new(hash[:natural_gas])
56
- @additional_fuel = EndUse.new(hash[:additional_fuel])
57
- @district_cooling = EndUse.new(hash[:district_cooling])
58
- @district_heating = EndUse.new(hash[:district_heating])
59
- @water = EndUse.new(hash[:water])
54
+ @electricity_kwh = EndUse.new(hash[:electricity_kwh])
55
+ @natural_gas_kwh = EndUse.new(hash[:natural_gas_kwh])
56
+ @propane_kwh = EndUse.new(hash[:propane_kwh])
57
+ @fuel_oil_kwh = EndUse.new(hash[:fuel_oil_kwh])
58
+ @other_fuels_kwh = EndUse.new(hash[:other_fuels_kwh])
59
+ @district_cooling_kwh = EndUse.new(hash[:district_cooling_kwh])
60
+ @district_heating_kwh = EndUse.new(hash[:district_heating_kwh])
61
+ @water_qbft = EndUse.new(hash[:water_qbft])
60
62
 
61
63
  # initialize class variables @@validator and @@schema
62
64
  @@validator ||= Validator.new
@@ -72,29 +74,37 @@ module URBANopt
72
74
  def to_hash
73
75
  result = {}
74
76
 
75
- electricity_hash = @electricity.to_hash if @electricity.to_hash
76
- electricity_hash.delete_if { |k, v| v.nil? }
77
- result[:electricity] = electricity_hash if @electricity
77
+ electricity_kwh_hash = @electricity_kwh.to_hash if @electricity_kwh
78
+ electricity_kwh_hash.delete_if { |k, v| v.nil? }
79
+ result[:electricity_kwh] = electricity_kwh_hash if @electricity_kwh
78
80
 
79
- natural_gas_hash = @natural_gas.to_hash if @natural_gas
80
- natural_gas_hash.delete_if { |k, v| v.nil? }
81
- result[:natural_gas] = natural_gas_hash if @natural_gas
81
+ natural_gas_kwh_hash = @natural_gas_kwh.to_hash if @natural_gas_kwh
82
+ natural_gas_kwh_hash.delete_if { |k, v| v.nil? }
83
+ result[:natural_gas_kwh] = natural_gas_kwh_hash if @natural_gas_kwh
82
84
 
83
- additional_fuel_hash = @additional_fuel.to_hash if @additional_fuel
84
- additional_fuel_hash.delete_if { |k, v| v.nil? }
85
- result[:additional_fuel] = additional_fuel_hash if @additional_fuel
85
+ propane_kwh_hash = @propane_kwh.to_hash if @propane_kwh
86
+ propane_kwh_hash.delete_if { |k, v| v.nil? }
87
+ result[:propane_kwh] = propane_kwh_hash if @propane_kwh
86
88
 
87
- district_cooling_hash = @district_cooling.to_hash if @district_cooling
88
- district_cooling_hash.delete_if { |k, v| v.nil? }
89
- result[:district_cooling] = district_cooling_hash if @district_cooling
89
+ fuel_oil_kwh_hash = @fuel_oil_kwh.to_hash if @fuel_oil_kwh
90
+ fuel_oil_kwh_hash.delete_if { |k, v| v.nil? }
91
+ result[:fuel_oil_kwh] = fuel_oil_kwh_hash if @fuel_oil_kwh
90
92
 
91
- district_heating_hash = @district_heating.to_hash if @district_heating
92
- district_heating_hash.delete_if { |k, v| v.nil? }
93
- result[:district_heating] = district_heating_hash if @district_heating
93
+ other_fuels_kwh_hash = @other_fuels_kwh.to_hash if @other_fuels_kwh
94
+ other_fuels_kwh_hash.delete_if { |k, v| v.nil? }
95
+ result[:other_fuels_kwh] = other_fuels_kwh_hash if @other_fuels_kwh
94
96
 
95
- water_hash = @water.to_hash if @water
96
- water_hash.delete_if { |k, v| v.nil? }
97
- result[:water] = water_hash if @water
97
+ district_cooling_kwh_hash = @district_cooling_kwh.to_hash if @district_cooling_kwh
98
+ district_cooling_kwh_hash.delete_if { |k, v| v.nil? }
99
+ result[:district_cooling_kwh] = district_cooling_kwh_hash if @district_cooling_kwh
100
+
101
+ district_heating_kwh_hash = @district_heating_kwh.to_hash if @district_heating_kwh
102
+ district_heating_kwh_hash.delete_if { |k, v| v.nil? }
103
+ result[:district_heating_kwh] = district_heating_kwh_hash if @district_heating_kwh
104
+
105
+ water_qbft_hash = @water_qbft.to_hash if @water_qbft
106
+ water_qbft_hash.delete_if { |k, v| v.nil? }
107
+ result[:water_qbft] = water_qbft_hash if @water_qbft
98
108
 
99
109
  # validate end_uses properties against schema
100
110
  if @@validator.validate(@@schema[:definitions][:EndUses][:properties], result).any?
@@ -109,12 +119,14 @@ module URBANopt
109
119
  ##
110
120
  def defaults
111
121
  hash = {}
112
- hash[:electricity] = EndUse.new.to_hash
113
- hash[:natural_gas] = EndUse.new.to_hash
114
- hash[:additional_fuel] = EndUse.new.to_hash
115
- hash[:district_cooling] = EndUse.new.to_hash
116
- hash[:district_heating] = EndUse.new.to_hash
117
- hash[:water] = EndUse.new.to_hash
122
+ hash[:electricity_kwh] = EndUse.new.to_hash
123
+ hash[:natural_gas_kwh] = EndUse.new.to_hash
124
+ hash[:propane_kwh] = EndUse.new.to_hash
125
+ hash[:fuel_oil_kwh] = EndUse.new.to_hash
126
+ hash[:other_fuels_kwh] = EndUse.new.to_hash
127
+ hash[:district_cooling_kwh] = EndUse.new.to_hash
128
+ hash[:district_heating_kwh] = EndUse.new.to_hash
129
+ hash[:water_qbft] = EndUse.new.to_hash
118
130
 
119
131
  return hash
120
132
  end
@@ -127,11 +139,13 @@ module URBANopt
127
139
  ##
128
140
  def merge_end_uses!(new_end_uses)
129
141
  # modify the existing_period by summing up the results ; # sum results only if they exist
130
- @electricity.merge_end_use!(new_end_uses.electricity)
131
- @natural_gas.merge_end_use!(new_end_uses.natural_gas)
132
- @additional_fuel.merge_end_use!(new_end_uses.additional_fuel)
133
- @district_cooling.merge_end_use!(new_end_uses.district_cooling)
134
- @district_heating.merge_end_use!(new_end_uses.district_heating)
142
+ @electricity_kwh.merge_end_use!(new_end_uses.electricity_kwh)
143
+ @natural_gas_kwh.merge_end_use!(new_end_uses.natural_gas_kwh)
144
+ @propane_kwh.merge_end_use!(new_end_uses.propane_kwh)
145
+ @fuel_oil_kwh.merge_end_use!(new_end_uses.fuel_oil_kwh)
146
+ @other_fuels_kwh.merge_end_use!(new_end_uses.other_fuels_kwh)
147
+ @district_cooling_kwh.merge_end_use!(new_end_uses.district_cooling_kwh)
148
+ @district_heating_kwh.merge_end_use!(new_end_uses.district_heating_kwh)
135
149
  return self
136
150
  end
137
151
  end
@@ -1,3 +1,33 @@
1
+ # *********************************************************************************
2
+ # URBANopt (tm), Copyright (c) 2019-2020, 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
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
1
31
  require 'version'
2
32
  require 'openstudio/extension'
3
33