Einfache Zeitmessung fuer eine Slotcar-/Carrera-Bahn mit MQTT-Sensoren (ESP32), FastAPI-Backend und kleiner Weboberflaeche.
- Python 3.10 oder neuer
- Lokaler MQTT-Broker im Heimnetz, z. B. Mosquitto
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txtStandardwerte fuer das Backend, die ueber Umgebungsvariablen ueberschrieben werden koennen:
MQTT_HOST(Standard:192.168.2.186)MQTT_PORT(Standard:1883)MQTT_TOPIC(Standard:slotcar/sensor)
Optional kannst du eine .env im Projektverzeichnis anlegen. Eine Vorlage liegt als .env.example bereit.
uvicorn app.main:app --reloadDanach ist die Weboberflaeche typischerweise unter http://localhost:8080/ erreichbar.
Dieses Projekt ist fuer Raspberry Pi OS 64-bit (linux/arm64) vorbereitet.
Image direkt auf dem Raspberry Pi bauen:
docker build -t slotcar-timing .Container auf dem Raspberry Pi starten:
docker run --rm -p 8080:8080 ^
-e MQTT_HOST=192.168.1.10 ^
-e MQTT_PORT=1883 ^
-e MQTT_TOPIC=slotcar/sensor ^
-e PORT=8080 ^
slotcar-timingDanach ist die Weboberflaeche unter http://<raspberrypi-ip>:8080/ erreichbar.
Wichtig: MQTT_HOST muss auf die IP-Adresse oder den Hostnamen deines MQTT-Brokers im Heimnetz gesetzt werden, zum Beispiel 192.168.1.50 oder mosquitto.local.
Alternativ mit Docker Compose auf dem Raspberry Pi:
docker compose up -d --buildVor dem Start in compose.yaml den Wert von MQTT_HOST auf deinen Broker anpassen.
Wenn du das Image nicht auf dem Raspberry Pi selbst bauen willst, kannst du mit Docker Buildx ein ARM64-Image erstellen:
docker buildx build --platform linux/arm64 -t slotcar-timing:pi .Falls du das Image direkt in eine Registry pushen willst:
docker buildx build --platform linux/arm64 -t <registry>/slotcar-timing:pi --push .Oder lokal als Archiv exportieren:
docker buildx build --platform linux/arm64 -t slotcar-timing:pi --output type=docker .Der Container selbst wird weiterhin mit uvicorn app.main:app --host 0.0.0.0 --port 8080 gestartet und ist damit im Netzwerk des Raspberry Pi erreichbar.
Die Sensor-Events sollen als JSON gesendet werden, zum Beispiel:
{
"device": "esp32_slotcar_01",
"bahn": 1,
"sensor": 2,
"delta_ms": 842
}Diese Events werden vom Backend empfangen und fuer die Zeitmessung verwendet.
Der ESP32-Sketch liegt unter esp32/slotcar-sensor/ESP32_SlotCar.ino.
Vor dem Flashen:
esp32/slotcar-sensor/config.example.hnachesp32/slotcar-sensor/config.hkopieren- WLAN, MQTT-Broker,
DEVICE_IDundBAHNinconfig.hanpassen
config.h ist in .gitignore eingetragen, damit keine lokalen Zugangsdaten in GitHub landen.