Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question

Revision history [back]

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Example using an explicit ZoneHVACIdealLoadsAirSystem

In [1]: # Create an Example model m = OpenStudio::Model::exampleModel() # It has one zone, connected to a AirLoopHVAC, we remove it m.getAirLoopHVACs[0].remove

# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m) i.addToThermalZone(z)

In [2]: puts i # Notice DSOA is empty... Out[2]: OS:ZoneHVAC:IdealLoadsAirSystem, {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type , !- Design Specification Outdoor Air Object Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}

In [3]: # Translate to E+ w = ft.translateModel(m)

In [4]: # Show result puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]: ZoneHVAC:IdealLoadsAirSystem, Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name Node 3, !- Zone Supply Air Node Name Node 2, !- Zone Exhaust Air Node Name , !- System Inlet Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type Design Specification Outdoor Air 1, !- Design Specification Outdoor Air Object Name , !- Outdoor Air Inlet Node Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Example using an explicit ZoneHVACIdealLoadsAirSystem

In [1]:
 # Create an Example model
 m = OpenStudio::Model::exampleModel()
 # It has one zone, connected to a AirLoopHVAC, we remove it
  m.getAirLoopHVACs[0].remove

m.getAirLoopHVACs[0].remove # We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m) i.addToThermalZone(z)

i.addToThermalZone(z) In [2]: puts i # Notice DSOA is empty... Out[2]: OS:ZoneHVAC:IdealLoadsAirSystem, {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type , !- Design Specification Outdoor Air Object Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}

{dimensionless} In [3]: # Translate to E+ w = ft.translateModel(m)

ft.translateModel(m) In [4]: # Show result puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType) Out[4]: ZoneHVAC:IdealLoadsAirSystem, Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name Node 3, !- Zone Supply Air Node Name Node 2, !- Zone Exhaust Air Node Name , !- System Inlet Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type Design Specification Outdoor Air 1, !- Design Specification Outdoor Air Object Name , !- Outdoor Air Inlet Node Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}

{dimensionless}

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Example using an explicit ZoneHVACIdealLoadsAirSystem

Proof in action

Initial setup

In [1]:
# Create an Example model
model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove

# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")

Using an explicit ZoneHVACIdealLoadsAirSystem

In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)


In [2]: [3]: puts i # Notice DSOA is empty...
Out[2]:
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
  {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
  {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  ,                                       !- Design Specification Outdoor Air Object Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}


In [3]:
[4]:
# Translate to E+
w = ft.translateModel(m)


In [4]:
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  Node 3,                                 !- Zone Supply Air Node Name
  Node 2,                                 !- Zone Exhaust Air Node Name
  ,                                       !- System Inlet Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  Design Specification Outdoor Air 1, DSOA 0.6 ACH,                           !- Design Specification Outdoor Air Object Name
  ,                                       !- Outdoor Air Inlet Node Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}

Using setUseIdealAirLoads

In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)

puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
  Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
  Thermal Zone 1,                         !- Zone or ZoneList Name
  {03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
  AirChanges/Hour,                        !- Design Flow Rate Calculation Method
  ,                                       !- Design Flow Rate {m3/s}
  ,                                       !- Flow Rate per Zone Floor Area {m3/s-m2}
  ,                                       !- Flow Rate per Person {m3/s-person}
  0.6,                                    !- Air Changes per Hour {1/hr}
  ,                                       !- Ventilation Type
  ,                                       !- Fan Pressure Rise {Pa}
  ,                                       !- Fan Total Efficiency
  ,                                       !- Constant Term Coefficient
  ,                                       !- Temperature Term Coefficient
  ,                                       !- Velocity Term Coefficient
  ;                                       !- Velocity Squared Term Coefficient

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Proof in action

ruby puts "hello world!'

Initial setup

In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove

# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")

Using an explicit ZoneHVACIdealLoadsAirSystem

In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)


In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
  {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
  {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  ,                                       !- Design Specification Outdoor Air Object Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}


In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  Node 3,                                 !- Zone Supply Air Node Name
  Node 2,                                 !- Zone Exhaust Air Node Name
  ,                                       !- System Inlet Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  DSOA 0.6 ACH,                           !- Design Specification Outdoor Air Object Name
  ,                                       !- Outdoor Air Inlet Node Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}

Using setUseIdealAirLoads

In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)

puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
  Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
  Thermal Zone 1,                         !- Zone or ZoneList Name
  {03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
  AirChanges/Hour,                        !- Design Flow Rate Calculation Method
  ,                                       !- Design Flow Rate {m3/s}
  ,                                       !- Flow Rate per Zone Floor Area {m3/s-m2}
  ,                                       !- Flow Rate per Person {m3/s-person}
  0.6,                                    !- Air Changes per Hour {1/hr}
  ,                                       !- Ventilation Type
  ,                                       !- Fan Pressure Rise {Pa}
  ,                                       !- Fan Total Efficiency
  ,                                       !- Constant Term Coefficient
  ,                                       !- Temperature Term Coefficient
  ,                                       !- Velocity Term Coefficient
  ;                                       !- Velocity Squared Term Coefficient

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Proof in action

ruby puts "hello world!'

Initial setup

In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove

# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")

Using an explicit ZoneHVACIdealLoadsAirSystem

In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)


In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
  {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
  {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  ,                                       !- Design Specification Outdoor Air Object Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}


In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  Node 3,                                 !- Zone Supply Air Node Name
  Node 2,                                 !- Zone Exhaust Air Node Name
  ,                                       !- System Inlet Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  DSOA 0.6 ACH,                           !- Design Specification Outdoor Air Object Name
  ,                                       !- Outdoor Air Inlet Node Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}

Using setUseIdealAirLoads

In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)

puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
  Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
  Thermal Zone 1,                         !- Zone or ZoneList Name
  {03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
  AirChanges/Hour,                        !- Design Flow Rate Calculation Method
  ,                                       !- Design Flow Rate {m3/s}
  ,                                       !- Flow Rate per Zone Floor Area {m3/s-m2}
  ,                                       !- Flow Rate per Person {m3/s-person}
  0.6,                                    !- Air Changes per Hour {1/hr}
  ,                                       !- Ventilation Type
  ,                                       !- Fan Pressure Rise {Pa}
  ,                                       !- Fan Total Efficiency
  ,                                       !- Constant Term Coefficient
  ,                                       !- Temperature Term Coefficient
  ,                                       !- Velocity Term Coefficient
  ;                                       !- Velocity Squared Term Coefficient

I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem HVACTemplate:Zone:IdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, ZoneHVAC:IdealLoadsAirSystem by E+, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Proof in action

Initial setup

In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove

# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")

Using an explicit ZoneHVACIdealLoadsAirSystem

In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)


In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
  {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
  {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  ,                                       !- Design Specification Outdoor Air Object Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}


In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  Node 3,                                 !- Zone Supply Air Node Name
  Node 2,                                 !- Zone Exhaust Air Node Name
  ,                                       !- System Inlet Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  DSOA 0.6 ACH,                           !- Design Specification Outdoor Air Object Name
  ,                                       !- Outdoor Air Inlet Node Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}

Using setUseIdealAirLoads

In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)

puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
  Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
  Thermal Zone 1,                         !- Zone or ZoneList Name
  {03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
  AirChanges/Hour,                        !- Design Flow Rate Calculation Method
  ,                                       !- Design Flow Rate {m3/s}
  ,                                       !- Flow Rate per Zone Floor Area {m3/s-m2}
  ,                                       !- Flow Rate per Person {m3/s-person}
  0.6,                                    !- Air Changes per Hour {1/hr}
  ,                                       !- Ventilation Type
  ,                                       !- Fan Pressure Rise {Pa}
  ,                                       !- Fan Total Efficiency
  ,                                       !- Constant Term Coefficient
  ,                                       !- Temperature Term Coefficient
  ,                                       !- Velocity Term Coefficient
  ;                                       !- Velocity Squared Term Coefficient

Short story: if you have clicked on "Use Ideal Air Loads" in the OS App next to the thermal Zone, you will want to request Zone Ventilation Mass Flow Rate [kg/s] instead, as it uses a ZoneVentilation:DesignFlowRate to mimic the DSOA, all output variables available for this object are here


I dug into the source code. There are two different thing that could be happening:

  • If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning zone.setUseIdealAirLoads(true) behind the scenes), you'll end up with an HVACTemplate:Zone:IdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem by E+, but it won't have the DesignSpecific:OutdoorAir (DSOA) object. Instead, a ZoneVentilation:DesignFlowRate object is created to match the DSOA, so you can request the output variable Zone Ventilation Mass Flow Rate [kg/s]
  • If you use the API, you can explicitly create a ZoneHVACIdealLoadsAirSystem and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variable Zone Ideal Loads Outdoor Air Mass Flow Rate

Source:


Proof in action

Initial setup

In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove

# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")

Using an explicit ZoneHVACIdealLoadsAirSystem

In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)


In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
  {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
  {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  ,                                       !- Design Specification Outdoor Air Object Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}


In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)

Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
  Zone HVAC Ideal Loads Air System 1,     !- Name
  ,                                       !- Availability Schedule Name
  Node 3,                                 !- Zone Supply Air Node Name
  Node 2,                                 !- Zone Exhaust Air Node Name
  ,                                       !- System Inlet Air Node Name
  ,                                       !- Maximum Heating Supply Air Temperature {C}
  ,                                       !- Minimum Cooling Supply Air Temperature {C}
  ,                                       !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
  ,                                       !- Heating Limit
  ,                                       !- Maximum Heating Air Flow Rate {m3/s}
  ,                                       !- Maximum Sensible Heating Capacity {W}
  ,                                       !- Cooling Limit
  ,                                       !- Maximum Cooling Air Flow Rate {m3/s}
  ,                                       !- Maximum Total Cooling Capacity {W}
  ,                                       !- Heating Availability Schedule Name
  ,                                       !- Cooling Availability Schedule Name
  ,                                       !- Dehumidification Control Type
  ,                                       !- Cooling Sensible Heat Ratio {dimensionless}
  ,                                       !- Humidification Control Type
  DSOA 0.6 ACH,                           !- Design Specification Outdoor Air Object Name
  ,                                       !- Outdoor Air Inlet Node Name
  ,                                       !- Demand Controlled Ventilation Type
  ,                                       !- Outdoor Air Economizer Type
  ,                                       !- Heat Recovery Type
  ,                                       !- Sensible Heat Recovery Effectiveness {dimensionless}
  ;                                       !- Latent Heat Recovery Effectiveness {dimensionless}

Using setUseIdealAirLoads

In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)

puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
  Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
  Thermal Zone 1,                         !- Zone or ZoneList Name
  {03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
  AirChanges/Hour,                        !- Design Flow Rate Calculation Method
  ,                                       !- Design Flow Rate {m3/s}
  ,                                       !- Flow Rate per Zone Floor Area {m3/s-m2}
  ,                                       !- Flow Rate per Person {m3/s-person}
  0.6,                                    !- Air Changes per Hour {1/hr}
  ,                                       !- Ventilation Type
  ,                                       !- Fan Pressure Rise {Pa}
  ,                                       !- Fan Total Efficiency
  ,                                       !- Constant Term Coefficient
  ,                                       !- Temperature Term Coefficient
  ,                                       !- Velocity Term Coefficient
  ;                                       !- Velocity Squared Term Coefficient