Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 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
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# OpenStudio Version 3.9.1
# OpenStudio Version 3.10.0

_Release Notes_ - _TDB_

These release notes describe version 3.9.1 of the OpenStudio SDK developed by the National Renewable Energy Laboratory (NREL), Buildings and Thermal Sciences Center, Commercial Buildings Research Group, Tools Development Section, and associated collaborators. The notes are organized into the following sections:
These release notes describe version 3.10.0 of the OpenStudio SDK developed by the National Renewable Energy Laboratory (NREL), Buildings and Thermal Sciences Center, Commercial Buildings Research Group, Tools Development Section, and associated collaborators. The notes are organized into the following sections:

- Overview
- Where to Find OpenStudio Documentation
Expand All @@ -15,7 +15,7 @@ As of April 2020, development and distribution of the OpenStudioApplication and

Below is the list of components that is included in this SDK installer:

__**OpenStudio SDK 3.9.1**__
__**OpenStudio SDK 3.10.0**__
- EnergyPlus
- Command Line Interface (CLI)
- Radiance
Expand All @@ -34,16 +34,16 @@ __**OpenStudio SDK 3.9.1**__

# Installation Notes

OpenStudio SDK 3.9.1 is supported on:
OpenStudio SDK 3.10.0 is supported on:

* 64-bit Windows 7 – 11
* macOS: 11.6+ x86_64, 12.1+ arm64
* Ubuntu: 20.04 x86_64, 22.04 x86_64, 22.04 arm64
* Centos7

OpenStudio SDK 3.9.1 supports [EnergyPlus Release @EP_VERSION@](https://github.com/NREL/EnergyPlus/releases/tag/v@EP_VERSION@), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK 3.9.1.
OpenStudio SDK 3.10.0 supports [EnergyPlus Release @EP_VERSION@](https://github.com/NREL/EnergyPlus/releases/tag/v@EP_VERSION@), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK 3.10.0.

OpenStudio SDK 3.9.1 supports Radiance 5.0.a.12, which is bundled with the OpenStudio installer; users no longer must install Radiance separately, and OpenStudio will use the included Radiance version regardless of any other versions that may be installed on the system. Other builds of Radiance are not supported by OpenStudio SDK 3.9.1.
OpenStudio SDK 3.10.0 supports Radiance 5.0.a.12, which is bundled with the OpenStudio installer; users no longer must install Radiance separately, and OpenStudio will use the included Radiance version regardless of any other versions that may be installed on the system. Other builds of Radiance are not supported by OpenStudio SDK 3.10.0.

As usual, you can refer to the **[OpenStudio SDK Compatibility Matrix](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Version-Compatibility-Matrix)** for more information.

Expand All @@ -57,7 +57,7 @@ For help with common installation problems please visit [Getting Started](http:/

# OpenStudio SDK: Changelog

The 3.9.1 is a **<minor/major>** release. This update includes several new features, performance improvements, and bug fixes.
The 3.10.0 is a **<minor/major>** release. This update includes several new features, performance improvements, and bug fixes.

## C++ Workflow code

Expand All @@ -67,7 +67,7 @@ As of OpenStudio SDK 3.7.0 a re-written workflow written in C++ is used by defau

As of OpenStudio SDK 3.2.0, Python bindings are officially supported and distributed through Python Package Index (PyPI). To install, users will need to have Python3 installed along with pip and simply run the following command in a terminal window.

`pip install openstudio==3.9.1`
`pip install openstudio==3.10.0`

Please see [openstudio on PyPi](https://pypi.org/project/openstudio/) for further instructions on how to install. Users can also visit the test channel at [openstudio on TestPyPi](https://test.pypi.org/project/openstudio/) to install development bindings.

Expand All @@ -79,11 +79,17 @@ You can also refer to the [OpenStudio SDK Python Binding Version Compatibility M
* The object was wrapped in the SDK.
* Note: in EnergyPlus 24.2.0, the `Zone Relief Air Node Name` is an optional field. The OpenStudio SDK always fills with the connected zone's Exhaust Air Node, meaning the airflow is always being balanced by EnergyPlus: the object will extract air from the zone to balance the air supplied to the zone by the cooler outlet node.

* [#5369](https://github.com/NREL/OpenStudio/pull/5369) - Wrap Output:Table:Annual and Output:Table:Monthly

* [#5365](https://github.com/NREL/OpenStudio/pull/5365) - E+ 25.1.0: Wrap OutputControl:ResilienceSummaries

* [#5312](https://github.com/NREL/OpenStudio/pull/5312) - Wrap PythonPlugin:SearchPaths

## Minor changes and bug fixes

Refer to the changelog on the release page at [v3.9.1](https://github.com/NREL/OpenStudio/releases/v3.9.1)
Refer to the changelog on the release page at [v3.10.0](https://github.com/NREL/OpenStudio/releases/v3.10.0)

**Full Changelog**: https://github.com/NREL/OpenStudio/compare/v3.9.0...v3.9.1
**Full Changelog**: https://github.com/NREL/OpenStudio/compare/v3.9.0...v3.10.0

**New Contributors**:

Expand All @@ -101,7 +107,7 @@ In addition to some refactoring, this release also included conversion of 90.1 d
---
# This YAML header controls the pandoc (via TeX) to PDF settings
# To convert the markdown to pdf, do `pandoc release_notes.md -o release_notes.pdf`
title: 'OpenStudio Release Notes - 3.9.1'
title: 'OpenStudio Release Notes - 3.10.0'
author:
- National Renewable Energy Laboratory
colorlinks: true
Expand Down
103 changes: 103 additions & 0 deletions resources/model/OpenStudio.idd
Original file line number Diff line number Diff line change
Expand Up @@ -38451,6 +38451,109 @@ OS:Output:Table:SummaryReports,
\key CO2ResilienceSummary
\key VisualResilienceSummary

OS:Output:Table:Monthly,
\memo Provides a generic method of setting up tables of monthly results. The report
\memo has multiple columns that are each defined using a repeated group of fields for any
\memo number of columns. A single Output:Table:Monthly object often produces multiple
\memo tables in the output. A table is produced for every instance of a particular output
\memo variable. For example, a table defined with zone variables will be produced once for
\memo every zone.
\extensible:2
\min-fields 5
A1, \field Handle
\type handle
\required-field
A2, \field Name
\required-field
\type alpha
N1, \field Digits After Decimal
\type integer
\required-field
\minimum 0
\maximum 10
A3, \field Variable or Meter 1 Name
\begin-extensible
\required-field
\type alpha
\memo type external-list
\memo external-list autoRDDvariableMeter
\note The name of an output variable or meter that is available in the RDD file.
A4; \field Aggregation Type for Variable or Meter 1
\type choice
\required-field
\key SumOrAverage
\key Maximum
\key Minimum
\key ValueWhenMaximumOrMinimum
\key HoursNonZero
\key HoursZero
\key HoursPositive
\key HoursNonPositive
\key HoursNegative
\key HoursNonNegative
\key SumOrAverageDuringHoursShown
\key MaximumDuringHoursShown
\key MinimumDuringHoursShown
\note The method of aggregation for the selected variable or meter.

OS:Output:Table:Annual,
\memo Provides a generic method of setting up tables of annual results with one row per object.
\memo The report has multiple columns that are each defined using a repeated group of fields
\memo for any number of columns. A single Output:Table:Annual produces a single table in the
\memo output.
\extensible:3
\min-fields 7
A1, \field Handle
\type handle
\required-field
A2, \field Name
\required-field
\type alpha
A3, \field Filter
\type alpha
\note An optional text string that is compared to the names of the objects referenced by the
\note variables and if they match are included in the table. A footnote will appear that indicates
\note that the objects shown may not be all the objects that of that type that occur in the file.
A4, \field Schedule Name
\type object-list
\object-list ScheduleNames
\note Optional schedule name. If left blank, aggregation is performed for all hours simulated. If
\note a schedule is specified, aggregation is performed for non-zero hours in the schedule.
A5, \field Variable or Meter or EMS Variable or Field 1 Name
\begin-extensible
\type alpha
\required-field
\memo type external-list
\memo external-list autoRDDvariableMeter
\note contain the name of a variable (see Output:Variable and eplusout.rdd), meter (see Output:Meter
\note and eplusout.mdd), or EMS Internal Variable Name or IDF Object Field name. This value is shown
\note using the aggregation method specified.
A6, \field Aggregation Type for Variable or Meter 1
\type choice
\required-field
\key SumOrAverage
\key Maximum
\key Minimum
\key ValueWhenMaximumOrMinimum
\key HoursNonZero
\key HoursZero
\key HoursPositive
\key HoursNonPositive
\key HoursNegative
\key HoursNonNegative
\key HourInTenBinsMinToMax
\key HourInTenBinsZeroToMax
\key HourInTenBinsMinToZero
\key SumOrAverageDuringHoursShown
\key MaximumDuringHoursShown
\key MinimumDuringHoursShown
\note The method of aggregation for the selected variable or meter.
N1; \field Digits After Decimal 1
\type integer
\required-field
\minimum 0
\maximum 10

\group Energy Management System (EMS)

OS:EnergyManagementSystem:Sensor,
Expand Down
6 changes: 6 additions & 0 deletions src/energyplus/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,8 @@ set(${target_name}_src
ForwardTranslator/ForwardTranslateOutputConstructions.cpp
ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp
ForwardTranslator/ForwardTranslateFuelFactors.cpp
ForwardTranslator/ForwardTranslateOutputTableAnnual.cpp
ForwardTranslator/ForwardTranslateOutputTableMonthly.cpp
ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp
ForwardTranslator/ForwardTranslatePeople.cpp
ForwardTranslator/ForwardTranslatePerformancePrecisionTradeoffs.cpp
Expand Down Expand Up @@ -573,6 +575,8 @@ set(${target_name}_src
ReverseTranslator/ReverseTranslateOutputMeterCumulativeMeterFileOnly.cpp
ReverseTranslator/ReverseTranslateOutputMeterMeterFileOnly.cpp
ReverseTranslator/ReverseTranslateOutputVariable.cpp
ReverseTranslator/ReverseTranslateOutputTableAnnual.cpp
ReverseTranslator/ReverseTranslateOutputTableMonthly.cpp
ReverseTranslator/ReverseTranslateOutputTableSummaryReports.cpp
ReverseTranslator/ReverseTranslatePeople.cpp
ReverseTranslator/ReverseTranslatePerformancePrecisionTradeoffs.cpp
Expand Down Expand Up @@ -786,6 +790,8 @@ set(${target_name}_test_src
Test/OutputSQLite_GTest.cpp
Test/OutputEnvironmentalImpactFactors_GTest.cpp
Test/OutputTableSummaryReports_GTest.cpp
Test/OutputTableAnnual_GTest.cpp
Test/OutputTableMonthly_GTest.cpp
Test/OutputSchedules_GTest.cpp
Test/OutputConstructions_GTest.cpp
Test/People_GTest.cpp
Expand Down
13 changes: 13 additions & 0 deletions src/energyplus/ForwardTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2380,6 +2380,16 @@ namespace energyplus {
retVal = translateOutputTableSummaryReports(summaryReports);
break;
}
case openstudio::IddObjectType::OS_Output_Table_Annual: {
auto mo = modelObject.cast<OutputTableAnnual>();
retVal = translateOutputTableAnnual(mo);
break;
}
case openstudio::IddObjectType::OS_Output_Table_Monthly: {
auto mo = modelObject.cast<OutputTableMonthly>();
retVal = translateOutputTableMonthly(mo);
break;
}
case openstudio::IddObjectType::OS_People: {
auto people = modelObject.cast<People>();
retVal = translatePeople(people);
Expand Down Expand Up @@ -3387,6 +3397,9 @@ namespace energyplus {
// IddObjectType::OS_FuelFactors,

IddObjectType::OS_Output_Table_SummaryReports,
IddObjectType::OS_Output_Table_Annual,
IddObjectType::OS_Output_Table_Monthly,

IddObjectType::OS_PerformancePrecisionTradeoffs,

IddObjectType::OS_Site,
Expand Down
6 changes: 6 additions & 0 deletions src/energyplus/ForwardTranslator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,8 @@ namespace model {
class OutputMeter;
class OutputVariable;
class OutputEnergyManagementSystem;
class OutputTableAnnual;
class OutputTableMonthly;
class OutputTableSummaryReports;
class People;
class PerformancePrecisionTradeoffs;
Expand Down Expand Up @@ -1201,6 +1203,10 @@ namespace energyplus {

boost::optional<IdfObject> translateOutputTableSummaryReports(model::OutputTableSummaryReports& modelObject);

boost::optional<IdfObject> translateOutputTableAnnual(model::OutputTableAnnual& modelObject);

boost::optional<IdfObject> translateOutputTableMonthly(model::OutputTableMonthly& modelObject);

boost::optional<IdfObject> translatePeople(model::People& modelObject);

boost::optional<IdfObject> translatePerformancePrecisionTradeoffs(model::PerformancePrecisionTradeoffs& modelObject);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/***********************************************************************************************************************
* OpenStudio(R), Copyright (c) Alliance for Sustainable Energy, LLC.
* See also https://openstudio.net/license
***********************************************************************************************************************/

#include "../ForwardTranslator.hpp"
#include "../../model/Model.hpp"

#include "../../model/OutputTableAnnual.hpp"

#include "../../model/Schedule.hpp"
#include "../../utilities/idf/IdfExtensibleGroup.hpp"

#include <utilities/idd/Output_Table_Annual_FieldEnums.hxx>
#include <utilities/idd/IddEnums.hxx>

using namespace openstudio::model;

namespace openstudio {

namespace energyplus {

boost::optional<IdfObject> ForwardTranslator::translateOutputTableAnnual(model::OutputTableAnnual& modelObject) {

if (modelObject.numberofAnnualVariableGroups() == 0) {
return boost::none;
}
Comment on lines +25 to +27

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

So at least 1 group must be present to FT this object. And the IDD requires at least 1 group. The ctor doesn't add any groups. No message is issued when there aren't any groups; the object is just skipped? (I'm not saying this is wrong. I'm just confirming.)

@jmarrec jmarrec Mar 19, 2025

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Yes. I figured issuing a LOG(Warn or Info would be kinda pointless and I know we have people in the ecosystem who are very sensitive to not having useless warnings.

I feel like having a blank OutputTable is quite harmless.

Maybe I should issue a log anyways?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

The ctor doesnt push an extensible group because it'd be quite annoying to have to clear the extensible groups before adding yours.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This isn't that unsual to have the minFields set to indicate that there should be at least one extensible group, but the ctor doesn't add it:

factory = OpenStudio::IddFileAndFactoryWrapper.new("OpenStudio".to_IddFileType)
factory.objects.select {|o| o.numFields < o.properties.minFields}.map(&:name)
=> ["OS:ComponentData",
 "OS:WindowMaterial:GlazingGroup:Thermochromic",
 "OS:Construction",
 "OS:Construction:InternalSource",
 "OS:Schedule:Compact",
 "OS:ShadingSurface",
 "OS:Surface",
 "OS:SubSurface",
 "OS:ShadingControl",
 "OS:ZoneProperty:UserViewFactors:BySurfaceName",
 "OS:SurfaceProperty:SurroundingSurfaces",
 "OS:SurfaceProperty:GroundSurfaces",
 "OS:AirLoopHVAC:DedicatedOutdoorAirSystem",
 "OS:GroundHeatExchanger:Vertical",
 "OS:Coil:Cooling:DX:CurveFit:OperatingMode",
 "OS:Connector:Mixer",
 "OS:Connector:Splitter",
 "OS:WaterUse:Connections",
 "OS:UtilityCost:Charge:Block",
 "OS:UtilityCost:Computation",
 "OS:EnergyManagementSystem:ProgramCallingManager",
 "OS:EnergyManagementSystem:Program",
 "OS:EnergyManagementSystem:Subroutine",
 "OS:PythonPlugin:Variable",
 "OS:AirflowNetworkDetailedOpening"]
m = Model.new
ems = OpenStudio::Model::EnergyManagementSystemProgram.new(m)
puts ems
OS:EnergyManagementSystem:Program,
  {b988fdde-8d6b-4776-97fd-5e28e3e48316}, !- Handle
  Energy_Management_System_Program_1;     !- Name
  
puts ems.iddObject
OS:EnergyManagementSystem:Program,
       \memo This input defines an Erl program
       \memo Each field after the name is a line of EMS Runtime Language
       \extensible:1
       \min-fields 3
  A1, \field Handle
       \type handle
       \required-field
  A2, \field Name
       \note No spaces allowed in names for ErlProgramNames
       \type alpha
       \required-field
       \reference ErlProgramNames
       \reference ErlProgramSubroutineNames
  A3; \field Program Line
       \type alpha
       \required-field
       \begin-extensible


// Instantiate an IdfObject of the class to store the values
IdfObject idfObject = createRegisterAndNameIdfObject(openstudio::IddObjectType::Output_Table_Annual, modelObject);

// Filter: boost::optional<std::string>
if (boost::optional<std::string> filter_ = modelObject.filter()) {
idfObject.setString(Output_Table_AnnualFields::Filter, filter_.get());
}

// Schedule Name: Optional Object
if (boost::optional<Schedule> schedule_ = modelObject.schedule()) {
if (boost::optional<IdfObject> wo_ = translateAndMapModelObject(schedule_.get())) {
idfObject.setString(Output_Table_AnnualFields::ScheduleName, wo_->nameString());
}
}

for (const auto& group : modelObject.annualVariableGroups()) {
IdfExtensibleGroup eg = idfObject.pushExtensibleGroup();
eg.setString(Output_Table_AnnualExtensibleFields::VariableorMeterorEMSVariableorFieldName, group.variableorMeterorEMSVariableorField());
eg.setString(Output_Table_AnnualExtensibleFields::AggregationTypeforVariableorMeter, group.aggregationType());
eg.setInt(Output_Table_AnnualExtensibleFields::DigitsAfterDecimal, group.digitsAfterDecimal());
}

return idfObject;
} // End of translate function

} // end namespace energyplus
} // end namespace openstudio
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/***********************************************************************************************************************
* OpenStudio(R), Copyright (c) Alliance for Sustainable Energy, LLC.
* See also https://openstudio.net/license
***********************************************************************************************************************/

#include "../ForwardTranslator.hpp"
#include "../../model/Model.hpp"

#include "../../model/OutputTableMonthly.hpp"

#include "../../utilities/idf/IdfExtensibleGroup.hpp"

#include <utilities/idd/Output_Table_Monthly_FieldEnums.hxx>
#include <utilities/idd/IddEnums.hxx>

using namespace openstudio::model;

namespace openstudio {

namespace energyplus {

boost::optional<IdfObject> ForwardTranslator::translateOutputTableMonthly(model::OutputTableMonthly& modelObject) {

if (modelObject.numberofMonthlyVariableGroups() == 0) {
return boost::none;
}

// Instantiate an IdfObject of the class to store the values
IdfObject idfObject = createRegisterAndNameIdfObject(openstudio::IddObjectType::Output_Table_Monthly, modelObject);

// Digits After Decimal: Optional Integer, we set it in ctor
const int digitsAfterDecimal = modelObject.digitsAfterDecimal();
idfObject.setInt(Output_Table_MonthlyFields::DigitsAfterDecimal, digitsAfterDecimal);

for (const auto& group : modelObject.monthlyVariableGroups()) {
IdfExtensibleGroup eg = idfObject.pushExtensibleGroup();
eg.setString(Output_Table_MonthlyExtensibleFields::VariableorMeterName, group.variableOrMeterName());
eg.setString(Output_Table_MonthlyExtensibleFields::AggregationTypeforVariableorMeter, group.aggregationType());
}

return idfObject;
} // End of translate function

} // end namespace energyplus
} // end namespace openstudio
7 changes: 6 additions & 1 deletion src/energyplus/ReverseTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -697,8 +697,13 @@ namespace energyplus {
modelObject = translateOutputMeterMeterFileOnly(workspaceObject);
break;
}
case openstudio::IddObjectType::Output_Table_Annual: {
modelObject = translateOutputTableAnnual(workspaceObject);
break;
}
case openstudio::IddObjectType::Output_Table_Monthly: {
break; // no-op
modelObject = translateOutputTableMonthly(workspaceObject);
break;
}
case openstudio::IddObjectType::Output_Table_SummaryReports: {
modelObject = translateOutputTableSummaryReports(workspaceObject);
Expand Down
4 changes: 4 additions & 0 deletions src/energyplus/ReverseTranslator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ namespace energyplus {

boost::optional<model::ModelObject> translateOutputTableSummaryReports(const WorkspaceObject& workspaceObject);

boost::optional<model::ModelObject> translateOutputTableAnnual(const WorkspaceObject& workspaceObject);

boost::optional<model::ModelObject> translateOutputTableMonthly(const WorkspaceObject& workspaceObject);

boost::optional<model::ModelObject> translateOtherEquipment(const WorkspaceObject& workspaceObject);

boost::optional<model::ModelObject> translateOutputEnergyManagementSystem(const WorkspaceObject& workspaceObject);
Expand Down
Loading