diff --git a/Changelog.md b/Changelog.md
index f20fbcabea..25b127dca0 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -53,6 +53,7 @@ __Bugfixes__
- Fixes error if modeling a ground-to-air heat pump with a separate backup heating system.
- Fixes default CFIS fan power during ventilation only mode.
- Fixes a bug that potentially oversizes heat pumps when detailed performance capacity fractions are provided.
+- For a CFIS system with a supplemental fan, fixes supplemental fan runtime when using sub-hourly timesteps.
## OpenStudio-HPXML v1.8.1
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index 2d7f57822c..b0b0e9790e 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.1
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- a34fa4e4-deee-4e59-8f0b-8c1a2c574cdc
- 2024-10-23T18:46:26Z
+ 64c3bdea-b4b3-4254-9b2a-23987ae4e9f3
+ 2024-10-25T00:51:54Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -189,7 +189,7 @@
airflow.rb
rb
resource
- F2AD4FE1
+ 87ABF972
battery.rb
@@ -207,7 +207,7 @@
constants.rb
rb
resource
- 8660B5E9
+ 22E067E1
constructions.rb
@@ -651,7 +651,7 @@
test_airflow.rb
rb
test
- D4E42045
+ 4366CDCD
test_battery.rb
diff --git a/HPXMLtoOpenStudio/resources/airflow.rb b/HPXMLtoOpenStudio/resources/airflow.rb
index 64df447128..16b83d830c 100644
--- a/HPXMLtoOpenStudio/resources/airflow.rb
+++ b/HPXMLtoOpenStudio/resources/airflow.rb
@@ -725,7 +725,7 @@ def self.create_return_air_duct_zone(model, loop_name, unit_multiplier, adiabati
# @param unavailable_periods [HPXML::UnavailablePeriods] Object that defines periods for, e.g., power outages or vacancies
# @return [TODO] TODO
def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
- cfis_data = { airloop: {}, t_sum_open_damper_var: {}, f_vent_only_mode_var: {} }
+ cfis_data = { airloop: {}, sum_oa_cfm_var: {}, f_vent_only_mode_var: {} }
return cfis_data if vent_fans[:mech].empty?
index = 0
@@ -742,9 +742,9 @@ def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
cfis_data[:airloop][vent_mech.id] = airloop_map[cfis_id]
end
- cfis_data[:t_sum_open_damper_var][vent_mech.id] = Model.add_ems_global_var(
+ cfis_data[:sum_oa_cfm_var][vent_mech.id] = Model.add_ems_global_var(
model,
- var_name: "#{Constants::ObjectTypeMechanicalVentilation} cfis t sum open damper #{index}"
+ var_name: "#{Constants::ObjectTypeMechanicalVentilation} cfis sum oa cfm #{index}"
)
cfis_data[:f_vent_only_mode_var][vent_mech.id] = Model.add_ems_global_var(
model,
@@ -756,7 +756,7 @@ def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
model,
name: "#{Constants::ObjectTypeMechanicalVentilation} cfis init program #{index}"
)
- cfis_program.addLine("Set #{cfis_data[:t_sum_open_damper_var][vent_mech.id].name} = 0")
+ cfis_program.addLine("Set #{cfis_data[:sum_oa_cfm_var][vent_mech.id].name} = 0")
cfis_program.addLine("Set #{cfis_data[:f_vent_only_mode_var][vent_mech.id].name} = 0")
Model.add_ems_program_calling_manager(
@@ -1966,6 +1966,8 @@ def self.calc_hrv_erv_effectiveness(vent_mech_fans)
# @param fan_data [TODO] TODO
# @return [nil]
def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_actuator, cfis_suppl_fan_actuator, fan_data)
+ infil_program.addLine("Set #{cfis_fan_actuator.name} = 0.0")
+ infil_program.addLine("Set #{cfis_suppl_fan_actuator.name} = 0.0") unless cfis_suppl_fan_actuator.nil?
infil_program.addLine('Set QWHV_cfis_sup = 0.0') # CFIS supply outdoor airflow rate
infil_program.addLine('Set QWHV_cfis_suppl_sup = 0.0') # CFIS supplemental fan supply outdoor airflow rate
infil_program.addLine('Set QWHV_cfis_suppl_exh = 0.0') # CFIS supplemental fan exhaust outdoor airflow rate
@@ -1977,97 +1979,130 @@ def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_a
infil_program.addLine("Set fan_rtf_hvac = fan_rtf_hvac + #{rtf_sensor.name}")
end
- t_sum_open_damper_var = cfis_data[:t_sum_open_damper_var][vent_mech.id]
+ sum_oa_cfm_var = cfis_data[:sum_oa_cfm_var][vent_mech.id]
f_vent_only_mode_var = cfis_data[:f_vent_only_mode_var][vent_mech.id]
- infil_program.addLine('If @ABS(Minute - ZoneTimeStep*60) < 0.1')
- infil_program.addLine(" Set #{t_sum_open_damper_var.name} = 0") # New hour, time on summation re-initializes to 0
- infil_program.addLine('EndIf')
-
- infil_program.addLine("Set t_min_hr_open = #{[vent_mech.hours_in_operation / 24.0 * 60.0, 59.999].min}") # Minimum CFIS damper open time in minutes
- infil_program.addLine("Set Q_duct_oa = #{UnitConversions.convert(vent_mech.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
- infil_program.addLine("Set #{f_vent_only_mode_var.name} = 0")
+ infil_program.addLine("Set f_operation = #{[vent_mech.hours_in_operation / 24.0, 0.0001].max}") # Operation, fraction of hour
+ infil_program.addLine("Set oa_cfm_ah = #{UnitConversions.convert(vent_mech.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
- infil_program.addLine("Set suppl_fan_w = #{vent_mech.cfis_supplemental_fan.unit_fan_power}") # W, fan power for additional ventilation only mode runtime
+ if vent_mech.cfis_supplemental_fan.oa_unit_flow_rate < vent_mech.average_unit_flow_rate
+ runner.registerWarning("CFIS supplemental fan '#{vent_mech.cfis_supplemental_fan.id}' is undersized (#{vent_mech.cfis_supplemental_fan.oa_unit_flow_rate} cfm) compared to the target hourly ventilation rate (#{vent_mech.average_unit_flow_rate} cfm).")
+ end
+ infil_program.addLine("Set suppl_fan_w = #{vent_mech.cfis_supplemental_fan.unit_fan_power}") # W, supplemental fan power
+ infil_program.addLine("Set oa_cfm_suppl = #{UnitConversions.convert(vent_mech.cfis_supplemental_fan.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler
- infil_program.addLine("Set ah_fan_w = #{vent_mech.unit_fan_power}") # W, fan power for additional ventilation only mode runtime
+ infil_program.addLine("Set ah_fan_w = #{vent_mech.unit_fan_power}") # W, air handler fan power
end
+ infil_program.addLine("Set has_outdoor_air_control = #{vent_mech.cfis_has_outdoor_air_control ? 1 : 0}")
if vent_mech.cfis_control_type == HPXML::CFISControlTypeTimer
# Ventilation occurs at fixed intervals regardless of HVAC operation
- infil_program.addLine('Set f_open_damper_ah = t_min_hr_open/60')
- infil_program.addLine("Set #{f_vent_only_mode_var.name} = f_open_damper_ah * (1 - fan_rtf_hvac)") # Fraction of the timestep with ventilation only mode runtime per ANSI 301-2022 Addendum E
- infil_program.addLine("Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + (ah_fan_w * #{f_vent_only_mode_var.name})") # Fan energy associated with ventilation only mode runtime
+
+ # Calculate outdoor air ventilation
+ infil_program.addLine('Set QWHV_cfis_sup = QWHV_cfis_sup + (oa_cfm_ah * f_operation)')
+
+ # Calculate fraction of the timestep with ventilation only mode runtime per ANSI 301-2022 Addendum E
+ infil_program.addLine("Set #{f_vent_only_mode_var.name} = f_operation * (1 - fan_rtf_hvac)")
+
+ # Calculate additional fan energy
+ infil_program.addLine("Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + (ah_fan_w * #{f_vent_only_mode_var.name})")
+
elsif vent_mech.cfis_control_type == HPXML::CFISControlTypeOptimized
# Ventilation optimized to make use of HVAC operation
- infil_program.addLine('Set f_open_damper = 0')
- infil_program.addLine("Set has_additional_runtime = #{vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeNone ? 0 : 1}")
- infil_program.addLine("If #{t_sum_open_damper_var.name} < t_min_hr_open") # Check whether we've met the minimum hourly runtime
- infil_program.addLine(" Set t_damper_open = 60 - (t_min_hr_open - #{t_sum_open_damper_var.name})") # Minute of the hour at which the damper must be opened
- infil_program.addLine(' If ((Minute+0.00001) >= t_damper_open) && (has_additional_runtime == 1)') # Check whether the damper must be opened to achieve target minutes per hour of operation
- infil_program.addLine(' Set open_damper_runtime = @Max (@ABS(Minute - t_damper_open)) (fan_rtf_hvac * ZoneTimeStep * 60)') # How many minutes this timestep the damper is open
- infil_program.addLine(" Set open_damper_runtime = @Min open_damper_runtime (t_min_hr_open - #{t_sum_open_damper_var.name})") # Make sure it's not exceeding target ventilation
- infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime") # How many minutes this hour the damper is open
- infil_program.addLine(' Set f_open_damper = open_damper_runtime / (60.0 * ZoneTimeStep)') # Fraction of the timestep that the damper is open
- infil_program.addLine(" Set #{f_vent_only_mode_var.name} = @Max (f_open_damper - fan_rtf_hvac) 0.0") # Fraction of the timestep with ventilation only mode runtime
- if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler
- # Air handler meets additional runtime requirement
- infil_program.addLine(" Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + ah_fan_w * #{f_vent_only_mode_var.name}") # Fan energy associated with ventilation only mode runtime
- elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
- # Supplemental fan meets additional runtime requirement
- if vent_mech.cfis_supplemental_fan.oa_unit_flow_rate < vent_mech.average_unit_flow_rate
- runner.registerWarning("CFIS supplemental fan '#{vent_mech.cfis_supplemental_fan.id}' is undersized (#{vent_mech.cfis_supplemental_fan.oa_unit_flow_rate} cfm) compared to the target hourly ventilation rate (#{vent_mech.average_unit_flow_rate} cfm).")
- end
- infil_program.addLine(" Set suppl_Q_oa = #{UnitConversions.convert(vent_mech.cfis_supplemental_fan.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
- if vent_mech.cfis_supplemental_fan.oa_unit_flow_rate > 0
- infil_program.addLine(" Set suppl_f = #{f_vent_only_mode_var.name} / (suppl_Q_oa / Q_duct_oa)") # Calculate desired runtime for supplemental fan to provide remaining ventilation requirement
- infil_program.addLine(' Set suppl_f = @Min suppl_f 1.0') # Ensure desired runtime does not exceed 100% (if the supplemental fan is undersized)
- else
- infil_program.addLine(' Set suppl_f = 0.0')
- end
- infil_program.addLine(" Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + suppl_fan_w * suppl_f")
- if vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeSupply
- infil_program.addLine(' Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (suppl_f * suppl_Q_oa)')
- elsif vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeExhaust
- infil_program.addLine(' Set QWHV_cfis_suppl_exh = QWHV_cfis_suppl_exh + (suppl_f * suppl_Q_oa)')
- end
- end
- infil_program.addLine(' Else') # No additional ventilation mode runtime
- infil_program.addLine(' Set open_damper_runtime = fan_rtf_hvac * ZoneTimeStep * 60') # How many minutes this timestep the damper is open
- infil_program.addLine(" If (#{t_sum_open_damper_var.name} + open_damper_runtime) > t_min_hr_open") # Damper is only open for a portion of this time step to achieve target ventilation
- infil_program.addLine(" Set open_damper_runtime = t_min_hr_open - #{t_sum_open_damper_var.name}")
- infil_program.addLine(' EndIf')
- infil_program.addLine(' Set f_open_damper = open_damper_runtime / (ZoneTimeStep * 60)') # Fraction of the timestep that the damper is open
- infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime") # How many minutes this hour the damper is open
- infil_program.addLine(' EndIf')
+
+ infil_program.addLine("Set #{f_vent_only_mode_var.name} = 0")
+ infil_program.addLine('If @ABS(Minute - ZoneTimeStep*60) < 0.1')
+ infil_program.addLine(" Set #{sum_oa_cfm_var.name} = 0") # New hour, re-initialize to 0
infil_program.addLine('EndIf')
- # Calculate fraction of the timestep that the damper is open and the air handler fan is running
- if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
- infil_program.addLine("Set f_open_damper_ah = @Max (f_open_damper - #{f_vent_only_mode_var.name}) 0.0")
+ # Calculate hourly-average target outdoor air ventilation
+ infil_program.addLine('Set hr_oa_cfm_target = f_operation * oa_cfm_ah')
+
+ # Calculate hourly-average outdoor air ventilation still needed for the hour
+ infil_program.addLine("Set hr_oa_cfm_needed = hr_oa_cfm_target - #{sum_oa_cfm_var.name}")
+ infil_program.addLine('If (hr_oa_cfm_needed > 0) || (has_outdoor_air_control == 0)')
+
+ # Calculate hourly-average available outdoor air ventilation during HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_during_hvac_avail = fan_rtf_hvac * oa_cfm_ah * ZoneTimestep')
+
+ # Calculate hourly-average actual outdoor air ventilation brought in during HVAC runtime
+ if vent_mech.cfis_has_outdoor_air_control
+ infil_program.addLine(' Set hr_oa_cfm_during_hvac = @Min hr_oa_cfm_during_hvac_avail hr_oa_cfm_needed')
else
- infil_program.addLine('Set f_open_damper_ah = f_open_damper')
+ # Outdoor air is introduced for the entire time the HVAC system is running
+ infil_program.addLine(' Set hr_oa_cfm_during_hvac = hr_oa_cfm_during_hvac_avail')
end
+ infil_program.addLine(' Set QWHV_cfis_sup = QWHV_cfis_sup + (hr_oa_cfm_during_hvac / ZoneTimestep)')
+ infil_program.addLine(" Set #{sum_oa_cfm_var.name} = #{sum_oa_cfm_var.name} + hr_oa_cfm_during_hvac")
+ # If specified, additionally run supplemental fan when ventilating during HVAC runtime
if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan && vent_mech.cfis_supplemental_fan_runs_with_air_handler_fan
- # Additionally run supplemental fan when damper is open and HVAC system is running
- infil_program.addLine("Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + (suppl_fan_w * f_open_damper_ah)")
+ infil_program.addLine(' If hr_oa_cfm_during_hvac > 0')
+ infil_program.addLine(' Set f_open_damper_ah = (hr_oa_cfm_during_hvac / hr_oa_cfm_during_hvac_avail) * fan_rtf_hvac')
+ infil_program.addLine(" Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + (suppl_fan_w * f_open_damper_ah)")
if vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeSupply
- infil_program.addLine('Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (f_open_damper_ah * suppl_Q_oa)')
+ infil_program.addLine(' Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (f_open_damper_ah * oa_cfm_suppl)')
elsif vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeExhaust
- infil_program.addLine('Set QWHV_cfis_suppl_exh = QWHV_cfis_suppl_exh + (f_open_damper_ah * suppl_Q_oa)')
+ infil_program.addLine(' Set QWHV_cfis_suppl_exh = QWHV_cfis_suppl_exh + (f_open_damper_ah * oa_cfm_suppl)')
end
+ infil_program.addLine(' EndIf')
end
- end
- # If no outdoor air control, then outdoor air is introduced for at least the entire time the HVAC system is running
- infil_program.addLine("Set has_outdoor_air_control = #{vent_mech.cfis_has_outdoor_air_control ? 1 : 0}")
- infil_program.addLine('If has_outdoor_air_control == 0')
- infil_program.addLine(' Set f_open_damper_ah = @Max f_open_damper_ah fan_rtf_hvac')
- infil_program.addLine('EndIf')
+ # Calculate hourly-average additional outdoor air ventilation still needed for the hour after HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_addtl_needed = hr_oa_cfm_needed - hr_oa_cfm_during_hvac')
+
+ # Calculate hourly-average outdoor air ventilation that can be brought in during subsequent timesteps of the hour if needed
+ if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler
+ infil_program.addLine(' Set hr_oa_cfm_addtl_needed = hr_oa_cfm_addtl_needed - (((60 - Minute) / 60) * oa_cfm_ah)')
+ elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
+ infil_program.addLine(' Set hr_oa_cfm_addtl_needed = hr_oa_cfm_addtl_needed - (((60 - Minute) / 60) * oa_cfm_suppl)')
+ elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeNone
+ infil_program.addLine(' Set hr_oa_cfm_addtl_needed = 0')
+ end
+ infil_program.addLine(' If hr_oa_cfm_addtl_needed > 0')
+
+ if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler
+ # Air handler meets additional runtime requirement
+
+ # Calculate hourly-average available outdoor air ventilation during non-HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_during_non_hvac_avail = (1.0 - fan_rtf_hvac) * oa_cfm_ah * ZoneTimestep')
+
+ # Calculate hourly-average actual outdoor air ventilation brought in during non-HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_during_non_hvac = @Min hr_oa_cfm_during_non_hvac_avail hr_oa_cfm_addtl_needed')
+ infil_program.addLine(' Set QWHV_cfis_sup = QWHV_cfis_sup + (hr_oa_cfm_during_non_hvac / ZoneTimestep)')
+ infil_program.addLine(" Set #{sum_oa_cfm_var.name} = #{sum_oa_cfm_var.name} + hr_oa_cfm_during_non_hvac")
- # Airflow brought in through air handler
- infil_program.addLine('Set QWHV_cfis_sup = QWHV_cfis_sup + (f_open_damper_ah * Q_duct_oa)')
+ # Calculate fraction of the timestep with ventilation only mode runtime and additional fan energy
+ infil_program.addLine(' If hr_oa_cfm_during_non_hvac > 0')
+ infil_program.addLine(" Set #{f_vent_only_mode_var.name} = (hr_oa_cfm_during_non_hvac / hr_oa_cfm_during_non_hvac_avail) * (1.0 - fan_rtf_hvac)")
+ infil_program.addLine(" Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + (ah_fan_w * #{f_vent_only_mode_var.name})")
+ infil_program.addLine(' EndIf')
+
+ elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
+ # Supplemental fan meets additional runtime requirement
+
+ # Calculate hourly-average available outdoor air ventilation during non-HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_during_non_hvac_avail = (1.0 - fan_rtf_hvac) * oa_cfm_suppl * ZoneTimestep')
+
+ # Calculate hourly-average actual outdoor air ventilation brought in during non-HVAC runtime
+ infil_program.addLine(' Set hr_oa_cfm_during_non_hvac = @Min hr_oa_cfm_during_non_hvac_avail hr_oa_cfm_addtl_needed')
+ if vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeSupply
+ infil_program.addLine(' Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (hr_oa_cfm_during_non_hvac / ZoneTimestep)')
+ elsif vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeExhaust
+ infil_program.addLine(' Set QWHV_cfis_suppl_exh = QWHV_cfis_suppl_exh + (hr_oa_cfm_during_non_hvac / ZoneTimestep)')
+ end
+ infil_program.addLine(" Set #{sum_oa_cfm_var.name} = #{sum_oa_cfm_var.name} + hr_oa_cfm_during_non_hvac")
+
+ # Calculate fraction of the timestep with ventilation only mode runtime and additional fan energy
+ infil_program.addLine(' If hr_oa_cfm_during_non_hvac > 0')
+ infil_program.addLine(" Set #{f_vent_only_mode_var.name} = (hr_oa_cfm_during_non_hvac / hr_oa_cfm_during_non_hvac_avail) * (1.0 - fan_rtf_hvac)")
+ infil_program.addLine(" Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + (suppl_fan_w * #{f_vent_only_mode_var.name})")
+ infil_program.addLine(' EndIf')
+ end
+
+ infil_program.addLine(' EndIf')
+ infil_program.addLine('EndIf')
+ end
end
end
@@ -2592,8 +2627,6 @@ def self.apply_infiltration_ventilation_to_conditioned(runner, model, spaces, we
fan_sens_load_actuator, fan_lat_load_actuator = setup_mech_vent_vars_actuators(model, spaces, infil_program, sensors)
# Apply CFIS
- infil_program.addLine("Set #{cfis_fan_actuator.name} = 0.0")
- infil_program.addLine("Set #{cfis_suppl_fan_actuator.name} = 0.0") unless cfis_suppl_fan_actuator.nil?
apply_cfis(runner, infil_program, vent_fans[:mech_cfis], cfis_data, cfis_fan_actuator, cfis_suppl_fan_actuator, fan_data)
# Calculate combined air exchange (infiltration and mechanical ventilation)
diff --git a/HPXMLtoOpenStudio/resources/constants.rb b/HPXMLtoOpenStudio/resources/constants.rb
index 0321d7ca28..eb1528a7cf 100644
--- a/HPXMLtoOpenStudio/resources/constants.rb
+++ b/HPXMLtoOpenStudio/resources/constants.rb
@@ -86,7 +86,7 @@ module Constants
# Arrays/Maps
ERIVersions = ['2014', '2014A', '2014AE', '2014AEG', '2019', '2019A',
- '2019AB', '2019ABC', '2019ABCD', '2022', '2022C']
+ '2019AB', '2019ABC', '2019ABCD', '2022', '2022C', '2022CE']
IECCZones = ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C',
'4A', '4B', '4C', '5A', '5B', '5C', '6A', '6B', '6C', '7', '8']
StateCodesMap = { 'AK' => 'Alaska',
diff --git a/HPXMLtoOpenStudio/tests/test_airflow.rb b/HPXMLtoOpenStudio/tests/test_airflow.rb
index 114a01234c..fa253f005b 100644
--- a/HPXMLtoOpenStudio/tests/test_airflow.rb
+++ b/HPXMLtoOpenStudio/tests/test_airflow.rb
@@ -377,15 +377,15 @@ def test_mechanical_ventilation_cfis
vent_fan = hpxml_bldg.ventilation_fans.find { |f| f.used_for_whole_building_ventilation }
vent_fan_cfm = vent_fan.oa_unit_flow_rate
vent_fan_power = vent_fan.fan_power
- vent_fan_mins = vent_fan.hours_in_operation / 24.0 * 60.0
+ vent_fan_operation = vent_fan.hours_in_operation / 24.0
# Check infiltration/ventilation program
program_values = get_ems_values(model.getEnergyManagementSystemPrograms, "#{Constants::ObjectTypeInfiltration} program")
- assert_in_epsilon(vent_fan_cfm, UnitConversions.convert(program_values['Q_duct_oa'].sum, 'm^3/s', 'cfm'), 0.01)
+ assert_in_epsilon(vent_fan_cfm, UnitConversions.convert(program_values['oa_cfm_ah'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['QWHV_sup'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['QWHV_exh'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(vent_fan_power, program_values['ah_fan_w'].sum, 0.01)
- assert_in_epsilon(vent_fan_mins, program_values['t_min_hr_open'].sum, 0.01)
+ assert_in_epsilon(vent_fan_operation, program_values['f_operation'].sum, 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['Qrange'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['Qbath'].sum, 'm^3/s', 'cfm'), 0.01)
# Load actuators
@@ -401,18 +401,18 @@ def test_mechanical_ventilation_cfis_with_supplemental_fan
# Get HPXML values
vent_fan = hpxml_bldg.ventilation_fans.find { |f| f.used_for_whole_building_ventilation }
vent_fan_cfm = vent_fan.oa_unit_flow_rate
- vent_fan_mins = vent_fan.hours_in_operation / 24.0 * 60.0
+ vent_fan_operation = vent_fan.hours_in_operation / 24.0
suppl_vent_fan_cfm = vent_fan.cfis_supplemental_fan.oa_unit_flow_rate
suppl_vent_fan_power = vent_fan.cfis_supplemental_fan.fan_power
# Check infiltration/ventilation program
program_values = get_ems_values(model.getEnergyManagementSystemPrograms, "#{Constants::ObjectTypeInfiltration} program")
- assert_in_epsilon(vent_fan_cfm, UnitConversions.convert(program_values['Q_duct_oa'].sum, 'm^3/s', 'cfm'), 0.01)
- assert_in_epsilon(suppl_vent_fan_cfm, UnitConversions.convert(program_values['suppl_Q_oa'].sum, 'm^3/s', 'cfm'), 0.01)
+ assert_in_epsilon(vent_fan_cfm, UnitConversions.convert(program_values['oa_cfm_ah'].sum, 'm^3/s', 'cfm'), 0.01)
+ assert_in_epsilon(suppl_vent_fan_cfm, UnitConversions.convert(program_values['oa_cfm_suppl'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['QWHV_sup'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['QWHV_exh'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(suppl_vent_fan_power, program_values['suppl_fan_w'].sum, 0.01)
- assert_in_epsilon(vent_fan_mins, program_values['t_min_hr_open'].sum, 0.01)
+ assert_in_epsilon(vent_fan_operation, program_values['f_operation'].sum, 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['Qrange'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0.0, UnitConversions.convert(program_values['Qbath'].sum, 'm^3/s', 'cfm'), 0.01)
# Load actuators
@@ -497,7 +497,7 @@ def test_multiple_mechvent
vent_fan_cfis = whole_fans.select { |f| f.fan_type == HPXML::MechVentTypeCFIS }
vent_fan_cfm_cfis = vent_fan_cfis.map { |f| f.oa_unit_flow_rate }.sum(0.0)
vent_fan_power_cfis = vent_fan_cfis.select { |f| f.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler }.map { |f| f.fan_power }.sum(0.0)
- vent_fan_mins_cfis = vent_fan_cfis.map { |f| f.hours_in_operation / 24.0 * 60.0 }.sum(0.0)
+ vent_fan_operation_cfis = vent_fan_cfis.map { |f| f.hours_in_operation / 24.0 }.sum(0.0)
# total mech vent fan power excluding cfis
total_mechvent_pow = vent_fan_power_sup + vent_fan_power_exh + vent_fan_power_bal + vent_fan_power_ervhrv
@@ -511,7 +511,7 @@ def test_multiple_mechvent
assert_in_epsilon(vent_fan_cfm_exh + vent_fan_cfm_bal + vent_fan_cfm_ervhrv, UnitConversions.convert(program_values['QWHV_exh'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(kitchen_fan_cfm, UnitConversions.convert(program_values['Qrange'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(bath_fan_cfm, UnitConversions.convert(program_values['Qbath'].sum, 'm^3/s', 'cfm'), 0.01)
- assert_in_epsilon(vent_fan_cfm_cfis, UnitConversions.convert(program_values['Q_duct_oa'].sum, 'm^3/s', 'cfm'), 0.01)
+ assert_in_epsilon(vent_fan_cfm_cfis, UnitConversions.convert(program_values['oa_cfm_ah'].sum, 'm^3/s', 'cfm'), 0.01)
# Fan power/load implementation
assert_equal(1, get_eed_for_ventilation(model, Constants::ObjectTypeMechanicalVentilationHouseFan).size)
assert_in_epsilon(total_mechvent_pow, get_eed_for_ventilation(model, Constants::ObjectTypeMechanicalVentilationHouseFan)[0].designLevel.get, 0.01)
@@ -528,7 +528,7 @@ def test_multiple_mechvent
assert_in_epsilon(1.0, bath_fan_eeds[0].fractionLost, 0.01)
assert_in_epsilon(1.0, bath_fan_eeds[1].fractionLost, 0.01)
# CFIS minutes
- assert_in_epsilon(vent_fan_mins_cfis, program_values['t_min_hr_open'].sum, 0.01)
+ assert_in_epsilon(vent_fan_operation_cfis, program_values['f_operation'].sum, 0.01)
# Load actuators
assert_equal(1, get_oed_for_ventilation(model, "#{Constants::ObjectTypeMechanicalVentilationHouseFan} sensible load").size)
assert_equal(1, get_oed_for_ventilation(model, "#{Constants::ObjectTypeMechanicalVentilationHouseFan} latent load").size)
@@ -557,7 +557,7 @@ def test_shared_mechvent_multiple
# CFIS
vent_fans_cfm_oa_cfis = hpxml_bldg.ventilation_fans.select { |f| f.fan_type == HPXML::MechVentTypeCFIS }.map { |f| f.oa_unit_flow_rate }.sum(0.0)
vent_fans_pow_cfis = hpxml_bldg.ventilation_fans.select { |f| f.fan_type == HPXML::MechVentTypeCFIS }.map { |f| f.unit_fan_power }.sum(0.0)
- vent_fans_mins_cfis = hpxml_bldg.ventilation_fans.select { |f| f.fan_type == HPXML::MechVentTypeCFIS }.map { |f| f.hours_in_operation / 24.0 * 60.0 }.sum(0.0)
+ vent_fans_mins_cfis = hpxml_bldg.ventilation_fans.select { |f| f.fan_type == HPXML::MechVentTypeCFIS }.map { |f| f.hours_in_operation / 24.0 }.sum(0.0)
# Load and energy eed
assert_equal(1, get_oed_for_ventilation(model, "#{Constants::ObjectTypeMechanicalVentilationHouseFan} sensible load").size)
@@ -574,8 +574,8 @@ def test_shared_mechvent_multiple
assert_in_epsilon((vent_fans_cfm_oa_preheat_sup + vent_fans_cfm_oa_preheat_bal + vent_fans_cfm_oa_preheat_ervhrv), UnitConversions.convert(program_values['Qpreheat'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon((vent_fans_cfm_oa_precool_sup + vent_fans_cfm_oa_precool_bal + vent_fans_cfm_oa_precool_ervhrv), UnitConversions.convert(program_values['Qprecool'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(vent_fans_pow_cfis, program_values['ah_fan_w'].sum, 0.01)
- assert_in_epsilon(vent_fans_mins_cfis, program_values['t_min_hr_open'].sum, 0.01)
- assert_in_epsilon(vent_fans_cfm_oa_cfis, UnitConversions.convert(program_values['Q_duct_oa'].sum, 'm^3/s', 'cfm'), 0.01)
+ assert_in_epsilon(vent_fans_mins_cfis, program_values['f_operation'].sum, 0.01)
+ assert_in_epsilon(vent_fans_cfm_oa_cfis, UnitConversions.convert(program_values['oa_cfm_ah'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(vent_fans_cfm_tot_sup + vent_fans_cfm_tot_ervhrvbal, UnitConversions.convert(program_values['QWHV_sup'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(vent_fans_cfm_tot_exh + vent_fans_cfm_tot_ervhrvbal, UnitConversions.convert(program_values['QWHV_exh'].sum, 'm^3/s', 'cfm'), 0.01)
assert_in_epsilon(0, UnitConversions.convert(program_values['Qrange'].sum, 'm^3/s', 'cfm'), 0.01)
diff --git a/tasks.rb b/tasks.rb
index 6e758c7068..370f737f76 100644
--- a/tasks.rb
+++ b/tasks.rb
@@ -2282,6 +2282,7 @@ def apply_hpxml_modification_sample_files(hpxml_path, hpxml)
elsif ['base-mechvent-cfis-no-outdoor-air-control.xml'].include? hpxml_file
hpxml_bldg.ventilation_fans[0].cfis_has_outdoor_air_control = false
elsif ['base-mechvent-cfis-supplemental-fan-exhaust.xml',
+ 'base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml',
'base-mechvent-cfis-supplemental-fan-supply.xml',
'base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml'].include? hpxml_file
hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json
index 954643115d..85f14ccdf4 100644
--- a/workflow/hpxml_inputs.json
+++ b/workflow/hpxml_inputs.json
@@ -3181,6 +3181,10 @@
"mech_vent_fan_power": 300,
"mech_vent_num_units_served": 1
},
+ "sample_files/base-mechvent-cfis-15-mins.xml": {
+ "parent_hpxml": "sample_files/base-mechvent-cfis.xml",
+ "simulation_control_timestep": 15
+ },
"sample_files/base-mechvent-cfis-airflow-fraction-zero.xml": {
"parent_hpxml": "sample_files/base-mechvent-cfis.xml"
},
@@ -3218,6 +3222,10 @@
"parent_hpxml": "sample_files/base-mechvent-cfis.xml",
"mech_vent_fan_power": null
},
+ "sample_files/base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml": {
+ "parent_hpxml": "sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml",
+ "simulation_control_timestep": 15
+ },
"sample_files/base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml": {
"parent_hpxml": "sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml"
},
diff --git a/workflow/run_simulation.rb b/workflow/run_simulation.rb
index 3cd84a466f..83f1ce0066 100644
--- a/workflow/run_simulation.rb
+++ b/workflow/run_simulation.rb
@@ -179,7 +179,7 @@ def run_workflow(basedir, rundir, hpxml, debug, skip_validation, add_comp_loads,
end
options[:debug] = false
- opts.on('-d', '--debug', 'Generate additional OpenStudio/EnergyPlus output files for debugging') do |_t|
+ opts.on('-d', '--debug', 'Generate additional OpenStudio and EnergyPlus files for debugging') do |_t|
options[:debug] = true
end
diff --git a/workflow/sample_files/base-mechvent-cfis-15-mins.xml b/workflow/sample_files/base-mechvent-cfis-15-mins.xml
new file mode 100644
index 0000000000..0f9f3834e1
--- /dev/null
+++ b/workflow/sample_files/base-mechvent-cfis-15-mins.xml
@@ -0,0 +1,567 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 15
+
+
+
+ Bills
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ suburban
+ stand-alone
+ no units above or below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ single-family detached
+ 2.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 2700.0
+ 21600.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 21600.0
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ attic - unvented
+ 1509.3
+ asphalt or fiberglass shingles
+ 0.7
+ 0.92
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ basement - conditioned
+ 115.6
+ wood siding
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1200.0
+ wood siding
+ 0.7
+ 0.92
+
+ gypsum board
+
+
+
+ 23.0
+
+
+
+
+ outside
+ attic - unvented
+ gable
+
+
+
+ 225.0
+ wood siding
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - conditioned
+ 8.0
+ 1200.0
+ 8.0
+ 7.0
+
+ gypsum board
+
+
+
+
+ continuous - exterior
+ 8.9
+ 0.0
+ 8.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ attic - unvented
+ conditioned space
+ ceiling
+
+
+
+ 1350.0
+
+ gypsum board
+
+
+
+ 39.3
+
+
+
+
+
+
+ basement - conditioned
+ 1350.0
+ 4.0
+ 150.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 108.0
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 108.0
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 36000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 24000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+
+ supply
+ 4.0
+ attic - unvented
+ 150.0
+
+
+
+ return
+ 0.0
+ attic - unvented
+ 50.0
+
+
+
+
+
+
+
+
+
+ central fan integrated supply
+
+ air handler fan
+
+ 330.0
+ 8.0
+ true
+ 300.0
+
+
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ conditioned space
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ conditioned space
+ electricity
+ 3.73
+ true
+ 150.0
+
+
+
+ conditioned space
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ conditioned space
+ 650.0
+
+
+
+ conditioned space
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+
+
+ other
+
+ kWh/year
+ 2457.0
+
+
+ 0.855
+ 0.045
+
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml b/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml
new file mode 100644
index 0000000000..fd7e0b0b07
--- /dev/null
+++ b/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml
@@ -0,0 +1,574 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 15
+
+
+
+ Bills
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ suburban
+ stand-alone
+ no units above or below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ single-family detached
+ 2.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 2700.0
+ 21600.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 21600.0
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ attic - unvented
+ 1509.3
+ asphalt or fiberglass shingles
+ 0.7
+ 0.92
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ basement - conditioned
+ 115.6
+ wood siding
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1200.0
+ wood siding
+ 0.7
+ 0.92
+
+ gypsum board
+
+
+
+ 23.0
+
+
+
+
+ outside
+ attic - unvented
+ gable
+
+
+
+ 225.0
+ wood siding
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - conditioned
+ 8.0
+ 1200.0
+ 8.0
+ 7.0
+
+ gypsum board
+
+
+
+
+ continuous - exterior
+ 8.9
+ 0.0
+ 8.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ attic - unvented
+ conditioned space
+ ceiling
+
+
+
+ 1350.0
+
+ gypsum board
+
+
+
+ 39.3
+
+
+
+
+
+
+ basement - conditioned
+ 1350.0
+ 4.0
+ 150.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 108.0
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 108.0
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 36000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 24000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+
+ supply
+ 4.0
+ attic - unvented
+ 150.0
+
+
+
+ return
+ 0.0
+ attic - unvented
+ 50.0
+
+
+
+
+
+
+
+
+
+ central fan integrated supply
+
+ supplemental fan
+
+
+ 330.0
+ 8.0
+ true
+
+
+
+
+ exhaust only
+ 120.0
+ true
+ 30.0
+
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ conditioned space
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ conditioned space
+ electricity
+ 3.73
+ true
+ 150.0
+
+
+
+ conditioned space
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ conditioned space
+ 650.0
+
+
+
+ conditioned space
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+
+
+ other
+
+ kWh/year
+ 2457.0
+
+
+ 0.855
+ 0.045
+
+
+
+
+
+
\ 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 1d0840593f..2b89143885 100644
--- a/workflow/tests/base_results/results_simulations_bills.csv
+++ b/workflow/tests/base_results/results_simulations_bills.csv
@@ -359,12 +359,14 @@ base-location-phoenix-az.xml,1632.46,144.0,1344.44,0.0,1488.44,144.0,0.02,144.02
base-location-portland-or.xml,1210.6,144.0,817.39,0.0,961.39,144.0,105.21,249.21,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-balanced.xml,2112.11,144.0,1376.02,0.0,1520.02,144.0,448.09,592.09,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-bath-kitchen-fans.xml,1863.27,144.0,1307.24,0.0,1451.24,144.0,268.03,412.03,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-15-mins.xml,2069.6,144.0,1372.13,0.0,1516.13,144.0,409.47,553.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-airflow-fraction-zero.xml,2042.44,144.0,1370.06,0.0,1514.06,144.0,384.38,528.38,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-control-type-timer.xml,2097.8,144.0,1404.85,0.0,1548.85,144.0,404.95,548.95,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-dse.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-evap-cooler-only-ducted.xml,1366.37,144.0,1222.37,0.0,1366.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-no-additional-runtime.xml,1928.74,144.0,1312.33,0.0,1456.33,144.0,328.41,472.41,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-no-outdoor-air-control.xml,2106.53,144.0,1377.18,0.0,1521.18,144.0,441.35,585.35,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml,2001.92,144.0,1327.45,0.0,1471.45,144.0,386.47,530.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,2006.02,144.0,1326.37,0.0,1470.37,144.0,391.65,535.65,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust.xml,1985.8,144.0,1320.96,0.0,1464.96,144.0,376.84,520.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-supply.xml,2002.27,144.0,1322.53,0.0,1466.53,144.0,391.74,535.74,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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 235d096603..4ed41d563b 100644
--- a/workflow/tests/base_results/results_simulations_energy.csv
+++ b/workflow/tests/base_results/results_simulations_energy.csv
@@ -359,12 +359,14 @@ base-location-phoenix-az.xml,38.486,38.486,38.485,38.485,0.001,0.0,0.0,0.0,0.0,0
base-location-portland-or.xml,37.945,37.945,27.21,27.21,10.734,0.0,0.0,0.0,0.0,0.0,0.0,0.069,0.0,0.0,2.796,0.406,8.935,0.0,0.0,2.646,0.0,0.238,0.0,0.0,0.0,0.0,2.088,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,4.192,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,10.734,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-balanced.xml,80.609,80.609,37.803,37.803,42.805,0.0,0.0,0.0,0.0,0.0,0.0,1.062,0.0,0.0,4.195,0.615,9.019,0.0,0.0,4.507,0.0,0.334,1.793,0.0,0.0,0.0,2.053,0.0,0.0,0.319,0.365,1.513,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,42.805,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-bath-kitchen-fans.xml,61.518,61.518,35.914,35.914,25.605,0.0,0.0,0.0,0.0,0.0,0.0,0.635,0.0,0.0,4.362,0.654,9.015,0.0,0.0,4.507,0.0,0.334,0.112,0.0,0.0,0.0,2.07,0.0,0.0,0.319,0.365,1.513,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,25.605,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-15-mins.xml,76.813,76.813,37.697,37.697,39.117,0.0,0.0,0.0,0.0,0.0,0.0,0.97,0.0,0.0,4.302,0.632,9.02,0.0,0.0,4.507,0.0,0.334,1.651,0.0,0.0,0.0,2.056,0.0,0.0,0.319,0.365,1.513,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,39.117,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-airflow-fraction-zero.xml,74.359,74.359,37.64,37.64,36.719,0.0,0.0,0.0,0.0,0.0,0.0,0.911,0.0,0.0,4.273,0.632,9.017,0.0,0.0,4.507,0.0,0.334,1.681,0.0,0.0,0.0,2.059,0.0,0.0,0.319,0.365,1.513,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,36.719,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-control-type-timer.xml,77.28,77.28,38.595,38.595,38.685,0.0,0.0,0.0,0.0,0.0,0.0,0.96,0.0,0.0,4.407,0.655,9.018,0.0,0.0,4.507,0.0,0.334,2.434,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,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,38.685,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-dse.xml,74.313,74.313,38.621,38.621,35.692,0.0,0.0,0.0,0.0,0.0,0.0,0.886,0.0,0.0,5.043,0.712,9.017,0.0,0.0,4.507,0.0,0.334,1.839,0.0,0.0,0.0,2.059,0.0,0.0,0.319,0.365,1.513,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,35.692,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-evap-cooler-only-ducted.xml,33.582,33.582,33.582,33.582,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.837,9.084,0.0,0.0,4.507,0.0,0.334,2.771,0.0,0.0,0.0,1.824,0.0,0.0,0.319,0.365,1.513,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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-no-additional-runtime.xml,67.426,67.426,36.054,36.054,31.372,0.0,0.0,0.0,0.0,0.0,0.0,0.778,0.0,0.0,4.455,0.669,9.014,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,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,31.372,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-no-outdoor-air-control.xml,79.997,79.997,37.835,37.835,42.161,0.0,0.0,0.0,0.0,0.0,0.0,1.046,0.0,0.0,4.345,0.642,9.018,0.0,0.0,4.507,0.0,0.334,1.661,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,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,42.161,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml,73.388,73.388,36.469,36.469,36.919,0.0,0.0,0.0,0.0,0.0,0.0,0.916,0.0,0.0,4.309,0.634,9.02,0.0,0.0,4.507,0.0,0.334,0.47,0.0,0.0,0.0,2.055,0.0,0.0,0.319,0.365,1.513,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,36.919,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,73.853,73.853,36.439,36.439,37.414,0.0,0.0,0.0,0.0,0.0,0.0,0.928,0.0,0.0,4.166,0.611,9.019,0.0,0.0,4.507,0.0,0.334,0.595,0.0,0.0,0.0,2.055,0.0,0.0,0.319,0.365,1.513,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,37.414,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-exhaust.xml,72.29,72.29,36.291,36.291,35.999,0.0,0.0,0.0,0.0,0.0,0.0,0.893,0.0,0.0,4.174,0.613,9.019,0.0,0.0,4.507,0.0,0.334,0.471,0.0,0.0,0.0,2.055,0.0,0.0,0.319,0.365,1.513,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,35.999,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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-mechvent-cfis-supplemental-fan-supply.xml,73.756,73.756,36.334,36.334,37.423,0.0,0.0,0.0,0.0,0.0,0.0,0.928,0.0,0.0,4.188,0.615,9.018,0.0,0.0,4.507,0.0,0.334,0.461,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,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,37.423,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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 97ee0b80a9..01268d7c5b 100644
--- a/workflow/tests/base_results/results_simulations_hvac.csv
+++ b/workflow/tests/base_results/results_simulations_hvac.csv
@@ -359,12 +359,14 @@ base-location-phoenix-az.xml,41.36,108.14,24000.0,24000.0,0.0,13081.0,1054.0,340
base-location-portland-or.xml,28.58,87.08,24000.0,24000.0,0.0,17789.0,6513.0,4921.0,0.0,377.0,1441.0,0.0,1472.0,0.0,1423.0,1644.0,0.0,0.0,15800.0,2411.0,6585.0,0.0,210.0,292.0,0.0,429.0,0.0,2304.0,248.0,0.0,3320.0,0.0,0.0,957.0,90.0,67.0,0.0,800.0
base-mechvent-balanced.xml,6.8,91.76,36000.0,24000.0,0.0,38765.0,8862.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,6372.0,0.0,21660.0,6043.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,1690.0,3320.0,0.0,0.0,-1656.0,0.0,-661.0,-1795.0,800.0
base-mechvent-bath-kitchen-fans.xml,6.8,91.76,36000.0,24000.0,0.0,32239.0,8709.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,4620.0,0.0,0.0,20039.0,6112.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,622.0,0.0,3320.0,0.0,0.0,139.0,0.0,-661.0,0.0,800.0
+base-mechvent-cfis-15-mins.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-airflow-fraction-zero.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-control-type-timer.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-dse.xml,6.8,91.76,36000.0,24000.0,0.0,25282.0,0.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,14995.0,0.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-evap-cooler-only-ducted.xml,6.8,91.76,0.0,24000.0,0.0,25282.0,0.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,17555.0,2561.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-no-additional-runtime.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-no-outdoor-air-control.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
+base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-supplemental-fan-supply.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
diff --git a/workflow/tests/base_results/results_simulations_loads.csv b/workflow/tests/base_results/results_simulations_loads.csv
index 78865b7d7b..75dd4621bb 100644
--- a/workflow/tests/base_results/results_simulations_loads.csv
+++ b/workflow/tests/base_results/results_simulations_loads.csv
@@ -359,12 +359,14 @@ base-location-phoenix-az.xml,0.001,0.0,52.569,4.866,0.556,0.0,0.0,0.0,0.164,0.13
base-location-portland-or.xml,9.941,0.0,8.005,8.724,0.78,0.0,0.0,0.0,3.137,2.898,0.0,0.0,0.627,7.236,-6.317,0.0,0.0,5.011,0.0,-0.259,1.389,0.0,0.674,0.0,2.023,-5.228,-1.338,0.0,-0.73,-1.092,0.0,0.0,-0.11,-2.022,12.184,0.0,0.0,-3.974,0.0,-0.257,-0.618,-2.989,-0.367,0.0,0.7,6.17,1.308
base-mechvent-balanced.xml,40.449,0.0,12.716,9.071,0.621,0.0,0.0,0.0,3.768,3.998,0.561,7.341,0.702,11.216,-14.601,0.0,0.0,0.0,8.3,-0.244,5.6,0.0,16.41,0.0,9.127,-9.184,-2.867,0.0,0.284,0.049,0.019,2.964,0.085,0.202,9.812,0.0,0.0,0.0,-5.701,-0.241,-0.525,-3.116,-2.142,0.0,3.075,6.384,1.641
base-mechvent-bath-kitchen-fans.xml,24.191,0.0,13.576,9.071,0.616,0.0,0.0,0.0,3.825,3.905,0.548,7.556,0.688,10.829,-13.686,0.0,0.0,0.0,8.336,-0.125,4.855,0.0,2.662,0.0,5.695,-8.56,-2.693,0.0,0.07,-0.152,-0.009,2.852,0.044,-0.522,10.727,0.0,0.0,0.0,-6.111,-0.121,-0.732,-3.793,-0.483,0.0,3.095,7.019,1.814
+base-mechvent-cfis-15-mins.xml,36.944,0.0,13.064,9.071,0.62,0.0,0.0,0.0,3.805,4.026,0.565,7.362,0.719,11.327,-14.409,0.0,0.0,0.0,8.174,-0.265,2.458,0.0,15.379,0.0,9.395,-9.1,-2.841,0.0,0.325,0.02,0.014,2.904,0.083,0.166,9.949,0.0,0.0,0.0,-5.871,-0.261,-0.365,-3.003,-1.746,0.0,2.814,6.47,1.666
base-mechvent-cfis-airflow-fraction-zero.xml,34.698,0.0,13.078,9.071,0.619,0.0,0.0,0.0,3.798,3.98,0.559,7.43,0.701,11.152,-14.238,0.0,0.0,0.0,8.232,-0.222,1.722,0.0,15.099,0.0,7.936,-8.963,-2.806,0.0,0.22,-0.013,0.011,2.929,0.074,0.004,10.175,0.0,0.0,0.0,-5.945,-0.218,-0.148,-3.365,-1.962,0.0,3.106,6.61,1.701
base-mechvent-cfis-control-type-timer.xml,36.555,0.0,13.551,9.071,0.619,0.0,0.0,0.0,3.691,3.999,0.561,7.372,0.704,11.209,-14.382,0.0,0.0,0.0,8.189,-0.264,1.732,0.0,14.668,0.0,10.625,-9.041,-2.826,0.0,0.281,0.02,0.015,2.911,0.08,0.106,10.031,0.0,0.0,0.0,-5.924,-0.261,-0.147,-3.26,-1.59,0.0,3.186,6.53,1.681
base-mechvent-cfis-dse.xml,26.959,0.0,10.124,9.071,0.619,0.0,0.0,0.0,4.221,3.977,0.558,7.419,0.701,11.142,-14.238,0.0,0.0,0.0,8.209,-0.222,1.666,0.0,14.975,0.0,0.0,-8.963,-2.806,0.0,0.368,-0.014,0.01,2.926,0.074,0.001,10.175,0.0,0.0,0.0,-5.953,-0.218,-0.15,-3.362,-1.929,0.0,0.0,6.61,1.701
base-mechvent-cfis-evap-cooler-only-ducted.xml,0.0,0.0,10.579,9.071,0.69,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.389,0.053,0.019,2.824,0.09,0.196,9.632,0.0,0.0,0.0,-6.055,-0.263,-0.14,-3.152,-1.452,0.0,0.66,6.271,1.619
base-mechvent-cfis-no-additional-runtime.xml,29.643,0.0,13.898,9.071,0.615,0.0,0.0,0.0,3.742,3.883,0.545,7.571,0.682,10.761,-13.574,0.0,0.0,0.0,8.367,-0.116,2.979,0.0,8.67,0.0,6.913,-8.475,-2.662,0.0,0.025,-0.187,-0.014,2.828,0.035,-0.631,10.839,0.0,0.0,0.0,-6.136,-0.112,-0.815,-3.874,-0.103,0.0,3.21,7.106,1.845
base-mechvent-cfis-no-outdoor-air-control.xml,39.835,0.0,13.324,9.071,0.62,0.0,0.0,0.0,3.733,3.996,0.561,7.365,0.703,11.202,-14.382,0.0,0.0,0.0,8.178,-0.265,1.538,0.0,18.718,0.0,10.039,-9.041,-2.826,0.0,0.291,0.02,0.015,2.91,0.08,0.105,10.031,0.0,0.0,0.0,-5.926,-0.261,-0.154,-3.258,-1.454,0.0,2.826,6.53,1.681
+base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml,34.875,0.0,13.124,9.071,0.62,0.0,0.0,0.0,3.853,4.023,0.565,7.418,0.712,11.269,-14.483,0.0,0.0,0.0,8.29,-0.198,2.723,0.0,14.295,0.0,8.045,-9.122,-2.848,0.0,0.291,0.021,0.014,2.972,0.078,0.121,9.875,0.0,0.0,0.0,-5.746,-0.194,-0.129,-3.02,-2.398,0.0,3.235,6.447,1.659
base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,35.354,0.0,12.647,9.071,0.62,0.0,0.0,0.0,3.813,3.994,0.56,7.388,0.7,11.183,-14.518,0.0,0.0,0.0,8.31,-0.217,2.992,0.0,14.725,0.0,8.074,-9.123,-2.852,0.0,0.267,0.032,0.016,2.977,0.081,0.13,9.895,0.0,0.0,0.0,-5.742,-0.214,-0.157,-3.187,-2.5,0.0,3.027,6.446,1.655
base-mechvent-cfis-supplemental-fan-exhaust.xml,34.018,0.0,12.692,9.071,0.62,0.0,0.0,0.0,3.826,3.994,0.56,7.388,0.7,11.183,-14.518,0.0,0.0,0.0,8.309,-0.217,2.58,0.0,14.066,0.0,7.796,-9.123,-2.852,0.0,0.267,0.032,0.016,2.977,0.081,0.13,9.895,0.0,0.0,0.0,-5.743,-0.214,-0.17,-3.19,-2.437,0.0,3.027,6.446,1.655
base-mechvent-cfis-supplemental-fan-supply.xml,35.363,0.0,12.728,9.071,0.62,0.0,0.0,0.0,3.805,3.988,0.56,7.403,0.702,11.181,-14.404,0.0,0.0,0.0,8.289,-0.227,1.759,0.0,15.823,0.0,8.069,-9.066,-2.834,0.0,0.248,0.014,0.014,2.956,0.079,0.091,10.009,0.0,0.0,0.0,-5.811,-0.223,-0.138,-3.248,-2.393,0.0,3.046,6.504,1.673
diff --git a/workflow/tests/base_results/results_simulations_misc.csv b/workflow/tests/base_results/results_simulations_misc.csv
index 825546a4f7..1e16a7b970 100644
--- a/workflow/tests/base_results/results_simulations_misc.csv
+++ b/workflow/tests/base_results/results_simulations_misc.csv
@@ -359,12 +359,14 @@ base-location-phoenix-az.xml,0.0,0.0,1354.7,998.0,8260.5,2035.4,2321.4,3630.7,36
base-location-portland-or.xml,0.0,0.0,1354.7,998.0,11014.7,2714.0,1626.8,2923.0,2923.0,9.262,15.105,0.0
base-mechvent-balanced.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2220.5,3787.6,3787.6,33.272,21.071,0.0
base-mechvent-bath-kitchen-fans.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2094.5,3719.8,3719.8,26.161,20.522,0.0
+base-mechvent-cfis-15-mins.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,3053.6,4775.9,4775.9,37.234,21.195,0.0
base-mechvent-cfis-airflow-fraction-zero.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2127.6,3702.5,3702.5,29.917,20.765,0.0
base-mechvent-cfis-control-type-timer.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2168.9,3768.8,3768.8,29.895,20.834,0.0
base-mechvent-cfis-dse.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2085.1,2926.2,2926.2,21.554,13.58,0.0
base-mechvent-cfis-evap-cooler-only-ducted.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2018.6,2306.5,2306.5,0.0,16.216,0.0
base-mechvent-cfis-no-additional-runtime.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2135.2,4049.8,4049.8,29.918,20.857,0.0
base-mechvent-cfis-no-outdoor-air-control.xml,49.0,5.0,1354.7,998.0,11171.5,2563.5,2230.6,3773.0,3773.0,37.835,21.601,0.0
+base-mechvent-cfis-supplemental-fan-exhaust-15-mins.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2881.5,4775.8,4775.8,37.234,21.241,0.0
base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2150.8,3723.0,3723.0,30.62,20.864,0.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2135.7,3696.2,3696.2,29.918,20.705,0.0
base-mechvent-cfis-supplemental-fan-supply.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2135.6,3697.7,3697.7,29.918,20.72,0.0