Skip to content

Commit 8e47f28

Browse files
authored
Merge pull request #1555 from NREL/fix-bills-scheduled-battery2
ReportUtilityBills: fix calculation of production credits
2 parents 5b61ad2 + 2a88d87 commit 8e47f28

16 files changed

+1929
-54
lines changed

Changelog.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ __New Features__
1111
__Bugfixes__
1212
- Prevents possible error when using multiple `Attic`/`Foundation` elements for the same attic/foundation type.
1313
- Adds error-checking for `NumberofConditionedFloorsAboveGrade`=0, which is not allowed per the documentation.
14+
- ReportUtilityBills measure: Fixes handling of battery storage and generator production.
1415

1516
## OpenStudio-HPXML v1.8.1
1617

HPXMLtoOpenStudio/measure.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>hpxm_lto_openstudio</name>
55
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
6-
<version_id>25e34fab-7635-4389-9100-1ab76dc7ad1d</version_id>
7-
<version_modified>2024-06-20T23:44:37Z</version_modified>
6+
<version_id>f7324c6c-96bb-456b-a571-6a0b94f8b09f</version_id>
7+
<version_modified>2024-06-24T16:04:38Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -447,7 +447,7 @@
447447
<filename>schedule_files/battery.csv</filename>
448448
<filetype>csv</filetype>
449449
<usage_type>resource</usage_type>
450-
<checksum>C1350909</checksum>
450+
<checksum>971B85EE</checksum>
451451
</file>
452452
<file>
453453
<filename>schedule_files/hvac-variable-system-maximum-power-ratios-varied.csv</filename>

HPXMLtoOpenStudio/resources/schedule_files/battery.csv

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ battery
66
0
77
0
88
0
9-
0
10-
0
11-
0
129
1
1310
1
1411
0.5
@@ -8759,3 +8756,6 @@ battery
87598756
0
87608757
0
87618758
0
8759+
0
8760+
0
8761+
0

ReportUtilityBills/measure.rb

+20-11
Original file line numberDiff line numberDiff line change
@@ -202,18 +202,22 @@ def energyPlusOutputRequests(runner, user_arguments)
202202
has_fuel = hpxml.has_fuels(Constants.FossilFuels, hpxml.to_doc)
203203
has_fuel[HPXML::FuelTypeElectricity] = true
204204

205-
# Fuel outputs
205+
# Has production
206206
has_pv = @hpxml_buildings.select { |hpxml_bldg| !hpxml_bldg.pv_systems.empty? }.size > 0
207+
has_battery = @model.getElectricLoadCenterStorageLiIonNMCBatterys.size > 0 # has modeled battery
208+
has_generator = @hpxml_buildings.select { |hpxml_bldg| !hpxml_bldg.generators.empty? }.size > 0
209+
210+
# Fuel outputs
207211
fuels.each do |(fuel_type, is_production), fuel|
208212
fuel.meters.each do |meter|
209213
next unless has_fuel[hpxml_fuel_map[fuel_type]]
210-
next if is_production && !has_pv
214+
next if is_production && !has_pv # we don't need to request these meters if there isn't pv
215+
next if meter.include?('ElectricStorage') && !has_battery # we don't need to request this meter if there isn't a modeled battery
216+
next if meter.include?('Cogeneration') && !has_generator # we don't need to request this meter if there isn't a generator
211217

212218
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get
213219
if fuel_type == FT::Elec && @hpxml_header.utility_bill_scenarios.has_detailed_electric_rates
214220
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},hourly;").get
215-
else
216-
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get
217221
end
218222
end
219223
end
@@ -698,8 +702,8 @@ def get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario
698702
# @return [Hash] Fuel type, is_production => Fuel object
699703
def setup_fuel_outputs()
700704
fuels = {}
701-
fuels[[FT::Elec, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeElectricity}:Facility"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeElectricity))
702-
fuels[[FT::Elec, true]] = Fuel.new(meters: ["#{EPlus::FuelTypeElectricity}Produced:Facility"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeElectricity))
705+
fuels[[FT::Elec, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeElectricity}:Facility", "ElectricStorage:#{EPlus::FuelTypeElectricity}Produced", "Cogeneration:#{EPlus::FuelTypeElectricity}Produced"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeElectricity))
706+
fuels[[FT::Elec, true]] = Fuel.new(meters: ["Photovoltaic:#{EPlus::FuelTypeElectricity}Produced", "PowerConversion:#{EPlus::FuelTypeElectricity}Produced"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeElectricity))
703707
fuels[[FT::Gas, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeNaturalGas}:Facility"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeNaturalGas))
704708
fuels[[FT::Oil, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeOil}:Facility"], units: UtilityBills.get_fuel_units(HPXML::FuelTypeOil))
705709
fuels[[FT::Propane, false]] = Fuel.new(meters: ["#{EPlus::FuelTypePropane}:Facility"], units: UtilityBills.get_fuel_units(HPXML::FuelTypePropane))
@@ -744,18 +748,17 @@ def get_outputs(fuels, utility_bill_scenario)
744748

745749
timeseries_freq = 'monthly'
746750
timeseries_freq = 'hourly' if fuel_type == FT::Elec && !utility_bill_scenario.elec_tariff_filepath.nil?
747-
fuel.timeseries = get_report_meter_data_timeseries(fuel.meters, unit_conv, 0, timeseries_freq)
751+
fuel.timeseries = get_report_meter_data_timeseries(fuel.meters, unit_conv, timeseries_freq)
748752
end
749753
end
750754

751755
# Get the reported timeseries data from the fuel meters.
752756
#
753757
# @param meter_names [Array<String>] array of EnergyPlus meter names
754758
# @param unit_conv [Double] the scalar that converts 1 Joule into units of the fuel meters
755-
# @param unit_adder [Double] the value to add after applying the scalar
756759
# @param timeseries_freq [String] the frequency of the requested timeseries data
757760
# @return [Array<Double>] array of timeseries data
758-
def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder, timeseries_freq)
761+
def get_report_meter_data_timeseries(meter_names, unit_conv, timeseries_freq)
759762
msgpack_timeseries_name = { 'hourly' => 'Hourly',
760763
'monthly' => 'Monthly' }[timeseries_freq]
761764
begin
@@ -766,12 +769,18 @@ def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder, timeser
766769
return [0.0]
767770
end
768771
indexes = cols.each_index.select { |i| meter_names.include? cols[i]['Variable'] }
772+
meter_names = indexes.each.collect { |i| cols[i]['Variable'] }
773+
indexes = Hash[indexes.zip(meter_names)]
774+
769775
vals = []
770776
rows.each do |row|
771777
row = row[row.keys[0]]
772778
val = 0.0
773-
indexes.each do |i|
774-
val += row[i] * unit_conv + unit_adder
779+
indexes.each do |i, meter_name|
780+
r = row[i]
781+
r *= -1 if ["ElectricStorage:#{EPlus::FuelTypeElectricity}Produced", "Cogeneration:#{EPlus::FuelTypeElectricity}Produced"].include?(meter_name) # positive for this meter means producing
782+
783+
val += r * unit_conv
775784
end
776785
vals << val
777786
end

ReportUtilityBills/measure.xml

+11-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>report_utility_bills</name>
55
<uid>ca88a425-e59a-4bc4-af51-c7e7d1e960fe</uid>
6-
<version_id>b7abb94b-3d8f-4a23-b950-5712bd342e6e</version_id>
7-
<version_modified>2024-06-20T23:44:40Z</version_modified>
6+
<version_id>7a771c54-4bba-4a64-bbc3-230311117b0e</version_id>
7+
<version_modified>2024-06-24T16:04:41Z</version_modified>
88
<xml_checksum>15BF4E57</xml_checksum>
99
<class_name>ReportUtilityBills</class_name>
1010
<display_name>Utility Bills Report</display_name>
@@ -180,7 +180,7 @@
180180
<filename>measure.rb</filename>
181181
<filetype>rb</filetype>
182182
<usage_type>script</usage_type>
183-
<checksum>28CFE565</checksum>
183+
<checksum>C0D15021</checksum>
184184
</file>
185185
<file>
186186
<filename>detailed_rates/Sample Flat Rate Min Annual Charge.json</filename>
@@ -254,6 +254,12 @@
254254
<usage_type>resource</usage_type>
255255
<checksum>4508028D</checksum>
256256
</file>
257+
<file>
258+
<filename>detailed_rates/Sample Time-of-Use Rate High Peak.json</filename>
259+
<filetype>json</filetype>
260+
<usage_type>resource</usage_type>
261+
<checksum>1F5FA05C</checksum>
262+
</file>
257263
<file>
258264
<filename>detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json</filename>
259265
<filetype>json</filetype>
@@ -300,7 +306,7 @@
300306
<filename>util.rb</filename>
301307
<filetype>rb</filetype>
302308
<usage_type>resource</usage_type>
303-
<checksum>F8E425A5</checksum>
309+
<checksum>07D547F6</checksum>
304310
</file>
305311
<file>
306312
<filename>Contains Demand Charges.json</filename>
@@ -342,7 +348,7 @@
342348
<filename>test_report_utility_bills.rb</filename>
343349
<filetype>rb</filetype>
344350
<usage_type>test</usage_type>
345-
<checksum>CDF8B24F</checksum>
351+
<checksum>7B65C730</checksum>
346352
</file>
347353
</files>
348354
</measure>

0 commit comments

Comments
 (0)