From 712d41f0f58505a6d8652fe62abaaa5bfe18e57d Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Thu, 30 Apr 2026 15:25:21 -0600 Subject: [PATCH 1/2] Initial cleanup before the bugfix. --- ReportUtilityBills/measure.xml | 6 +- .../tests/test_report_utility_bills.rb | 530 +++++++----------- 2 files changed, 213 insertions(+), 323 deletions(-) diff --git a/ReportUtilityBills/measure.xml b/ReportUtilityBills/measure.xml index 37dea407f9..aa9fedb72b 100644 --- a/ReportUtilityBills/measure.xml +++ b/ReportUtilityBills/measure.xml @@ -4,8 +4,8 @@ Failed to infer measure name from '/mnt/c/git/openstudio-hpxml/ReportUtilityBills/measure.rb' report_utility_bills ca88a425-e59a-4bc4-af51-c7e7d1e960fe - ef1c155c-852e-4dcf-8cd4-cf2029e7c3c5 - 2026-03-19T22:48:22Z + fc8cb8ef-1635-40ed-bd0a-b0f2c0c5d0c7 + 2026-04-30T21:24:50Z 15BF4E57 ReportUtilityBills Utility Bills Report @@ -361,7 +361,7 @@ test_report_utility_bills.rb rb test - 95CFA2CF + 2EA74EB9 diff --git a/ReportUtilityBills/tests/test_report_utility_bills.rb b/ReportUtilityBills/tests/test_report_utility_bills.rb index 26958bebeb..cb8d69fc25 100644 --- a/ReportUtilityBills/tests/test_report_utility_bills.rb +++ b/ReportUtilityBills/tests/test_report_utility_bills.rb @@ -59,9 +59,8 @@ def setup @hpxml = HPXML.new(hpxml_path: @hpxml_path) @hpxml_bldg = @hpxml.buildings[0] - @hpxml_header = @hpxml.header - @hpxml_header.utility_bill_scenarios.clear - @hpxml_header.utility_bill_scenarios.add(name: 'Test', + @hpxml.header.utility_bill_scenarios.clear + @hpxml.header.utility_bill_scenarios.add(name: 'Test', elec_fixed_charge: 8.0, elec_marginal_rate: 0.1195179675994109, natural_gas_fixed_charge: 8.0, @@ -78,8 +77,8 @@ def setup runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new) weather_dir = File.join(File.dirname(__FILE__), '..', '..', 'weather') weather = WeatherFile.new(epw_path: File.join(weather_dir, 'USA_CO_Denver.Intl.AP.725650_TMY3.epw'), runner: runner) - Defaults.apply_header(@hpxml_header, @hpxml_bldg, weather) - Defaults.apply_utility_bill_scenarios(runner, @hpxml_header, @hpxml_bldg, @has_fuel) + Defaults.apply_header(@hpxml.header, @hpxml_bldg, weather) + Defaults.apply_utility_bill_scenarios(runner, @hpxml.header, @hpxml_bldg, @has_fuel) @root_path = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..')) @sample_files_path = File.join(@root_path, 'workflow', 'sample_files') @@ -106,76 +105,62 @@ def teardown # Simple (non-JSON) Calculations def test_simple_pv_none - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_simple, @hpxml_header, [], utility_bill_scenario) - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_simple, @hpxml) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_1kW_net_metering_user_excess_rate @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_10kW_net_metering_user_excess_rate @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -920 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -1777 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -632 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_simple, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end @@ -463,7 +448,6 @@ def test_downloaded_utility_rates require 'tempfile' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] Zip.on_exists_proc = true Zip::File.open(File.join(File.dirname(__FILE__), '../resources/detailed_rates/openei_rates.zip')) do |zip_file| zip_file.each_with_index do |entry, i| @@ -477,10 +461,10 @@ def test_downloaded_utility_rates File.open(tmp_path, 'wb') do |f| f.print entry.get_input_stream.read - utility_bill_scenario.elec_tariff_filepath = tmp_path + @hpxml.header.utility_bill_scenarios[0].elec_tariff_filepath = tmp_path File.delete(@bills_csv) if File.exist? @bills_csv File.delete(@bills_monthly_csv) if File.exist? @bills_monthly_csv - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) if !File.exist?(@bills_csv) flunk "#{entry.name} was not successful." end @@ -501,635 +485,539 @@ def test_downloaded_utility_rates # Flat (Same as simple tests above) def test_detailed_flat_pv_none - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_none_fixed_daily_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Fixed Daily Charge.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Fixed Daily Charge.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 91.25 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_1kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_10kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -920 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -1777 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -632 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_flat_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end # Tiered def test_detailed_tiered_pv_none - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_1kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -190 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_10kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -867 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1443 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -580 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 580 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end # Time-of-Use def test_detailed_tou_pv_none - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_1kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -112 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_10kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -681 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1127 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -393 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tou_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 393 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end # Tiered and Time-of-Use def test_detailed_tiered_tou_pv_none - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_1kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -108 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_10kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -665 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1000 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -377 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_tiered_tou_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 377 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end # Real-time Pricing def test_detailed_rtp_pv_none - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_1kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -106 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_10kW_net_metering_user_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -641 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_10kW_net_metering_retail_excess_rate - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1060 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_10kW_net_metering_zero_excess_rate - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate = 0.0 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -354 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_1kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -178 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_rtp_pv_10kW_feed_in_tariff - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff - @hpxml_header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_compensation_type = HPXML::PVCompensationTypeFeedInTariff + @hpxml.header.utility_bill_scenarios[-1].pv_feed_in_tariff_rate = 0.12 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 108 @expected_bills['Test: Electricity: Energy (USD)'] = 354 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1785 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end # Extra Fees & Charges def test_simple_pv_1kW_grid_fee_dollars_per_kW - @hpxml_header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 126 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_simple_pv_1kW_grid_fee_dollars - @hpxml_header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars = 7.50 + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars = 7.50 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_simple, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 186 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_1kW_grid_fee_dollars_per_kW - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 126 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_1kW_grid_fee_dollars - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' - @hpxml_header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars = 7.50 + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json' + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars = 7.50 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 186 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_none_min_monthly_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 96 @expected_bills['Test: Electricity: Energy (USD)'] = 632 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_none_min_annual_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 96 @expected_bills['Test: Electricity: Energy (USD)'] = 632 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_1kW_net_metering_user_excess_rate_min_monthly_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 96 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_1kW_net_metering_user_excess_rate_min_annual_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_1kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 96 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -177 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_10kW_net_metering_user_excess_rate_min_monthly_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 180 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -920 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_10kW_net_metering_user_excess_rate_min_annual_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 200 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -920 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_10kW_net_metering_retail_excess_rate_min_monthly_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 180 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1777 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end def test_detailed_pv_10kW_net_metering_retail_excess_rate_min_annual_charge - @hpxml_header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' - @hpxml_header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost + @hpxml.header.utility_bill_scenarios[-1].elec_tariff_filepath = '../../ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json' + @hpxml.header.utility_bill_scenarios[-1].pv_net_metering_annual_excess_sellback_rate_type = HPXML::PVAnnualExcessSellbackRateTypeRetailElectricityCost @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 10000.0 / @hpxml_bldg.pv_systems.size } - utility_bill_scenario = @hpxml_header.utility_bill_scenarios[0] - actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml_header, @hpxml.buildings, utility_bill_scenario) + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_10kw_detailed, @hpxml) @expected_bills['Test: Electricity: Fixed (USD)'] = 200 @expected_bills['Test: Electricity: Energy (USD)'] = 632 @expected_bills['Test: Electricity: PV Credit (USD)'] = -1777 - expected_bills = _get_expected_bills(@expected_bills) - _check_bills(expected_bills, actual_bills) + _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) end @@ -1148,6 +1036,7 @@ def _get_expected_bills(expected_bills) end def _check_bills(expected_bills, actual_bills) + expected_bills = _get_expected_bills(expected_bills) bills = expected_bills.keys | actual_bills.keys bills.each do |bill| assert(expected_bills.keys.include?(bill)) @@ -1210,14 +1099,15 @@ def _load_timeseries(pv_size_kw, use_hourly_electricity) return fuels end - def _bill_calcs(fuels, header, hpxml_buildings, utility_bill_scenario) + def _bill_calcs(fuels, hpxml) runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new) args = { output_format: 'csv', include_annual_bills: true, include_monthly_bills: true, register_annual_bills: true, register_monthly_bills: true } utility_rates, utility_bills = @measure.setup_utility_outputs() - pv_monthly_fee = @measure.get_pv_monthly_fee(utility_bill_scenario, hpxml_buildings) + utility_bill_scenario = hpxml.header.utility_bill_scenarios[0] + pv_monthly_fee = @measure.get_pv_monthly_fee(utility_bill_scenario, hpxml.buildings) @measure.get_utility_rates(@hpxml_path, @has_fuel, utility_rates, utility_bill_scenario, pv_monthly_fee) - @measure.get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, header) + @measure.get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, hpxml.header) # Annual output_path = File.join(File.dirname(__FILE__), "results_bills.#{args[:output_format]}") @@ -1231,7 +1121,7 @@ def _bill_calcs(fuels, header, hpxml_buildings, utility_bill_scenario) timestamps = (1..12).to_a monthly_data = [] monthly_output_path = File.join(File.dirname(__FILE__), "results_bills_monthly.#{args[:output_format]}") - @measure.get_monthly_output_results(args, utility_bills, utility_bill_scenario.name, monthly_data, header) + @measure.get_monthly_output_results(args, utility_bills, utility_bill_scenario.name, monthly_data, hpxml.header) @measure.report_monthly_output_results(runner, args, timestamps, monthly_data, monthly_output_path) # Check written values exist From 61016e04c3bebe4c86dbcad1a0f389054984f466 Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Thu, 30 Apr 2026 15:48:24 -0600 Subject: [PATCH 2/2] Add bugfix and tests. --- Changelog.md | 1 + ReportUtilityBills/measure.rb | 5 ++++- ReportUtilityBills/measure.xml | 8 ++++---- .../tests/test_report_utility_bills.rb | 19 +++++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Changelog.md b/Changelog.md index 7f193b213e..5c8cab30e1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -31,6 +31,7 @@ __Bugfixes__ - Fixes unmet hours outputs, which could be missing some periods of unmet hours. - Fixes timeseries outputs for heating/cooling setpoints. - Fixes logic in HP multi-stage backup advanced research feature. +- Fixes PV grid connection fee applying in utility bill calculation even if the home has no PV. ## OpenStudio-HPXML v1.11.1 diff --git a/ReportUtilityBills/measure.rb b/ReportUtilityBills/measure.rb index bfabf093c4..3d4386cb0e 100644 --- a/ReportUtilityBills/measure.rb +++ b/ReportUtilityBills/measure.rb @@ -324,7 +324,10 @@ def get_pv_monthly_fee(bill_scenario, hpxml_buildings) end end elsif not bill_scenario.pv_monthly_grid_connection_fee_dollars.nil? - pv_monthly_fee = bill_scenario.pv_monthly_grid_connection_fee_dollars + has_pv = hpxml_buildings.map { |hpxml_bldg| hpxml_bldg.pv_systems.map { |pv_system| pv_system.max_power_output }.sum }.sum > 0 + if has_pv + pv_monthly_fee = bill_scenario.pv_monthly_grid_connection_fee_dollars + end end return pv_monthly_fee diff --git a/ReportUtilityBills/measure.xml b/ReportUtilityBills/measure.xml index aa9fedb72b..e1ab88921d 100644 --- a/ReportUtilityBills/measure.xml +++ b/ReportUtilityBills/measure.xml @@ -4,8 +4,8 @@ Failed to infer measure name from '/mnt/c/git/openstudio-hpxml/ReportUtilityBills/measure.rb' report_utility_bills ca88a425-e59a-4bc4-af51-c7e7d1e960fe - fc8cb8ef-1635-40ed-bd0a-b0f2c0c5d0c7 - 2026-04-30T21:24:50Z + fb1e14f6-89e9-4e7a-87a6-6e9f60ee73f0 + 2026-04-30T21:38:53Z 15BF4E57 ReportUtilityBills Utility Bills Report @@ -181,7 +181,7 @@ measure.rb rb script - ED3188F5 + 06397C29 detailed_rates/README.md @@ -361,7 +361,7 @@ test_report_utility_bills.rb rb test - 2EA74EB9 + C44CE366 diff --git a/ReportUtilityBills/tests/test_report_utility_bills.rb b/ReportUtilityBills/tests/test_report_utility_bills.rb index cb8d69fc25..88ea6ac218 100644 --- a/ReportUtilityBills/tests/test_report_utility_bills.rb +++ b/ReportUtilityBills/tests/test_report_utility_bills.rb @@ -105,6 +105,7 @@ def teardown # Simple (non-JSON) Calculations def test_simple_pv_none + @hpxml_bldg.pv_systems.clear actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_simple, @hpxml) _check_bills(@expected_bills, actual_bills) _check_monthly_bills(actual_bills, actual_monthly_bills) @@ -893,6 +894,24 @@ def test_detailed_rtp_pv_10kW_feed_in_tariff # Extra Fees & Charges + def test_pv_none_with_pv_grid_fee_dollars_per_kW + # Check PV grid fee not applied if no PV + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 + @hpxml_bldg.pv_systems.clear + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_simple, @hpxml) + _check_bills(@expected_bills, actual_bills) + _check_monthly_bills(actual_bills, actual_monthly_bills) + end + + def test_pv_none_with_pv_grid_fee_dollars + # Check PV grid fee not applied if no PV + @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars = 7.50 + @hpxml_bldg.pv_systems.clear + actual_bills, actual_monthly_bills = _bill_calcs(@fuels_pv_none_simple, @hpxml) + _check_bills(@expected_bills, actual_bills) + _check_monthly_bills(actual_bills, actual_monthly_bills) + end + def test_simple_pv_1kW_grid_fee_dollars_per_kW @hpxml.header.utility_bill_scenarios[-1].pv_monthly_grid_connection_fee_dollars_per_kw = 2.50 @hpxml_bldg.pv_systems.each { |pv_system| pv_system.max_power_output = 1000.0 / @hpxml_bldg.pv_systems.size }