Ein modernes System zur Essensanmeldung für die Feuerwehr, optimiert für den Raspberry Pi mit 3,5" Touchscreen.
- 🆔 RFID-Transponder: Automatische Anmeldung per ELATEC TWN4 HID Reader
- 📱 QR-Code: Persönlicher QR-Code für jeden User zum Ausdrucken
- 🔢 Personalnummer: Manuelle Eingabe am Touchscreen mit virtueller Tastatur (ausblendbar)
- 👥 Gäste: Schnelle +/- Buttons für Besucher ohne Account
- 🍽️ Zwei-Menü-System: Optional zwei verschiedene Menüs pro Tag
- 📝 Menü-Auswahl: Benutzer wählen bei Anmeldung ihr Wunschmenü (RFID + Personalnummer)
- 📊 Getrennte Zählung: Separate Anzeige für Menü 1 und Menü 2
- ✅ Farbcodierte Bestätigung: Grün für Anmeldung, Rot für Abmeldung
- ⏰ Anmeldefrist: Konfigurierbarer Deadline-Zeitpunkt (Standard: 19:45)
- 📅 Wochenplanung: 14-Tage-Vorausplanung mit Deadline-Einstellungen pro Tag
- 📱 Touch-Display (3,5" 320x480): Modernes Dark-Theme, optimiert für kleine Displays
- 🍽️ Küchenansicht: Live-Statistiken, Menü-Eingabe, Druckansicht (Auto-Refresh 5s)
- ⚙️ Admin-Panel: User-Verwaltung, CSV-Import, Preset-Menüs, Deadline-Konfiguration
- 📊 Statistiken: 14-Tage-Übersicht, CSV-Export
- 📈 Historie: Top-10-Esser, persönliche Statistiken, monatliche Übersicht
- 🖨️ Druckliste: Gruppiert nach Menü mit Checkboxen für die Küche
- 🔐 Admin-Login: Session-basierte Authentifizierung (Standard-Passwort: feuerwehr2026)
- ⚡ Rate Limiting: Schutz vor API-Missbrauch (200/Tag, 50/Stunde)
- 📝 Logrotate: Automatische Log-Verwaltung (täglich, 14 Tage Retention)
- 🔔 Webhooks: Benachrichtigungen via Slack, Discord, etc.
- 🔌 REST-API: Integration mit externen Systemen
- 💾 Auto-Backup: Tägliches Datenbank-Backup (00:30 Uhr)
- 🌙 Auto-Reset: Anmeldungen werden täglich gelöscht (00:00 Uhr)
- ⏰ Cronjobs: Vollständig konfigurierte automatische Aufgaben
- 🎨 Modernes Dark-Theme: Gradient-Background (#1e1e1e → #2d2d2d), rote Akzente (#dc2626)
- 📐 Touch-optimiert: Große Buttons, virtuelle Tastatur auf Abruf
- 📱 Responsive: Grid-Layout passt sich an alle Bildschirmgrößen an
- ⚡ Live-Updates: Menü-Aktualisierung alle 5 Sekunden (Touch + Küche)
- 🎭 Status-Popups: Große, farbcodierte Bestätigungen mit Icons
Für Production-Deployment auf Raspberry Pi:
# Repository klonen
cd /home/pi
git clone https://github.com/Brunsben/FoodBot
cd FoodBot
# Automatisches Setup (als root)
sudo ./deployment/setup_production.shDas Skript installiert:
- ✅ Python Virtual Environment + Dependencies
- ✅ Systemd Service für automatischen Start
- ✅ Logrotate Konfiguration
- ✅ Cronjobs für Backup & Reset
- ✅ Optional: Nginx Reverse Proxy
📖 Ausführliche Deployment-Anleitung: DEPLOYMENT.md
git clone <repository-url> FoodBot
cd FoodBot
docker-compose up -d# Virtual Environment
python3 -m venv venv
source venv/bin/activate
# Dependencies
pip install -r requirements.txt
# Datenbank initialisieren
python -c "from app import create_app, db; app = create_app(); app.app_context().push(); db.create_all()"
# Starten
gunicorn -c deployment/gunicorn.conf.py "app:create_app()"Nach der Installation erreichbar unter:
- Touch-Display:
http://<raspberry-pi>:5001/- Hauptinterface für Anmeldung - Küchenansicht:
http://<raspberry-pi>:5001/kitchen- Für Tablet/PC in der Küche - Admin-Panel:
http://<raspberry-pi>:5001/admin- Benutzerverwaltung (Login erforderlich) - Statistiken:
http://<raspberry-pi>:5001/stats- Auswertungen (Login erforderlich) - Historie:
http://<raspberry-pi>:5001/history- Essenshistorie & Top-10 (Login erforderlich)
- Passwort:
feuerwehr2026 - Ändern via Environment-Variable:
ADMIN_PASSWORD=dein-passwort
Die API ist erreichbar unter /api/ und bietet folgende Endpoints:
GET /api/statusGibt aktuelles Menü, Anzahl Anmeldungen und Gäste zurück.
Rate Limit: 30 Requests/Minute
POST /api/register
Content-Type: application/json
{
"personal_number": "12345"
}Rate Limit: 10 Requests/Minute
GET /api/stats?days=7GET /api/usersErstelle eine .env-Datei oder setze die Variablen im System:
# Admin-Passwort (Standard: feuerwehr2026)
ADMIN_PASSWORD=dein-sicheres-passwort
# Secret Key für Sessions (WICHTIG in Production!)
SECRET_KEY=$(python3 -c 'import os; print(os.urandom(24).hex())')
# Flask Environment
FLASK_ENV=production
# RFID-Port (optional, Standard: /dev/ttyUSB0)
RFID_PORT=/dev/ttyUSB0
# Webhook für Benachrichtigungen (optional)
WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL# Status prüfen
sudo systemctl status foodbot
# Starten/Stoppen/Neustarten
sudo systemctl start foodbot
sudo systemctl stop foodbot
sudo systemctl restart foodbot
# Logs ansehen
journalctl -u foodbot -fBeispiel:
curl http://localhost:5000/api/status
curl -X POST http://localhost:5000/api/register \
-H "Content-Type: application/json" \
-d '{"personal_number": "12345"}'FoodBot/
├── app/
│ ├── __init__.py # Flask App Factory
│ ├── models.py # Datenbank-Modelle (User, Registration, Menu, AdminLog)
│ ├── routes.py # Hauptrouten (Touch, Kitchen, Admin)
│ ├── api.py # REST API mit Rate Limiting
│ ├── stats.py # Statistik-Routes
│ ├── history.py # Essenshistorie & Top-10
│ ├── auth.py # Admin-Authentifizierung
│ ├── rfid.py # RFID-Reader Integration (optional)
│ └── gunicorn_config.py # Gunicorn für Docker
├── templates/
│ ├── touch.html # 3,5" Touch-Interface (modernes Dark-Theme)
│ ├── kitchen.html # Küchenansicht (Card-Layout)
│ ├── admin.html # Admin-Panel (Drag & Drop CSV-Import)
│ ├── stats.html # Statistiken
│ ├── history.html # Historie-Übersicht
│ ├── history_detail.html # User-Detail-Historie
│ ├── *_modern.html # Moderne Design-Varianten (Backup)
│ └── *_old.html # Legacy-Templates (Backup)
├── deployment/
│ ├── setup_production.sh # Automatisches Production-Setup
│ ├── setup_cronjobs.sh # Cronjob-Installation
│ ├── gunicorn.conf.py # Gunicorn Konfiguration
│ ├── foodbot.service # Systemd Service
│ ├── nginx-foodbot # Nginx Reverse Proxy Config
│ ├── logrotate-foodbot # Log-Rotation Config
│ └── DISPLAY_SETUP.md # 3,5" Display Konfiguration (LCD-show)
├── backup_db.py # Automatisches Datenbank-Backup
├── clear_registrations.py # Täglich Anmeldungen löschen
├── docker-compose.yml # Docker Deployment
├── Dockerfile # Container-Image
├── requirements.txt # Python Dependencies
├── README.md # Diese Datei
└── DEPLOYMENT.md # Ausführliche Deployment-Anleitung
Backups werden automatisch täglich um 00:30 Uhr erstellt:
- Speicherort:
/home/pi/FoodBot/backups/ - Format:
foodbot_backup_YYYYMMDD_HHMMSS.db - Manuell:
python backup_db.py
# Application Logs
tail -f /var/log/foodbot/error.log
tail -f /var/log/foodbot/access.log
# Systemd Logs
journalctl -u foodbot -f
# Backup/Reset Logs
tail -f /var/log/foodbot/backup.log
tail -f /var/log/foodbot/reset.log# WARNUNG: Löscht alle Anmeldungen des heutigen Tages!
python clear_registrations.pycd /home/pi/FoodBot
git pull
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart foodbotIm Admin-Panel können Benutzer per CSV importiert werden.
Format:
Name,Personalnummer,Karte
Max Mustermann,12345,ABC1234
Erika Musterfrau,23456,XYZ5678Oder englisch:
name,personal_number,card_idDie Karten-ID (RFID) ist optional.
FoodBot kann Webhooks senden (Slack, Discord, Teams):
Konfiguration:
NOTIFICATIONS_ENABLED=true
WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URLEvents:
- ✅ Neue Anmeldung
⚠️ Niedrige Teilnehmerzahl (< 5)- 🔥 Hohe Teilnehmerzahl (> 30)
sudo systemctl status foodbot
journalctl -u foodbot -n 50# Device prüfen
ls -l /dev/ttyUSB*
# Berechtigungen
sudo usermod -a -G dialout pi
# Neu anmelden!# Service aktiv?
sudo systemctl status foodbot
# Port 5001 lauscht?
sudo netstat -tlnp | grep 5001Mehr Hilfe: DEPLOYMENT.md - Troubleshooting
- Backend: Python 3.11+, Flask 3.1
- Datenbank: SQLite mit SQLAlchemy 2.0
- Server: Gunicorn mit 4 Workern (Production)
- Reverse Proxy: Nginx (optional)
- Hardware: Raspberry Pi 4, ELATEC TWN4 HID RFID Reader, 3,5" ILI9486 Touchscreen (320x480)
- Display: LCD-show Treiber für SPI-basierte Displays
- CSS: CSS Custom Properties (Variablen)
- Layout: CSS Grid & Flexbox
- Theme: Dark Mode (#0f172a Base, #dc2626 Primary, #10b981 Success)
- Typography: System Fonts (-apple-system, BlinkMacSystemFont, Segoe UI)
- Components: Card-basiert, Gradients, Shadow-Effekte
flask- Web Frameworkflask-sqlalchemy- ORMflask-limiter- Rate Limitingpyserial- RFID-Reader Kommunikationqrcode[pil]- QR-Code Generierunggunicorn- WSGI Serverpython-dotenv- Environment Configuration
- ✅ Session-basierte Admin-Authentifizierung
- ✅ Rate Limiting auf API-Endpoints
- ✅ CSRF-Protection (Flask-WTF)
- ✅ Prepared Statements (SQLAlchemy)
- ✅ Input Validation
MIT License - Frei verwendbar für private und kommerzielle Projekte.
Pull Requests sind willkommen! Für größere Änderungen bitte zuerst ein Issue öffnen.
Bei Problemen:
- DEPLOYMENT.md lesen
- Logs prüfen (siehe Wartung)
- GitHub Issue öffnen
🚒 Entwickelt für die Feuerwehr - Mit ❤️ und Python 🚒