Live-Dashboard für VW Passat B4 und andere VW/Audi/Seat/Skoda-Modelle aus den 90ern mit KW1281/K-Line-ECU (z.B. Golf 3, Audi 80/100, Seat Toledo, Skoda Felicia) auf Raspberry Pi.
app/- Laufzeitcode (FastAPI-Server, KW1281-Treiber, Dashboard, CLI-Trace)docs/- Setup- und Betriebsdokumentationrequirements.txt- Python-Abhaengigkeiten
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app/server.pyDanach im Browser:
http://localhost:1994(lokal)http://<raspi-ip>:1994(im Netzwerk)
Optional anderer Port:
- setze
ECU_HTTP_PORT=<port> - fuer Port
80bei systemd fuer UserpizusaetzlichAmbientCapabilities=CAP_NET_BIND_SERVICE
Der Server loggt standardmaessig Engine-Telemetrie im Hintergrund (optimiert fuer Pi Zero 2W).
- Format: rotierende JSONL-Dateien (
engine-telemetry-*.jsonl.gz) - Basisordner:
./logs - Logging ist vom Dashboard entkoppelt (Queue + async Writer), damit UI/Streaming priorisiert bleibt
Wichtige ENV-Variablen:
ECU_LOG_ENABLED=1(an/aus)ECU_LOG_DIR=./logs(Zielordner)ECU_LOG_ROTATE_MB=25(Rotation pro Datei)ECU_LOG_MAX_FILES=12(max. Archivdateien)ECU_LOG_MAX_TOTAL_MB=300(max. Gesamtgroesse der Archive)ECU_LOG_MAX_QUEUE=2000(Puffer, danach kontrolliertes Dropping)ECU_LOG_GZIP=1(rotierte Dateien komprimieren)
Beispiele:
# Standard-Logging aktiv (Default)
python app/server.py
# Logging komplett aus
ECU_LOG_ENABLED=0 python app/server.py
# Eigener Speicherpfad und konservativeres Retention-Limit
ECU_LOG_DIR=/var/log/piB4ECU ECU_LOG_ROTATE_MB=10 ECU_LOG_MAX_FILES=8 python app/server.pyInteraktive Auswertung der Telemetrie-Logs ist mit tools/telemetry_viewer.py moeglich.
Fuer eine nutzerfreundliche Browser-Oberflaeche gibt es zusaetzlich tools/telemetry_app.py (Streamlit).
Analyse-Abhaengigkeiten installieren:
pip install -r requirements-analysis.txtMetriken anzeigen:
python tools/telemetry_viewer.py --log-dir logs list-metricsNutzerfreundliche UI starten:
streamlit run tools/telemetry_app.pyDann im Browser die angezeigte lokale URL oeffnen (typisch http://localhost:8501).
Die UI nutzt als Standard-Logpfad ECU_LOG_DIR (falls gesetzt), sonst automatisch <repo-root>/logs.
Eine Metrik ueber Zeit vergleichen (alle Runs):
python tools/telemetry_viewer.py --log-dir logs plot-metric --metric "Drehzahl" --out analysis/out/rpm.htmlZwei Metriken als Scatter vergleichen:
python tools/telemetry_viewer.py --log-dir logs plot-pair --x "Drehzahl" --y "Einspritzzeit" --out analysis/out/inj_vs_rpm.htmlNur bestimmte Runs/Fahrten auswerten:
python tools/telemetry_viewer.py --log-dir logs --run-filter "20260327" plot-metric --metric "Kühlmitteltemperatur" --out analysis/out/coolant_20260327.htmlapp/server.py- FastAPI + WebSocket Streaming + APIapp/kw1281.py- KW1281 Protokoll und Decoderapp/dashboard.html- Smartphone-optimiertes Dashboardapp/ecu_trace.py- CLI fuer Handshake/Diagnose
docs/SETUP.md- Raspberry-Pi Setup inkl. systemd Servicedocs/OLED.md- OLED Mini-Display Setup (Software, Service, Layout)docs/OLED_HARDWARE.md- OLED Verdrahtung (Pi Pins, I2C, Spannung)- OLED: on the Pi,
python tools/oled_status.py --test-live(or--test-screen …) holds one fake screen;--testcycles all — seedocs/OLED.md docs/HOTSPOT.md- Hotspot-Betrieb im Autodocs/USB_GADGET.md- USB-Ethernet-Gadget (Werkstatt ohne WLAN)scripts/pib4ecu-net-mode.sh- Umschalten car / home / usb / auto + lock/unlock (siehedocs/SETUP.md)deploy/systemd/pib4ecu-net-mode-apply.service- Boot-Policy: OBD erkannt => car, sonst homedocs/MEASURING_BLOCKS.md- Dokumentierte MesswertbloeckeCHANGELOG.md- Aenderungshistorie und Releases
Fuer Updates direkt im Auto sind zwei Skripte enthalten:
scripts/update.sh- deploytorigin/mainoder ein explizites Release-Tagscripts/rollback.sh- springt auf die zuletzt installierte Version zurueck
Beispiele:
./scripts/update.sh
./scripts/update.sh v1.0.0-alpha.1
./scripts/update.sh --set-time "2026-03-26 14:35:00"
CALLER_UTC="$(date -u '+%Y-%m-%d %H:%M:%S')" ./scripts/update.sh --set-time-from-ssh
./scripts/rollback.shDie Skripte verwalten den Deploy-Status in .deploy-state (CURRENT_REF, PREVIOUS_REF, Commits).
Bei stark falscher Systemzeit versucht update.sh automatisch einen Best-Effort Sync (falls Internet verfuegbar ist), oder nimmt explizit --set-time.
Aktueller Release-Kanal: v1.0.0-alpha.1 (Pre-Release)
-
Laufzeit- und lokale Dateien sind per
.gitignoreausgeschlossen (.venv,__pycache__,.cursor). -
Lizenz:
MIT(sieheLICENSE)