urbanopt-scenario 0.2.0.pre2 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -1
- data/Gemfile +0 -3
- data/lib/measures/default_feature_reports/measure.rb +25 -3
- data/lib/measures/default_feature_reports/measure.xml +3 -3
- data/lib/urbanopt/scenario.rb +1 -0
- data/lib/urbanopt/scenario/default_reports/distributed_generation.rb +8 -3
- data/lib/urbanopt/scenario/default_reports/feature_report.rb +14 -7
- data/lib/urbanopt/scenario/default_reports/power_distribution.rb +102 -0
- data/lib/urbanopt/scenario/default_reports/scenario_report.rb +7 -1
- data/lib/urbanopt/scenario/default_reports/schema/scenario_csv_columns.txt +17 -6
- data/lib/urbanopt/scenario/default_reports/schema/scenario_schema.json +14 -0
- data/lib/urbanopt/scenario/default_reports/timeseries_csv.rb +37 -22
- data/lib/urbanopt/scenario/scenario_post_processor_opendss.rb +276 -0
- data/lib/urbanopt/scenario/version.rb +1 -1
- data/urbanopt-scenario-gem.gemspec +5 -5
- metadata +35 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 268f5db33f1444f7e4daddf2f6055b5a5c7f9f03
|
|
4
|
+
data.tar.gz: 8a2af9239f2433fc2ffc883e69e8748f1ba69d9b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c9110c7e58e8f9d47891f46ac2519a436ba6733e11bd4a2e4907ba65bb85c39ce635133ec1edb0fc0380dea2bd5438b432ad0cdc31c370aed76afa75d6351839
|
|
7
|
+
data.tar.gz: e6bb432c9ef28be6db0511da9f1a58e7fc94438b5a0655924eb9654688a9bf358909715724b234d072d5d15774dfe63f5e7f30e5cce06857628ef8ddc442ce67
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# URBANopt Scenario Gem
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
## Version 0.2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Date Range: 01/15/20 - 03/30/20:
|
|
7
|
+
|
|
8
|
+
- Fixed [#27]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/27 ), FeatureReports are not initialized with location information.
|
|
9
|
+
- Fixed [#38]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/38 ), Write documentation on how to configure ScenarioRunner to run multiple OSWs in parallel
|
|
10
|
+
- Fixed [#42]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/42 ), Scenario Report Instantiation from Hash
|
|
11
|
+
- Fixed [#43]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/43 ), Add timestep column to timeseries csv or add start and end timestep to feature and scenario reports
|
|
12
|
+
- Fixed [#46]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/46 ), add Validator class
|
|
13
|
+
- Fixed [#52]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/52 ), create a save as method that takes a file name
|
|
14
|
+
- Fixed [#54]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/54 ), Add constraint on the versions of ruby in the gemspec file
|
|
15
|
+
- Fixed [#56]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/56 ), Add folder for mapper csv files
|
|
16
|
+
- Fixed [#58]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/58 ), post process results
|
|
17
|
+
- Fixed [#59]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/59 ), figure out how UrbanOpt will select tariff structure for REopt
|
|
18
|
+
- Fixed [#65]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/65 ), make default timeseries csv for scenario; update adding feature timeseries
|
|
19
|
+
- Fixed [#67]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/67 ), update vuepress version
|
|
20
|
+
- Fixed [#70]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/70 ), updates to Scenario Gem to Support REopt Release
|
|
21
|
+
- Fixed [#74]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/74 ), Update copyrights
|
|
22
|
+
- Fixed [#75]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/75 ), make github_api a development dependency
|
|
23
|
+
- Fixed [#81]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/81 ), add thermal comfort results and timestamp to reports
|
|
24
|
+
- Fixed [#83]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/83 ), add multiple pV
|
|
25
|
+
- Fixed [#88]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/88 ), add units to CSV reports
|
|
26
|
+
- Fixed [#89]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/89 ), created Save feature report method
|
|
27
|
+
- Fixed [#91]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/91 ), add total_costruction_cost to reports
|
|
28
|
+
- Fixed [#95]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/95 ), list datapoint failures
|
|
29
|
+
- Fixed [#98]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/98 ), add power, net power, net energy and apparent power to timeseries results
|
|
30
|
+
- Fixed [#101]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/101 ), fix for unit conversion when timeseries doe not exist
|
|
31
|
+
- Fixed [#102]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/102 ), add opendss post_processor
|
|
32
|
+
- Fixed [#104]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/104 ), add power distribution results to schema and reports
|
|
33
|
+
- Fixed [#110]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/110 ), save transformer features CSV and JSON reports
|
|
34
|
+
- Fixed [#112]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/112 ), added additional timeseries results to CSV reports
|
|
35
|
+
|
|
3
36
|
## Version 0.1.1
|
|
4
37
|
|
|
5
38
|
Date Range: 10/16/19 - 01/14/20
|
data/Gemfile
CHANGED
|
@@ -174,6 +174,17 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
|
174
174
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Gas:Facility,#{reporting_frequency};").get
|
|
175
175
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,DistrictCooling:Facility,#{reporting_frequency};").get
|
|
176
176
|
result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,DistrictHeating:Facility,#{reporting_frequency};").get
|
|
177
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Cooling:Electricity,#{reporting_frequency};").get
|
|
178
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Heating:Electricity,#{reporting_frequency};").get
|
|
179
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorLights:Electricity,#{reporting_frequency};").get
|
|
180
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,ExteriorLights:Electricity,#{reporting_frequency};").get
|
|
181
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorEquipment:Electricity,#{reporting_frequency};").get
|
|
182
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Fans:Electricity,#{reporting_frequency};").get
|
|
183
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Pumps:Electricity,#{reporting_frequency};").get
|
|
184
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,WaterSystems:Electricity,#{reporting_frequency};").get
|
|
185
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,Heating:Gas,#{reporting_frequency};").get
|
|
186
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,WaterSystems:Gas,#{reporting_frequency};").get
|
|
187
|
+
# result << OpenStudio::IdfObject.load("Output:Meter:MeterFileOnly,InteriorEquipment:Gas,#{reporting_frequency};").get
|
|
177
188
|
|
|
178
189
|
timeseries_data = ['District Cooling Chilled Water Rate', 'District Cooling Mass Flow Rate',
|
|
179
190
|
'District Cooling Inlet Temperature', 'District Cooling Outlet Temperature',
|
|
@@ -608,6 +619,17 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
|
608
619
|
'Electricity:Facility',
|
|
609
620
|
'ElectricityProduced:Facility',
|
|
610
621
|
'Gas:Facility',
|
|
622
|
+
'Cooling:Electricity',
|
|
623
|
+
'Heating:Electricity',
|
|
624
|
+
'InteriorLights:Electricity',
|
|
625
|
+
'ExteriorLights:Electricity',
|
|
626
|
+
'InteriorEquipment:Electricity',
|
|
627
|
+
'Fans:Electricity',
|
|
628
|
+
'Pumps:Electricity',
|
|
629
|
+
'WaterSystems:Electricity',
|
|
630
|
+
'Heating:Gas',
|
|
631
|
+
'WaterSystems:Gas',
|
|
632
|
+
'InteriorEquipment:Gas',
|
|
611
633
|
'DistrictCooling:Facility',
|
|
612
634
|
'DistrictHeating:Facility',
|
|
613
635
|
'District Cooling Chilled Water Rate',
|
|
@@ -646,7 +668,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
|
646
668
|
total_seconds = (60 / timesteps_per_hour.to_f) * 60 # make sure timesteps_per_hour is a float in the division
|
|
647
669
|
total_hours = 1 / timesteps_per_hour.to_f # make sure timesteps_per_hour is a float in the division
|
|
648
670
|
# set power_conversion
|
|
649
|
-
power_conversion = total_hours
|
|
671
|
+
power_conversion = total_hours # we set the power conversio to total_hours since we want to convert lWh to kW
|
|
650
672
|
puts "Power Converion: to convert kWh to kW values will be divided by #{power_conversion}"
|
|
651
673
|
|
|
652
674
|
# number of values in each timeseries
|
|
@@ -768,7 +790,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
|
768
790
|
newVals[j] = (values[tsToKeepIndexes['Electricity:Facility']][j].to_f - values[tsToKeepIndexes['ElectricityProduced:Facility']][j].to_f) / power_conversion / powerFactor
|
|
769
791
|
j += 1
|
|
770
792
|
end
|
|
771
|
-
new_unit = '
|
|
793
|
+
new_unit = 'kVA'
|
|
772
794
|
elsif timeseries_name.include? 'Net Electric Energy'
|
|
773
795
|
(0..n - 1).each do |j|
|
|
774
796
|
newVals[j] = (values[tsToKeepIndexes['Electricity:Facility']][j].to_f - values[tsToKeepIndexes['ElectricityProduced:Facility']][j].to_f)
|
|
@@ -798,7 +820,7 @@ class DefaultFeatureReports < OpenStudio::Measure::ReportingMeasure
|
|
|
798
820
|
newVals[j] = values[indexValue][j].to_f / power_conversion / powerFactor
|
|
799
821
|
j += 1
|
|
800
822
|
end
|
|
801
|
-
new_unit = '
|
|
823
|
+
new_unit = 'kVA'
|
|
802
824
|
else
|
|
803
825
|
# Power calculation
|
|
804
826
|
(0..n - 1).each do |j|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
<schema_version>3.0</schema_version>
|
|
3
3
|
<name>default_feature_reports</name>
|
|
4
4
|
<uid>9ee3135a-8070-4408-bfa1-b75fecf9dd4f</uid>
|
|
5
|
-
<version_id>
|
|
6
|
-
<version_modified>
|
|
5
|
+
<version_id>dcf043ff-d992-4835-893d-8658a6365eb3</version_id>
|
|
6
|
+
<version_modified>20200329T155122Z</version_modified>
|
|
7
7
|
<xml_checksum>FB304155</xml_checksum>
|
|
8
8
|
<class_name>DefaultFeatureReports</class_name>
|
|
9
9
|
<display_name>DefaultFeatureReports</display_name>
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
<filename>measure.rb</filename>
|
|
138
138
|
<filetype>rb</filetype>
|
|
139
139
|
<usage_type>script</usage_type>
|
|
140
|
-
<checksum>
|
|
140
|
+
<checksum>DF6AAD06</checksum>
|
|
141
141
|
</file>
|
|
142
142
|
</files>
|
|
143
143
|
</measure>
|
data/lib/urbanopt/scenario.rb
CHANGED
|
@@ -36,6 +36,7 @@ require 'urbanopt/scenario/scenario_base'
|
|
|
36
36
|
require 'urbanopt/scenario/scenario_csv'
|
|
37
37
|
require 'urbanopt/scenario/scenario_post_processor_base'
|
|
38
38
|
require 'urbanopt/scenario/scenario_post_processor_default'
|
|
39
|
+
require 'urbanopt/scenario/scenario_post_processor_opendss'
|
|
39
40
|
require 'urbanopt/scenario/scenario_runner_base'
|
|
40
41
|
require 'urbanopt/scenario/scenario_runner_osw'
|
|
41
42
|
require 'urbanopt/scenario/simulation_dir_base'
|
|
@@ -107,6 +107,11 @@ module URBANopt
|
|
|
107
107
|
#
|
|
108
108
|
attr_accessor :total_storage_kw
|
|
109
109
|
|
|
110
|
+
##
|
|
111
|
+
# _Float_ - Installed storage capacity
|
|
112
|
+
#
|
|
113
|
+
attr_accessor :total_storage_kwh
|
|
114
|
+
|
|
110
115
|
##
|
|
111
116
|
# _Float_ - Installed generator capacity
|
|
112
117
|
#
|
|
@@ -286,15 +291,15 @@ module URBANopt
|
|
|
286
291
|
result[:solar_pv].push pv.to_hash
|
|
287
292
|
end
|
|
288
293
|
result[:wind] = []
|
|
289
|
-
@wind.each do |
|
|
294
|
+
@wind.each do |wind|
|
|
290
295
|
result[:wind].push wind.to_hash
|
|
291
296
|
end
|
|
292
297
|
result[:generator] = []
|
|
293
|
-
@generator.each do |
|
|
298
|
+
@generator.each do |generator|
|
|
294
299
|
result[:generator].push generator.to_hash
|
|
295
300
|
end
|
|
296
301
|
result[:storage] = []
|
|
297
|
-
@storage.each do |
|
|
302
|
+
@storage.each do |storage|
|
|
298
303
|
result[:storage].push storage.to_hash
|
|
299
304
|
end
|
|
300
305
|
return result
|
|
@@ -33,9 +33,10 @@ require 'urbanopt/scenario/default_reports/program'
|
|
|
33
33
|
require 'urbanopt/scenario/default_reports/location'
|
|
34
34
|
require 'urbanopt/scenario/default_reports/reporting_period'
|
|
35
35
|
require 'urbanopt/scenario/default_reports/timeseries_csv'
|
|
36
|
-
require 'urbanopt/scenario/default_reports/validator'
|
|
37
36
|
require 'urbanopt/scenario/default_reports/distributed_generation'
|
|
37
|
+
require 'urbanopt/scenario/default_reports/power_distribution'
|
|
38
38
|
|
|
39
|
+
require 'urbanopt/scenario/default_reports/validator'
|
|
39
40
|
require 'json-schema'
|
|
40
41
|
|
|
41
42
|
require 'json'
|
|
@@ -52,7 +53,7 @@ module URBANopt
|
|
|
52
53
|
##
|
|
53
54
|
class FeatureReport
|
|
54
55
|
attr_accessor :id, :name, :directory_name, :feature_type, :timesteps_per_hour, :simulation_status,
|
|
55
|
-
:timeseries_csv, :location, :program, :design_parameters, :construction_costs, :reporting_periods, :distributed_generation # :nodoc:
|
|
56
|
+
:timeseries_csv, :location, :program, :design_parameters, :construction_costs, :reporting_periods, :distributed_generation, :power_distribution # :nodoc:
|
|
56
57
|
##
|
|
57
58
|
# Each FeatureReport object corresponds to a single Feature.
|
|
58
59
|
##
|
|
@@ -84,7 +85,9 @@ module URBANopt
|
|
|
84
85
|
@reporting_periods << ReportingPeriod.new(rp)
|
|
85
86
|
end
|
|
86
87
|
|
|
87
|
-
@distributed_generation = DistributedGeneration.new(hash[:distributed_generation]
|
|
88
|
+
@distributed_generation = DistributedGeneration.new(hash[:distributed_generation])
|
|
89
|
+
|
|
90
|
+
@power_distribution = PowerDistribution.new(hash[:power_distribution])
|
|
88
91
|
|
|
89
92
|
# initialize class variables @@validator and @@schema
|
|
90
93
|
@@validator ||= Validator.new
|
|
@@ -104,6 +107,8 @@ module URBANopt
|
|
|
104
107
|
hash[:program] = {}
|
|
105
108
|
hash[:construction_costs] = []
|
|
106
109
|
hash[:reporting_periods] = []
|
|
110
|
+
hash[:distributed_generation] = {}
|
|
111
|
+
hash[:power_distribution] = {}
|
|
107
112
|
return hash
|
|
108
113
|
end
|
|
109
114
|
|
|
@@ -203,6 +208,8 @@ module URBANopt
|
|
|
203
208
|
|
|
204
209
|
result[:distributed_generation] = @distributed_generation.to_hash if @distributed_generation
|
|
205
210
|
|
|
211
|
+
result[:power_distribution] = @power_distribution.to_hash if @power_distribution
|
|
212
|
+
|
|
206
213
|
# validate feature_report properties against schema
|
|
207
214
|
if @@validator.validate(@@schema[:definitions][:FeatureReport][:properties], result).any?
|
|
208
215
|
raise "feature_report properties does not match schema: #{@@validator.validate(@@schema[:definitions][:FeatureReport][:properties], result)}"
|
|
@@ -216,7 +223,7 @@ module URBANopt
|
|
|
216
223
|
##
|
|
217
224
|
# [parameters]:
|
|
218
225
|
# +file_name+ - _String_ - Assign a name to the saved feature report results file without an extension
|
|
219
|
-
def save_feature_report(file_name = '
|
|
226
|
+
def save_feature_report(file_name = 'default_feature_report')
|
|
220
227
|
# reassign the initialize local variable @file_name to the file name input.
|
|
221
228
|
@file_name = file_name
|
|
222
229
|
|
|
@@ -232,13 +239,13 @@ module URBANopt
|
|
|
232
239
|
@timeseries_csv.path = File.join(@directory_name, 'feature_reports', file_name + '.csv')
|
|
233
240
|
@timeseries_csv.save_data
|
|
234
241
|
|
|
235
|
-
|
|
236
|
-
|
|
242
|
+
# feature_hash
|
|
243
|
+
feature_hash = to_hash
|
|
237
244
|
|
|
238
245
|
json_name_path = File.join(@directory_name, 'feature_reports', file_name + '.json')
|
|
239
246
|
|
|
240
247
|
File.open(json_name_path, 'w') do |f|
|
|
241
|
-
f.puts JSON.pretty_generate(
|
|
248
|
+
f.puts JSON.pretty_generate(feature_hash)
|
|
242
249
|
# make sure data is written to the disk one way or the other
|
|
243
250
|
begin
|
|
244
251
|
f.fsync
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# *********************************************************************************
|
|
2
|
+
# URBANopt, 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
|
+
|
|
31
|
+
require 'json'
|
|
32
|
+
require 'urbanopt/scenario/default_reports/validator'
|
|
33
|
+
require 'json-schema'
|
|
34
|
+
|
|
35
|
+
module URBANopt
|
|
36
|
+
module Scenario
|
|
37
|
+
module DefaultReports
|
|
38
|
+
##
|
|
39
|
+
# power_distributio include eletrical power distribution systems information.
|
|
40
|
+
##
|
|
41
|
+
class PowerDistribution
|
|
42
|
+
attr_accessor :under_voltage_hours, :over_voltage_hours # :nodoc:
|
|
43
|
+
##
|
|
44
|
+
# PowerDistrinution class intialize all power_distribution attributes:
|
|
45
|
+
# +:under_voltage_hours+ , +:over_voltage_hours+
|
|
46
|
+
##
|
|
47
|
+
# [parameters:]
|
|
48
|
+
# +hash+ - _Hash_ - A hash which may contain a deserialized power_distribution.
|
|
49
|
+
##
|
|
50
|
+
def initialize(hash = {})
|
|
51
|
+
hash.delete_if { |k, v| v.nil? }
|
|
52
|
+
hash = defaults.merge(hash)
|
|
53
|
+
|
|
54
|
+
@under_voltage_hours = hash[:under_voltage_hours]
|
|
55
|
+
@over_voltage_hours = hash[:over_voltage_hours]
|
|
56
|
+
|
|
57
|
+
# initialize class variables @@validator and @@schema
|
|
58
|
+
@@validator ||= Validator.new
|
|
59
|
+
@@schema ||= @@validator.schema
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# Assigns default values if attribute values do not exist.
|
|
64
|
+
##
|
|
65
|
+
def defaults
|
|
66
|
+
hash = {}
|
|
67
|
+
hash[:under_voltage_hours] = nil
|
|
68
|
+
hash[:over_voltage_hours] = nil
|
|
69
|
+
|
|
70
|
+
return hash
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Converts to a Hash equivalent for JSON serialization.
|
|
75
|
+
##
|
|
76
|
+
# - Exclude attributes with nil values.
|
|
77
|
+
# - Validate power_distribution hash properties against schema.
|
|
78
|
+
##
|
|
79
|
+
def to_hash
|
|
80
|
+
result = {}
|
|
81
|
+
result[:under_voltage_hours] = @under_voltage_hours if @under_voltage_hours
|
|
82
|
+
result[:over_voltage_hours] = @over_voltage_hours if @over_voltage_hours
|
|
83
|
+
|
|
84
|
+
# validate power_distribution properties against schema
|
|
85
|
+
if @@validator.validate(@@schema[:definitions][:PowerDistribution][:properties], result).any?
|
|
86
|
+
raise "power_distribution properties does not match schema: #{@@validator.validate(@@schema[:definitions][:PowerDistribution][:properties], result)}"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
return result
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Merges muliple power distribution results together.
|
|
94
|
+
##
|
|
95
|
+
# +new_costs+ - _Array_ - An array of ConstructionCost objects.
|
|
96
|
+
def merge_power_distribition
|
|
97
|
+
# method to be developed for any attributes to be aggregated or merged
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -151,7 +151,7 @@ module URBANopt
|
|
|
151
151
|
# reassign the initialize local variable @file_name to the file name input.
|
|
152
152
|
@file_name = file_name
|
|
153
153
|
|
|
154
|
-
# save the csv data
|
|
154
|
+
# save the scenario reports csv and json data
|
|
155
155
|
old_timeseries_path = nil
|
|
156
156
|
if !@timeseries_csv.path.nil?
|
|
157
157
|
old_timeseries_path = @timeseries_csv.path
|
|
@@ -184,6 +184,12 @@ module URBANopt
|
|
|
184
184
|
else
|
|
185
185
|
@timeseries_csv.path = File.join(@directory_name, file_name + '.csv')
|
|
186
186
|
end
|
|
187
|
+
|
|
188
|
+
# save the feature reports csv and json data
|
|
189
|
+
# @feature_reports.each do |feature_report|
|
|
190
|
+
# feature_report.save_feature_report()
|
|
191
|
+
# end
|
|
192
|
+
|
|
187
193
|
return true
|
|
188
194
|
end
|
|
189
195
|
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
Datetime
|
|
2
2
|
Electricity:Facility
|
|
3
|
-
ElectricityProduced:Facility
|
|
3
|
+
ElectricityProduced:Facility
|
|
4
4
|
Gas:Facility
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
Cooling:Electricity
|
|
6
|
+
Heating:Electricity
|
|
7
|
+
InteriorLights:Electricity
|
|
8
|
+
ExteriorLights:Electricity
|
|
9
|
+
InteriorEquipment:Electricity
|
|
10
|
+
Fans:Electricity
|
|
11
|
+
Pumps:Electricity
|
|
12
|
+
WaterSystems:Electricity
|
|
13
|
+
Heating:Gas
|
|
14
|
+
WaterSystems:Gas
|
|
15
|
+
InteriorEquipment:Gas
|
|
16
|
+
DistrictCooling:Facility
|
|
17
|
+
DistrictHeating:Facility
|
|
18
|
+
District Cooling Chilled Water Rate
|
|
8
19
|
District Cooling Mass Flow Rate
|
|
9
|
-
District Cooling Inlet Temperature
|
|
10
|
-
District Cooling Outlet Temperature
|
|
20
|
+
District Cooling Inlet Temperature
|
|
21
|
+
District Cooling Outlet Temperature
|
|
11
22
|
District Heating Hot Water Rate
|
|
12
23
|
District Heating Mass Flow Rate
|
|
13
24
|
District Heating Inlet Temperature
|
|
@@ -213,6 +213,9 @@
|
|
|
213
213
|
},
|
|
214
214
|
"distributed_generation": {
|
|
215
215
|
"$ref": "#/definitions/DistributedGeneration"
|
|
216
|
+
},
|
|
217
|
+
"power_distribution": {
|
|
218
|
+
"$ref": "#/definitions/PowerDistribution"
|
|
216
219
|
}
|
|
217
220
|
},
|
|
218
221
|
"required": [
|
|
@@ -834,6 +837,17 @@
|
|
|
834
837
|
"column_names"
|
|
835
838
|
],
|
|
836
839
|
"additionalProperties": false
|
|
840
|
+
},
|
|
841
|
+
"PowerDistribution": {
|
|
842
|
+
"type": "object",
|
|
843
|
+
"properties": {
|
|
844
|
+
"over_voltage_hours": {
|
|
845
|
+
"type": "number"
|
|
846
|
+
},
|
|
847
|
+
"under_voltage_hours": {
|
|
848
|
+
"type": "number"
|
|
849
|
+
}
|
|
850
|
+
}
|
|
837
851
|
}
|
|
838
852
|
}
|
|
839
853
|
}
|
|
@@ -87,7 +87,8 @@ module URBANopt
|
|
|
87
87
|
File.readlines(scenario_csv_schema).each do |line|
|
|
88
88
|
l = line.delete("\n")
|
|
89
89
|
a = l.delete("\t")
|
|
90
|
-
|
|
90
|
+
r = a.delete("\r")
|
|
91
|
+
scenario_csv_schema_headers << r
|
|
91
92
|
end
|
|
92
93
|
return scenario_csv_schema_headers
|
|
93
94
|
end
|
|
@@ -152,7 +153,11 @@ module URBANopt
|
|
|
152
153
|
end
|
|
153
154
|
else
|
|
154
155
|
row.each_with_index do |value, i|
|
|
155
|
-
|
|
156
|
+
if i == 0
|
|
157
|
+
@data[@column_names[i]] << value
|
|
158
|
+
else
|
|
159
|
+
@data[@column_names[i]] << value.to_f
|
|
160
|
+
end
|
|
156
161
|
end
|
|
157
162
|
end
|
|
158
163
|
end
|
|
@@ -204,6 +209,7 @@ module URBANopt
|
|
|
204
209
|
if path.nil?
|
|
205
210
|
path = @path
|
|
206
211
|
end
|
|
212
|
+
|
|
207
213
|
File.open(path, 'w') do |f|
|
|
208
214
|
f.puts @column_names.join(',')
|
|
209
215
|
n = @data[@column_names[0]].size - 1
|
|
@@ -246,35 +252,44 @@ module URBANopt
|
|
|
246
252
|
end
|
|
247
253
|
|
|
248
254
|
# merge the column names
|
|
249
|
-
|
|
255
|
+
other_column_names = []
|
|
256
|
+
other.column_names.each do |n|
|
|
257
|
+
if !n[0, 4].casecmp('ZONE').zero?
|
|
258
|
+
other_column_names << n
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
@column_names = @column_names.concat(other_column_names).uniq
|
|
250
263
|
|
|
251
264
|
# merge the column data
|
|
252
265
|
other.column_names.each do |column_name|
|
|
253
|
-
if
|
|
254
|
-
|
|
255
|
-
|
|
266
|
+
if !column_name[0, 4].casecmp('ZONE').zero?
|
|
267
|
+
if !@column_names.include? column_name
|
|
268
|
+
@column_names.push column_name
|
|
269
|
+
end
|
|
256
270
|
|
|
257
|
-
|
|
271
|
+
new_values = other.get_data(column_name)
|
|
258
272
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
273
|
+
if @data.nil?
|
|
274
|
+
@data = {}
|
|
275
|
+
end
|
|
262
276
|
|
|
263
|
-
|
|
277
|
+
current_values = @data[column_name]
|
|
264
278
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
279
|
+
if current_values
|
|
280
|
+
if current_values.size != new_values.size
|
|
281
|
+
raise 'Values of different sizes in add_timeseries_csv'
|
|
282
|
+
end
|
|
283
|
+
new_values.each_with_index do |value, i|
|
|
284
|
+
# aggregate all columns except Datime column
|
|
285
|
+
if column_name != 'Datetime'
|
|
286
|
+
new_values[i] = value.to_f + current_values[i].to_f
|
|
287
|
+
end
|
|
273
288
|
end
|
|
289
|
+
@data[column_name] = new_values
|
|
290
|
+
else
|
|
291
|
+
@data[column_name] = new_values
|
|
274
292
|
end
|
|
275
|
-
@data[column_name] = new_values
|
|
276
|
-
else
|
|
277
|
-
@data[column_name] = new_values
|
|
278
293
|
end
|
|
279
294
|
end
|
|
280
295
|
end
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# *********************************************************************************
|
|
2
|
+
# URBANopt, 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
|
+
|
|
31
|
+
# require 'urbanopt/scenario/scenario_post_processor_base'
|
|
32
|
+
require 'urbanopt/scenario/default_reports'
|
|
33
|
+
require 'urbanopt/scenario/default_reports/logger'
|
|
34
|
+
|
|
35
|
+
require 'csv'
|
|
36
|
+
require 'json'
|
|
37
|
+
require 'fileutils'
|
|
38
|
+
require 'pathname'
|
|
39
|
+
|
|
40
|
+
module URBANopt
|
|
41
|
+
module Scenario
|
|
42
|
+
class OpenDSSPostProcessor
|
|
43
|
+
##
|
|
44
|
+
# OpenDSSPostProcessor post-processes OpenDSS results to selected OpenDSS results and integrate them in scenario and feature reports.
|
|
45
|
+
##
|
|
46
|
+
# [parameters:]
|
|
47
|
+
# +scenario_report+ - _ScenarioBase_ - An object of Scenario_report class.
|
|
48
|
+
# +opendss_results_dir_name+ - _directory name of opendss results
|
|
49
|
+
def initialize(scenario_report, opendss_results_dir_name = 'opendss')
|
|
50
|
+
if !scenario_report.nil?
|
|
51
|
+
@scenario_report = scenario_report
|
|
52
|
+
@opendss_results_dir = File.join(@scenario_report.directory_name, opendss_results_dir_name)
|
|
53
|
+
else
|
|
54
|
+
raise 'scenario_report is not valid'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# hash of column_name to array of values, does not get serialized to hash
|
|
58
|
+
@mutex = Mutex.new
|
|
59
|
+
|
|
60
|
+
# initialize opendss data
|
|
61
|
+
@opendss_data = {}
|
|
62
|
+
|
|
63
|
+
# initialize feature_reports data
|
|
64
|
+
@feature_reports_data = {}
|
|
65
|
+
|
|
66
|
+
# initialize logger
|
|
67
|
+
@@logger ||= URBANopt::Scenario::DefaultReports.logger
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# load opendss data
|
|
71
|
+
def load_opendss_data
|
|
72
|
+
# load building features data
|
|
73
|
+
@scenario_report.feature_reports.each do |feature_report|
|
|
74
|
+
# read results from opendss
|
|
75
|
+
opendss_csv = CSV.read(File.join(@opendss_results_dir, 'results', 'Features', feature_report.id + '.csv'))
|
|
76
|
+
# add results to data
|
|
77
|
+
@opendss_data[feature_report.id] = opendss_csv
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
## load transformers data
|
|
81
|
+
|
|
82
|
+
# transformers results directory path
|
|
83
|
+
tf_results_path = File.join(@opendss_results_dir, 'results', 'Transformers')
|
|
84
|
+
|
|
85
|
+
# get transformer ids
|
|
86
|
+
transformer_ids = []
|
|
87
|
+
Dir.entries(tf_results_path.to_s).select do |f|
|
|
88
|
+
if !File.directory? f
|
|
89
|
+
fn = File.basename(f, '.csv')
|
|
90
|
+
transformer_ids << fn
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# add transformer results to @opendss_data
|
|
95
|
+
transformer_ids.each do |id|
|
|
96
|
+
# read results from transformers
|
|
97
|
+
transformer_csv = CSV.read(File.join(tf_results_path, id + '.csv'))
|
|
98
|
+
# add results to data
|
|
99
|
+
@opendss_data[id] = transformer_csv
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# load feature report data
|
|
104
|
+
def load_feature_report_data
|
|
105
|
+
@scenario_report.feature_reports.each do |feature_report|
|
|
106
|
+
# read feature results
|
|
107
|
+
feature_csv = CSV.read(File.join(feature_report.timeseries_csv.path))
|
|
108
|
+
# add results to data
|
|
109
|
+
@feature_reports_data[feature_report.id] = feature_csv
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# load feature report data and opendss data
|
|
114
|
+
def load_data
|
|
115
|
+
# load selected opendss data
|
|
116
|
+
load_opendss_data
|
|
117
|
+
# load selected feature reports data
|
|
118
|
+
load_feature_report_data
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# merge data
|
|
122
|
+
def merge_data(feature_report_data, opendss_data)
|
|
123
|
+
output = CSV.generate do |csv|
|
|
124
|
+
opendss_data.each_with_index do |row, i|
|
|
125
|
+
if row.include? 'Datetime'
|
|
126
|
+
row.map { |header| header.prepend('opendss_') }
|
|
127
|
+
end
|
|
128
|
+
csv << (feature_report_data[i] + row[1..-1])
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
return output
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# add feature reports for transformers
|
|
136
|
+
def save_transformers_reports
|
|
137
|
+
@opendss_data.keys.each do |k|
|
|
138
|
+
if k.include? 'Transformer'
|
|
139
|
+
|
|
140
|
+
# create transformer directory
|
|
141
|
+
transformer_dir = File.join(@scenario_report.directory_name, k)
|
|
142
|
+
FileUtils.mkdir_p(File.join(transformer_dir, 'feature_reports'))
|
|
143
|
+
|
|
144
|
+
# write data to csv
|
|
145
|
+
# store under voltages and over voltages
|
|
146
|
+
under_voltage_hrs = 0
|
|
147
|
+
over_voltage_hrs = 0
|
|
148
|
+
|
|
149
|
+
transformer_csv = CSV.generate do |csv|
|
|
150
|
+
@opendss_data[k].each_with_index do |row, i|
|
|
151
|
+
csv << row
|
|
152
|
+
|
|
153
|
+
if !row[1].include? 'loading'
|
|
154
|
+
if row[1].to_f > 1.05
|
|
155
|
+
over_voltage_hrs += 1
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
if row[1].to_f < 0.95
|
|
159
|
+
under_voltage_hrs += 1
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# save transformer CSV report
|
|
166
|
+
File.write(File.join(transformer_dir, 'feature_reports', 'default_feature_report_opendss' + '.csv'), transformer_csv)
|
|
167
|
+
|
|
168
|
+
# create transformer report
|
|
169
|
+
transformer_report = URBANopt::Scenario::DefaultReports::FeatureReport.new(id: k, name: k, directory_name: transformer_dir, feature_type: 'Transformer',
|
|
170
|
+
timesteps_per_hour: @scenario_report.timesteps_per_hour,
|
|
171
|
+
simulation_status: 'complete')
|
|
172
|
+
|
|
173
|
+
# assign results to transfomrer report
|
|
174
|
+
transformer_report.power_distribution.over_voltage_hours = over_voltage_hrs
|
|
175
|
+
transformer_report.power_distribution.under_voltage_hours = under_voltage_hrs
|
|
176
|
+
|
|
177
|
+
## save transformer JSON file
|
|
178
|
+
# transformer_hash
|
|
179
|
+
transformer_hash = transformer_report.to_hash
|
|
180
|
+
# transformer_hash.delete_if { |k, v| v.nil? }
|
|
181
|
+
|
|
182
|
+
json_name_path = File.join(transformer_dir, 'feature_reports', 'default_feature_report_opendss' + '.json')
|
|
183
|
+
|
|
184
|
+
# save the json file
|
|
185
|
+
File.open(json_name_path, 'w') do |f|
|
|
186
|
+
f.puts JSON.pretty_generate(transformer_hash)
|
|
187
|
+
# make sure data is written to the disk one way or the other
|
|
188
|
+
begin
|
|
189
|
+
f.fsync
|
|
190
|
+
rescue StandardError
|
|
191
|
+
f.flush
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# add transformers reports to scenario_report
|
|
196
|
+
@scenario_report.feature_reports << transformer_report
|
|
197
|
+
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
##
|
|
203
|
+
# Save csv report method
|
|
204
|
+
##
|
|
205
|
+
# [parameters:]
|
|
206
|
+
# +feature_report+ - _feature report object_ - An onject of the feature report
|
|
207
|
+
# +updated_feature_report_csv+ - _CSV_ - An updated feature report csv
|
|
208
|
+
# +file_name+ - _String_ - Assigned name to save the file with no extension
|
|
209
|
+
def save_csv(feature_report, updated_feature_report_csv, file_name = 'default_feature_report')
|
|
210
|
+
File.write(File.join(feature_report.directory_name, 'feature_reports', "#{file_name}.csv"), updated_feature_report_csv)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
##
|
|
214
|
+
# create opendss json report results
|
|
215
|
+
##
|
|
216
|
+
# [parameters:]
|
|
217
|
+
# +feature_report+ - _feature report object_ - An onject of the feature report
|
|
218
|
+
def add_summary_results(feature_report)
|
|
219
|
+
under_voltage_hrs = 0
|
|
220
|
+
over_voltage_hrs = 0
|
|
221
|
+
|
|
222
|
+
id = feature_report.id
|
|
223
|
+
@opendss_data[id].each_with_index do |row, i|
|
|
224
|
+
if !row[1].include? 'voltage'
|
|
225
|
+
|
|
226
|
+
if row[1].to_f > 1.05
|
|
227
|
+
over_voltage_hrs += 1
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
if row[1].to_f < 0.95
|
|
231
|
+
under_voltage_hrs += 1
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# assign results to feature report
|
|
238
|
+
feature_report.power_distribution.over_voltage_hours = over_voltage_hrs
|
|
239
|
+
feature_report.power_distribution.under_voltage_hours = under_voltage_hrs
|
|
240
|
+
|
|
241
|
+
return feature_report
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
##
|
|
245
|
+
# run opendss post_processor
|
|
246
|
+
##
|
|
247
|
+
def run
|
|
248
|
+
@scenario_report.feature_reports.each do |feature_report|
|
|
249
|
+
# load data
|
|
250
|
+
load_data
|
|
251
|
+
|
|
252
|
+
# puts " @opendss data = #{@opendss_data}"
|
|
253
|
+
|
|
254
|
+
# get summary results
|
|
255
|
+
add_summary_results(feature_report)
|
|
256
|
+
|
|
257
|
+
# merge csv data
|
|
258
|
+
id = feature_report.id
|
|
259
|
+
updated_feature_csv = merge_data(@feature_reports_data[id], @opendss_data[id])
|
|
260
|
+
|
|
261
|
+
# save fetaure reports
|
|
262
|
+
feature_report.save_feature_report('default_feature_report_opendss')
|
|
263
|
+
|
|
264
|
+
# resave updated csv report
|
|
265
|
+
save_csv(feature_report, updated_feature_csv, 'default_feature_report_opendss')
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# add transformer reports
|
|
269
|
+
save_transformers_reports
|
|
270
|
+
|
|
271
|
+
# save the updated scenario reports
|
|
272
|
+
@scenario_report.save(file_name = 'scenario_report_opendss')
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
@@ -24,17 +24,17 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
spec.required_ruby_version = '~> 2.2.4'
|
|
25
25
|
|
|
26
26
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
|
27
|
-
spec.add_development_dependency 'rake', '12.3.1'
|
|
28
|
-
spec.add_development_dependency 'rspec', '3.7.0'
|
|
29
27
|
spec.add_development_dependency 'github_api', '~> 0.18.0'
|
|
30
|
-
|
|
31
|
-
spec.add_development_dependency '
|
|
28
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.7'
|
|
32
30
|
|
|
33
31
|
spec.add_dependency 'json-schema'
|
|
34
32
|
spec.add_dependency 'json_pure'
|
|
35
33
|
spec.add_dependency 'openstudio-model-articulation', '~> 0.1.1'
|
|
36
|
-
spec.add_dependency 'urbanopt-core', '~> 0.
|
|
34
|
+
spec.add_dependency 'urbanopt-core', '~> 0.2.0'
|
|
37
35
|
|
|
38
36
|
# lock the version of these dependencies due to using older version of Ruby.
|
|
39
37
|
spec.add_dependency 'public_suffix', '3.1.1'
|
|
38
|
+
spec.add_development_dependency 'rack', '2.1.2'
|
|
39
|
+
|
|
40
40
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: urbanopt-scenario
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.0
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rawad El Kontar
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2020-03-
|
|
12
|
+
date: 2020-03-30 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -26,61 +26,47 @@ dependencies:
|
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
27
|
version: '1.14'
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
|
-
name:
|
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
|
31
|
-
requirements:
|
|
32
|
-
- - '='
|
|
33
|
-
- !ruby/object:Gem::Version
|
|
34
|
-
version: 12.3.1
|
|
35
|
-
type: :development
|
|
36
|
-
prerelease: false
|
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
-
requirements:
|
|
39
|
-
- - '='
|
|
40
|
-
- !ruby/object:Gem::Version
|
|
41
|
-
version: 12.3.1
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: rspec
|
|
29
|
+
name: github_api
|
|
44
30
|
requirement: !ruby/object:Gem::Requirement
|
|
45
31
|
requirements:
|
|
46
|
-
- -
|
|
32
|
+
- - "~>"
|
|
47
33
|
- !ruby/object:Gem::Version
|
|
48
|
-
version:
|
|
34
|
+
version: 0.18.0
|
|
49
35
|
type: :development
|
|
50
36
|
prerelease: false
|
|
51
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
52
38
|
requirements:
|
|
53
|
-
- -
|
|
39
|
+
- - "~>"
|
|
54
40
|
- !ruby/object:Gem::Version
|
|
55
|
-
version:
|
|
41
|
+
version: 0.18.0
|
|
56
42
|
- !ruby/object:Gem::Dependency
|
|
57
|
-
name:
|
|
43
|
+
name: rake
|
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
|
59
45
|
requirements:
|
|
60
46
|
- - "~>"
|
|
61
47
|
- !ruby/object:Gem::Version
|
|
62
|
-
version:
|
|
48
|
+
version: '12.3'
|
|
63
49
|
type: :development
|
|
64
50
|
prerelease: false
|
|
65
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
52
|
requirements:
|
|
67
53
|
- - "~>"
|
|
68
54
|
- !ruby/object:Gem::Version
|
|
69
|
-
version:
|
|
55
|
+
version: '12.3'
|
|
70
56
|
- !ruby/object:Gem::Dependency
|
|
71
|
-
name:
|
|
57
|
+
name: rspec
|
|
72
58
|
requirement: !ruby/object:Gem::Requirement
|
|
73
59
|
requirements:
|
|
74
|
-
- -
|
|
60
|
+
- - "~>"
|
|
75
61
|
- !ruby/object:Gem::Version
|
|
76
|
-
version:
|
|
62
|
+
version: '3.7'
|
|
77
63
|
type: :development
|
|
78
64
|
prerelease: false
|
|
79
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
66
|
requirements:
|
|
81
|
-
- -
|
|
67
|
+
- - "~>"
|
|
82
68
|
- !ruby/object:Gem::Version
|
|
83
|
-
version:
|
|
69
|
+
version: '3.7'
|
|
84
70
|
- !ruby/object:Gem::Dependency
|
|
85
71
|
name: json-schema
|
|
86
72
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -129,14 +115,14 @@ dependencies:
|
|
|
129
115
|
requirements:
|
|
130
116
|
- - "~>"
|
|
131
117
|
- !ruby/object:Gem::Version
|
|
132
|
-
version: 0.
|
|
118
|
+
version: 0.2.0
|
|
133
119
|
type: :runtime
|
|
134
120
|
prerelease: false
|
|
135
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
136
122
|
requirements:
|
|
137
123
|
- - "~>"
|
|
138
124
|
- !ruby/object:Gem::Version
|
|
139
|
-
version: 0.
|
|
125
|
+
version: 0.2.0
|
|
140
126
|
- !ruby/object:Gem::Dependency
|
|
141
127
|
name: public_suffix
|
|
142
128
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -151,6 +137,20 @@ dependencies:
|
|
|
151
137
|
- - '='
|
|
152
138
|
- !ruby/object:Gem::Version
|
|
153
139
|
version: 3.1.1
|
|
140
|
+
- !ruby/object:Gem::Dependency
|
|
141
|
+
name: rack
|
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - '='
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: 2.1.2
|
|
147
|
+
type: :development
|
|
148
|
+
prerelease: false
|
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
150
|
+
requirements:
|
|
151
|
+
- - '='
|
|
152
|
+
- !ruby/object:Gem::Version
|
|
153
|
+
version: 2.1.2
|
|
154
154
|
description: Library to export data point OSW files from URBANopt Scenario CSV
|
|
155
155
|
email:
|
|
156
156
|
- rawad.elkontar@nrel.gov
|
|
@@ -214,6 +214,7 @@ files:
|
|
|
214
214
|
- lib/urbanopt/scenario/default_reports/generator.rb
|
|
215
215
|
- lib/urbanopt/scenario/default_reports/location.rb
|
|
216
216
|
- lib/urbanopt/scenario/default_reports/logger.rb
|
|
217
|
+
- lib/urbanopt/scenario/default_reports/power_distribution.rb
|
|
217
218
|
- lib/urbanopt/scenario/default_reports/program.rb
|
|
218
219
|
- lib/urbanopt/scenario/default_reports/reporting_period.rb
|
|
219
220
|
- lib/urbanopt/scenario/default_reports/scenario_report.rb
|
|
@@ -232,6 +233,7 @@ files:
|
|
|
232
233
|
- lib/urbanopt/scenario/scenario_datapoint_base.rb
|
|
233
234
|
- lib/urbanopt/scenario/scenario_post_processor_base.rb
|
|
234
235
|
- lib/urbanopt/scenario/scenario_post_processor_default.rb
|
|
236
|
+
- lib/urbanopt/scenario/scenario_post_processor_opendss.rb
|
|
235
237
|
- lib/urbanopt/scenario/scenario_runner_base.rb
|
|
236
238
|
- lib/urbanopt/scenario/scenario_runner_osw.rb
|
|
237
239
|
- lib/urbanopt/scenario/simulation_dir_base.rb
|
|
@@ -253,9 +255,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
253
255
|
version: 2.2.4
|
|
254
256
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
257
|
requirements:
|
|
256
|
-
- - "
|
|
258
|
+
- - ">="
|
|
257
259
|
- !ruby/object:Gem::Version
|
|
258
|
-
version:
|
|
260
|
+
version: '0'
|
|
259
261
|
requirements: []
|
|
260
262
|
rubyforge_project:
|
|
261
263
|
rubygems_version: 2.4.5.1
|