Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Electric panel #1853

Open
wants to merge 195 commits into
base: master
Choose a base branch
from
Open

Electric panel #1853

wants to merge 195 commits into from

Conversation

joseph-robertson
Copy link
Collaborator

@joseph-robertson joseph-robertson commented Oct 10, 2024

Pull Request Description

Support electric panel.

Related to: hpxmlwg/hpxml#420 and hpxmlwg/hpxml#435.

Checklist:

  • Rename Watts under ServiceFeeder to something else; Power? Capacity? Decided on PowerRating.
  • Move all system-prefixed arguments to panel-prefixed, so new electric_panel_xxx arguments section maps more directly to ElectricPanels HPXML section
  • Make "Mech Vent" its own panel load type for ventilation fans (i.e., any load that can reference a system ID has its own load type)
  • Create catchall argument for covering "Other" loads like garage door opener, garbage disposal, microwave (i.e., anything that doesn't reference a system ID)
  • Separate arguments for controlling 83 and 87 outputs?
    • We may not want 87 for resstock -- can't we just ignore them?
  • Comments/suggestions from Scott:
    • Meter-based total can change based on use of stochastic schedules and/or timestep.
    • Move HPXML class input capacity methods to HVAC resource file so they are only used for panel loads (and we can ignore fuel systems)
    • Separate results_panel.csv (unit reporting?) which is output from translator measure and then overwritten (with Meter-based) from reporting measure. See results_design_load_details.csv as an example.
    • Start discussion on adopting new extension elements: Subpanels, circuits, breakers/slots, smart features, etc on ElectricPanel hpxmlwg/hpxml#422 (comment)
    • Electric panel should be opt-in using new build measure argument for panel scenario types.
  • Handle the new backup_heating_capacity input for HPWH; assume no simultaneous operation and so take max(heating_capacity, backup_heating_capacity)? Can the 120V HPWH have backup?
  • Pool and permanent spa
    • There is no pump type arguments -- build measure defaults to Unknown; add new arguments? Update: we default based on a 2 HP pump capacity.
  • Default watts based on input capacity and not output capacity
    • Divide output capacity by seasonal COP (e.g., SEER, HSPF) or by rated COP (e.g., additional_properties.heat_rated_cops, additional_properties.cool_rated_cops)?
    • For HeatingSystem, CoolingSystem, HeatPump: add heating_input_capacity, cooling_input_capacity, and backup_heating_input_capacity methods to hpxml.rb
    • For WaterHeatingSystem: add heating_input_capacity and backup_heating_input_capacity methods to hpxml.rb (additional_properties.cop set by Waterheater.set_heat_pump_cop)
  • Get alternative/better defaults:
    • Replace regressions:
      • DX coil compressor power rating from rated capacity
        • Yingli is looking at correlation with EER2 (not strong); going back to using rated capacity as the input
        • will be updating the work plan with new equations
      • Air handler / wall furnace fan: fan_watts_per_cfm * xxx_airflow_cfm? Yes.
      • Pump: electric_auxiliary_energy / 2.08? Yes.
    • Clothes dryer
      • How to determine HP or not? Let's just use vented/ventless as the switch -- probably the best option at this point in time.
    • Mechanical ventilation:
      • Use count and fan_power? Yes.
      • Should local ventilation (i.e., kitchen and bath fans) really occupy at most 1 breaker space? Yes.

Checklist

Not all may apply:

  • Schematron validator (EPvalidator.xml) has been updated
  • Sample files have been added/updated (openstudio tasks.rb update_hpxmls)
  • Tests have been added/updated (e.g., HPXMLtoOpenStudio/tests/test*.rb and/or workflow/tests/test*.rb)
  • Documentation has been updated
  • Changelog has been updated
  • openstudio tasks.rb update_measures has been run
  • No unexpected changes to simulation results of sample files

@joseph-robertson joseph-robertson added the enhancement New feature or request label Oct 10, 2024
@joseph-robertson joseph-robertson self-assigned this Oct 10, 2024
@joseph-robertson joseph-robertson marked this pull request as ready for review January 16, 2025 22:55
Copy link
Collaborator

@lixiliu lixiliu left a comment

Choose a reason for hiding this comment

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

Thanks for the making all these cases! It's a lot to think through.

I should follow up with you about getting the capacity value for each of the HVAC configs so I can also check the load values.

_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 0, 0)
_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 2011, 1)
Copy link
Collaborator

Choose a reason for hiding this comment

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

For 120V room AC, we assume they can plug into existing receptacles, so 0 breaker spaces.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Why not assume dedicated circuit here like all other 120V system types?

Copy link
Collaborator

@lixiliu lixiliu Jan 23, 2025

Choose a reason for hiding this comment

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

I am thinking more about their usage in terms of an upgrade. People installing new 120V room ACs will unlikely be installing a new dedicated branch circuit for it. Instead, they will plug into an existing receptacle circuit that do not have other loads plugged in, which also counts as a dedicated circuit. This is also the case for most level 2 EV chargers.

When we add the appropriate number of general lighting/receptacle branch circuits later (via NREL/resstock#1341), it may become a bit clearer that we are accounting for plug loads like room ACs as part of receptacles.

_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 295, 1)
_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 300 + 4022, 2)
Copy link
Collaborator

Choose a reason for hiding this comment

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

For this combo, the central AC would share the 120V AHU. So it's 295 + 4022, if 295 is for the 120V AHU.

Copy link
Collaborator

Choose a reason for hiding this comment

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

It's a bit awkward that each of these returns the total required for load but partial count for spaces because we take the max of heating/cooling, but sum the breaker spaces. E.g., for cooling, 2 is for the ODU only but works here because we sum the breaker spaces.

I don't have a good suggestion here, but just wanted to point it out.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I think this applies to several of your comments below, but didn't we decide that blower fan power would be determined using fan W/cfm multiplied by airflow cfm?

From the current version of RTD:
image

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 295 + 10551, 2)
Copy link
Collaborator

Choose a reason for hiding this comment

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

For furnace with CAC, we should always let heating dictate the AHU load. It's a 240V AHU here. Cooling would be 295 + 4022, if 295 is the load for the 240 AHU.

_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 393 + 14067, 4)
_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 300 + 4022, 2)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Cooling would be 393 + 4022 per logic above

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 295, 1)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Is this using the 120V AHU regression? Because for the electric furnace only in the next example, the AHU load is the same.

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 210 + 3114 + 96, 3)
Copy link
Collaborator

Choose a reason for hiding this comment

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

See above

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 202 + 5839, 2)
Copy link
Collaborator

Choose a reason for hiding this comment

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

AHU load should be the same between heating and cooling.

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 202 + 5839 + 10551, 6)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Heating breaker space: 202+10551 = 10753 -> 2 for indoor + 2 for outdoor = 4
0 for cooling

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Where'd the 5839 go?

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 42 + 3114 + 17584, 6)
Copy link
Collaborator

Choose a reason for hiding this comment

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

No AHU load, where does the 42 come from? 4 spaces for backup + 2 for HP, 6 is right.

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power_and_breaker_spaces(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 42 + 3114 + 655, 3)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Same question about 42, 3 spaces is right

Copy link
Collaborator

@lixiliu lixiliu left a comment

Choose a reason for hiding this comment

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

Some more comments

_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 0)
_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 400 + 4022)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why is AHU 400 here when it was 300 in the last example and both ODUs are 4022?

Copy link
Collaborator

Choose a reason for hiding this comment

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

0.5 W/cfm for CAC only and 0.375W/cfm for attachedToFurnace

_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 393 + 14067)
_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 300 + 4022)
Copy link
Collaborator

Choose a reason for hiding this comment

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

This tells me heating and cooling have different flow rates, which is fine. Ideally, AHU load should be the same between heating and cooling since it is shared. Maybe it is a wishlist item.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Alternatively, we could:

  • take the max of heating and cooling air handler loads (the proposed fix)
  • always take the heating air handler load

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 82 + 10766)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Do gas and electric boiler not use the same pump? Wondering why it is 96 for gas and 82 for electric here (assuming heating capacity is the same).

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Is there an inconsistency in the docs around EAE for in-unit boilers? Elec gives 170 and gas gives 200...

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 96 + 11468)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Numbers are different than "Electric boiler only" example

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 96 + 15291)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Does heating capacity increase flow rate?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

No. See previous EAE comment.


_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 202 + 5839 + 10551)
_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 216 + 5839)
_test_occupied_spaces(hpxml_bldg, [HPXML::ElectricPanelLoadTypeHeating, HPXML::ElectricPanelLoadTypeCooling], 6)
Copy link
Collaborator

Choose a reason for hiding this comment

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

4 here. (202+10551) = 10753 < 12000, 2 slots for IDU + 2 slots for ODU = 4


_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 202 + 5839)
_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeCooling, 216 + 5839)
_test_occupied_spaces(hpxml_bldg, [HPXML::ElectricPanelLoadTypeHeating, HPXML::ElectricPanelLoadTypeCooling], 4)
Copy link
Collaborator

Choose a reason for hiding this comment

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

3

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This is like ASHP w/integrated gas backup switchover.

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 84 + 5839)
Copy link
Collaborator

Choose a reason for hiding this comment

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

No AHU load right?

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 42 + 3114 + 17584)
Copy link
Collaborator

Choose a reason for hiding this comment

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

No AHU load, MSHP + baseboard here

XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_model, _hpxml, hpxml_bldg = _test_measure(args_hash)

_test_service_feeder_power(hpxml_bldg, HPXML::ElectricPanelLoadTypeHeating, 42 + 3114 + 655)
Copy link
Collaborator

Choose a reason for hiding this comment

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

What is the 655 here? The gas furnace?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
Status: In progress
Development

Successfully merging this pull request may close these issues.

5 participants