Skip to main content

A fast, modern EnergyPlus IDF/epJSON parser with O(1) lookups and reference tracking

Project description

idfkit

Release Build status codecov License

A fast, modern EnergyPlus IDF/epJSON toolkit for Python.

[!NOTE] idfkit is in beta. The API may change between minor versions. We're looking for early adopters and testers — especially users of eppy who want better performance and a modern API. If you try it out, please open an issue with feedback, bug reports, or feature requests.

idfkit lets you load, create, query, and modify EnergyPlus models with an intuitive Python API. It is designed as a drop-in replacement for eppy with better performance, built-in reference tracking, and native support for both IDF and epJSON formats.

Key Features

  • O(1) object lookups — Collections are indexed by name, so doc["Zone"]["Office"] is a dict lookup, not a linear scan.
  • Automatic reference tracking — A live reference graph keeps track of every cross-object reference. Renaming an object updates every field that pointed to the old name.
  • IDF + epJSON — Read and write both formats; convert between them in a single call.
  • Schema-driven validation — Validate documents against the official EnergyPlus epJSON schema with detailed error messages.
  • Built-in 3D geometryVector3D and Polygon3D classes for surface area, zone volume, and coordinate transforms without external dependencies.
  • EnergyPlus simulation — Run simulations as subprocesses with structured result parsing, batch processing, and content-addressed caching.
  • Weather data — Search 55,000+ weather stations, download EPW/DDY files, and apply ASHRAE design day conditions.
  • Async & batch simulation — Run simulations concurrently with async_simulate or process parameter sweeps with simulate_batch.
  • 3D visualization — Render building geometry to interactive 3D views or static SVG images with no external tools.
  • Schedule evaluation — Parse and evaluate EnergyPlus compact, weekly, and holiday schedules to time-series values.
  • Thermal properties — Gas mixture and material thermal calculations for glazing and construction analysis.
  • Broad version support — Bundled schemas for every EnergyPlus release from v8.9 through v25.2.

Performance

idfkit is designed from the ground up for speed. On a 1,700-object IDF, looking up a single object by name is over 4000x faster than eppy and opyplus thanks to O(1) dict-based indexing:

benchmark chart

See full benchmark results for all six operations (load, get by type, get by name, add, modify, write) across four tools.

Installation

Requires Python 3.10+.

pip install idfkit

Or with uv:

uv add idfkit

Optional extras

Extra Install command What it adds
weather pip install idfkit[weather] Refresh weather station indexes from source (openpyxl)
dataframes pip install idfkit[dataframes] DataFrame result conversion (pandas)
s3 pip install idfkit[s3] S3 cloud storage backend (boto3)
plot pip install idfkit[plot] Matplotlib plotting
plotly pip install idfkit[plotly] Plotly interactive charts
progress pip install idfkit[progress] tqdm progress bars for simulations
all pip install idfkit[all] Everything above

Quick Example

from idfkit import load_idf, write_idf

# Load an existing IDF file
doc = load_idf("in.idf")

# Query objects with O(1) lookups
zone = doc["Zone"]["Office"]
print(zone.x_origin, zone.y_origin)

# Modify a field
zone.x_origin = 10.0

# See what references the zone
for obj in doc.get_referencing("Office"):
    print(obj.obj_type, obj.name)

# Write back to IDF (or epJSON)
write_idf(doc, "out.idf")

Note: load_idf() defaults to strict parsing (strict=True) and raises IDFParseError on malformed objects. Use strict=False only as a tolerant migration/compatibility fallback for legacy or noisy files.

Creating a model from scratch

from idfkit import new_document, write_idf

doc = new_document()
doc.add("Zone", "Office", x_origin=0.0, y_origin=0.0)
write_idf(doc, "new_building.idf")

Simulation

from idfkit.simulation import simulate

result = simulate(doc, "weather.epw", design_day=True)

# Query results from the SQLite output
ts = result.sql.get_timeseries(
    variable_name="Zone Mean Air Temperature",
    key_value="Office",
)
print(f"Max temp: {max(ts.values):.1f}°C")

Note: result.sql requires EnergyPlus to produce SQLite output (the default). See the Simulation Guide for details on output configuration.

Weather

from idfkit.weather import StationIndex, geocode

index = StationIndex.load()
results = index.nearest(*geocode("Chicago, IL"))
print(results[0].station.display_name)

Documentation

Full documentation is available at samuelduchesne.github.io/idfkit.

Key sections:

Development

make install    # Install dependencies and pre-commit hooks
make check      # Run linting, formatting, and type checks
make test       # Run tests with coverage
make docs       # Serve documentation locally

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

This project is licensed under the MIT License — see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

idfkit-0.6.0.tar.gz (13.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

idfkit-0.6.0-py3-none-any.whl (12.5 MB view details)

Uploaded Python 3

File details

Details for the file idfkit-0.6.0.tar.gz.

File metadata

  • Download URL: idfkit-0.6.0.tar.gz
  • Upload date:
  • Size: 13.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for idfkit-0.6.0.tar.gz
Algorithm Hash digest
SHA256 cebca501a2cbef19737fe92aeb543076ebe1d763f1184187ac5e70363a04d255
MD5 7778c52e82cf9dc26ae0c66cd2d34f37
BLAKE2b-256 d7c3e007d0b1b01ef6ef19ca2b5149808658f55e2de4a6bca422d913b3cb0ad9

See more details on using hashes here.

File details

Details for the file idfkit-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: idfkit-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 12.5 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for idfkit-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 48950eb05e188d2c29535fef2136be628b6f2e69e9fb31101b9dbc80e0494aef
MD5 9d8e50e6092e995a28f59f28737a4272
BLAKE2b-256 8c9f6015be2c43ddc1c0ea7f3ae8cc79bdc032ac100aa29fb28b982a5fcb37a1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page