Open-FDD Python package (PyPI)
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)
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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file open_fdd-4.4.1.tar.gz.
File metadata
- Download URL: open_fdd-4.4.1.tar.gz
- Upload date:
- Size: 322.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
146d1e24dcb071686973e11bc6b771b42aa1d0667290a1911a6d490d3a06b9d0
|
|
| MD5 |
6247cc579ab03aa3f89ec02cc5d034c5
|
|
| BLAKE2b-256 |
a8257233629f8c87c21e6519d8298df1c40cbade9a2522ebabe9ebd054e7d401
|
Provenance
The following attestation bundles were made for open_fdd-4.4.1.tar.gz:
Publisher:
publish-open-fdd.yml on bbartling/open-fdd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_fdd-4.4.1.tar.gz -
Subject digest:
146d1e24dcb071686973e11bc6b771b42aa1d0667290a1911a6d490d3a06b9d0 - Sigstore transparency entry: 2476915482
- Sigstore integration time:
-
Permalink:
bbartling/open-fdd@8ab0b5e347d8be8d5fb1d45b24ec3559afccbe7c -
Branch / Tag:
refs/tags/open-fdd-v4.4.1 - Owner: https://github.com/bbartling
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-open-fdd.yml@8ab0b5e347d8be8d5fb1d45b24ec3559afccbe7c -
Trigger Event:
push
-
Statement type:
File details
Details for the file open_fdd-4.4.1-py3-none-any.whl.
File metadata
- Download URL: open_fdd-4.4.1-py3-none-any.whl
- Upload date:
- Size: 348.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61748c7369356121f031b8762d52d30c7367caf7274f9dd396f73f8e6fb111ea
|
|
| MD5 |
07e38ba80d8a82a66fbd6c4cc49fe95b
|
|
| BLAKE2b-256 |
d07aeeb948b02bf64493a213cbc29c681ecd7b55ce4b46a86c3215f81f4aea1b
|
Provenance
The following attestation bundles were made for open_fdd-4.4.1-py3-none-any.whl:
Publisher:
publish-open-fdd.yml on bbartling/open-fdd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_fdd-4.4.1-py3-none-any.whl -
Subject digest:
61748c7369356121f031b8762d52d30c7367caf7274f9dd396f73f8e6fb111ea - Sigstore transparency entry: 2476915550
- Sigstore integration time:
-
Permalink:
bbartling/open-fdd@8ab0b5e347d8be8d5fb1d45b24ec3559afccbe7c -
Branch / Tag:
refs/tags/open-fdd-v4.4.1 - Owner: https://github.com/bbartling
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-open-fdd.yml@8ab0b5e347d8be8d5fb1d45b24ec3559afccbe7c -
Trigger Event:
push
-
Statement type: