root 7c1d0069c6 Update documentation for PyP100 migration
- Updated environment variable section to use PRINTERS instead of TAPO_DEVICES
- Added JSON format example for the PRINTERS variable
- Updated technology stack to mention PyP100 instead of Tapo library
- Fixed database path reference from DATABASE_URL to DATABASE_PATH

🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-12 12:20:31 +01:00

6.8 KiB

MYP Backend-Steuerungsplattform

Dies ist das Backend für das MYP (Manage Your Printer) Projekt, ein IHK-Abschlussprojekt für Fachinformatiker für digitale Vernetzung. Die Plattform ist mit Python und Flask implementiert und stellt eine RESTful API zur Verfügung, die es ermöglicht, 3D-Drucker zu verwalten, zu reservieren und über WLAN-Steckdosen (Tapo P115) zu steuern.

Funktionen

  • Lokales Authentifizierungssystem (Offline-fähig)
  • Rollen-basierte Zugriffskontrolle (Admin/User/Guest)
  • Druckerverwaltung (Hinzufügen, Bearbeiten, Löschen)
  • Reservierungsverwaltung (Erstellen, Abbrechen, Verlängern)
  • Fernsteuerung von WLAN-Steckdosen (Tapo P115)
  • Statistikerfassung und -anzeige
  • RESTful API für die Kommunikation mit dem Frontend

Technologie-Stack

  • Python: Programmiersprache
  • Flask: Web-Framework
  • SQLite: Integrierte Datenbank (kann für Produktion durch PostgreSQL ersetzt werden)
  • PyP100: Python-Bibliothek zur Steuerung der Tapo P115 WLAN-Steckdosen
  • Gunicorn: WSGI HTTP Server für die Produktionsumgebung
  • Docker: Containerisierung der Anwendung

Projekt-Struktur

  • app.py: Hauptanwendungsdatei mit allen Routen und Modellen
  • requirements.txt: Liste aller Python-Abhängigkeiten
  • Dockerfile: Docker-Konfiguration
  • docker-compose.yml: Docker Compose Konfiguration für einfaches Deployment
  • .env.example: Beispiel für die Umgebungsvariablen
  • logs/: Logdateien (automatisch erstellt)
  • instance/: SQLite-Datenbank (automatisch erstellt)

Installation und Ausführung

Lokal (Entwicklung)

  1. Python 3.8 oder höher installieren
  2. Repository klonen
  3. Ins Projektverzeichnis wechseln
  4. Virtuelle Umgebung erstellen (optional, aber empfohlen)
    python -m venv venv
    source venv/bin/activate  # Unter Windows: venv\Scripts\activate
    
  5. Abhängigkeiten installieren
    pip install -r requirements.txt
    
  6. .env.example nach .env kopieren und anpassen
    cp .env.example .env
    
  7. Anwendung starten
    python app.py
    

Die Anwendung ist dann unter http://localhost:5000 erreichbar.

Mit Docker

  1. Docker und Docker Compose installieren
  2. Ins Projektverzeichnis wechseln
  3. .env.example nach .env kopieren und anpassen
    cp .env.example .env
    
  4. Anwendung starten
    docker-compose up -d
    

Die Anwendung ist dann unter http://localhost:5000 erreichbar.

API-Endpunkte

Authentifizierung

  • POST /auth/register: Neuen Benutzer registrieren
  • POST /auth/login: Benutzer anmelden
  • POST /auth/logout: Abmelden und Session beenden
  • POST /api/create-initial-admin: Initialen Administrator erstellen
  • GET /api/me: Aktuelle Benutzerinformationen abrufen

Benutzer

  • GET /api/users: Liste aller Benutzer (Admin)
  • GET /api/users/<id>: Details zu einem Benutzer (Admin)
  • PUT /api/users/<id>: Benutzer aktualisieren (Admin)
  • DELETE /api/users/<id>: Benutzer löschen (Admin)

Drucker

  • GET /api/printers: Liste aller Drucker
  • POST /api/printers: Drucker hinzufügen (Admin)
  • GET /api/printers/<id>: Details zu einem Drucker
  • PUT /api/printers/<id>: Drucker aktualisieren (Admin)
  • DELETE /api/printers/<id>: Drucker löschen (Admin)

Druckaufträge

  • GET /api/jobs: Liste aller Druckaufträge (Admin) oder eigener Druckaufträge (Benutzer)
  • POST /api/jobs: Druckauftrag erstellen
  • GET /api/jobs/<id>: Details zu einem Druckauftrag
  • POST /api/jobs/<id>/abort: Druckauftrag abbrechen
  • POST /api/jobs/<id>/finish: Druckauftrag vorzeitig beenden
  • POST /api/jobs/<id>/extend: Druckauftrag verlängern
  • PUT /api/jobs/<id>/comments: Kommentare aktualisieren
  • GET /api/job/<id>/remaining-time: Verbleibende Zeit für einen aktiven Druckauftrag

Statistiken

  • GET /api/stats: Statistiken zu Druckern, Aufträgen und Benutzern (Admin)

Datenmodell

Benutzer (User)

  • id (String UUID, Primary Key)
  • username (String, Unique)
  • password_hash (String)
  • display_name (String)
  • email (String, Unique)
  • role (String, 'admin', 'user' oder 'guest')

Session

  • id (String UUID, Primary Key)
  • user_id (String UUID, Foreign Key zu User)
  • expires_at (DateTime)

Drucker (Printer)

  • id (String UUID, Primary Key)
  • name (String)
  • description (Text)
  • status (Integer, 0=available, 1=busy, 2=maintenance)
  • ip_address (String, IP-Adresse der Tapo-Steckdose)

Druckauftrag (PrintJob)

  • id (String UUID, Primary Key)
  • printer_id (String UUID, Foreign Key zu Printer)
  • user_id (String UUID, Foreign Key zu User)
  • start_at (DateTime)
  • duration_in_minutes (Integer)
  • comments (Text)
  • aborted (Boolean)
  • abort_reason (Text)

Steckdosensteuerung

Die Anwendung steuert Tapo P115 WLAN-Steckdosen, um die Drucker basierend auf Reservierungen ein- und auszuschalten:

  • Bei Erstellung eines Druckauftrags wird die Steckdose des zugehörigen Druckers automatisch eingeschaltet
  • Bei Abbruch oder vorzeitiger Beendigung eines Druckauftrags wird die Steckdose ausgeschaltet
  • Nach Ablauf der Reservierungszeit wird die Steckdose automatisch ausgeschaltet
  • Ein CLI-Befehl flask check-jobs überprüft regelmäßig abgelaufene Jobs und schaltet Steckdosen aus

Sicherheit

  • Die Anwendung verwendet ein lokales Authentifizierungssystem mit Passwort-Hashing
  • Sitzungsdaten werden in Server-Side-Sessions gespeichert
  • Zugriffskontrollen sind implementiert, um sicherzustellen, dass Benutzer nur auf ihre eigenen Daten zugreifen können
  • Admin-Benutzer haben Zugriff auf alle Daten und können Systemkonfigurationen ändern
  • Der erste registrierte Benutzer wird automatisch zum Administrator

Logging

Die Anwendung protokolliert Aktivitäten in rotierenden Logdateien in einem logs Verzeichnis. Dies hilft bei der Fehlersuche und Überwachung der Anwendung im Betrieb.

Umgebungsvariablen

Die folgenden Umgebungsvariablen müssen konfiguriert werden:

  • SECRET_KEY: Geheimer Schlüssel für die Session-Verschlüsselung
  • DATABASE_PATH: Pfad zur Datenbank (Standard: SQLite-Datenbank im Instance-Verzeichnis)
  • TAPO_USERNAME: Benutzername für die Tapo-Steckdosen
  • TAPO_PASSWORD: Passwort für die Tapo-Steckdosen
  • PRINTERS: JSON-Objekt mit der Zuordnung von Drucker-Namen zu IP-Adressen der Steckdosen im Format: {"Printer 1": {"ip": "192.168.1.100"}, "Printer 2": {"ip": "192.168.1.101"}, ...}

Automatisierung

Die Anwendung beinhaltet einen CLI-Befehl flask check-jobs, der regelmäßig ausgeführt werden sollte (z.B. als Cron-Job), um abgelaufene Druckaufträge zu überprüfen und die zugehörigen Steckdosen auszuschalten.

Kompatibilität mit dem Frontend

Das Backend wurde speziell für die Kompatibilität mit dem bestehenden Frontend entwickelt, welches in /packages/reservation-platform zu finden ist. Die API-Endpunkte und Datenstrukturen sind so gestaltet, dass sie nahtlos mit dem Frontend zusammenarbeiten.