# MYP - Projektdokumentation für das IHK-Abschlussprojekt

## Projektübersicht

**Projektname:** MYP (Manage Your Printer)  
**Projekttyp:** IHK-Abschlussprojekt für Fachinformatiker für digitale Vernetzung  
**Zeitraum:** [Dein Projektzeitraum]  
**Team:** 2 Personen (Frontend- und Backend-Entwicklung)

## Projektziel

Das Ziel des Projektes ist die Entwicklung einer Reservierungs- und Steuerungsplattform für 3D-Drucker, die es Benutzern ermöglicht, Drucker zu reservieren und deren Stromversorgung automatisch über WLAN-Steckdosen (Tapo P115) zu steuern. Die Plattform soll eine einfache Verwaltung der Drucker und ihrer Auslastung bieten sowie den Stromverbrauch optimieren, indem Drucker nur während aktiver Reservierungen mit Strom versorgt werden.

## Aufgabenbeschreibung

Als Fachinformatiker für digitale Vernetzung besteht meine Aufgabe in der Entwicklung des Backend-Systems, das folgende Funktionen bereitstellt:

1. **API-Backend für das Frontend**: Entwicklung einer RESTful API, die mit dem Frontend kommuniziert und alle notwendigen Daten bereitstellt.

2. **Authentifizierungssystem**: Integration einer OAuth-Authentifizierung über GitHub, um Benutzer zu identifizieren und Zugriffskontrolle zu gewährleisten.

3. **Datenbankverwaltung**: Erstellung und Verwaltung der Datenbankmodelle für Benutzer, Drucker und Reservierungen.

4. **Steckdosensteuerung**: Implementierung einer Schnittstelle zu Tapo P115 WLAN-Steckdosen, um die Stromversorgung der Drucker basierend auf Reservierungen zu steuern.

5. **Automatisierung**: Entwicklung von Mechanismen zur automatischen Überwachung von Reservierungen und Steuerung der Steckdosen.

6. **Sicherheit**: Implementierung von Sicherheitsmaßnahmen zum Schutz der Anwendung und der Daten.

7. **Dokumentation**: Erstellung einer umfassenden Dokumentation für Entwicklung, Installation und Nutzung des Systems.

## Technische Umsetzung

### Backend (Mein Verantwortungsbereich)

#### Verwendete Technologien

- **Programmiersprache**: Python 3.11
- **Web-Framework**: Flask 2.3.3
- **Datenbank-ORM**: SQLAlchemy 3.1.1
- **Datenbank**: SQLite (für Entwicklung), erweiterbar auf PostgreSQL für Produktion
- **Authentifizierung**: Authlib für GitHub OAuth
- **Steckdosen-Steuerung**: Tapo Python Library
- **Container-Technologie**: Docker und Docker Compose

#### Architektur

Die Backend-Anwendung folgt einer klassischen dreischichtigen Architektur:

1. **Datenmodell-Schicht**: SQLAlchemy ORM-Modelle für Benutzer, Sessions, Drucker und Druckaufträge
2. **Business-Logic-Schicht**: Implementierung der Geschäftslogik für Reservierungsverwaltung und Steckdosensteuerung
3. **API-Schicht**: RESTful API-Endpunkte, die vom Frontend konsumiert werden

Zusätzlich wurden folgende Features implementiert:

- **OAuth-Authentifizierung**: Implementierung einer sicheren Authentifizierung über GitHub
- **Session-Management**: Server-seitige Session-Verwaltung für Benutzerauthentifizierung
- **Steckdosensteuerung**: Asynchrone Steuerung der Tapo P115 WLAN-Steckdosen
- **CLI-Befehle**: Flask CLI-Befehle für automatisierte Aufgaben wie die Überprüfung abgelaufener Reservierungen

#### Datenmodell

Das Datenmodell besteht aus vier Hauptentitäten:

1. **User**: Benutzer mit GitHub-Authentifizierung und Rollenverwaltung
2. **Session**: Sitzungsdaten für die Authentifizierung
3. **Printer**: Drucker mit Status und IP-Adresse der zugehörigen Steckdose
4. **PrintJob**: Reservierungen mit Start- und Endzeit, Dauer und Status

#### API-Endpunkte

Die API wurde speziell entwickelt, um nahtlos mit dem bestehenden Frontend zusammenzuarbeiten. Sie bietet Endpunkte für:

- Authentifizierung und Benutzerverwaltung
- Druckerverwaltung
- Reservierungsverwaltung (Erstellen, Abbrechen, Verlängern)
- Statusinformationen wie verbleibende Zeit

#### Steckdosensteuerung

Die Steuerung der Tapo P115 WLAN-Steckdosen erfolgt über die Tapo Python Library. Das System:

- Schaltet Steckdosen bei Erstellung einer Reservierung ein
- Schaltet Steckdosen bei Abbruch oder Beendigung einer Reservierung aus
- Überprüft regelmäßig abgelaufene Reservierungen und schaltet die entsprechenden Steckdosen aus

#### Automatisierung

Das System implementiert mehrere Automatisierungsmechanismen:

- **Automatische Steckdosensteuerung**: Ein- und Ausschalten der Steckdosen basierend auf Reservierungsstatus
- **Job-Überprüfung**: CLI-Befehl `flask check-jobs` zur regelmäßigen Überprüfung abgelaufener Reservierungen
- **Logging**: Automatische Protokollierung aller Aktionen zur Fehlerdiagnose

### Frontend (Verantwortungsbereich des Teampartners)

Das Frontend wurde von meinem Teampartner entwickelt und besteht aus:

- Next.js-Anwendung mit React-Komponenten
- Tailwind CSS für das Styling
- Serverless Functions für API-Integrationen
- Responsive Design für Desktop- und Mobile-Nutzung

## Projektergebnisse

Das Projekt hat erfolgreich eine funktionsfähige Reservierungs- und Steuerungsplattform für 3D-Drucker geschaffen, die es Benutzern ermöglicht:

1. Sich über GitHub zu authentifizieren
2. Verfügbare Drucker zu sehen und zu reservieren
3. Ihre Reservierungen zu verwalten (verlängern, abbrechen, kommentieren)
4. Als Administrator Drucker und Benutzer zu verwalten

Technische Errungenschaften:

1. Nahtlose Integration mit dem Frontend
2. Erfolgreiche Implementierung der Steckdosensteuerung
3. Sichere Authentifizierung über GitHub OAuth
4. Optimierte Stromnutzung durch automatische Steckdosensteuerung

## Herausforderungen und Lösungen

### Herausforderung 1: GitHub OAuth-Integration

Die Integration der GitHub-Authentifizierung, insbesondere mit GitHub Enterprise, erforderte eine sorgfältige Konfiguration der OAuth-Einstellungen und URL-Anpassungen.

**Lösung:** Implementierung mit Authlib und anpassbaren Konfigurationsoptionen für verschiedene GitHub-Instanzen.

### Herausforderung 2: Tapo P115 Steuerung

Die Kommunikation mit den Tapo P115 WLAN-Steckdosen erforderte eine zuverlässige und asynchrone Implementierung.

**Lösung:** Verwendung der Tapo Python Library mit asynchronem Handling und robusten Fehlerbehandlungsmechanismen.

### Herausforderung 3: Kompatibilität mit bestehendem Frontend

Das Backend musste mit dem bereits entwickelten Frontend kompatibel sein, was eine genaue Anpassung der API-Endpunkte und Datenstrukturen erforderte.

**Lösung:** Sorgfältige Analyse des Frontend-Codes, um die erwarteten API-Strukturen zu verstehen und das Backend entsprechend zu implementieren.

### Herausforderung 4: Automatische Steckdosensteuerung

Die zuverlässige Steuerung der Steckdosen bei abgelaufenen Reservierungen war eine Herausforderung.

**Lösung:** Implementierung eines CLI-Befehls, der regelmäßig durch Cron-Jobs ausgeführt werden kann, um abgelaufene Reservierungen zu überprüfen.

## Fachliche Reflexion

Das Projekt erforderte ein breites Spektrum an Fähigkeiten aus dem Bereich der digitalen Vernetzung:

1. **Netzwerkkommunikation**: Implementierung der Kommunikation zwischen Backend, Frontend und WLAN-Steckdosen über verschiedene Protokolle.

2. **Systemintegration**: Integration verschiedener Systeme (GitHub OAuth, Datenbank, Tapo-Steckdosen) zu einer kohärenten Anwendung.

3. **API-Design**: Entwicklung einer RESTful API, die den Anforderungen des Frontends entspricht und zukunftssicher ist.

4. **Datenbankentwurf**: Erstellung eines optimierten Datenbankschemas für die Anwendung.

5. **Sicherheitskonzepte**: Implementierung von Sicherheitsmaßnahmen wie OAuth, Session-Management und Zugriffskontrollen.

6. **Automatisierung**: Entwicklung von Automatisierungsprozessen für die Steckdosensteuerung und Job-Überwachung.

Diese Aspekte entsprechen direkt den Kernkompetenzen des Berufsbildes "Fachinformatiker für digitale Vernetzung" und zeigen die praktische Anwendung dieser Fähigkeiten in einem realen Projekt.

## Ausblick und Weiterentwicklung

Das System bietet verschiedene Möglichkeiten zur Weiterentwicklung:

1. **Erweiterung der Steckdosenunterstützung**: Integration weiterer Smart-Home-Geräte neben Tapo P115.

2. **Benachrichtigungssystem**: Implementierung von E-Mail- oder Push-Benachrichtigungen für Reservierungserinnerungen.

3. **Erweiterte Statistiken**: Detailliertere Nutzungsstatistiken und Visualisierungen für Administratoren.

4. **Mobile App**: Entwicklung einer nativen mobilen App für iOS und Android.

5. **Verbesserte Automatisierung**: Integration mit weiteren Systemen wie 3D-Drucker-APIs für direktes Monitoring des Druckstatus.

## Fazit

Das MYP-Projekt zeigt erfolgreich, wie moderne Webtechnologien und IoT-Geräte kombiniert werden können, um eine praktische Lösung für die Verwaltung von 3D-Druckern zu schaffen. 

Als angehender Fachinformatiker für digitale Vernetzung konnte ich meine Fähigkeiten in den Bereichen Programmierung, Systemintegration, Netzwerkkommunikation und Automatisierung anwenden und erweitern. 

Die Zusammenarbeit im Team mit klarer Aufgabenteilung (Frontend/Backend) hat zu einem erfolgreichen Projektergebnis geführt, das die gestellten Anforderungen erfüllt und einen praktischen Nutzen bietet.

---

## Anhang

### Installation und Einrichtung

Detaillierte Anweisungen zur Installation und Einrichtung des Backend-Systems finden sich in der README.md-Datei.

### Wichtige Konfigurationsparameter

Die folgenden Umgebungsvariablen müssen konfiguriert werden:

- `SECRET_KEY`: Geheimer Schlüssel für die Session-Verschlüsselung
- `DATABASE_URL`: URL zur Datenbank
- `OAUTH_CLIENT_ID`: GitHub OAuth Client ID
- `OAUTH_CLIENT_SECRET`: GitHub OAuth Client Secret
- `GITHUB_API_BASE_URL`, `GITHUB_AUTHORIZE_URL`, `GITHUB_TOKEN_URL`: URLs für GitHub OAuth
- `TAPO_USERNAME`: Benutzername für die Tapo-Steckdosen
- `TAPO_PASSWORD`: Passwort für die Tapo-Steckdosen
- `TAPO_DEVICES`: JSON-Objekt mit der Zuordnung von Drucker-IDs zu IP-Adressen

### Cron-Job-Einrichtung

Für die automatische Überprüfung abgelaufener Jobs kann folgender Cron-Job eingerichtet werden:

```
*/5 * * * * cd /pfad/zum/projekt && /pfad/zur/venv/bin/flask check-jobs >> /pfad/zum/projekt/logs/cron.log 2>&1
```