9.9 KiB
MYP V2 - Häufige Fehler und Lösungen
Übersicht
Diese Datei dokumentiert häufige Fehler, die während der Entwicklung und dem Betrieb von MYP V2 auftreten können, sowie deren Lösungen.
🔧 Setup und Installation
Fehler: ModuleNotFoundError für PyP100
Symptom: ModuleNotFoundError: No module named 'PyP100'
Ursache: PyP100-Bibliothek ist nicht installiert
Lösung:
pip3.11 install PyP100
Fehler: Datenbankverbindung fehlgeschlagen
Symptom: sqlite3.OperationalError: unable to open database file
Ursache:
- Fehlende Schreibberechtigung im Datenbank-Verzeichnis
- Verzeichnis existiert nicht
Lösung:
# Verzeichnis erstellen
mkdir -p /path/to/database/directory
# Berechtigungen setzen
chmod 755 /path/to/database/directory
Fehler: Log-Verzeichnis nicht gefunden
Symptom: FileNotFoundError: [Errno 2] No such file or directory: 'logs/app/app.log'
Ursache: Log-Verzeichnisse wurden nicht erstellt
Lösung: Die ensure_log_directories()
Funktion in logging_config.py
wird automatisch aufgerufen
🔐 Authentifizierung und Autorisierung
Fehler: Session-Timeout zu kurz
Symptom: Benutzer werden zu häufig abgemeldet
Ursache: SESSION_LIFETIME
in settings.py
zu niedrig eingestellt
Lösung:
# In config/settings.py
SESSION_LIFETIME = timedelta(days=7) # Oder gewünschte Dauer
Fehler: Admin-Rechte nicht erkannt
Symptom: AttributeError: 'AnonymousUserMixin' object has no attribute 'is_admin'
Ursache: Benutzer ist nicht angemeldet oder UserMixin-Objekt falsch erstellt
Lösung: Prüfung in Decorators verbessern:
if not current_user.is_authenticated or not hasattr(current_user, 'is_admin') or not current_user.is_admin:
return jsonify({"error": "Keine Berechtigung"}), 403
Fehler: Passwort-Hash-Fehler
Symptom: ValueError: Invalid salt
Ursache: Inkonsistente Passwort-Hash-Methoden
Lösung: Einheitliche Verwendung von werkzeug.security
:
from werkzeug.security import generate_password_hash, check_password_hash
🖨️ Drucker und Smart Plug-Steuerung
Fehler: Tapo-Verbindung fehlgeschlagen
Symptom: Exception: Failed to establish a new connection
Ursache:
- Falsche IP-Adresse
- Netzwerkprobleme
- Falsche Credentials
Lösung:
- IP-Adresse in
PRINTERS
Konfiguration prüfen - Netzwerkverbindung testen:
ping <ip-address>
- Credentials in
settings.py
überprüfen
Fehler: Plug-Status kann nicht abgerufen werden
Symptom: KeyError: 'device_on'
Ursache: Unerwartete API-Antwort von Tapo-Gerät
Lösung: Defensive Programmierung:
plug_state = plug_info.get("device_on", False)
power_consumption = plug_info.get("current_power", 0)
Fehler: Drucker nicht in Konfiguration gefunden
Symptom: Drucker nicht in Konfiguration gefunden
Ursache: Drucker-Name stimmt nicht mit PRINTERS
Dictionary überein
Lösung:
- Verfügbare Drucker in
settings.py
prüfen - Exakte Schreibweise verwenden
- Neue Drucker zur Konfiguration hinzufügen
📅 Job-Management
Fehler: Überlappende Jobs nicht erkannt
Symptom: Mehrere Jobs laufen gleichzeitig auf einem Drucker
Ursache: Fehlerhafte Überlappungsprüfung in der Datenbank-Abfrage
Lösung: Korrekte SQL-Abfrage verwenden:
overlapping_jobs = db_session.query(Job).filter(
Job.printer_id == printer_id,
Job.status.in_(["scheduled", "active"]),
((Job.start_time <= start_time) & (Job.end_time > start_time)) |
((Job.start_time < end_time) & (Job.end_time >= end_time)) |
((Job.start_time >= start_time) & (Job.end_time <= end_time))
).count()
Fehler: Datumsformat-Parsing fehlgeschlagen
Symptom: ValueError: time data does not match format
Ursache: Inkonsistente Datumsformate zwischen Frontend und Backend
Lösung: ISO-Format verwenden:
start_time = datetime.fromisoformat(data["start_time"].replace("Z", "+00:00"))
Fehler: Job-Status nicht aktualisiert
Symptom: Jobs bleiben im "scheduled" Status obwohl sie laufen sollten
Ursache:
- Scheduler läuft nicht
- Fehler im Job-Monitor
Lösung:
- Scheduler-Status prüfen:
GET /api/scheduler/status
- Logs überprüfen:
logs/scheduler/scheduler.log
- Scheduler neu starten:
POST /api/scheduler/start
🗄️ Datenbank-Probleme
Fehler: Foreign Key Constraint
Symptom: sqlite3.IntegrityError: FOREIGN KEY constraint failed
Ursache: Versuch, referenzierte Datensätze zu löschen
Lösung: Abhängigkeiten vor dem Löschen prüfen:
# Vor dem Löschen eines Druckers
active_jobs = db_session.query(Job).filter(
Job.printer_id == printer_id,
Job.status.in_(["scheduled", "active"])
).count()
if active_jobs > 0:
return jsonify({"error": "Es existieren aktive Jobs für diesen Drucker"}), 400
Fehler: Datenbank-Session nicht geschlossen
Symptom: ResourceWarning: unclosed <sqlite3.Connection>
Ursache: Vergessene db_session.close()
Aufrufe
Lösung: Immer try/finally
verwenden:
db_session = get_db_session()
try:
# Datenbankoperationen
pass
finally:
db_session.close()
Fehler: Unique Constraint Violation
Symptom: sqlite3.IntegrityError: UNIQUE constraint failed
Ursache: Versuch, doppelte Einträge zu erstellen
Lösung: Vor dem Einfügen prüfen:
existing = db_session.query(User).filter(User.email == email).first()
if existing:
return jsonify({"error": "E-Mail bereits registriert"}), 400
📊 Logging und Monitoring
Fehler: Log-Rotation funktioniert nicht
Symptom: Log-Dateien werden sehr groß
Ursache: RotatingFileHandler
nicht korrekt konfiguriert
Lösung: Konfiguration in logging_config.py
prüfen:
handler = RotatingFileHandler(
log_file,
maxBytes=10*1024*1024, # 10MB
backupCount=5
)
Fehler: Logger schreibt nicht in Datei
Symptom: Keine Log-Einträge in den Dateien
Ursache:
- Log-Level zu hoch eingestellt
- Handler nicht korrekt hinzugefügt
Lösung:
- Log-Level prüfen:
logger.setLevel(logging.INFO)
- Handler hinzufügen:
logger.addHandler(handler)
Fehler: Doppelte Log-Einträge
Symptom: Jeder Log-Eintrag erscheint mehrfach
Ursache: Logger-Vererbung oder mehrfache Handler-Registrierung
Lösung: propagate
deaktivieren:
logger.propagate = False
🔄 Scheduler-Probleme
Fehler: Scheduler startet nicht
Symptom: scheduler.is_running()
gibt False
zurück
Ursache:
SCHEDULER_ENABLED = False
in Konfiguration- Fehler beim Task-Registrieren
Lösung:
- Konfiguration prüfen:
SCHEDULER_ENABLED = True
- Task-Registrierung überprüfen
- Logs analysieren:
logs/scheduler/scheduler.log
Fehler: Tasks werden nicht ausgeführt
Symptom: Job-Monitor läuft nicht automatisch
Ursache:
- Task nicht korrekt registriert
- Fehler in der Task-Funktion
Lösung:
- Task-Status prüfen:
scheduler.get_task_info()
- Task-Funktion auf Fehler prüfen
- Interval-Einstellungen überprüfen
Fehler: Scheduler-Thread blockiert
Symptom: Anwendung reagiert nicht mehr
Ursache: Endlosschleife oder blockierende Operation in Task
Lösung:
- Timeout für externe Operationen setzen
- Exception-Handling in Tasks verbessern
- Scheduler neu starten
🌐 API und HTTP-Probleme
Fehler: CORS-Probleme
Symptom: Access-Control-Allow-Origin
Fehler im Browser
Ursache: Frontend und Backend auf verschiedenen Ports
Lösung: Flask-CORS installieren und konfigurieren:
from flask_cors import CORS
CORS(app)
Fehler: 500 Internal Server Error
Symptom: Unspezifische Server-Fehler
Ursache: Unbehandelte Exceptions
Lösung:
- Debug-Modus aktivieren:
FLASK_DEBUG = True
- Logs überprüfen
- Try-Catch-Blöcke erweitern
Fehler: JSON-Serialisierung fehlgeschlagen
Symptom: TypeError: Object of type datetime is not JSON serializable
Ursache: Datetime-Objekte in JSON-Response
Lösung: .isoformat()
verwenden:
"created_at": obj.created_at.isoformat() if obj.created_at else None
🔧 Performance-Probleme
Fehler: Langsame Datenbankabfragen
Symptom: API-Responses dauern sehr lange
Ursache: Fehlende Indizes oder ineffiziente Abfragen
Lösung:
- Indizes auf häufig abgefragte Spalten erstellen
- Query-Optimierung mit
EXPLAIN QUERY PLAN
- Eager Loading für Beziehungen verwenden
Fehler: Speicher-Leaks
Symptom: Speicherverbrauch steigt kontinuierlich
Ursache:
- Nicht geschlossene Datenbankverbindungen
- Zirkuläre Referenzen
Lösung:
- Connection-Pooling implementieren
- Regelmäßige Garbage Collection
- Memory-Profiling mit
memory_profiler
🛠️ Entwicklungsumgebung
Fehler: Import-Fehler in Tests
Symptom: ModuleNotFoundError
beim Ausführen von Tests
Ursache: PYTHONPATH nicht korrekt gesetzt
Lösung:
export PYTHONPATH="${PYTHONPATH}:$(pwd)"
python3.11 -m pytest
Fehler: Konfigurationsdateien nicht gefunden
Symptom: FileNotFoundError
für settings.py
Ursache: Arbeitsverzeichnis stimmt nicht
Lösung: Relative Pfade verwenden oder Arbeitsverzeichnis setzen:
cd /path/to/MYP_V2
python3.11 app/app.py
📋 Checkliste für Fehlerbehebung
Vor jeder Änderung:
- Aktuelle Logs überprüfen
- Datenbank-Backup erstellen
- Konfiguration validieren
- Tests ausführen (falls vorhanden)
Nach jeder Änderung:
- Funktionalität testen
- Logs auf neue Fehler prüfen
- Performance-Impact bewerten
- Dokumentation aktualisieren
Bei kritischen Fehlern:
- Service stoppen
- Fehlerursache identifizieren
- Rollback-Plan erstellen
- Fix implementieren und testen
- Service neu starten
- Monitoring für 24h verstärken
Letzte Aktualisierung: Dezember 2024
Hinweis: Diese Datei sollte bei jedem neuen Fehler aktualisiert werden.