Open-FDD Python package (PyPI)
GitHub Pages: this README is excluded from the docs site (
exclude: README.md). Published overview lives atdocs/ecm/index.md/overview.md— section PyPI agent tools.
open-fdd (PyPI 4.1+) ships:
- ECM engineering (
open_fdd.ecm_engineering) — agent-drivable HVAC spreadsheet workbooks + Python benchmarks. - Pandas oracle (
open_fdd.rules,open_fdd.analytics,open_fdd.reporting) — cookbook catalog, analytics helpers, Engineering Findings.
The ECM API fills the same workbook input cells a human engineer would fill. It does not replace the visible spreadsheet calculations.
Production FDD (DataFusion SQL fault detection) lives in the GHCR container stack, not this wheel.
Product freeze / upsell: Engineer upsell brief — open-fdd + PyPI (vibe freeze) — after 2026-07-30, customers see ECM via PyPI → open-fdd, not vibe19/vibe20 tip churn.
Build handoff / golden example: OPENFDD_AGENT_ECM_HANDOFF.md · packaged workbook examples/liberty_dual_ahu/ECM_FULL_PARITY.xlsx.
Install
pip install open-fdd # ECM only (openpyxl)
pip install "open-fdd[oracle]" # + pandas rules
pip install "open-fdd[analytics]" # + analytics helpers (same as oracle)
pip install "open-fdd[reporting]" # + Engineering Findings extras
For the FastAPI ECM example:
pip install "open-fdd[ecm-web]"
Oracle rules (pandas)
from open_fdd.rules import RULES, run_rule
Generate a workbook in a few lines
from open_fdd.ecm_engineering import ECMJob
job = (
ECMJob("Lincoln Middle School")
.set_global(
area_ft2=85000,
electric_rate=0.145,
gas_rate=0.92,
)
.add_ecm(
"static_pressure_reset",
fan_kw=55.9,
hours=4100,
baseline_speed=0.82,
proposed_speed=0.67,
)
.add_ecm(
"boiler_reset",
base_therms=48000,
base_eff=0.86,
prop_eff=0.92,
)
)
# set_many / add_ecm already persist; save() is idempotent on the same path
# (BUG-OFDD-ECM-002) and can also copy to another path.
job.save("Lincoln_Middle_School_ECMs.xlsx")
The resulting XLSX contains the engineering inputs and formulas for human review.
Module names vs calculators
from open_fdd.ecm_engineering import list_ecm_modules, list_calculators
list_ecm_modules() # names accepted by add_ecm (aliases included)
list_calculators() # independent Python benchmarks (job.calc), not sheet names
New in 4.2.0: chiller_lockout, load_shed, schedule_align / ahu_sched_align.
Honesty / twin compare export (4.2.0)
job.attach_twin_compare({
"provenance": {"idf_path": "...", "g14_pass": True},
"inputs": [{"name": "lockout_hours", "value": 612, "provenance": "FITTED_FROM_EPLUS"}],
"measures": [{
"measure_id": "ECM-CHILLER-LOCKOUT",
"name": "Chiller OAT lockout",
"eplus_source": "cascade",
"fitted_sheet_kwh": 101580.56,
"eplus_kwh": 101580.56,
"hours_provenance": "FITTED_FROM_EPLUS",
}],
"demand": {"july_weekday_kw": 420, "july_weekend_kw": 280, "loadshed_kw": 365},
})
job.save("honesty.xlsx") # Contents, Measures, … (FITTED ≠ independent validation)
IPMVP change-point / G14 (4.4.3)
from open_fdd.ecm_engineering import fit_changepoint, score_g14_monthly, option_c_savings
Docs: IPMVP change-point & G14. Requires numpy (pip install "open-fdd[oracle]").
Independent benchmark
from open_fdd.ecm_engineering import ECMJob
job = ECMJob("demo")
result = job.calc(
"fan_affinity",
design_kw=55.9,
hours=4100,
baseline_speed_fraction=0.82,
proposed_speed_fraction=0.67,
)
CLI
open-fdd-ecm calculators
open-fdd-ecm demo --out Demo_ECMs.xlsx
Engineering posture
Prefer measured BAS, utility, TAB, nameplate and manufacturer data over defaults.
Generic chiller %/°F methods are screening proxies; manufacturer performance
maps or calibrated EnergyPlus should replace them when stronger estimates are needed.
Metadata
Release files for open-fdd 4.4.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| open_fdd-4.4.5.tar.gz | 336.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| open_fdd-4.4.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 699.7 kB
Release files / open_fdd-4.4.5.tar.gz
| Download URL | open_fdd-4.4.5.tar.gz |
|---|---|
| Size | 336.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c52ac4c677a4ad6377c21bf4be2e30f4fc5e7bf1337e3db4e1f6e9ab27a70159
|
|
BLAKE2b-256 checksum How to use checksums |
77263d593c1cc51228333f212ce4fc3a409ba187995dc01f13de6ad46d1bab24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.
Transparency logRelease files / open_fdd-4.4.5-py3-none-any.whl
| Download URL | open_fdd-4.4.5-py3-none-any.whl |
|---|---|
| Size | 363.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e14fc0b83b83b712ff0d18bb13d3c1552cd7ea2174dbbf07e326a0f1197b4f5b
|
|
BLAKE2b-256 checksum How to use checksums |
754e242ec0a925ddcb63ae2692e7b05c4d3bc4173893ee89db8b1050bf1496e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.
Transparency log