Skip to content

Comments

HPRTU measure: carrier's dual fuel RTU option#446

Open
JanghyunJK wants to merge 242 commits intomainfrom
jk/duelfuelrtu
Open

HPRTU measure: carrier's dual fuel RTU option#446
JanghyunJK wants to merge 242 commits intomainfrom
jk/duelfuelrtu

Conversation

@JanghyunJK
Copy link
Contributor

@JanghyunJK JanghyunJK commented Jan 14, 2026

Pull request overview

coming from DualFuelRTU project:

  • expanding existing HPRTU measure to reflect Carrier's dual fuel RTU (48QE model) performance

  • other than some clean ups in the measure script, major implementations/changes are,

    • performance maps:

      image
    • hybrid gas coil:


      • initially tried implementing as close as possible to the real control (i.e., SAT based control) as shown below but decided to go with simpler approach (i.e., load based control) after a discussion with @eringold @ChristopherCaradonna which is more fair to ComStock baseline models.
      image
      • ended up using Coil:UserDefined object for modeling two-stage hybrid gas coil. because of the suspected issue with the OS forward translator, this is how the final model looks like in terms of branch structure:
      image
      • applied realistic gas coil capacities from catalog data:
      image
      • single model test results 1:

        • HP sized @ 0F and HP compressor lockout @ 0F
        image
        • HP sized @ 47F and HP compressor lockout @ 32F
        image

      • single model test results 2:

        • HP sized @ 0F and HP compressor lockout @ 0F
        image
        • HP sized @ 47F and HP compressor lockout @ 32F
        image
  • remaining TODOs:

    • just noticed, I have to let the hybrid gas coil to run when compressor is locked out.
    • I do need to do the rubocop

Pull Request Author

This pull request makes changes to (select all the apply):

  • Documentation
  • Infrastructure (includes apptainer image, buildstock batch, dependencies, continuous integration tests)
  • Sampling
  • Workflow Measures
  • Upgrade Measures
  • Reporting Measures
  • Postprocessing

Pull Request Author Checklist:

  • Tagged the pull request with the appropriate label (documentation, infrastructure, sampling, workflow measure, upgrade measure, reporting measure, postprocessing) to help categorize changes in the release notes.
  • Added or edited tests for measures that adequately cover anticipated cases
  • New or changed register values reflected in comstock_column_definitions.csv
  • Both options_lookup.tsv files updated
  • New measure tests add to to test/reporting_measure_tests.txt, test/workflow_measure_tests.txt, or test/upgrade_measure_tests.txt
  • Added 'See ComStock License' language to first two lines of each code file
  • Run rubocop and check log
  • Updated measure .xml(s)
  • Ran 10k+ test run and checked failure rate to make sure no new errors were introduced
  • Measure documentation written or updated
  • ComStock documentation written or updated
  • Change document written and assigned to a reviewer
  • Changes reflected in example .yml files and README.md files

Pull Request Reviewer Checklist:

  • Perform a code review on GitHub
  • All changes have been implemented: data, methods, tests, documentation
  • If fixing a defect, verify by running main branch to reproduce the defect and the PR branch to verify the fix
  • Measure tests written and adequately cover anticipated cases
  • Run measure tests and ensure they pass
  • New measure tests add to to test/reporting_measure_tests.txt, test/workflow_measure_tests.txt, or test/upgrade_measure_tests.txt
  • Ensured code files contain License reference
  • Run rubocop and check log
  • Measure .xml updated
  • CI status: all tests pass
  • ComStock documentation adequately describes the new assumptions
  • Reviewed change documentation, results differences are reasonable, and no new errors introduced
  • Author has addressed comments in change documentation
  • .yml and README.md files updated

ComStock Licensing Language - Add to Beginning of Each Code File

# ComStock™, Copyright (c) 2025 Alliance for Sustainable Energy, LLC. All rights reserved.
# See top level LICENSE.txt file for license terms.

kflemin and others added 30 commits August 27, 2025 13:35
* fix missing district emissions in postproc

- add district emissions columns, add to naming mixin, and list downselect option in log

* Update comstock_to_cbecs_comparison.py

Don't try to plot end use stacked bar comparisons unless there are at least 2 discrete values in the groupby column. For now, this means 2 different comstock runs. May edit later to accommodate CBECS.
Turn off equipment counts (HVAC and water heater)
Comment on lines 1545 to 1553
ems_dx_load_during_hybrid_heating = OpenStudio::Model::EnergyManagementSystemOutputVariable.new(model,g_dx_load_during_hybrid_heating)
ems_dx_load_during_hybrid_heating.setName("#{ems_name_airloop}_dx_load_during_hybrid_heating")
ems_dx_load_during_hybrid_heating.setEMSVariableName("#{g_dx_load_during_hybrid_heating.name}")
ems_dx_load_during_hybrid_heating.setTypeOfDataInVariable("Averaged")
ems_dx_load_during_hybrid_heating.setUpdateFrequency("SystemTimeStep")
ems_dx_load_during_hybrid_heating.setUnits("W")
output_var = OpenStudio::Model::OutputVariable.new("#{ems_dx_load_during_hybrid_heating.name}", model)
output_var.setKeyValue("*")
output_var.setReportingFrequency("Hourly")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the DX heating load only/during hybrid heating is on. so can be used to calculated gas usage for operating scenario when compressor is locked out when gas coil is on.

@JanghyunJK
Copy link
Contributor Author

@eringold review ready!! Unit test / simulation validation results shown in these slides. And I'm going to add some highlights of the simulation unit test below.

# -----------------------------
# Main test runner
# -----------------------------
def test_dual_fuel_rtu_example_models
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is where the simulation unit test starts.

Comment on lines 2783 to 2785
'310_retailstandalone_DC.osm' => 'G5101370.epw',
'310_retailstandalone_MA.osm' => 'G0900110.epw',
'310_retailstandalone_MN.osm' => 'G2701230.epw',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with three different models

'310_retailstandalone_MN.osm' => 'G2701230.epw',
}

hp_lockout_temps = [-10, 0, 17, 47]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and 4 different lockout temps

Comment on lines 2911 to 2916
# 1. HP Usage Check: Lower Lockout -> More HP runtime -> Higher HP kWh
if (l_hp_kwh - h_hp_kwh).abs / h_hp_kwh > 0.1 # Only assert if there's a meaningful difference to avoid noise
assert(
l_hp_kwh > h_hp_kwh,
"Trend Error (HP kWh) for #{metadata}: At #{l_temp}F, HP usage should be > than at #{h_temp}F."
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert

Comment on lines 2919 to 2924
# 2. Defrost Check: Lower Lockout -> More runtime in frost zones -> Higher Defrost kWh
if (l_defrost - h_defrost).abs / h_defrost > 0.1 # Only assert if there's a meaningful difference to avoid noise
assert(
l_defrost > h_defrost,
"Trend Error (Defrost) for #{metadata}: At #{l_temp}F, Defrost should be > than at #{h_temp}F."
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert

Comment on lines 2927 to 2932
# 3. Gas Check: Lower Lockout -> Less reliance on boiler -> Lower Gas kWh
if (l_gas - h_gas).abs / h_gas > 0.1 # Only assert if there's a meaningful difference to avoid noise
assert(
l_gas < h_gas,
"Trend Error (Gas) for #{metadata}: At #{l_temp}F, Gas usage should be < than at #{h_temp}F."
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert

Comment on lines +2968 to +2972
assert(
gas_equiv_kwh >= min_expected_gas && gas_equiv_kwh <= max_expected_gas,
"COP Range Error for #{metadata}: Gas equiv (#{gas_equiv_kwh.round(2)}) is outside " \
"expected range based on HP Delta of #{hp_kwh_delta.round(2)} kWh."
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

upgrade measure PR improves or adds upgrade measures

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants