diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb
index 1ccf1e639b..1807e2238d 100644
--- a/HPXMLtoOpenStudio/measure.rb
+++ b/HPXMLtoOpenStudio/measure.rb
@@ -277,7 +277,7 @@ def process_whole_sfa_mf_inputs(hpxml)
# SFA/MF building simulations, we'd need to create custom meters with electricity usage *for each unit*
# and switch to "TrackMeterDemandStoreExcessOnSite".
# https://github.com/NREL/OpenStudio-HPXML/issues/1499
- fail 'Modeling batteries for whole SFA/MF buildings is not currently supported.'
+ # fail 'Modeling batteries for whole SFA/MF buildings is not currently supported.'
end
end
end
@@ -388,8 +388,8 @@ def create_unit_model(hpxml, hpxml_bldg, runner, model, weather, schedules_file)
# Other
PV.apply(runner, model, hpxml_bldg)
Generator.apply(model, hpxml_bldg)
- Battery.apply(runner, model, spaces, hpxml_bldg, schedules_file)
- Vehicle.apply(runner, model, spaces, hpxml_bldg, hpxml.header, schedules_file)
+ Battery.apply(runner, model, spaces, hpxml, hpxml_bldg, schedules_file)
+ Vehicle.apply(runner, model, spaces, hpxml, hpxml_bldg, hpxml.header, schedules_file)
# Unit Meters
Outputs.create_custom_unit_meters(model, hpxml)
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index c5e8327db2..09b8ff4489 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.1
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- f69f8c71-e00a-4bc7-8683-566de62c07f5
- 2026-01-13T20:00:36Z
+ 40743261-db1b-4704-85cb-babb19c24b04
+ 2026-01-15T22:06:45Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -192,7 +192,7 @@
measure.rb
rb
script
- 2001BC79
+ E3D309E8
airflow.rb
@@ -204,7 +204,7 @@
battery.rb
rb
resource
- F9BB0DB6
+ 9C83CBF5
calendar.rb
@@ -480,7 +480,7 @@
output.rb
rb
resource
- B6BE2EE5
+ 0CE7A472
psychrometrics.rb
@@ -684,7 +684,7 @@
vehicle.rb
rb
resource
- F4638081
+ C249066B
version.rb
@@ -726,7 +726,7 @@
test_battery.rb
rb
test
- BD69BEA3
+ 11254D6D
test_defaults.rb
@@ -810,13 +810,13 @@
test_validation.rb
rb
test
- 1A14E141
+ DEE2BEDA
test_vehicle.rb
rb
test
- 2EB7C07E
+ 39B48E52
test_water_heater.rb
diff --git a/HPXMLtoOpenStudio/resources/battery.rb b/HPXMLtoOpenStudio/resources/battery.rb
index 9daaaa85bc..a8b185e6c7 100644
--- a/HPXMLtoOpenStudio/resources/battery.rb
+++ b/HPXMLtoOpenStudio/resources/battery.rb
@@ -7,17 +7,18 @@ module Battery
# @param runner [OpenStudio::Measure::OSRunner] Object typically used to display warnings
# @param model [OpenStudio::Model::Model] OpenStudio Model object
# @param spaces [Hash] Map of HPXML locations => OpenStudio Space objects
+ # @param hpxml [HPXML] HPXML object
# @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit
# @param schedules_file [SchedulesFile] SchedulesFile wrapper class instance of detailed schedule files
# @return [nil]
- def self.apply(runner, model, spaces, hpxml_bldg, schedules_file)
+ def self.apply(runner, model, spaces, hpxml, hpxml_bldg, schedules_file)
charging_schedule, discharging_schedule = nil, nil
if not schedules_file.nil?
charging_schedule = schedules_file.create_schedule_file(model, col_name: SchedulesFile::Columns[:BatteryCharging].name)
discharging_schedule = schedules_file.create_schedule_file(model, col_name: SchedulesFile::Columns[:BatteryDischarging].name)
end
hpxml_bldg.batteries.each do |battery|
- apply_battery(runner, model, spaces, hpxml_bldg, battery, charging_schedule, discharging_schedule)
+ apply_battery(runner, model, spaces, hpxml, hpxml_bldg, battery, charging_schedule, discharging_schedule)
end
end
@@ -32,12 +33,13 @@ def self.apply(runner, model, spaces, hpxml_bldg, schedules_file)
# @param runner [OpenStudio::Measure::OSRunner] Object typically used to display warnings
# @param model [OpenStudio::Model::Model] OpenStudio Model object
# @param spaces [Hash] Map of HPXML locations => OpenStudio Space objects
+ # @param hpxml [HPXML] HPXML object
# @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit
# @param battery [HPXML::Battery, HPXML::Vehicle] Object that defines a single home battery or EV battery
# @param charging_schedule [OpenStudio::Model::ScheduleXXX] The battery charging schedule
# @param discharging_schedule [OpenStudio::Model::ScheduleXXX] The battery discharging schedule
# @return [nil]
- def self.apply_battery(runner, model, spaces, hpxml_bldg, battery, charging_schedule, discharging_schedule)
+ def self.apply_battery(runner, model, spaces, hpxml, hpxml_bldg, battery, charging_schedule, discharging_schedule)
nbeds = hpxml_bldg.building_construction.number_of_bedrooms
unit_multiplier = hpxml_bldg.building_construction.number_of_units
pv_systems = hpxml_bldg.pv_systems
@@ -149,7 +151,18 @@ def self.apply_battery(runner, model, spaces, hpxml_bldg, battery, charging_sche
elcd = elcds.find { |elcd| elcd.name.to_s.include?('PVSystem') }
if elcd
elcd.setElectricalBussType('DirectCurrentWithInverterACStorage')
- elcd.setStorageOperationScheme('TrackFacilityElectricDemandStoreExcessOnSite')
+ # Use TrackMeterDemandStoreExcessOnSite for single unit simulations.
+ # Even when custom Electricity_Facility mirrors Electricity:Facility
+ # exactly, TrackMeterDemandStoreExcessOnSite produces different results
+ # than TrackFacilityElectricDemandStoreExcessOnSite.
+ elcd.setStorageOperationScheme('TrackMeterDemandStoreExcessOnSite')
+ if hpxml.buildings.size == 1
+ meter_name = 'Electricity_Facility'
+ else
+ unit_num = hpxml.buildings.index(hpxml_bldg) + 1
+ meter_name = "unit#{unit_num}_Electricity_Facility"
+ end
+ elcd.setStorageControlTrackMeterName(meter_name)
else
elcd = OpenStudio::Model::ElectricLoadCenterDistribution.new(model)
elcd.setName("#{obj_name} elec load center dist")
@@ -165,6 +178,7 @@ def self.apply_battery(runner, model, spaces, hpxml_bldg, battery, charging_sche
if (not charging_schedule.nil?) && (not discharging_schedule.nil?)
elcd.setStorageOperationScheme('TrackChargeDischargeSchedules')
+ elcd.resetStorageControlTrackMeterName # In case scheduled battery w/PV
elcd.setStorageChargePowerFractionSchedule(charging_schedule)
elcd.setStorageDischargePowerFractionSchedule(discharging_schedule)
diff --git a/HPXMLtoOpenStudio/resources/output.rb b/HPXMLtoOpenStudio/resources/output.rb
index c95f367065..68a9f39404 100644
--- a/HPXMLtoOpenStudio/resources/output.rb
+++ b/HPXMLtoOpenStudio/resources/output.rb
@@ -1512,6 +1512,8 @@ def self.create_custom_meters(model, custom_unit_meter = nil)
if custom_unit_meter.nil?
key_vars << ['', 'Electricity:Facility']
else
+ # Since custom meter cannot reference other custom meters, copy
+ # all custom meter key/variable groups to this custom meter.
key_vars = custom_unit_meter.keyVarGroups
end
Model.add_meter_custom(
@@ -1548,8 +1550,6 @@ def self.create_custom_meters(model, custom_unit_meter = nil)
# @param hpxml [HPXML] HPXML object
# @return [nil]
def self.create_custom_unit_meters(model, hpxml)
- return if hpxml.buildings.size == 1
-
to_eplus = { FT::Elec => EPlus::FuelTypeElectricity,
FT::Gas => EPlus::FuelTypeNaturalGas,
FT::Oil => EPlus::FuelTypeOil,
@@ -1575,15 +1575,14 @@ def self.create_custom_unit_meters(model, hpxml)
next unless to_eplus[ft] == fuel_type
output_vars.each do |output_var|
- next if output_var.include? 'ExteriorLights:Electricity' # not associated with a zone, so the meter is across all units
- next if output_var.include? 'InteriorLights:Electricity' # same as above; like interior equipment, we *could* switch to zone level
- next if output_var.include? 'Electric Storage Charge Energy' # vehicles
+ next if output_var.include? 'ExteriorLights:Electricity' # Not associated with a zone, so the meter is across all units.
+ next if output_var.include? 'InteriorLights:Electricity' # Same as above; like interior equipment, we *could* switch to zone level.
key_vars << [object.name.to_s, output_var]
end
end
- # FIXME: can we simplify all this special stuff?
+ # FIXME: Can we simplify/avoid all this special stuff?
if fuel_type == EPlus::FuelTypeElectricity
if object.to_ElectricLoadCenterInverterPVWatts.is_initialized
key_vars << [object.name.to_s, 'Inverter Ancillary AC Electricity Energy']
@@ -1603,7 +1602,10 @@ def self.create_custom_unit_meters(model, hpxml)
end
end
- # Avoid the "Output Variable or Meter Name="x:y:z" referenced multiple times, only first instance will be used" E+ warning
+ next if key_vars.empty?
+
+ # Avoid the "Output Variable or Meter Name="x:y:z" referenced multiple
+ # times, only first instance will be used" E+ warning.
key_vars.each_with_index do |key_var1, i|
key_vars.each_with_index do |key_var2, j|
next if key_var1 == key_var2
@@ -1615,16 +1617,16 @@ def self.create_custom_unit_meters(model, hpxml)
end
end
- next if key_vars.empty?
-
meter_custom = Model.add_meter_custom(
model,
- name: "#{fuel_type}:Facility",
+ name: "#{fuel_type}_Facility",
fuel_type: fuel_type,
key_var_pairs: key_vars
)
- if fuel_type == EPlus::FuelTypeElectricity
+ # We only need the electricity Total, Net, PV, Critical meters by unit when
+ # there are multiple units.
+ if (fuel_type == EPlus::FuelTypeElectricity) && (hpxml.buildings.size > 1)
Outputs.create_custom_meters(model, meter_custom)
end
end
diff --git a/HPXMLtoOpenStudio/resources/vehicle.rb b/HPXMLtoOpenStudio/resources/vehicle.rb
index 48242d2b4a..ed5869746a 100644
--- a/HPXMLtoOpenStudio/resources/vehicle.rb
+++ b/HPXMLtoOpenStudio/resources/vehicle.rb
@@ -8,18 +8,19 @@ module Vehicle
# @param runner [OpenStudio::Measure::OSRunner] Object typically used to display warnings
# @param model [OpenStudio::Model::Model] OpenStudio Model object
# @param spaces [Hash] Map of HPXML locations => OpenStudio Space objects
+ # @param hpxml [HPXML] HPXML object
# @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit
# @param hpxml_header [HPXML::Header] HPXML Header object (one per HPXML file)
# @param schedules_file [SchedulesFile] SchedulesFile wrapper class instance of detailed schedule files
# @return [nil]
- def self.apply(runner, model, spaces, hpxml_bldg, hpxml_header, schedules_file)
+ def self.apply(runner, model, spaces, hpxml, hpxml_bldg, hpxml_header, schedules_file)
hpxml_bldg.vehicles.each do |vehicle|
if vehicle.vehicle_type != HPXML::VehicleTypeBEV
# Warning issued by Schematron validator
next
end
- apply_electric_vehicle(runner, model, spaces, hpxml_bldg, hpxml_header, vehicle, schedules_file)
+ apply_electric_vehicle(runner, model, spaces, hpxml, hpxml_bldg, hpxml_header, vehicle, schedules_file)
end
end
@@ -30,12 +31,13 @@ def self.apply(runner, model, spaces, hpxml_bldg, hpxml_header, schedules_file)
# @param runner [OpenStudio::Measure::OSRunner] Object typically used to display warnings
# @param model [OpenStudio::Model::Model] OpenStudio Model object
# @param spaces [Hash] Map of HPXML locations => OpenStudio Space objects
+ # @param hpxml [HPXML] HPXML object
# @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit
# @param hpxml_header [HPXML::Header] HPXML Header object (one per HPXML file)
# @param vehicle [HPXML::Vehicle] Object that defines a single electric vehicle
# @param schedules_file [SchedulesFile] SchedulesFile wrapper class instance of detailed schedule files
# @return [nil]
- def self.apply_electric_vehicle(runner, model, spaces, hpxml_bldg, hpxml_header, vehicle, schedules_file)
+ def self.apply_electric_vehicle(runner, model, spaces, hpxml, hpxml_bldg, hpxml_header, vehicle, schedules_file)
unit_multiplier = hpxml_bldg.building_construction.number_of_units
if hpxml_bldg.plug_loads.any? { |pl| pl.plug_load_type == HPXML::PlugLoadTypeElectricVehicleCharging }
# Warning issued by Schematron validator
@@ -95,7 +97,7 @@ def self.apply_electric_vehicle(runner, model, spaces, hpxml_bldg, hpxml_header,
vehicle.additional_properties.eff_discharge_power = eff_discharge_power * unit_multiplier
# Apply vehicle battery to model
- Battery.apply_battery(runner, model, spaces, hpxml_bldg, vehicle, charging_schedule, discharging_schedule)
+ Battery.apply_battery(runner, model, spaces, hpxml, hpxml_bldg, vehicle, charging_schedule, discharging_schedule)
temp_sensor = Model.add_ems_sensor(
model,
diff --git a/HPXMLtoOpenStudio/tests/test_battery.rb b/HPXMLtoOpenStudio/tests/test_battery.rb
index 85086d34f8..904e31096d 100644
--- a/HPXMLtoOpenStudio/tests/test_battery.rb
+++ b/HPXMLtoOpenStudio/tests/test_battery.rb
@@ -77,7 +77,8 @@ def test_battery_default
assert_equal(5000.0, elcd.designStorageControlChargePower.get)
assert_equal(5000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
end
end
@@ -128,6 +129,7 @@ def test_battery_scheduled
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
assert_equal('TrackChargeDischargeSchedules', elcd.storageOperationScheme)
+ assert(!elcd.storageControlTrackMeterName.is_initialized)
assert(elcd.storageChargePowerFractionSchedule.is_initialized)
assert(elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(elcd.storageConverter.is_initialized)
@@ -171,7 +173,8 @@ def test_pv_battery
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
assert(!elcd.storageChargePowerFractionSchedule.is_initialized)
assert(!elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(!elcd.storageConverter.is_initialized)
@@ -210,7 +213,8 @@ def test_pv_battery_shared
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
assert(!elcd.storageChargePowerFractionSchedule.is_initialized)
assert(!elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(!elcd.storageConverter.is_initialized)
@@ -250,6 +254,7 @@ def test_pv_battery_scheduled
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
assert_equal('TrackChargeDischargeSchedules', elcd.storageOperationScheme)
+ assert(!elcd.storageControlTrackMeterName.is_initialized)
assert(elcd.storageChargePowerFractionSchedule.is_initialized)
assert(elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(elcd.storageConverter.is_initialized)
@@ -293,7 +298,8 @@ def test_pv_battery_round_trip_efficiency
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
assert(!elcd.storageChargePowerFractionSchedule.is_initialized)
assert(!elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(!elcd.storageConverter.is_initialized)
@@ -333,7 +339,8 @@ def test_pv_battery_garage
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
end
end
@@ -369,7 +376,8 @@ def test_pv_battery_ah
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
end
end
diff --git a/HPXMLtoOpenStudio/tests/test_validation.rb b/HPXMLtoOpenStudio/tests/test_validation.rb
index fe028b4c70..b7e93b1053 100644
--- a/HPXMLtoOpenStudio/tests/test_validation.rb
+++ b/HPXMLtoOpenStudio/tests/test_validation.rb
@@ -1399,7 +1399,6 @@ def test_ruby_error_messages
'unique-objects-vary-across-units-epw' => ['Weather station EPW filepath has different values across dwelling units.'],
'unique-objects-vary-across-units-dst' => ['Unique object (OS:RunPeriodControl:DaylightSavingTime) has different values across dwelling units.'],
'unique-objects-vary-across-units-tmains' => ['Unique object (OS:Site:WaterMainsTemperature) has different values across dwelling units.'],
- 'whole-mf-building-batteries' => ['Modeling batteries for whole SFA/MF buildings is not currently supported.'],
'whole-mf-building-dehumidifiers-unit-multiplier' => ['NumberofUnits greater than 1 is not supported for dehumidifiers.'],
'whole-mf-building-gshps-unit-multiplier' => ['NumberofUnits greater than 1 is not supported for ground-to-air heat pumps.'] }
@@ -1973,10 +1972,6 @@ def test_ruby_error_messages
hpxml_bldg.hot_water_distributions[0].dwhr_facilities_connected = HPXML::DWHRFacilitiesConnectedOne
hpxml_bldg.hot_water_distributions[0].dwhr_equal_flow = true
hpxml_bldg.hot_water_distributions[0].dwhr_efficiency = 0.55
- when 'whole-mf-building-batteries'
- hpxml, hpxml_bldg = _create_hpxml('base-bldgtype-mf-whole-building.xml', building_id: building_id)
- hpxml_bldg.batteries.add(id: 'Battery1',
- type: HPXML::BatteryTypeLithiumIon)
when 'whole-mf-building-dehumidifiers-unit-multiplier'
hpxml, hpxml_bldg = _create_hpxml('base-appliances-dehumidifier.xml')
hpxml_bldg.building_construction.number_of_units = 2
diff --git a/HPXMLtoOpenStudio/tests/test_vehicle.rb b/HPXMLtoOpenStudio/tests/test_vehicle.rb
index 5346a5d785..4359b3fea1 100644
--- a/HPXMLtoOpenStudio/tests/test_vehicle.rb
+++ b/HPXMLtoOpenStudio/tests/test_vehicle.rb
@@ -261,7 +261,8 @@ def test_vehicle_ev_home_battery
assert_equal(6000.0, elcd.designStorageControlChargePower.get)
assert_equal(6000.0, elcd.designStorageControlDischargePower.get)
assert(!elcd.demandLimitSchemePurchasedElectricDemandLimit.is_initialized)
- assert_equal('TrackFacilityElectricDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('TrackMeterDemandStoreExcessOnSite', elcd.storageOperationScheme)
+ assert_equal('Electricity_Facility', elcd.storageControlTrackMeterName.get)
assert(!elcd.storageChargePowerFractionSchedule.is_initialized)
assert(!elcd.storageDischargePowerFractionSchedule.is_initialized)
assert(!elcd.storageConverter.is_initialized)
diff --git a/ReportSimulationOutput/measure.rb b/ReportSimulationOutput/measure.rb
index 5494d380f3..a733e730e6 100644
--- a/ReportSimulationOutput/measure.rb
+++ b/ReportSimulationOutput/measure.rb
@@ -435,7 +435,14 @@ def modelOutputRequests(model, runner, user_arguments)
if args[:timeseries_frequency] != EPlus::TimeseriesFrequencyTimestep
resilience_frequency = EPlus::TimeseriesFrequencyHourly
end
- Model.add_output_meter(model, meter_name: Outputs::MeterCustomElectricityCritical, reporting_frequency: resilience_frequency)
+ if @hpxml_bldgs.size == 1
+ Model.add_output_meter(model, meter_name: Outputs::MeterCustomElectricityCritical, reporting_frequency: resilience_frequency)
+ else
+ @hpxml_bldgs.each do |hpxml_bldg|
+ unit_num = @hpxml_bldgs.index(hpxml_bldg) + 1
+ Model.add_output_meter(model, meter_name: "unit#{unit_num}_#{Outputs::MeterCustomElectricityCritical.gsub(':', '_')}", reporting_frequency: resilience_frequency)
+ end
+ end
@resilience.values.each do |resilience|
resilience.variables.each do |_sys_id, varkey, var|
Model.add_output_variable(model, key_value: varkey, variable_name: var, reporting_frequency: resilience_frequency)
@@ -1081,27 +1088,6 @@ def get_outputs(runner, args)
next unless (args[:include_annual_resilience] || args[:include_timeseries_resilience])
next if resilience.variables.empty?
- batteries = []
- @hpxml_bldgs.each do |hpxml_bldg|
- hpxml_bldg.batteries.each do |battery|
- batteries << battery
- end
- end
- next if batteries.empty?
-
- if batteries.size > 1
- # When modeling individual dwelling units, OS-HPXML only allows a single battery
- # When modeling whole SFA/MF buildings, OS-HPXML does not currently allow batteries
- fail 'Unexpected error.'
- end
-
- battery = batteries[0]
-
- elcd = @model.getElectricLoadCenterDistributions.find { |elcd| elcd.additionalProperties.getFeatureAsString('HPXML_ID').to_s == battery.id }
- next if elcd.nil?
-
- elcs = @model.getElectricLoadCenterStorageLiIonNMCBatterys.find { |elcs| elcs.additionalProperties.getFeatureAsString('HPXML_ID').to_s == battery.id }
-
resilience_frequency = EPlus::TimeseriesFrequencyTimestep
ts_per_hr = @model.getTimestep.numberOfTimestepsPerHour
if args[:timeseries_frequency] != EPlus::TimeseriesFrequencyTimestep
@@ -1109,32 +1095,59 @@ def get_outputs(runner, args)
ts_per_hr = 1
end
- vars = ['Electric Storage Charge Fraction']
- keys = resilience.variables.select { |v| v[2] == vars[0] }.map { |v| v[1] }
- batt_soc = get_report_variable_data_timeseries(keys, vars, 1, 0, resilience_frequency)
+ annual_outputs = []
+ timeseries_outputs = []
+ @hpxml_bldgs.each do |hpxml_bldg|
+ if hpxml_bldg.batteries.size > 1
+ # When modeling individual dwelling units, OS-HPXML only allows a single battery
+ fail 'Unexpected error.'
+ end
+ next if hpxml_bldg.batteries.size == 0
+
+ battery = hpxml_bldg.batteries[0]
- min_soc = elcd.minimumStorageStateofChargeFraction
- batt_kw = elcd.designStorageControlDischargePower.get / 1000.0
- batt_roundtrip_eff = elcs.dctoDCChargingEfficiency
- batt_kwh = elcs.additionalProperties.getFeatureAsDouble('UsableCapacity_kWh').get
+ elcd = @model.getElectricLoadCenterDistributions.find { |elcd| elcd.additionalProperties.getFeatureAsString('HPXML_ID').to_s == battery.id }
+ next if elcd.nil?
- batt_soc_kwh = batt_soc.map { |soc| soc - min_soc }.map { |soc| soc * batt_kwh }
+ elcs = @model.getElectricLoadCenterStorageLiIonNMCBatterys.find { |elcs| elcs.additionalProperties.getFeatureAsString('HPXML_ID').to_s == battery.id }
- crit_load = get_report_meter_data_timeseries([Outputs::MeterCustomElectricityCritical.upcase], UnitConversions.convert(1.0, 'J', 'kWh'), 0, resilience_frequency)
+ vars = ['Electric Storage Charge Fraction']
+ batt_soc = get_report_variable_data_timeseries([elcs.name.to_s.upcase], vars, 1, 0, resilience_frequency)
- resilience_timeseries = []
- n_timesteps = crit_load.size
- (0...n_timesteps).each do |init_time_step|
- resilience_timeseries << get_resilience_timestep_value(init_time_step, batt_kwh, batt_kw, batt_soc_kwh[init_time_step], crit_load, batt_roundtrip_eff, n_timesteps, ts_per_hr)
- end
+ min_soc = elcd.minimumStorageStateofChargeFraction
+ batt_kw = elcd.designStorageControlDischargePower.get / 1000.0
+ batt_roundtrip_eff = elcs.dctoDCChargingEfficiency
+ batt_kwh = elcs.additionalProperties.getFeatureAsDouble('UsableCapacity_kWh').get
- resilience.annual_output = resilience_timeseries.sum(0.0) / resilience_timeseries.size
+ batt_soc_kwh = batt_soc.map { |soc| soc - min_soc }.map { |soc| soc * batt_kwh }
- next unless args[:include_timeseries_resilience]
+ if @hpxml_bldgs.size == 1
+ crit_load = get_report_meter_data_timeseries([Outputs::MeterCustomElectricityCritical.upcase], UnitConversions.convert(1.0, 'J', 'kWh'), 0, resilience_frequency)
+ else
+ unit_num = @hpxml_bldgs.index(hpxml_bldg) + 1
+ crit_load = get_report_meter_data_timeseries(["unit#{unit_num}_#{Outputs::MeterCustomElectricityCritical.gsub(':', '_')}".upcase], UnitConversions.convert(1.0, 'J', 'kWh'), 0, resilience_frequency)
+ end
+
+ resilience_timeseries = []
+ n_timesteps = crit_load.size
+ (0...n_timesteps).each do |init_time_step|
+ resilience_timeseries << get_resilience_timestep_value(init_time_step, batt_kwh, batt_kw, batt_soc_kwh[init_time_step], crit_load, batt_roundtrip_eff, n_timesteps, ts_per_hr)
+ end
+
+ annual_outputs << resilience_timeseries.sum(0.0) / resilience_timeseries.size
+
+ next unless args[:include_timeseries_resilience]
+
+ if ![EPlus::TimeseriesFrequencyDaily, EPlus::TimeseriesFrequencyMonthly].include?(args[:timeseries_frequency])
+ timeseries_outputs << resilience_timeseries
+ else
+ timeseries_outputs << rollup_timeseries_output_to_daily_or_monthly(resilience_timeseries, args[:timeseries_frequency], true)
+ end
+ end
- resilience.timeseries_output = resilience_timeseries
- if [EPlus::TimeseriesFrequencyDaily, EPlus::TimeseriesFrequencyMonthly].include? args[:timeseries_frequency]
- resilience.timeseries_output = rollup_timeseries_output_to_daily_or_monthly(resilience.timeseries_output, args[:timeseries_frequency], true)
+ resilience.annual_output = annual_outputs.max
+ if not timeseries_outputs.empty?
+ resilience.timeseries_output = timeseries_outputs[0].zip(*timeseries_outputs[1..-1]).map { |e| e.max }
end
end
diff --git a/ReportSimulationOutput/measure.xml b/ReportSimulationOutput/measure.xml
index 2c69c82fe2..0cfd01398f 100644
--- a/ReportSimulationOutput/measure.xml
+++ b/ReportSimulationOutput/measure.xml
@@ -3,8 +3,8 @@
3.1
report_simulation_output
df9d170c-c21a-4130-866d-0d46b06073fd
- 7389abec-ba4c-4dd0-8d8a-ccfe1f9da0d9
- 2026-01-13T20:00:39Z
+ ca8fcfde-4aac-444c-9266-50e80f6028c5
+ 2026-01-13T23:11:21Z
9BF1E6AC
ReportSimulationOutput
HPXML Simulation Output Report
@@ -2029,7 +2029,7 @@
measure.rb
rb
script
- 5E2D0E6C
+ 066D9889
test_report_sim_output.rb
diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst
index fc633b16e2..df24d23bbf 100644
--- a/docs/source/workflow_inputs.rst
+++ b/docs/source/workflow_inputs.rst
@@ -402,7 +402,6 @@ For these simulations:
Notes/caveats about this approach:
- Some inputs (e.g., EPW location or ground conductivity) cannot vary across ``Building`` elements.
-- :ref:`hpxml_batteries` is not currently supported.
- :ref:`hpxml_utility_bill_scenarios` using *detailed* :ref:`electricity_rates` are not supported.
.. _building_site:
diff --git a/tasks.rb b/tasks.rb
index 9c3fe87e4c..1844cf0fe4 100644
--- a/tasks.rb
+++ b/tasks.rb
@@ -2883,6 +2883,16 @@ def apply_hpxml_modification_sample_files(hpxml_path, hpxml)
'base-residents-5-5.xml'].include? hpxml_file
hpxml_bldg.batteries[0].nominal_capacity_kwh = nil
end
+ if ['base-bldgtype-mf-whole-building-pv-battery.xml'].include? hpxml_file
+ if hpxml_bldg_index > 0 # intentionally not all buildings have a battery
+ hpxml_bldg.pv_systems.add(id: "PVSystem#{hpxml_bldg.pv_systems.size + 1}_#{hpxml_bldg_index + 1}",
+ array_azimuth: 270,
+ array_tilt: 10,
+ max_power_output: 10000)
+ hpxml_bldg.batteries.add(id: "Battery#{hpxml_bldg.batteries.size + 1}_#{hpxml_bldg_index + 1}",
+ type: HPXML::BatteryTypeLithiumIon)
+ end
+ end
# ------------- #
# HPXML Vehicle #
diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json
index 704f967aa6..3c3926e258 100644
--- a/workflow/hpxml_inputs.json
+++ b/workflow/hpxml_inputs.json
@@ -2441,6 +2441,9 @@
"sample_files/base-bldgtype-mf-whole-building-vehicle-ev-charger.xml": {
"parent_hpxml": "sample_files/base-bldgtype-mf-whole-building.xml"
},
+ "sample_files/base-bldgtype-mf-whole-building-pv-battery.xml": {
+ "parent_hpxml": "sample_files/base-bldgtype-mf-whole-building.xml"
+ },
"sample_files/base-pv.xml": {
"parent_hpxml": "sample_files/base.xml",
"pv_system": "4.0 kW",
diff --git a/workflow/sample_files/base-bldgtype-mf-whole-building-pv-battery.xml b/workflow/sample_files/base-bldgtype-mf-whole-building-pv-battery.xml
new file mode 100644
index 0000000000..98a4a682d7
--- /dev/null
+++ b/workflow/sample_files/base-bldgtype-mf-whole-building-pv-battery.xml
@@ -0,0 +1,2491 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+ true
+
+
+ Default
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit above
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 0.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ basement - unconditioned
+ 77.1
+ wood siding
+ medium
+
+
+ 13.9
+
+
+
+
+ basement - unconditioned
+ basement - unconditioned
+ 30.8
+
+
+ 4.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - unconditioned
+ solid concrete
+ 8.0
+ 800.0
+ 7.0
+
+
+
+ continuous - exterior
+ 10.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+ basement - unconditioned
+ basement - unconditioned
+ solid concrete
+ 8.0
+ 320.0
+ 7.0
+
+
+
+ continuous - exterior
+ 0.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ basement - unconditioned
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 22.6
+
+
+
+
+ other housing unit
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 2.1
+
+
+
+
+
+
+ basement - unconditioned
+ 1200.0
+ 100.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit above
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 0.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit_2.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ basement - unconditioned
+ 77.1
+ wood siding
+ medium
+
+
+ 13.9
+
+
+
+
+ basement - unconditioned
+ basement - unconditioned
+ 30.8
+
+
+ 4.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - unconditioned
+ solid concrete
+ 8.0
+ 800.0
+ 7.0
+
+
+
+ continuous - exterior
+ 10.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+ basement - unconditioned
+ basement - unconditioned
+ solid concrete
+ 8.0
+ 320.0
+ 7.0
+
+
+
+ continuous - exterior
+ 0.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ basement - unconditioned
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 22.6
+
+
+
+
+ other housing unit
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 2.1
+
+
+
+
+
+
+ basement - unconditioned
+ 1200.0
+ 100.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+ 270
+ 10.0
+ 10000.0
+
+
+
+
+
+ Li-ion
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit above and below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 10.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit_3.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 5.3
+
+
+
+
+ other housing unit
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 2.1
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+ 270
+ 10.0
+ 10000.0
+
+
+
+
+
+ Li-ion
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit above and below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 10.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit_4.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 5.3
+
+
+
+
+ other housing unit
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 2.1
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+ 270
+ 10.0
+ 10000.0
+
+
+
+
+
+ Li-ion
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 20.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit_5.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1341.6
+ asphalt or fiberglass shingles
+ light
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 200.0
+ wood siding
+ medium
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 200.0
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 5.3
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 39.6
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+ 270
+ 10.0
+ 10000.0
+
+
+
+
+
+ Li-ion
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ attached on one side
+ unit below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ apartment unit
+ 20.0
+ 1.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 1200.0
+ 9600.0
+
+
+ ../../HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-mf-unit_6.csv
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ unit exterior only
+
+ ACHnatural
+ 0.375
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attic - vented
+ 1341.6
+ asphalt or fiberglass shingles
+ light
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 800.0
+ wood siding
+ medium
+
+
+ 22.7
+
+
+
+
+ other housing unit
+ conditioned space
+
+
+
+ 320.0
+
+
+ 4.0
+
+
+
+
+ outside
+ attic - vented
+ gable
+
+
+
+ 200.0
+ wood siding
+ medium
+
+
+ 4.0
+
+
+
+
+ attic - vented
+ attic - vented
+
+
+
+ 200.0
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit
+ conditioned space
+ floor
+
+
+
+ 1200.0
+
+
+ 5.3
+
+
+
+
+ attic - vented
+ conditioned space
+ ceiling
+
+
+
+ 1200.0
+
+
+ 39.6
+
+
+
+
+
+
+ 43.2
+ 0
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 43.2
+ 180
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+ 57.6
+ 270
+ 0.35
+ 0.44
+
+
+ light curtains
+
+ 0.67
+
+
+
+
+
+
+
+ 20.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ electricity
+ 10000.0
+
+ Percent
+ 1.0
+
+ 1.0
+
+
+
+ room air conditioner
+ electricity
+ 12000.0
+ 1.0
+
+ CEER
+ 8.4
+
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 1.0
+ 0.94
+
+
+
+
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ false
+
+
+
+ faucet
+ false
+
+
+
+
+
+ 270
+ 10.0
+ 10000.0
+
+
+
+
+
+ Li-ion
+
+
+
+
+
+
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ 650.0
+
+
+
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+
+
+ other
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/tests/base_results/results_simulations_bills.csv b/workflow/tests/base_results/results_simulations_bills.csv
index 3aefa308b4..057ef20740 100644
--- a/workflow/tests/base_results/results_simulations_bills.csv
+++ b/workflow/tests/base_results/results_simulations_bills.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,1286.63,144.0,990.14,0.0,1134.14,144.0,8.49,152.49,0.0
base-bldgtype-mf-whole-building-common-spaces.xml,8235.59,1152.0,7083.59,0.0,8235.59,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,8529.43,864.0,7665.43,0.0,8529.43,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,7549.75,864.0,6685.75,0.0,7549.75,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+base-bldgtype-mf-whole-building-pv-battery.xml,847.76,864.0,7806.9,-7823.14,847.76,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,9934.37,864.0,9070.37,0.0,9934.37,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-bldgtype-mf-whole-building.xml,8529.43,864.0,7665.43,0.0,8529.43,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
base-bldgtype-sfa-unit-2stories.xml,1869.14,144.0,1368.09,0.0,1512.09,144.0,213.05,357.05,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
@@ -435,7 +436,7 @@ base-pv-battery-round-trip-efficiency.xml,1131.69,144.0,1514.83,-987.32,671.51,1
base-pv-battery-scheduled.xml,1120.71,144.0,1503.84,-987.32,660.53,144.0,316.18,460.18,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-battery.xml,1085.17,144.0,1468.31,-987.32,624.99,144.0,316.18,460.18,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-generators-battery-scheduled.xml,1121.98,144.0,1203.12,-987.32,359.81,144.0,398.53,542.53,0.0,219.64,219.64,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
-base-pv-generators-battery.xml,1088.7,144.0,1169.85,-987.32,326.53,144.0,398.53,542.53,0.0,219.64,219.64,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-pv-generators-battery.xml,1086.44,144.0,1167.59,-987.32,324.27,144.0,398.53,542.53,0.0,219.64,219.64,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-generators.xml,1058.28,144.0,1139.43,-987.32,296.11,144.0,398.53,542.53,0.0,219.64,219.64,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-inverters.xml,1062.66,144.0,1440.15,-981.67,602.48,144.0,316.18,460.18,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv.xml,1057.01,144.0,1440.15,-987.32,596.83,144.0,316.18,460.18,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/base_results/results_simulations_energy.csv b/workflow/tests/base_results/results_simulations_energy.csv
index 9cdab30437..98dac1aa18 100644
--- a/workflow/tests/base_results/results_simulations_energy.csv
+++ b/workflow/tests/base_results/results_simulations_energy.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,27.839,27.839,26.963,26.963,0.876,0.0,0.0,0.0,0.0,0.0,
base-bldgtype-mf-whole-building-common-spaces.xml,192.899,192.899,192.899,192.899,0.0,0.0,0.0,0.0,0.0,0.0,31.799,0.0,0.0,0.0,11.853,0.0,67.393,0.0,0.0,19.519,0.0,1.819,0.0,0.0,0.0,0.0,12.41,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,208.743,208.743,208.743,208.743,0.0,0.0,0.0,0.0,0.0,0.0,42.292,0.0,0.0,0.0,22.415,0.0,67.306,0.0,0.0,14.641,0.0,1.364,0.0,0.0,0.0,0.0,12.619,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,182.065,182.065,182.065,182.065,0.0,0.0,0.0,0.0,0.0,0.0,25.135,0.0,0.0,0.0,12.923,0.0,67.329,0.0,0.0,14.641,0.0,1.364,0.0,0.0,0.0,0.0,12.566,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-bldgtype-mf-whole-building-pv-battery.xml,212.596,-1.847,212.596,-1.847,0.0,0.0,0.0,0.0,0.0,0.0,42.292,0.0,0.0,0.0,22.415,0.0,67.306,0.0,0.0,14.641,0.0,1.364,0.0,0.0,0.0,0.0,12.619,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,-214.443,0.0,3.853,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,247.002,247.002,247.002,247.002,0.0,0.0,0.0,0.0,0.0,0.0,42.292,0.0,0.0,0.0,22.415,0.0,67.306,0.0,0.0,14.641,0.0,1.364,0.0,0.0,0.0,0.0,12.619,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,38.259,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building.xml,208.743,208.743,208.743,208.743,0.0,0.0,0.0,0.0,0.0,0.0,42.292,0.0,0.0,0.0,22.415,0.0,67.306,0.0,0.0,14.641,0.0,1.364,0.0,0.0,0.0,0.0,12.619,0.0,0.0,1.745,2.141,0.0,9.172,0.0,12.693,22.356,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-sfa-unit-2stories.xml,59.247,59.247,37.255,37.255,21.991,0.0,0.0,0.0,0.0,0.0,0.0,0.675,0.0,0.0,3.958,0.841,10.769,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.076,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,21.991,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
@@ -435,7 +436,7 @@ base-pv-battery-round-trip-efficiency.xml,73.888,47.001,41.252,14.365,32.636,0.0
base-pv-battery-scheduled.xml,73.588,46.702,40.952,14.066,32.636,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,0.0,1.735,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-battery.xml,72.621,45.734,39.985,13.098,32.636,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,0.0,0.767,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-generators-battery-scheduled.xml,82.399,55.513,32.763,5.877,41.136,8.5,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,-8.189,1.735,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
-base-pv-generators-battery.xml,81.493,54.607,31.857,4.971,41.136,8.5,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,-8.189,0.828,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-pv-generators-battery.xml,81.432,54.545,31.795,4.909,41.136,8.5,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,-8.189,0.767,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-generators.xml,80.665,53.778,31.029,4.142,41.136,8.5,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,-8.189,0.0,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,8.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv-inverters.xml,71.854,45.121,39.218,12.485,32.636,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.732,0.0,0.0,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-pv.xml,71.854,44.967,39.218,12.331,32.636,0.0,0.0,0.0,0.0,0.0,0.0,1.016,0.0,0.0,5.216,1.204,10.77,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.075,0.0,0.0,0.284,0.347,1.436,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,-26.886,0.0,0.0,0.0,32.636,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/base_results/results_simulations_hvac.csv b/workflow/tests/base_results/results_simulations_hvac.csv
index d19dd1df21..fd9d67148b 100644
--- a/workflow/tests/base_results/results_simulations_hvac.csv
+++ b/workflow/tests/base_results/results_simulations_hvac.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,6.8,91.76,10000.0,12000.0,0.0,5884.0,0.0,2732.0,0.0,28
base-bldgtype-mf-whole-building-common-spaces.xml,6.8,91.76,75000.0,36000.0,0.0,184939.0,0.0,12740.0,0.0,1148.0,19546.0,73730.0,0.0,3495.0,0.0,74278.0,0.0,0.0,93826.0,0.0,12400.0,0.0,412.0,3532.0,38802.0,0.0,0.0,0.0,10032.0,0.0,25180.0,0.0,3464.0,-5456.0,0.0,-10656.0,0.0,5200.0
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,6.8,91.76,60000.0,72000.0,0.0,81800.0,0.0,19110.0,0.0,1722.0,10626.0,0.0,2232.0,0.0,3830.0,44282.0,0.0,0.0,54508.0,0.0,18600.0,0.0,618.0,1356.0,0.0,592.0,0.0,2228.0,5992.0,0.0,19920.0,0.0,5196.0,-1564.0,0.0,-6364.0,0.0,4800.0
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,6.8,91.76,75000.0,36000.0,0.0,81800.0,0.0,19110.0,0.0,1722.0,10626.0,0.0,2232.0,0.0,3830.0,44282.0,0.0,0.0,54508.0,0.0,18600.0,0.0,618.0,1356.0,0.0,592.0,0.0,2228.0,5992.0,0.0,19920.0,0.0,5196.0,-1564.0,0.0,-6364.0,0.0,4800.0
+base-bldgtype-mf-whole-building-pv-battery.xml,6.8,91.76,60000.0,72000.0,0.0,81800.0,0.0,19110.0,0.0,1722.0,10626.0,0.0,2232.0,0.0,3830.0,44282.0,0.0,0.0,54508.0,0.0,18600.0,0.0,618.0,1356.0,0.0,592.0,0.0,2228.0,5992.0,0.0,19920.0,0.0,5196.0,-1564.0,0.0,-6364.0,0.0,4800.0
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,6.8,91.76,60000.0,72000.0,0.0,81800.0,0.0,19110.0,0.0,1722.0,10626.0,0.0,2232.0,0.0,3830.0,44282.0,0.0,0.0,54508.0,0.0,18600.0,0.0,618.0,1356.0,0.0,592.0,0.0,2228.0,5992.0,0.0,19920.0,0.0,5196.0,-1564.0,0.0,-6364.0,0.0,4800.0
base-bldgtype-mf-whole-building.xml,6.8,91.76,60000.0,72000.0,0.0,81800.0,0.0,19110.0,0.0,1722.0,10626.0,0.0,2232.0,0.0,3830.0,44282.0,0.0,0.0,54508.0,0.0,18600.0,0.0,618.0,1356.0,0.0,592.0,0.0,2228.0,5992.0,0.0,19920.0,0.0,5196.0,-1564.0,0.0,-6364.0,0.0,4800.0
base-bldgtype-sfa-unit-2stories.xml,6.8,91.76,50000.0,36000.0,0.0,37662.0,18108.0,5459.0,0.0,575.0,5653.0,0.0,0.0,1286.0,1436.0,5144.0,0.0,0.0,27802.0,14340.0,5459.0,0.0,207.0,513.0,0.0,0.0,0.0,1517.0,699.0,0.0,3320.0,0.0,1747.0,118.0,61.0,-743.0,0.0,800.0
diff --git a/workflow/tests/base_results/results_simulations_loads.csv b/workflow/tests/base_results/results_simulations_loads.csv
index 2d9c81fe97..74bce9a293 100644
--- a/workflow/tests/base_results/results_simulations_loads.csv
+++ b/workflow/tests/base_results/results_simulations_loads.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,0.827,0.0,8.948,10.368,0.802,0.0,0.0,0.0,-0.003,1.696,
base-bldgtype-mf-whole-building-common-spaces.xml,31.768,0.0,25.32,62.257,5.111,0.0,0.0,0.0,3.936,8.554,0.758,5.147,0.739,9.585,-9.465,0.0,0.0,7.495,4.759,-0.461,25.602,0.0,0.0,0.0,0.0,-20.707,-4.101,0.0,4.837,2.161,-0.018,1.542,-0.016,-0.706,10.495,0.0,0.0,-1.436,-4.856,-0.458,-5.024,-3.027,0.0,0.0,0.0,18.584,3.22
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,42.236,0.0,46.521,62.257,5.023,0.0,0.0,0.0,7.463,18.694,0.0,0.0,2.33,28.754,-25.563,0.0,0.0,6.813,0.0,-2.272,50.719,0.0,0.0,0.0,0.0,-37.239,-7.151,0.0,-0.616,-3.646,0.0,0.0,-0.142,-3.534,34.272,0.0,0.0,-4.598,0.0,-2.249,-13.154,-8.741,0.0,0.0,0.0,41.457,7.49
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,25.104,0.0,27.683,62.257,5.046,0.0,0.0,0.0,3.473,14.756,0.0,0.0,1.141,14.465,-13.566,0.0,0.0,3.471,0.0,-0.868,25.685,0.0,0.0,0.0,0.0,-19.544,-3.769,0.0,-0.202,3.602,0.0,0.0,-0.079,-1.648,16.401,0.0,0.0,-2.643,0.0,-0.86,-6.016,-4.677,0.0,0.0,0.0,20.234,3.551
+base-bldgtype-mf-whole-building-pv-battery.xml,42.236,0.0,46.521,62.257,5.023,0.0,0.0,0.0,7.463,18.694,0.0,0.0,2.33,28.754,-25.563,0.0,0.0,6.813,0.0,-2.272,50.719,0.0,0.0,0.0,0.0,-37.239,-7.151,0.0,-0.616,-3.646,0.0,0.0,-0.142,-3.534,34.272,0.0,0.0,-4.598,0.0,-2.249,-13.154,-8.741,0.0,0.0,0.0,41.457,7.49
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,42.236,0.0,46.521,62.257,5.023,0.0,0.0,0.0,7.463,18.694,0.0,0.0,2.33,28.754,-25.563,0.0,0.0,6.813,0.0,-2.272,50.719,0.0,0.0,0.0,0.0,-37.239,-7.151,0.0,-0.616,-3.646,0.0,0.0,-0.142,-3.534,34.272,0.0,0.0,-4.598,0.0,-2.249,-13.154,-8.741,0.0,0.0,0.0,41.457,7.49
base-bldgtype-mf-whole-building.xml,42.236,0.0,46.521,62.257,5.023,0.0,0.0,0.0,7.463,18.694,0.0,0.0,2.33,28.754,-25.563,0.0,0.0,6.813,0.0,-2.272,50.719,0.0,0.0,0.0,0.0,-37.239,-7.151,0.0,-0.616,-3.646,0.0,0.0,-0.142,-3.534,34.272,0.0,0.0,-4.598,0.0,-2.249,-13.154,-8.741,0.0,0.0,0.0,41.457,7.49
base-bldgtype-sfa-unit-2stories.xml,20.903,0.0,14.157,9.917,0.848,0.0,0.0,0.0,2.308,5.419,0.513,4.104,0.685,8.169,-8.741,0.0,0.0,0.0,4.94,-0.138,7.459,0.0,0.512,0.0,6.832,-8.524,-2.651,0.0,0.04,-0.343,-0.006,1.453,0.023,-0.325,8.481,0.0,0.0,0.0,-4.143,-0.134,-1.268,-3.092,-0.081,0.0,4.379,7.269,1.856
diff --git a/workflow/tests/base_results/results_simulations_misc.csv b/workflow/tests/base_results/results_simulations_misc.csv
index 0849391fea..e331f96b78 100644
--- a/workflow/tests/base_results/results_simulations_misc.csv
+++ b/workflow/tests/base_results/results_simulations_misc.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,0.0,0.0,0.0,1323.0,910.7,12046.2,4107.6,1703.8,2103.2,
base-bldgtype-mf-whole-building-common-spaces.xml,0.0,1.0,0.0,7938.3,5463.9,72300.8,24653.6,18244.6,14064.1,18244.6,18244.6,14064.1,18244.6,34.08,24.044,0.0
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,0.0,3.0,0.0,7938.3,5463.9,72300.5,24653.5,22676.9,17047.4,22676.9,22676.9,17047.4,22676.9,56.418,56.02,0.0
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,0.0,13.0,0.0,7938.3,5463.9,72301.4,24653.8,17409.8,13347.5,17409.8,17409.8,13347.5,17409.8,32.785,29.246,0.0
+base-bldgtype-mf-whole-building-pv-battery.xml,0.0,3.0,0.0,7938.3,5463.9,72300.5,24653.5,31864.5,29659.2,31864.5,22676.9,5894.6,22676.9,56.418,56.02,14.999
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,0.0,3.0,0.0,7938.3,5463.9,72300.5,24653.5,47794.7,44767.0,47794.7,47794.7,44767.0,47794.7,56.418,56.02,0.0
base-bldgtype-mf-whole-building.xml,0.0,3.0,0.0,7938.3,5463.9,72300.5,24653.5,22676.9,17047.4,22676.9,22676.9,17047.4,22676.9,56.418,56.02,0.0
base-bldgtype-sfa-unit-2stories.xml,0.0,0.0,0.0,1286.4,890.5,11468.5,3942.3,2282.4,4156.5,4156.5,2282.4,4156.5,4156.5,23.91,23.996,0.0
@@ -435,7 +436,7 @@ base-pv-battery-round-trip-efficiency.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942
base-pv-battery-scheduled.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,8119.5,8427.4,8427.4,7933.3,7700.7,7933.3,33.305,23.005,6.505
base-pv-battery.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,3996.5,4181.8,4674.8,2338.2,3731.3,3731.3,33.305,23.005,9.862
base-pv-generators-battery-scheduled.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,7845.5,8153.5,8153.5,7659.3,7426.7,7659.3,33.305,23.005,16.182
-base-pv-generators-battery.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,3996.5,4181.8,4500.2,2003.8,3394.3,3394.3,33.305,23.005,54.516
+base-pv-generators-battery.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,3722.5,3907.9,4400.8,2064.2,3457.3,3457.3,33.305,23.005,39.147
base-pv-generators.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,2040.9,3502.5,3502.5,2040.9,3337.3,3337.3,33.305,23.005,0.0
base-pv-inverters.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,2314.8,3776.5,3776.5,2314.8,3612.1,3612.1,33.305,23.005,0.0
base-pv.xml,0.0,87.0,0.0,1286.4,890.5,11468.5,3942.3,2314.8,3776.5,3776.5,2314.8,3611.3,3611.3,33.305,23.005,0.0
diff --git a/workflow/tests/base_results/results_simulations_panel.csv b/workflow/tests/base_results/results_simulations_panel.csv
index fbbfa3f90e..50d10d8c3e 100644
--- a/workflow/tests/base_results/results_simulations_panel.csv
+++ b/workflow/tests/base_results/results_simulations_panel.csv
@@ -68,6 +68,7 @@ base-bldgtype-mf-unit.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.
base-bldgtype-mf-whole-building-common-spaces.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building-detailed-electric-panel.xml,17584.2,6614.4,33000.6,0.0,7200.0,72000.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,48600.0,1200.0,100153.8,417.6,782.4,33750.0,140.4,1059.6,12.0,0.0,12.0,0.0,6.0,12.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,36.0,96.0,78.0,18.0
base-bldgtype-mf-whole-building-inter-unit-heat-transfer.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-bldgtype-mf-whole-building-pv-battery.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building-vehicle-ev-charger.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-mf-whole-building.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-bldgtype-sfa-unit-2stories.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/util.rb b/workflow/tests/util.rb
index 0ec8605e7d..9e0284f6df 100644
--- a/workflow/tests/util.rb
+++ b/workflow/tests/util.rb
@@ -49,12 +49,9 @@ def _run_xml(xml, worker_num, apply_unit_multiplier = false, annual_results_1x =
elsif hpxml_bldg.heat_pumps.count { |hp| hp.heat_pump_type == HPXML::HVACTypeHeatPumpGroundToAir } > 0
# FUTURE: GSHPs currently don't give desired results w/ unit multipliers
# https://github.com/NREL/OpenStudio-HPXML/issues/1499
- elsif hpxml_bldg.batteries.size > 0
+ # elsif hpxml_bldg.batteries.size > 0
# FUTURE: Batteries currently don't work with whole SFA/MF buildings
# https://github.com/NREL/OpenStudio-HPXML/issues/1499
- # but we still want to test unit multipliers
- whole_sfa_or_mf_building_sim = false
- hpxml_bldg.building_construction.number_of_units *= 10
elsif hpxml.header.hvac_onoff_thermostat_deadband
# On off thermostat not supported with unit multiplier yet
elsif hpxml.header.heat_pump_backup_heating_capacity_increment