urbanopt-reopt 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a833a15c613e58704915acea2d8a31cfd2ded2f9
4
- data.tar.gz: 4aa9285353fb46787c73b12d7d6b4e47da0e4098
3
+ metadata.gz: 8000b40da80c144605734ce4d7284a86a2231e87
4
+ data.tar.gz: ae21be460c29a1d9027083d6d72c51abc8dd1a9b
5
5
  SHA512:
6
- metadata.gz: 364198ba99ef78bc954f94519717abb17d7e24a9d1c46c08eee4b05c4881f6b510d1557e451f64ee8e42cf00c30c4892ddf018d1b5040d88f68c31456060fb46
7
- data.tar.gz: 5040b4fdbee705eabd026c0139d76857b53fcd325aa6e0730f58eba29b5107c86d0bb8eb77c3fb064dc2173b60ed8077cb578e270305ef36ebdf09560aa1212a
6
+ metadata.gz: 4a64e8393504d9262f56ff09787ed7ba12d8830b891615e1d0bbce38aa984cddd4eb698544f259b028a33f14357b35955b2cd4dbc71e0aa4219f84059109016d
7
+ data.tar.gz: 69000034ce08db6386777d2dd351a0b607154e2e43c411d35f4bc2486dd126c73ef9e00b279df63270f968f9978acb59fc3430c9cebbdd4b22d0579eb84e7373
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # URBANopt REopt Gem
2
2
 
3
+ ## Version 0.2.1
4
+ * Corrects code checking PV size that fails on multi PV
5
+ * Corrects parsing of site energy at timesteps other than 1 per hour
6
+
7
+
3
8
  ## Version 0.2.0
4
9
 
5
10
  * Handles multiple PV systems in the REopt Lite assumptions
@@ -104,17 +104,17 @@ module URBANopt # :nodoc:
104
104
  begin
105
105
  col_num = feature_report.timeseries_csv.column_names.index('Electricity:Facility(kWh)')
106
106
  t = CSV.read(feature_report.timeseries_csv.path, headers: true, converters: :numeric)
107
- energy_timeseries_kwh = t.by_col[col_num].map { |e| ((e || 0) ) }
108
- if energy_timeseries_kwh.length < (feature_report.timesteps_per_hour * 8760)
107
+ energy_timeseries_kw = t.by_col[col_num].map { |e| ((e * feature_report.timesteps_per_hour || 0) ) }
108
+ if energy_timeseries_kw.length < (feature_report.timesteps_per_hour * 8760)
109
109
  start_date = Time.parse(t.by_col["Datetime"][0])
110
110
  start_ts = (((start_date.yday * 60.0 * 60.0 * 24) + (start_date.hour * 60.0 * 60.0) + (start_date.min * 60.0) + start_date.sec) /
111
111
  (( 60 / feature_report.timesteps_per_hour ) * 60)).to_int
112
112
  end_date = Time.parse(t.by_col["Datetime"][-1])
113
113
  end_ts = (((end_date.yday * 60.0 * 60.0 * 24) + (end_date.hour * 60.0 * 60.0) + (end_date.min * 60.0) + end_date.sec) /
114
114
  (( 60 / feature_report.timesteps_per_hour ) * 60)).to_int
115
- energy_timeseries_kwh = [0.0]*(start_ts-1) + energy_timeseries_kwh + [0.0]*((feature_report.timesteps_per_hour * 8760) - end_ts)
115
+ energy_timeseries_kw = [0.0]*(start_ts-1) + energy_timeseries_kw + [0.0]*((feature_report.timesteps_per_hour * 8760) - end_ts)
116
116
  end
117
- reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = energy_timeseries_kwh.map { |e| e ? e : 0 }[0,(feature_report.timesteps_per_hour * 8760)]
117
+ reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = energy_timeseries_kw.map { |e| e ? e : 0 }[0,(feature_report.timesteps_per_hour * 8760)]
118
118
  rescue StandardError
119
119
  @@logger.error("Could not parse the annual electric load from the timeseries csv - #{feature_report.timeseries_csv.path}")
120
120
  raise "Could not parse the annual electric load from the timeseries csv - #{feature_report.timeseries_csv.path}"
@@ -200,7 +200,7 @@ module URBANopt # :nodoc:
200
200
  feature_report.distributed_generation.add_tech 'storage', URBANopt::Scenario::DefaultReports::Storage.new( {size_kwh: (storage['size_kwh'] || 0), size_kw: (storage['size_kw'] || 0) })
201
201
  end
202
202
 
203
- generation_timeseries_kwh = Matrix[[0] * 8760]
203
+ generation_timeseries_kwh = Matrix[[0] * (8760 * feature_report.timesteps_per_hour)]
204
204
 
205
205
  unless reopt_output['outputs']['Scenario']['Site']['PV'].nil?
206
206
  reopt_output['outputs']['Scenario']['Site']['PV'].each do |pv|
@@ -236,7 +236,7 @@ module URBANopt # :nodoc:
236
236
  end
237
237
  end
238
238
 
239
- $generation_timeseries_kwh = generation_timeseries_kwh.to_a[0] || [0] * 8760
239
+ $generation_timeseries_kwh = generation_timeseries_kwh.to_a[0] || [0] * (8760 * feature_report.timesteps_per_hour)
240
240
  $generation_timeseries_kwh_col = feature_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Total(kw)')
241
241
  if $generation_timeseries_kwh_col.nil?
242
242
  $generation_timeseries_kwh_col = feature_report.timeseries_csv.column_names.length
@@ -196,7 +196,15 @@ module URBANopt # :nodoc:
196
196
  while status == 'Optimizing...'
197
197
  response = make_request(http, request)
198
198
  data = JSON.parse(response.body)
199
- sizes = (data['outputs']['Scenario']['Site']['PV']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Storage']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0)
199
+ if data['outputs']['Scenario']['Site']['PV'].kind_of?(Array)
200
+ pv_sizes = 0
201
+ data['outputs']['Scenario']['Site']['PV'].each do |x|
202
+ pv_sizes = pv_sizes + x['size_kw'].to_f
203
+ end
204
+ else
205
+ pv_sizes = data['outputs']['Scenario']['Site']['PV']['size_kw'] || 0
206
+ end
207
+ sizes = pv_sizes + (data['outputs']['Scenario']['Site']['Storage']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0)
200
208
  status = data['outputs']['Scenario']['status']
201
209
 
202
210
  sleep 5
@@ -209,7 +217,15 @@ module URBANopt # :nodoc:
209
217
  sleep 1
210
218
  response = make_request(http, request)
211
219
  data = JSON.parse(response.body)
212
- sizes = (data['outputs']['Scenario']['Site']['PV']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Storage']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0)
220
+ if data['outputs']['Scenario']['Site']['PV'].kind_of?(Array)
221
+ pv_sizes = 0
222
+ data['outputs']['Scenario']['Site']['PV'].each do |x|
223
+ pv_sizes = pv_sizes + x['size_kw'].to_f
224
+ end
225
+ else
226
+ pv_sizes = data['outputs']['Scenario']['Site']['PV']['size_kw'] || 0
227
+ end
228
+ sizes = pv_sizes + (data['outputs']['Scenario']['Site']['Storage']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) + (data['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0)
213
229
  (check_complete = sizes == 0) && ((data['outputs']['Scenario']['Site']['Financial']['npv_us_dollars'] || 0) > 0)
214
230
  _tries += 1
215
231
  end
@@ -223,7 +223,7 @@ module URBANopt # :nodoc:
223
223
  else
224
224
  warn "Could not save feature reports - the number of save names provided did not match the number of feature reports"
225
225
  end
226
- end
226
+ end
227
227
  rescue StandardError
228
228
  @@logger.info("Could not optimize Feature Report #{feature_report.name} #{feature_report.id}")
229
229
  end
@@ -115,21 +115,25 @@ module URBANopt # :nodoc:
115
115
  reopt_inputs[:Scenario][:Site][:land_acres] = scenario_report.program.site_area * 1.0 / 43560 # acres/sqft
116
116
  end
117
117
 
118
+ unless scenario_report.timesteps_per_hour.nil?
119
+ reopt_inputs[:Scenario][:time_steps_per_hour] = scenario_report.timesteps_per_hour
120
+ end
121
+
118
122
  # Update load profile info
119
123
  begin
120
124
  col_num = scenario_report.timeseries_csv.column_names.index('Electricity:Facility(kWh)')
121
125
  t = CSV.read(scenario_report.timeseries_csv.path, headers: true, converters: :numeric)
122
- energy_timeseries_kwh = t.by_col[col_num].map { |e| ((e || 0) ) }
123
- if energy_timeseries_kwh.length < (scenario_report.timesteps_per_hour * 8760)
126
+ energy_timeseries_kw = t.by_col[col_num].map { |e| ((e * scenario_report.timesteps_per_hour || 0) ) }
127
+ if energy_timeseries_kw.length < (scenario_report.timesteps_per_hour * 8760)
124
128
  start_date = Time.parse(t.by_col["Datetime"][0])
125
129
  start_ts = (((start_date.yday * 60.0 * 60.0 * 24) + (start_date.hour * 60.0 * 60.0) + (start_date.min * 60.0) + start_date.sec) /
126
130
  (( 60 / scenario_report.timesteps_per_hour ) * 60)).to_int
127
131
  end_date = Time.parse(t.by_col["Datetime"][-1])
128
132
  end_ts = (((end_date.yday * 60.0 * 60.0 * 24) + (end_date.hour * 60.0 * 60.0) + (end_date.min * 60.0) + end_date.sec) /
129
133
  (( 60 / scenario_report.timesteps_per_hour ) * 60)).to_int
130
- energy_timeseries_kwh = [0.0]*(start_ts-1) + energy_timeseries_kwh + [0.0]*((scenario_report.timesteps_per_hour * 8760) - end_ts)
134
+ energy_timeseries_kw = [0.0]*(start_ts-1) + energy_timeseries_kw + [0.0]*((scenario_report.timesteps_per_hour * 8760) - end_ts)
131
135
  end
132
- reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = energy_timeseries_kwh.map { |e| e ? e : 0 }[0,(scenario_report.timesteps_per_hour * 8760)]
136
+ reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = energy_timeseries_kw.map { |e| e ? e : 0 }[0,(scenario_report.timesteps_per_hour * 8760)]
133
137
  rescue StandardError
134
138
  @@logger.error("Could not parse the annual electric load from the timeseries csv - #{scenario_report.timeseries_csv.path}")
135
139
  raise "Could not parse the annual electric load from the timeseries csv - #{scenario_report.timeseries_csv.path}"
@@ -237,7 +241,7 @@ module URBANopt # :nodoc:
237
241
  scenario_report.distributed_generation.add_tech 'storage', URBANopt::Scenario::DefaultReports::Storage.new( {size_kwh: (storage['size_kwh'] || 0), size_kw: (storage['size_kw'] || 0) })
238
242
  end
239
243
 
240
- generation_timeseries_kwh = Matrix[[0] * 8760]
244
+ generation_timeseries_kwh = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
241
245
 
242
246
 
243
247
  reopt_output['outputs']['Scenario']['Site']['PV'].each do |pv|
@@ -272,7 +276,7 @@ module URBANopt # :nodoc:
272
276
  end
273
277
  end
274
278
 
275
- $generation_timeseries_kwh = generation_timeseries_kwh.to_a[0]
279
+ $generation_timeseries_kwh = generation_timeseries_kwh.to_a[0] || [0] * (8760 * scenario_report.timesteps_per_hour)
276
280
  $generation_timeseries_kwh_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Total(kw)')
277
281
  if $generation_timeseries_kwh_col.nil?
278
282
  $generation_timeseries_kwh_col = scenario_report.timeseries_csv.column_names.length
@@ -30,6 +30,6 @@
30
30
 
31
31
  module URBANopt # :nodoc:
32
32
  module REopt # :nodoc:
33
- VERSION = '0.2.0'.freeze
33
+ VERSION = '0.2.1'.freeze
34
34
  end
35
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urbanopt-reopt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-31 00:00:00.000000000 Z
11
+ date: 2020-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler