Skip to content
New issue

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

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

Already on GitHub? # to your account

Enable Heat Recovery Chiller Fields #4724

Closed
mdahlhausen opened this issue Oct 25, 2022 · 3 comments · Fixed by #4726
Closed

Enable Heat Recovery Chiller Fields #4724

mdahlhausen opened this issue Oct 25, 2022 · 3 comments · Fixed by #4726

Comments

@mdahlhausen
Copy link
Collaborator

Enhancement Request

This is a feature request to enable heat recovery chiller modeling in OpenStudio.

Detailed Description

More specifically, this is a feature request to:
(1) enable and fix field setters for heat recovery chiller inputs
(2) provide a working openstudio example model with a heat recovery chiller

Background:
I'm attempting to emulate a heat recovery chiller scheme in OpenStudio that is doable in EnergyPlus.
See the FTLB_HRC.idf attached.

heat_recovery_chiller.zip

I have a ruby script that adjusts a base model equipment temperatures, adds a heat recovery loop, and adds a heat recovery chiller. However, I cannot manage to set the ChillerElectricEIR fields to enable heat recovery operation. The setHeatRecoveryLeavingTemperatureSetpointNode method runs without an error, but fails to set the node in the model. Also, there is no method to set the 'Heat Recovery Inlet Node Name' and 'Heat Recovery Outlet Node Name' fields.

Related to #4311

Possible Implementation

Setting node names directly is probably not what we want. Typically we add equipment with the addSupplyBranchForComponent() or addDemandBranchForComponent() methods on a PlantLoop object. One options is to make an addHeatRecoveryBranchForComponent method that sets the nodes for the chiller, or a method tied to the chiller object addSupplyHeatRecoveryBranch(<OS:PlantLoop>) (preferred).

@mdahlhausen mdahlhausen added Enhancement Request Triage Issue needs to be assessed and labeled, further information on reported might be needed labels Oct 25, 2022
@tijcolem tijcolem added component - Model and removed Triage Issue needs to be assessed and labeled, further information on reported might be needed labels Oct 26, 2022
@tijcolem tijcolem added this to the OpenStudio SDK 3.6.0 milestone Oct 26, 2022
@jmarrec
Copy link
Collaborator

jmarrec commented Oct 27, 2022

@mdahlhausen This is already partially implemented.

include OpenStudio::Model
m = Model.new
cndLoop = PlantLoop.new(m)
chwLoop = PlantLoop.new(m)
hrLoop = PlantLoop.new(m)
ch = ChillerElectricEIR.new(m)
chwLoop.addSupplyBranchForComponent(ch)
cndLoop.addDemandBranchForComponent(ch)
hrLoop.addDemandBranchForComponent(ch)
=> [openstudio.model.ChillerElectricEIR] <0> Calling addToTertiaryNode to connect it to the tertiary (=Heat Recovery Loop) loop for Object of type 'OS:Chiller:Electric:EIR' and named 'Chiller Electric EIR 1'
=> true
puts ch
OS:Chiller:Electric:EIR,
  {b040fa1f-f206-454e-ac2e-6468c3bba8ad}, !- Handle
  Chiller Electric EIR 1,                 !- Name
  Autosize,                               !- Reference Capacity {W}
  5.5,                                    !- Reference COP {W/W}
  ,                                       !- Reference Leaving Chilled Water Temperature {C}
  ,                                       !- Reference Entering Condenser Fluid Temperature {C}
  Autosize,                               !- Reference Chilled Water Flow Rate {m3/s}
  ,                                       !- Reference Condenser Fluid Flow Rate {m3/s}
  {69d8bb32-352d-4999-847f-752d935bab2f}, !- Cooling Capacity Function of Temperature Curve Name
  {523248f1-9a17-4af3-911a-be3cc9e0a4b8}, !- Electric Input to Cooling Output Ratio Function of Temperature Curve Name
  {39b45e88-985a-4476-97c9-6ac2d9de79b8}, !- Electric Input to Cooling Output Ratio Function of Part Load Ratio Curve Name
  ,                                       !- Minimum Part Load Ratio
  ,                                       !- Maximum Part Load Ratio
  ,                                       !- Optimum Part Load Ratio
  ,                                       !- Minimum Unloading Ratio
  {cff9f947-287b-416b-a171-c0af07a90f97}, !- Chilled Water Inlet Node Name
  {2375e7b9-f079-4fcc-91b4-9856313313cd}, !- Chilled Water Outlet Node Name
  {64143aad-a2c0-45fe-930f-9dd0f50d41e3}, !- Condenser Inlet Node Name
  {ba07517c-528c-4958-b585-2d957ecb1e6b}, !- Condenser Outlet Node Name
  WaterCooled,                            !- Condenser Type
  ,                                       !- Condenser Fan Power Ratio {W/W}
  ,                                       !- Fraction of Compressor Electric Consumption Rejected by Condenser
  ,                                       !- Leaving Chilled Water Lower Temperature Limit {C}
  ,                                       !- Chiller Flow Mode
  Autosize,                               !- Design Heat Recovery Water Flow Rate {m3/s}
+  {1858909b-3abb-40b9-8983-d3de191752f0}, !- Heat Recovery Inlet Node Name
+  {4188fe54-d459-486f-b6b5-c126678de0f5}, !- Heat Recovery Outlet Node Name
  1,                                      !- Sizing Factor
  0,                                      !- Basin Heater Capacity {W/K}
  10,                                     !- Basin Heater Setpoint Temperature {C}
  ,                                       !- Basin Heater Operating Schedule Name
  1,                                      !- Condenser Heat Recovery Relative Capacity Fraction
  ,                                       !- Heat Recovery Inlet High Temperature Limit Schedule Name
  ,                                       !- Heat Recovery Leaving Temperature Setpoint Node Name
  General;                                !- End-Use Subcategory

@jmarrec
Copy link
Collaborator

jmarrec commented Oct 27, 2022

If you want to be explicit about which loop you intend to connect to, you can also always call chiller.addToTertiaryNode (but you need to make your own branch yourself).

I am seeing the issue with the setHeatRecoveryLeavingTemperatureSetpointNode though. It's an IDD issue.

--- a/resources/model/OpenStudio.idd
+++ b/resources/model/OpenStudio.idd
@@ -13597,11 +13597,11 @@ OS:Chiller:Electric:EIR,
   A16, \field Heat Recovery Leaving Temperature Setpoint Node Name
        \note This optional field provides control over the heat recovery
        \note Using this triggers a model more suited to series bundle and chillers with higher temperature heat recovery
        \note If this field is not used, the bundles are modeled as being in parallel
        \type object-list
-       \object-list ConnectionNames
+       \object-list Node
   A17; \field End-Use Subcategory

@jmarrec
Copy link
Collaborator

jmarrec commented Oct 27, 2022

Damn, I suppose you'll also want to put a SPM on that node, like a SetpointManager::Scheduled. Except we disallow placing a SPM on the demand side of a plant loop when the node is on a branch... Before the Splitter, after the Mixer is fine though...

I'm torn between removing this check (and remove a valid check for the vast majority of users), or force advanced users doing HR to use the mixer outlet node instead.

Edit: Or use the setString/setPointer approach...

hrOutletNode = ch.tertiaryOutletModelObject.get.to_Node.get
spm = SetpointManagerScheduled.new(m, ScheduleConstant.new(m))
spm.addToNode(hrOutletNode)
[openstudio.model.SetpointManager] <-1> Object of type 'OS:SetpointManager:Scheduled' and named 'Setpoint Manager Scheduled 1' cannot be added on a demand branch
=> false
idx = spm.iddObject.numFields.times.select{|i| spm.iddObject.getField(i).get.name.include?('Setpoint Node') }.first
raise if idx.nil?
spm.setPointer(idx, hrOutletNode.handle())
=> true

puts spm

OS:SetpointManager:Scheduled,
  {61d7be49-a724-43b5-995d-8f26e77eacc9}, !- Handle
  Setpoint Manager Scheduled 1,           !- Name
  Temperature,                            !- Control Variable
  {d959a999-a4b2-4380-8cdc-56f715f88c51}, !- Schedule Name
  {2e8204e0-8a54-4307-a993-2df5c56d50ab}; !- Setpoint Node or NodeList Name

jmarrec added a commit that referenced this issue Oct 27, 2022
jmarrec added a commit that referenced this issue Oct 31, 2022
Fix #4724 - ChillerElectricEIR correctly set Heat Recovery Leaving Temperature Setpoint Node
# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
3 participants