CSV batch import

CSV loading is API-only — no dashboard tab. Use host-side scripts or MCP for batch ingest.

Step Method Path
Contract GET /api/ingest/contract
Preflight POST /api/csv/import/preflight
Execute POST /api/csv/import/execute

For large CSV analysis and FDD rule development, use the Pandas cookbook outside Open-FDD.

For daily batch loads, see CSV batch driver and the import sidecar scripts.

Hourly IoT-style appends (after a one-time package seed):

TOKEN="$(curl -s -X POST http://127.0.0.1:8080/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"'"$OPENFDD_ADMIN_PASSWORD"'"}' | jq -r '.token // .access_token')"

curl -s -X POST http://127.0.0.1:8080/api/csv/import/package/append \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"confirm":true,"building_id":"BUILDING_50","equipment_id":"AHU_1","csv":"timestamp_utc,sat\n2026-01-01T01:00:00Z,55\n"}'

Write your own vendor puller; OpenFDD only merges + re-ingests parquet. Same-hour replay is idempotent (last-write-wins on timestamp).

AFDD routine after append (real-world pattern)

After each append (or on a schedule), operators tune rules and re-run FDD:

# Update rule params (confirm_min, etc.)
curl -s -X PUT http://127.0.0.1:8080/api/fdd/session-config \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"schema_version":"openfdd_session_v1","params":{"VAV-1":{"confirm_min":1200}}}'

# Run registry for one building
curl -s -X POST http://127.0.0.1:8080/api/fdd/run \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"mode":"registry","building_id":"BUILDING_50","rule_ids":["VAV-1","ECON-1"]}'

Bench orchestrator: scripts/csv_flood_afdd_routine_sim.py with scripts/fixtures/b50_afdd_routine.json — see CSV flood + AFDD routine.

./scripts/openfdd_csv_preflight.sh /path/to/file.csv