Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions idd/Energy+.idd.in
Original file line number Diff line number Diff line change
Expand Up @@ -76318,6 +76318,7 @@ HeatPump:AirToWater,
A5, \field Operating Mode Control Option for Multiple Unit
\note this determines how the operation mode is assigned when the load
\note is too large to be met by multiple heat pump units
\type choice
Copy link
Contributor

@jmarrec jmarrec Oct 6, 2025

Choose a reason for hiding this comment

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

I added this missing type.

I'm currently trying to scope how I would wrap this object in the OpenStudio SDK.

I had already figured I would probably break the heating/cooling speeds into subobjects, but I might actually break the cooling and heating side into two subobjects too.

Have you considered this versus a large object (105 fields)? Just curious.

https://docs.google.com/spreadsheets/d/1uCcEdmM4p3M9L7HeihAwL9F9NawK1TR8j3ADBqS6jTs/edit?usp=sharing

Placement of field "Minimum Part Load Ratio" is strange to me, it's "stuck" between heating-related fields

Copy link
Contributor

Choose a reason for hiding this comment

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

Why did you pick "min-fields 56"?

Copy link
Contributor

Choose a reason for hiding this comment

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

I don't understand the booster mode for cooling/heating. Didn't find an entry in the Engineering reference.

Copy link
Contributor

@jmarrec jmarrec Oct 6, 2025

Choose a reason for hiding this comment

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

Essentially, this appears to just allow using 6 speeds instead of 5, but that sixth speed isn't used to determine the reference Capacity and COP (edit: this statement is apparently wrong)

Copy link
Contributor

Choose a reason for hiding this comment

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

I think there's a weirdness and potential error in the way the reference capacity is set.

I/O ref says

The maximum number of speeds allowed is 5. Speed level 1 is the lowest speed; and speed level 5 is the highest
speed.

Rated heating capacity at speed i, where i is the speed number from 1 to 5. For speed 1, the default value is autosize.

So, it seems that the reference Capacity is taken at speed 1, and the flag referenceCapacityWasAutoSized is set based on that

if (i == 0) {
thisAWHP.referenceCapacity = thisAWHP.ratedCapacity[0] = state.dataInputProcessing->inputProcessor->getRealFieldValue(
fields, schemaProps, format("rated_{}_capacity_at_speed_1", modeKeyWord));
if (thisAWHP.ratedCapacity[0] == DataSizing::AutoSize) {
thisAWHP.referenceCapacityWasAutoSized = true;
}

Then it's assigned to speed 5 here:

thisAWHP.referenceCapacityOneUnit = thisAWHP.ratedCapacity[thisAWHP.numSpeeds - 1];
thisAWHP.referenceCapacity = thisAWHP.referenceCapacityOneUnit * thisAWHP.heatPumpMultiplier;
thisAWHP.referenceCOP = thisAWHP.ratedCOP[thisAWHP.numSpeeds - 1];

Copy link
Contributor

Choose a reason for hiding this comment

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

  • If speed 5 is the nominal speed level, shouldn't it be the one carrying the "autosize"? And shouldn't the thisAWHP.ratedCapacity[thisAWHP.numSpeeds - 1] be reassigned the autosized capacity?

  • It seems that if you have a booster mode, the block on line 4270 to 4272 actually takes the booster mode as a the reference capacity. is that correct?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Have you considered this versus a large object (105 fields)? Just curious.

The intention was so that it resembles the real equipment, whose heating and cooling functionality is usually encapsulated in one piece of equipment. Although it would have been easier to implement with heating and cooling as separate component.

Placement of field "Minimum Part Load Ratio" is strange to me, it's "stuck" between heating-related fields

Indeed. I just moved it up to before the group of heating input.

Why did you pick "min-fields 56"?

It should be 77. To make sure the number of speeds for heating and cooling gets defaults if user didn't give inputs. I just changed it.

I don't understand the booster mode for cooling/heating. Didn't find an entry in the Engineering reference.

To my understanding, if the booster mode is enabled, the heat pump will have the ability to increase its capacity (increase compressor speed) further beyond the maximum, to meet a large demand. But this is usually at the cost of lower COP. If it's not enabled, the heat pump will operate at the maximum speed level and not meet the large demand.

I only have description of booster mode in IO reference as follows. I can add some more description of its intention to engineering reference.

Field: Booster Mode On Heating. This field is a flag that indicates
whether the heat pump has a booster mode enabled for heating operation. If the
flag is on, booster mode will be enabled and the heat pump will operate at a
higher capacity during heating operation. The default value is false, which
means booster mode is not enabled. When the booster mode is on, the following
performance fields are required.

Essentially, this appears to just allow using 6 speeds instead of 5, but that sixth speed isn't used to determine the reference Capacity and COP.

Yes, it will use another set of performance curves to represent the booster mode.
It is used to determine reference capacity and COP. Here when the booster mode is on, the curves, COP, capacity etc are added as another speed level. In the later calculation of reference COP and capacity, the booster mode data is considered as well.

                if (thisAWHP.boosterOn) {
                    thisAWHP.numSpeeds += 1;

I think there's a weirdness and potential error in the way the reference capacity is set.

Indeed, I will modify the code to have the highest speed level be autosizable (currently it's fixed at the lowest speed) and make the autosized capacity be reference capacity.

It seems that if you have a booster mode, the block on line 4270 to 4272 actually takes the booster mode as a the reference capacity. is that correct?

Yes, the booster mode is treated as a higher speed level and its capacity will be considered in the reference capacity

Copy link
Contributor

Choose a reason for hiding this comment

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

I guess my followup question is why do you need a booster speed in that case?

Just have the potential for 6 speeds. And the Nth highest speed is hte booster one. each speed level includes the curves, COP and capacity, so I don't understand how it's different from regular speeds?

Copy link
Contributor

Choose a reason for hiding this comment

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

(and thanks for the taking the time to answer the questions! I'm not trying to be difficult, this is just a byproduct of having to wrap this object in the OpenStudio SDK).

Dunno if you saw my question lower here; #11251 (comment)

Copy link
Contributor

Choose a reason for hiding this comment

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

The intention was so that it resembles the real equipment, whose heating and cooling functionality is usually encapsulated in one piece of equipment. Although it would have been easier to implement with heating and cooling as separate component.

FWIW, one does not prevent the other. We have a bunch of equipment that has a top-level wrapper object and logical subojects. (CentralHeatPumpSystem and ChillerHeaterPerformance:Electric:EIR to name one)

\key SingleMode
\key CoolingPriority
\key HeatingPriority
Expand Down
204 changes: 138 additions & 66 deletions testfiles/PlantLoopHeatPump_EIR_AirSource_and_AWHP.idf
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
! PlantLoopHeatPump_EIR_AirSource.idf
! PlantLoopHeatPump_EIR_AirSource_and_AWHP.idf
!
! Basic file description:
! The EIR formulated air-to-water heat pump is demonstrated using a simple collection of plant loops. Building loads
! The air-to-water heat pump HeatPump:AirToWater is demonstrated using a simple collection of plant loops. Building loads
! are represented using Plant Load Profile objects
! Run: 1 design day.
! Building: None.
! System: None.
! Plant: PLANT LOAD PROFILE with District Heating and Cooling as necessary.
! Plant: Both the heating loop and the cooling loop served by air-to-water heat pump.

Version,25.2;

Expand Down Expand Up @@ -321,13 +321,13 @@
2 , !- Number of Speeds for Heating
20000, !- Rated Heating Capacity at Speed 1
3.49, !- Rated COP for Heating at Speed 1
CapCurveFuncTemp, !- Normalized Heating Capacity Function of Temperature Curve Name at Speed 1
EIRCurveFuncTemp, !- Heating Energy Input Ratio Function of Temperature Curve Name at Speed 1
CapCurveFuncTempHT, !- Normalized Heating Capacity Function of Temperature Curve Name at Speed 1
EIRCurveFuncTempHT, !- Heating Energy Input Ratio Function of Temperature Curve Name at Speed 1
EIRCurveFuncPLR, !- Heating Energy Input Ratio Function of PLR Curve Name at Speed 1
40000, !- Rated Heating Capacity at Speed 2
3.51, !- Rated COP for Heating at Speed 2
CapCurveFuncTemp2, !- Normalized Heating Capacity Function of Temperature Curve Name at Speed 2
EIRCurveFuncTemp2, !- Heating Energy Input Ratio Function of Temperature Curve Name at Speed 2
CapCurveFuncTempHT2, !- Normalized Heating Capacity Function of Temperature Curve Name at Speed 2
EIRCurveFuncTempHT2, !- Heating Energy Input Ratio Function of Temperature Curve Name at Speed 2
EIRCurveFuncPLR2, !- Heating Energy Input Ratio Function of PLR Curve Name at Speed 2
, !- Rated Heating Capacity at Speed 3
, !- Rated COP for Heating at Speed 3
Expand All @@ -353,13 +353,13 @@
2, !- Number of Speeds for Cooling
200000, !- Rated Cooling Capacity at Speed 1
3.5, !- Rated COP for Cooling at Speed 1
CapCurveFuncTemp, !- Normalized Cooling Capacity Function of Temperature Curve Name at Speed 1
EIRCurveFuncTemp, !- Cooling Energy Input Ratio Function of Temperature Curve Name at Speed 1
CapCurveFuncTempCL, !- Normalized Cooling Capacity Function of Temperature Curve Name at Speed 1
EIRCurveFuncTempCL, !- Cooling Energy Input Ratio Function of Temperature Curve Name at Speed 1
EIRCurveFuncPLR, !- Cooling Energy Input Ratio Function of PLR Curve Name at Speed 1
400000, !- Rated Cooling Capacity at Speed 2
3.5, !- Rated COP for Cooling at Speed 2
CapCurveFuncTemp2, !- Normalized Cooling Capacity Function of Temperature Curve Name at Speed 2
EIRCurveFuncTemp2, !- Cooling Energy Input Ratio Function of Temperature Curve Name at Speed 2
CapCurveFuncTempCL2, !- Normalized Cooling Capacity Function of Temperature Curve Name at Speed 2
EIRCurveFuncTempCL2, !- Cooling Energy Input Ratio Function of Temperature Curve Name at Speed 2
EIRCurveFuncPLR2, !- Cooling Energy Input Ratio Function of PLR Curve Name at Speed 2
, !- Rated Cooling Capacity at Speed 3
, !- Rated COP for Cooling at Speed 3
Expand Down Expand Up @@ -432,37 +432,37 @@
Temperature; !- Output Unit Type

Curve:Biquadratic,
CapCurveFuncTemp, !- Name
0.5, !- Coefficient1 Constant
0.0, !- Coefficient2 x
0.0, !- Coefficient3 x**2
0.0, !- Coefficient4 y
0.0, !- Coefficient5 y**2
0.0, !- Coefficient6 x*y
5.0, !- Minimum Value of x
10.0, !- Maximum Value of x
24.0, !- Minimum Value of y
35.0, !- Maximum Value of y
, !- Minimum Curve Output
, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type
CapCurveFuncTempHT, !- Name
0.899, !- Coefficient1 Constant
-0.00045, !- Coefficient2 x
0.00021, !- Coefficient3 x**2
0.0185, !- Coefficient4 y
-0.0108, !- Coefficient5 y**2
0.000617, !- Coefficient6 x*y
30, !- Minimum Value of x
50, !- Maximum Value of x
-7, !- Minimum Value of y
20, !- Maximum Value of y
0.5, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Biquadratic,
EIRCurveFuncTemp, !- Name
1.0, !- Coefficient1 Constant
0.0, !- Coefficient2 x
0.0, !- Coefficient3 x**2
0.0, !- Coefficient4 y
0.0, !- Coefficient5 y**2
0.0, !- Coefficient6 x*y
5.0, !- Minimum Value of x
10.0, !- Maximum Value of x
24.0, !- Minimum Value of y
35.0, !- Maximum Value of y
, !- Minimum Curve Output
, !- Maximum Curve Output
EIRCurveFuncTempHT, !- Name
1.055, !- Coefficient1 Constant
0.00035, !- Coefficient2 y
-0.00027, !- Coefficient3 y**2
-0.0108, !- Coefficient4 x
0.0145, !- Coefficient5 x**2
-0.000230, !- Coefficient6 x*y
30, !- Minimum Value of x
50, !- Maximum Value of x
-7, !- Minimum Value of y
20, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.5, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type
Expand All @@ -475,6 +475,42 @@
0.0, !- Minimum Value of x
1.0; !- Maximum Value of x

Curve:Biquadratic,
CapCurveFuncTempCL, !- Name
0.900, !- Coefficient1 Constant
-0.00038, !- Coefficient2 x
-0.00042, !- Coefficient3 x**2
-0.0102, !- Coefficient4 y
0.0225, !- Coefficient5 y**2
-0.000210, !- Coefficient6 x*y
5, !- Minimum Value of x
15, !- Maximum Value of x
15, !- Minimum Value of y
45, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Biquadratic,
EIRCurveFuncTempCL, !- Name
0.980, !- Coefficient1 Constant
0.00021, !- Coefficient2 x
0.00019, !- Coefficient3 x**2
0.0068, !- Coefficient4 y
-0.0085, !- Coefficient5 y**2
0.000158, !- Coefficient6 x*y
5, !- Minimum Value of x
15, !- Maximum Value of x
15, !- Minimum Value of y
45, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Quadratic,
CrankCaseHeaterPowerCurve, !- Name
1.0, !- Coefficient1 Constant
Expand Down Expand Up @@ -588,37 +624,73 @@
INTERMITTENT; !- Pump Control Type

Curve:Biquadratic,
CapCurveFuncTemp2, !- Name
0.8, !- Coefficient1 Constant
0.02, !- Coefficient2 x
0.0, !- Coefficient3 x**2
0.0, !- Coefficient4 y
0.0, !- Coefficient5 y**2
0.0, !- Coefficient6 x*y
5.0, !- Minimum Value of x
10.0, !- Maximum Value of x
24.0, !- Minimum Value of y
35.0, !- Maximum Value of y
, !- Minimum Curve Output
, !- Maximum Curve Output
CapCurveFuncTempHT2, !- Name
0.885, !- Coefficient1 Constant
-0.00040, !- Coefficient2 x
0.00019, !- Coefficient3 x**2
0.0202, !- Coefficient4 y
-0.0096, !- Coefficient5 y**2
0.000580, !- Coefficient6 x*y
30, !- Minimum Value of x
50, !- Maximum Value of x
-7, !- Minimum Value of y
20, !- Maximum Value of y
0.5, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Biquadratic,
EIRCurveFuncTemp2, !- Name
1.0, !- Coefficient1 Constant
0.0, !- Coefficient2 x
0.0, !- Coefficient3 x**2
0.0, !- Coefficient4 y
0.0, !- Coefficient5 y**2
0.0, !- Coefficient6 x*y
5.0, !- Minimum Value of x
10.0, !- Maximum Value of x
24.0, !- Minimum Value of y
35.0, !- Maximum Value of y
, !- Minimum Curve Output
, !- Maximum Curve Output
EIRCurveFuncTempHT2, !- Name
1.055, !- Coefficient1 Constant
0.00035, !- Coefficient2 x
-0.00027, !- Coefficient3 x**2
-0.0108, !- Coefficient4 y
0.0145, !- Coefficient5 y**2
-0.000230, !- Coefficient6 x*y
30, !- Minimum Value of x
50, !- Maximum Value of x
-7, !- Minimum Value of y
20, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.5, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Biquadratic,
CapCurveFuncTempCL2, !- Name
0.910, !- Coefficient1 Constant
-0.00034, !- Coefficient2 x
-0.00040, !- Coefficient3 x**2
-0.0096, !- Coefficient4 y
0.0208, !- Coefficient5 y**2
-0.000205, !- Coefficient6 x*y
5, !- Minimum Value of x
15, !- Maximum Value of x
15, !- Minimum Value of y
45, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type

Curve:Biquadratic,
EIRCurveFuncTempCL2, !- Name
0.990, !- Coefficient1 Constant
0.00019, !- Coefficient2 x
0.00017, !- Coefficient3 x**2
0.0075, !- Coefficient4 y
-0.0078, !- Coefficient5 y**2
0.000165, !- Coefficient6 x*y
5, !- Minimum Value of x
15, !- Maximum Value of x
15, !- Minimum Value of y
45, !- Maximum Value of y
0.7, !- Minimum Curve Output
1.3, !- Maximum Curve Output
Temperature, !- Input Unit Type for X
Temperature, !- Input Unit Type for Y
Dimensionless; !- Output Unit Type
Expand Down
Loading
Loading