Arrow-native HVAC fault detection runtime — lint, test, and run apply_faults_arrow rules on columnar telemetry (PyPI). Use GHCR Docker images for the full edge operator stack.
Project description
Open-FDD
Open-source supervisory fault detection for buildings — Arrow-native rules, optional DataFusion SQL rules for Rust-ready migration, optional PyPI embeddable runtime, and a full Docker/GHCR edge operator stack (BACnet, bridge API, dashboard, MCP).
Install / run
Full Open-FDD edge stack (Docker / GHCR)
Use GHCR (GitHub Container Registry — GitHub’s OCI image registry at ghcr.io) for BACnet polling, Operator Bridge API, React dashboard, historian, and MCP sidecar in a docker pull workflow.
| Image | Role |
|---|---|
ghcr.io/bbartling/openfdd-bridge |
API, dashboard, historian |
ghcr.io/bbartling/openfdd-commission |
BACnet discover, read, poll |
ghcr.io/bbartling/openfdd-mcp-rag |
MCP + doc-search |
New edge host (no git clone — pulls latest from GHCR):
curl -fsSL -o /tmp/openfdd_edge_bootstrap.sh \
https://github.com/bbartling/open-fdd/raw/refs/heads/master/scripts/openfdd_edge_bootstrap.sh
bash /tmp/openfdd_edge_bootstrap.sh --start
Update an existing site (backup workspace, pull latest containers from GHCR, recreate stack):
cd ~/open-fdd
./scripts/openfdd_site_backup.sh
./scripts/openfdd_site_update.sh
Python package (PyPI)
Use PyPI when you only need the embeddable Arrow-native FDD runtime — lint, test, and run rules in your own pipelines (cloud, IoT, notebooks) without Docker.
pip install open-fdd
import pyarrow as pa
import pyarrow.compute as pc
from open_fdd.arrow_runtime import run_arrow_rule
def high_sat(table, cfg, context=None):
return pc.greater(table["SAT"], float(cfg["high"]))
table = pa.table({"SAT": [70.0, 90.0]})
result = run_arrow_rule(high_sat, table, {"high": 85})
print(result.true_count) # 1
DataFusion SQL (same telemetry table, optional pip install 'open-fdd[datafusion]'):
from open_fdd.arrow_runtime import run_datafusion_sql_rule
SQL = """
SELECT
*,
"SAT" > 85.0 AS fault
FROM telemetry
"""
result = run_datafusion_sql_rule(SQL, table, {"min_true_rows": 5, "poll_interval_s": 60})
print(result.true_count) # 1 — same confirmed count as PyArrow when cfg matches
Rule config fields such as min_elapsed_minutes and min_true_rows apply to both backends (fault confirmation / minimum duration). See fault confirmation.
Develop
git clone https://github.com/bbartling/open-fdd.git && cd open-fdd
python -m venv .venv && source .venv/bin/activate
pip install -e ".[test,dev,analytics]"
pytest open_fdd/tests -q
Contributor layout: AGENTS.md and developer docs.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
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-3.1.5.tar.gz.
File metadata
- Download URL: open_fdd-3.1.5.tar.gz
- Upload date:
- Size: 63.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76284a060fa90a375e0e913ac41932a9cfe4a8ef19346961f79c7a811504943d
|
|
| MD5 |
9f79565b1f3ab991d802d6583ebc9418
|
|
| BLAKE2b-256 |
c176027c93f84532e03cb1dcd4e254ee62b7a340e73cb833b19d5505de234cf6
|
Provenance
The following attestation bundles were made for open_fdd-3.1.5.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-3.1.5.tar.gz -
Subject digest:
76284a060fa90a375e0e913ac41932a9cfe4a8ef19346961f79c7a811504943d - Sigstore transparency entry: 1841066243
- Sigstore integration time:
-
Permalink:
bbartling/open-fdd@08e05ae2a7a2cf9d3a3cb9238a06730bb2ffe6e3 -
Branch / Tag:
refs/tags/v3.1.5 - Owner: https://github.com/bbartling
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-open-fdd.yml@08e05ae2a7a2cf9d3a3cb9238a06730bb2ffe6e3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file open_fdd-3.1.5-py3-none-any.whl.
File metadata
- Download URL: open_fdd-3.1.5-py3-none-any.whl
- Upload date:
- Size: 71.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8942b9a160616a11a255da0813acfbeeb32453113bcda78920c293ff839b05be
|
|
| MD5 |
e42c35067c2b8a93708bd4006a32e0c2
|
|
| BLAKE2b-256 |
2a43e257da2315d371b221acf924b51d7ecd6305294de26c6946993d71e19bb1
|
Provenance
The following attestation bundles were made for open_fdd-3.1.5-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-3.1.5-py3-none-any.whl -
Subject digest:
8942b9a160616a11a255da0813acfbeeb32453113bcda78920c293ff839b05be - Sigstore transparency entry: 1841066308
- Sigstore integration time:
-
Permalink:
bbartling/open-fdd@08e05ae2a7a2cf9d3a3cb9238a06730bb2ffe6e3 -
Branch / Tag:
refs/tags/v3.1.5 - Owner: https://github.com/bbartling
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-open-fdd.yml@08e05ae2a7a2cf9d3a3cb9238a06730bb2ffe6e3 -
Trigger Event:
push
-
Statement type: