EnergyPlus
Objects, fields, units, choices, defaults, and references
Building,
Example Office,
0.0, !- North Axis
Suburbs; !- Terrain
The text file is the simulation payload.
OpenStudio exposes a typed Model API backed by OpenStudio.idd. The Forward Translator converts that model to an EnergyPlus IDF.
Objects, fields, units, choices, defaults, and references
Building,
Example Office,
0.0, !- North Axis
Suburbs; !- Terrain
The text file is the simulation payload.
A similar—but independently designed—set of model records
model = OpenStudio::Model::Model.new
building = model.getBuilding
Typed classes, object relationships, and Model helper methods
The Forward Translator converts the OpenStudio Model to EnergyPlus IDF.
Resolve differences in object names, fields, relationships, and behavior while keeping the OpenStudio Model API.
Keep the interface that applications, measures, and users already know.
Implement OpenStudio Model behavior on EnergyPlus IDF objects.
Load, edit, and save EnergyPlus IDF directly instead of maintaining a second OpenStudio schema.
Original OpenStudio has a CurveQuadratic class with scalar methods named after the EnergyPlus fields.
Curve:Quadratic,
Capacity Modifier, !- Name
0.8, !- Coefficient1 Constant
0.2, !- Coefficient2 x
0.0, !- Coefficient3 x**2
0.0, !- Minimum Value of x
1.0; !- Maximum Value of x
curve = OpenStudio::Model::CurveQuadratic.new(model)
curve.setName("Capacity Modifier")
curve.setCoefficient1Constant(0.8)
curve.setCoefficient2x(0.2)
curve.setCoefficient3xPOW2(0.0)
curve.setMinimumValueofx(0.0)
curve.setMaximumValueofx(1.0)
OpenStudio still maintains its own schema, its own Model objects, and the translation code that writes EnergyPlus IDF.
The object still maps cleanly, but type and field names are no longer identical.
Coil:Heating:Fuel,
Main Heating Coil, !- Name
Always On Discrete, !- Availability Schedule Name
NaturalGas, !- Fuel Type
0.85, !- Burner Efficiency
10000, !- Nominal Capacity
Heating Coil Inlet Node, !- Air Inlet Node Name
Heating Coil Outlet Node, !- Air Outlet Node Name
, !- Temperature Setpoint Node Name
50, !- On Cycle Parasitic Electric Load
, !- Part Load Fraction Correlation Curve Name
100; !- Off Cycle Parasitic Fuel Load
coil = OpenStudio::Model::CoilHeatingGas.new(model)
coil.setName("Main Heating Coil")
coil.setFuelType("NaturalGas")
coil.setGasBurnerEfficiency(0.85)
coil.setNominalCapacity(10000)
coil.setOnCycleParasiticElectricLoad(50)
coil.setOffCycleParasiticGasLoad(100)
The scalar fields still map. The node fields hint at something structurally different.
OpenStudio connects equipment through a Node object. EnergyPlus repeats “Fan Outlet Node” in the adjoining equipment fields.
Same text means the same node.
No Node object exists in the IDF.
SpaceType and DefaultScheduleSet are OpenStudio Model objects. EnergyPlus has Space, but not SpaceType or DefaultScheduleSet; each load names its schedule directly.
space_type.setDefaultScheduleSet(office_defaults)No DefaultScheduleSet object
The schedule assignments remain, but the set does not.
For each difference, we adapt epmodel, propose a change to EnergyPlus, or do both. Existing Measures must continue to run.
Node methods work as before, while epmodel reads and writes EnergyPlus node names, Branches, and related HVAC objects.
Represent the reusable schedule group directly in IDF instead of expanding it into separate load assignments.
There are 858 input object types. Each one must be compared with the OpenStudio Model API, implemented, available to Measures, and tested.
Each type can bring fields, references, defaults, behavior, bindings, and tests.
Names, types, defaults, autosizing, validation
References, ownership, lists, inheritance
Constructors, helper methods, HVAC connections, removal
Ruby bindings, IDF load and save, focused tests
We started by asking for one change at a time. We now give agents larger, testable assignments and let them work through the IDD in a controlled loop.
A person chose the next object, supplied the background, watched the work, and reviewed each result.
The program records progress, selects the next object, calls an implementation agent, runs reviews, and returns for fixes.
Agents can increasingly plan, implement, test, and correct their work across an object family—or a much larger assignment.
The checked-in example starts with a reference-building IDF, replaces its HVAC systems with familiar Model methods, and produces a simulation-ready IDF.
RefBldgSmallOffice
New2004_Chicago.idf
The OSW names an .idf seed—not an OSM.
air_loops = model.getAirLoopHVACs()
air_loops.each { |loop| loop.remove() }
air_loop = OpenStudio::EPModel::AirLoopHVAC.new(model)
air_loop.addBranchForZone(zone, terminal)
The Measure uses familiar Model methods to build the new air and plant loops.
model-measures.idf
EnergyPlus completed successfully.
Boiler hot water + air-cooled chiller + multizone VAV
A usable epmodel release for early evaluation and feedback.
Plausibly. It would look something like this:
Working in this OpenStudio repository, first read the epmodel documentation and inspect the relevant source, IDD files, and checked-in workflow examples.
Build a polished, self-contained 16:9 HTML/CSS/JS presentation for OpenStudio modelers. Explain today's two-schema setup and the goal of making the Model API work directly on EnergyPlus IDF while preserving existing Model APIs and Measures. Keep OpenStudio on the left and EnergyPlus on the right.
Use repository-backed examples to progress from CurveQuadratic, to CoilHeatingGas versus Coil:Heating:Fuel, to Nodes and Connections, to SpaceType and DefaultScheduleSet. Explain the case-by-case reconciliation strategy, the scale across the IDD, why coding agents are integral, the working IDF Measure workflow, and the fall alpha target.
Use concise human language, familiar OpenStudio vocabulary, large projection-safe type, fullscreen keyboard navigation, a QR code, and a linked PDF. Serve it on port 8080. Render every slide and fix any crowding, clipping, small text, or unsupported claims before calling it done.