Skip to main content

Python interface to DesignBuilder command line processing.

Project description

db-process

Python interface to DesignBuilder's command-line driver — typed /process= commands, subprocess execution, process discovery, and diagnostics-log parsing.

DesignBuilder is a Windows GUI app, but it exposes a /process= argument that runs a sequence of commands non-interactively and exits. db-process wraps that surface in real Python: dataclass commands instead of stringly-typed flags, a ProcessChain builder, blocking and non-blocking runners, helpers to find/kill the process, and a parser for the rolling diagnostics logs DesignBuilder writes under %LOCALAPPDATA%.

Install

pip install db-process
# or, from the cloned repo:
pip install -e .[dev]

Requires Python 3.10+ and psutil. DesignBuilder itself only runs on Windows; on other platforms, the package imports fine but run() and the process helpers will raise FileNotFoundError.

Quick start

Python — run a model with a chain of commands

from db_process import ProcessChain, Screen, run

chain = (
    ProcessChain()
    .use_sim_manager()
    .switch_screen(Screen.SIMULATION)
    .sim_start_date(1, 1)
    .sim_end_date(31, 12)
    .change_attribute("OccupancyValue", 0.5)
    .run()
)

result = run("models/office.dsb", chain, timeout=600)
print(result.success, result.duration_seconds)

Python — convenience factories for common runs

from db_process import eplus_simulation, run

# A pre-built ProcessChain for "open model, run EnergyPlus, close".
result = run("models/office.dsb", eplus_simulation())

Other factories: sbem_calculation, export_xml, heating_and_cooling_design, daylighting, cfd_simulation.

Python — non-blocking with idle-detection kill

from db_process import run_async

handle = run_async("models/office.dsb")
# Block until DesignBuilder finishes its work and CPU drops, then kill it.
handle.kill_when_idle(idle_threshold=10, cpu_threshold=0.1)

kill_when_idle is the workaround for runs where DesignBuilder finishes the calculation but doesn't exit — common with the GUI Sim Manager path.

CLI

db-process status              # is DesignBuilder running? show pid + exe path
db-process open                # launch DesignBuilder
db-process open path/to.dsb    # launch with a model
db-process close               # kill any running DesignBuilder
db-process restart [model]     # close + open (with a 1.5 s settle)

db-process diag list           # list recent diagnostic logs (newest first)
db-process diag latest         # print a one-paragraph summary of the newest log
db-process diag latest --errors   # also list every error line found
db-process diag summary <path>    # summarise a specific log

db-process is the entry point installed by the package; you can also run it as python -m db_process.

Public API

from db_process import (
    # Executable discovery
    find_designbuilder,                          # () -> Path

    # Process status
    is_running, find_process, status,            # status() -> ProcessStatus
    kill_process, kill_when_idle,
    ProcessStatus,                               # is_running, pid, exe_path

    # Run
    run, run_async, RunHandle, RunResult,

    # Command model
    ProcessChain, Screen,
    SwitchScreen, RunCalculation, TabChange,
    SimStartDate, SimEndDate, ChangeAttributeValue,
    ExternalCommand, ImportModelData, ImportLibraryData,
    ExportAsXML, UseSimManager, NoClose,

    # Convenience factories
    eplus_simulation, sbem_calculation, export_xml,
    heating_and_cooling_design, daylighting, cfd_simulation,

    # Diagnostics logs
    DiagnosticsLog, find_logs, latest_log,
    parse_filename_timestamp, DEFAULT_DIAGNOSTICS_DIR,
)

Executable discovery

find_designbuilder(exe_path=None) resolves DesignBuilder.exe in this order:

  1. The explicit exe_path argument, if given.
  2. DESIGNBUILDER_EXE environment variable.
  3. C:\Program Files (x86)\DesignBuilder\DesignBuilder.exe, then C:\Program Files\DesignBuilder\DesignBuilder.exe.
  4. The system PATH (shutil.which("DesignBuilder")).

Raises FileNotFoundError with a hint to set DESIGNBUILDER_EXE if none match.

Process status

status() is a one-shot snapshot:

from db_process import status

s = status()
# ProcessStatus(is_running=True, pid=12345, exe_path='C:\\...\\DesignBuilder.exe')
if not s.is_running and s.exe_path:
    # Discovered but not running — safe to launch.
    ...

exe_path is populated regardless of whether the process is running, so callers can decide whether to launch without a second find_designbuilder call.

ProcessChain — building a /process= argument

ProcessChain is a fluent builder for the /process= command sequence documented in DesignBuilder Help. Example output of chain.to_string():

/process=UseSimManager, miGSS, SimStartDate 1 1, SimEndDate 31 12,
         ChangeAttributeValue OccupancyValue 0.5, miTUpdate

Every command is also exposed as a plain dataclass, so you can construct chains without the builder when that's clearer.

Diagnostics logs

DesignBuilder writes a per-session diagnostics log to %LOCALAPPDATA%\DesignBuilder\Diagnostics\ named like DesignBuilder_diagnostic_2026-04-23_15-12-08.txt. DiagnosticsLog parses one of those files into a structured object:

from db_process import latest_log, DiagnosticsLog

log = DiagnosticsLog.from_file(latest_log())
print(log.summary())
print(log.is_complete, log.duration, log.error_count)
for line_no, text in log.errors:
    print(f"L{line_no}: {text}")

Error detection uses word-boundary matching (error, failed, exception, fatal, crash) plus a small negative list to suppress known benign markers (e.g. the GL_KHR_no_error OpenGL extension).

Compatibility

  • DesignBuilder: any version that supports the /process= argument. Tested against the v25.1 / v26.1 lines.
  • Python: 3.10+.
  • OS: Windows for live runs. The command model and diagnostics parser are pure Python and import on any platform — useful for unit tests on Linux CI.

Development

pip install -e .[dev]
pytest         
ruff check .

Tests are split by area:

File Covers
test_commands.py ProcessChain building + every command's to_string()
test_executable.py find_designbuilder resolution order
test_status.py status / ProcessStatus
test_diagnostics.py log parsing, error detection, filename timestamps
test_cli.py CLI argparse wiring (mocked subprocess)

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

db_process-0.2.0.tar.gz (24.0 kB view details)

Uploaded Source

Built Distribution

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

db_process-0.2.0-py3-none-any.whl (19.1 kB view details)

Uploaded Python 3

File details

Details for the file db_process-0.2.0.tar.gz.

File metadata

  • Download URL: db_process-0.2.0.tar.gz
  • Upload date:
  • Size: 24.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for db_process-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1c2498438ac9e0a4305c838f4380083eafa85f5b8bc610ed9e51b14073448668
MD5 8a02b9774474e4a47b83f84af0a1012e
BLAKE2b-256 7877ddf0fb16e03133c15b6761048e45953c20d19c45dba8f756f4ac7622b001

See more details on using hashes here.

File details

Details for the file db_process-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: db_process-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 19.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for db_process-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1d787b9918cbd58679b68c4f8c5d97d75ee9c3136ad7f4086208d13a1eec588c
MD5 a8c25311c51ecaca1d4f88028b09331a
BLAKE2b-256 275babc72d5889920de112e8c3c00d50106ab9ca85a1ad6fe530c501c24f970c

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