88 KiB
Alles klar. Ich verfasse nun eine vollstĂ€ndige IHK-konforme Projektdokumentation ĂŒber dein MYP-Projekt (Manage Your Printer) als FlieĂtext in deutscher Sprache. Die Gliederung und Formatierung orientieren sich exakt an deiner bisherigen Struktur und den IHK-Vorgaben. Der Umfang wird auf ca. 15 Seiten ausgelegt, ohne direkte Inhalte aus der Beispieldokumentation zu ĂŒbernehmen. Du erhĂ€ltst den Text vollstĂ€ndig formatiert hier zur Ăbernahme in dein Word-Dokument.
Projektdokumentation: MYP â Manage Your Printer
Einleitung
Die folgende Projektdokumentation beschreibt die Umsetzung des IHK-Abschlussprojekts âMYP â Manage Your Printerâ , das im Rahmen der Ausbildung zum Fachinformatiker Digitale Vernetzung durchgefĂŒhrt wurde. Ziel des Projekts war die Entwicklung eines lokal betriebenen Druckerreservierungssystems, das es Gastnutzern ermöglicht, DruckauftrĂ€ge anzufragen, welche von Administratoren geprĂŒft und freigegeben werden. Zur physischen Kontrolle des Druckvorgangs wird ein Smart Plug (WLAN-Steckdose) eingesetzt, der den Drucker nur bei autorisierten VorgĂ€ngen mit Strom versorgt. Das Besondere an diesem System ist der ausschlieĂliche Betrieb in einem Offline-Netzwerk â also ohne Internetzugang â was erhöhte Sicherheit und UnabhĂ€ngigkeit von externen Diensten gewĂ€hrleistet.
Ausgangssituation fĂŒr dieses Projekt ist ein Szenario, in dem externen Nutzern zeitweilig ein Drucker zur VerfĂŒgung gestellt werden soll, ohne ihnen direkten und unkontrollierten Zugriff auf die Infrastruktur zu gewĂ€hren. Bisher war der Ablauf manuell: GĂ€ste mussten ihre DruckwĂŒnsche dem Personal mitteilen, das den Drucker einschaltete und den Druck ausfĂŒhrte. Dieses Verfahren war ineffizient und zeitaufwĂ€ndig. Mit Manage Your Printer (MYP) soll dieser Prozess digitalisiert und automatisiert werden. GĂ€ste können selbstĂ€ndig Druckanfragen stellen, welche durch das System verwaltet werden. Mitarbeiter in der Rolle Administrator behalten dennoch die Kontrolle, indem sie jede Anfrage prĂŒfen und freigeben oder ablehnen können. Der Drucker wird nur bei Freigabe â und nach Eingabe eines One-Time Password (OTP) durch den Nutzer â eingeschaltet. Dadurch wird sichergestellt, dass der Druck nur vom berechtigten Nutzer und zur vorgesehenen Zeit durchgefĂŒhrt wird.
Projektumfang und KernfunktionalitĂ€ten: MYP umfasst eine Webanwendung mit client-seitiger und server-seitiger Komponente sowie IoT-Integration. Die server-seitige Komponente bildet das HerzstĂŒck: Ein Python-basiertes Flask-Backend stellt eine REST-API bereit und ĂŒbernimmt die GeschĂ€ftslogik (Authentifizierung, Benutzer- und Rechteverwaltung, Verarbeitung der Druckanfragen, Generierung von Benachrichtigungen und OTP-Codes). Als Datenbank kommt eine lokale SQLite -Datenbank zum Einsatz, um Benutzerdaten, Anfragen und Reservierungszeiten zu speichern. Zur Steuerung des Druckers ist ein TP-Link Tapo P110 Smart Plug integriert â eine WLAN-Steckdose, die ĂŒber das Netzwerk schaltbar ist und den Drucker vom Strom trennt oder freigibt. Da das GerĂ€t normalerweise eine Cloud-Anbindung erfordert, wurde im Rahmen des Projekts das Protokoll der Steckdose analysiert und eine lokale Steuerung implementiert. Die client-seitige Komponente besteht aus einer Web-OberflĂ€che, die auf modernen Webtechnologien basiert (ein mit pnpm und shadcn/UI entwickeltes Frontend, laufend in einem Docker-Container auf dem Kiosk-GerĂ€t). FĂŒr den Fall, dass dieses containerisierte Frontend nicht verfĂŒgbar ist, bietet das System eine einfache Fallback-OberflĂ€che auf Basis von Jinja2-Templates , die direkt vom Flask-Server geliefert wird. Diese Fallback-UI wird insbesondere im Kiosk-Modus genutzt: Ein Raspberry Pi mit angeschlossenem Display kann im Vollbild-Browser die OberflĂ€che anzeigen, sodass Nutzer direkt vor Ort am GerĂ€t Druckanfragen stellen und freigegebene DruckauftrĂ€ge durch Eingabe des OTP-Codes starten können.
Infrastruktur und Netzwerk: Das System wird auf zwei Raspberry Pi Einplatinencomputern betrieben, die als Frontend- bzw. Backend-Server fungieren. Beide Raspberry Pi sind in einem vom Internet isolierten lokalen Netzwerk mit festen IP-Adressen eingebunden (Backend-Server unter z.B. 192.168.0.105
, Frontend-Kiosk unter 192.168.0.109
). Das lokale Netzwerk umfasst ein LAN und ein WLAN , die aus SicherheitsgrĂŒnden voneinander getrennt sind und nur gezielt miteinander kommunizieren. Der Backend-Pi ist ĂŒber LAN angebunden, wĂ€hrend der Frontend-Pi einen WLAN-Zugang bereitstellt. Durch Routing auf dem Frontend-Pi können die WLAN-Clients (GĂ€ste) ausschlieĂlich auf definierte Dienste im LAN zugreifen (insbesondere auf die API des Backend-Servers), wĂ€hrend ein Zugriff auf andere interne Ressourcen unterbunden ist. Dieses Netzwerkdesign â ein isoliertes Subnetz (192.168.0.0/24
) mit internem Routing ohne Internetzugang â entspricht den Anforderungen der digitalen Vernetzung hinsichtlich Sicherheit und Kontrolle: GĂ€ste erhalten nur Zugang zum benötigten Dienst, und das Gesamtsystem ist gegen Angriffe von auĂen abgeschottet. Zudem kommen SSL/TLS-Zertifikate in Form einer selbstsignierten Public-Key-Infrastruktur zum Einsatz, um die Web-OberflĂ€che auch ohne Internet sicher (HTTPS-verschlĂŒsselt) bereitzustellen. Auf den Einsatz externer CDNs oder Cloud-Dienste wurde vollstĂ€ndig verzichtet, um die Offline-FĂ€higkeit und DatenschutzkonformitĂ€t zu gewĂ€hrleisten â alle benötigten Bibliotheken und Ressourcen werden lokal vorgehalten.
Im Folgenden wird zunĂ€chst die Planung des Projekts beschrieben, einschlieĂlich Anforderungsanalyse, Zeit- und Ressourcenplanung. AnschlieĂend erfolgt eine ausfĂŒhrliche Darstellung der DurchfĂŒhrung und technischen Umsetzung, gefolgt vom Projektabschluss mit Testphase und Auswertung. AbschlieĂend enthĂ€lt die Dokumentation eine Kundendokumentation mit Hinweisen zur Bedienung des Systems fĂŒr Endanwender sowie den Anhang mit ergĂ€nzenden Unterlagen.
Projektplanung
2.1 Anforderungsanalyse und Projektzieldefinition
Zu Beginn des Projekts wurden die Anforderungen in Abstimmung mit dem Auftraggeber (internes IT-Management) erhoben und prĂ€zisiert. Daraus ergab sich das nachfolgend beschriebene Leistungsprofil des MYP â Manage Your Printer -Systems.
Funktionale Anforderungen:
- Benutzerrollen und Authentifizierung: Das System muss zwei Rollen unterstĂŒtzen â Gast und Administrator . GĂ€ste sind berechtigte Nutzer, die DruckauftrĂ€ge anfragen dĂŒrfen. Administratoren verwalten das System, genehmigen oder verweigern Anfragen und können den Drucker manuell freigeben. Alle Nutzer mĂŒssen sich am Websystem anmelden (Login mit Benutzername/Passwort), damit Aktionen nachvollziehbar und geschĂŒtzt sind. Die Authentifizierung soll lokal erfolgen, da keine externe Anbindung vorhanden ist.
- Druckanfrage und Reservierung: Ein Gast soll ĂŒber die WeboberflĂ€che eine Druckanfrage stellen können. Dazu gibt er die erforderlichen Informationen ein, z.B. Name, ggf. Dokumentenbeschreibung oder Anzahl der Seiten, sowie den gewĂŒnschten Zeitrahmen oder Zeitpunkt fĂŒr den Druck. Optional kann ein Kalender benutzt werden, um einen freien Zeitslot fĂŒr die Nutzung des Druckers zu buchen. Das System erfasst diese Anfrage und stellt sie im Backend zur Entscheidung bereit.
- Genehmigungs-Workflow: Ein Administrator soll eine Ăbersicht aller offenen Druckanfragen sehen. Er kann einzelne Anfragen freigeben (genehmigen) oder ablehnen . Im Falle einer Ablehnung wird der anfragende Gast in der BenutzeroberflĂ€che darĂŒber informiert, dass der Druck nicht erfolgen kann (inklusive optionalem Grund). Im Falle einer Freigabe erzeugt das System einen eindeutigen OTP-Code (Einmalkennwort) fĂŒr die entsprechende Anfrage. Dieser Code wird dem Gast angezeigt (bzw. vom Administrator an den Gast kommuniziert) und berechtigt zum Start des Druckvorgangs.
- OTP-gestĂŒtzter Druckvorgang: Der Drucker ist standardmĂ€Ăig deaktiviert (vom Stromnetz getrennt) und kann nur mittels der smarten Steckdose aktiviert werden. Hat der Administrator den Auftrag freigegeben, kann der Gast den Druck vor Ort initiieren, indem er am Kiosk-Terminal oder in seiner WeboberflĂ€che den erhaltenen OTP-Code eingibt. Nach Eingabe eines gĂŒltigen Codes schaltet das System die Smart-Steckdose ein, wodurch der Drucker mit Strom versorgt wird und der Gast seinen Druck durchfĂŒhren kann. Jeder OTP-Code ist nur einmalig gĂŒltig und verknĂŒpft mit genau einem Druckauftrag. Nach erfolgtem Druck (oder falls der Code nicht innerhalb eines definierten Zeitfensters benutzt wird) wird der Code ungĂŒltig und die Steckdose automatisch wieder ausgeschaltet, um den Drucker zu deaktivieren.
- Kalender- und Terminverwaltung: Um Kollisionen zu vermeiden und die Ressourcennutzung zu optimieren, soll das System einen Kalender anbieten. Darin werden alle genehmigten Drucktermine bzw. reservierten Zeitfenster sichtbar gemacht. GĂ€ste können beim Stellen einer Anfrage ein freies Zeitfenster auswĂ€hlen; Administratoren können Reservierungen einsehen und bei Bedarf manuell anpassen. Die KalenderfunktionalitĂ€t wird mit FullCalendar umgesetzt, wodurch eine ĂŒbersichtliche Darstellung der Tage und Uhrzeiten sowie eine einfache Benutzerinteraktion (z.B. Auswahl eines Slots) möglich ist.
- Benachrichtigungssystem: Das System soll die beteiligten Personen ĂŒber StatusĂ€nderungen informieren. Beispielsweise erhĂ€lt ein Administrator eine Benachrichtigung (innerhalb der Web-OberflĂ€che oder per Signal auf dem Kiosk), sobald ein neuer Druckwunsch eingegangen ist. Ebenso wird der Gast benachrichtigt, wenn sein Auftrag genehmigt oder abgelehnt wurde â im Offline-Betrieb geschieht dies durch Statusanzeigen in der Web-App (etwa beim Neuladen der Seite oder via AJAX-Polling, da push-Nachrichten mangels Internet nicht realisierbar sind). Optional könnte ein akustisches Signal oder LED am Kiosk-GerĂ€t eingesetzt werden, um eine Freigabe visuell/akustisch anzuzeigen.
- Kiosk-Modus Bedienung: Das System soll auch ohne eigenes EndgerĂ€t durch den Nutzer bedienbar sein. Dazu dient der Raspberry Pi im Kiosk-Modus, der einen Bildschirm und EingabegerĂ€te bereitstellt. Ăber diesen Kiosk können GĂ€ste ihre Druckanfragen ebenfalls eingeben und â sofern genehmigt â den Drucker per Codeeingabe freischalten. Die OberflĂ€che im Kiosk-Modus soll intuitiv und einfach gehalten sein (groĂe SchaltflĂ€chen, klare Anweisungen), da sie von wechselnden Benutzern spontan bedient wird.
- Administrationsfunktionen: ZusĂ€tzlich zur Genehmigung von Anfragen sollen Administratoren grundlegende Verwaltungsfunktionen haben. Dazu zĂ€hlt insbesondere die Verwaltung der Benutzerkonten (Anlegen von Gast-Accounts, Ăndern von Passwörtern) und ggf. das Einsehen von Logs ĂŒber vergangene DruckvorgĂ€nge. Diese Funktionen stellen sicher, dass das System langfristig betreut werden kann.
- Sicherheit: Alle Aktionen sollen nur durch authentifizierte und berechtigte Personen erfolgen. Unbefugte dĂŒrfen weder Drucker noch Steckdose aktivieren können. Die Kommunikation im Netzwerk muss durch VerschlĂŒsselung vor Mithören geschĂŒtzt sein (TLS im internen Netz). Ferner dĂŒrfen GĂ€ste im WLAN keinen Zugriff auf interne Systeme erhalten auĂer auf die vorgesehenen Dienste des Druckmanagementsystems.
Nicht-funktionale Anforderungen:
- Offline-FĂ€higkeit: Das gesamte System muss ohne Internetzugriff voll funktionsfĂ€hig sein. SĂ€mtliche AbhĂ€ngigkeiten (JavaScript/CSS-Bibliotheken, Schriftarten etc.) sind lokal zu hosten. Auf Cloud-Dienste (wie z.B. externe Authentifizierung, E-Mail-Versand oder externe APIs) wird verzichtet. Dies gewĂ€hrleistet UnabhĂ€ngigkeit von Internetverbindung und schĂŒtzt vor externen Bedrohungen.
- Performance und ZuverlĂ€ssigkeit: Trotz ressourcenarmer Hardware (Raspberry Pi) soll die Anwendung flĂŒssig laufen. Anfragen und Seitenaufrufe sollen in wenigen Sekunden verarbeitet werden. Das System muss auĂerdem ĂŒber lĂ€ngere Zeit stabil betrieben werden können (24/7 Betrieb wĂ€hrend VeranstaltungszeitrĂ€umen), ohne regelmĂ€Ăige Neustarts.
- Benutzerfreundlichkeit: Die Web-OberflĂ€che soll auch fĂŒr technisch unerfahrene GĂ€ste verstĂ€ndlich sein. Dies bedeutet ein klares UI-Design, deutsche Beschriftungen und Eingabehilfen (z.B. Kalender zur Datumsauswahl statt manueller Eingabe). Im Kiosk-Modus muss die Bedienung ohne Schulung möglich sein.
- Skalierbarkeit und Erweiterbarkeit: Obwohl zunĂ€chst nur ein Drucker und eine begrenzte Nutzerzahl vorgesehen sind, sollte das Design grundsĂ€tzlich erweiterbar sein. Beispielsweise könnte man in Zukunft weitere Drucker/Steckdosen integrieren oder eine gröĂere Zahl gleichzeitiger Nutzer unterstĂŒtzen. Die Software-Architektur (Trennung von Frontend/Backend, Nutzung einer REST-API) begĂŒnstigt solche Erweiterungen.
- Wartbarkeit: Da es sich um ein Abschlussprojekt handelt, soll das System gut dokumentiert und im Quelltext sauber strukturiert sein. Einrichtungsschritte (Installation auf Raspberry Pi, Starten der Dienste) sollen nachvollziehbar und reproduzierbar sein. Konfigurationsparameter (wie IP-Adressen, Zugangsdaten) werden zentral verwaltet, um Anpassungen im Betrieb zu erleichtern.
- Kostenrahmen: Das Projekt nutzt kostengĂŒnstige Hardware. Vorhandene Raspberry Pi und ein handelsĂŒblicher Smart Plug (ca. 20â30 âŹ) genĂŒgen. Weitere Ausgaben, etwa fĂŒr Lizenzen, entfallen durch Einsatz von Open-Source-Software. Damit bleibt das Projekt im niedrigen dreistelligen Euro-Bereich (inkl. Ersatzhardware) und im Rahmen der Ausbildungskriterien.
- Zeitlicher Rahmen: Die Umsetzung des Projekts musste innerhalb der von der IHK vorgegebenen Projektzeit (i.d.R. 70 Stunden netto) erfolgen. Dies beinhaltet Planung, Umsetzung, Test und Dokumentation. Eine strukturierte Zeitplanung war daher entscheidend, um alle Ziele fristgerecht zu erreichen.
Das Projektziel lĂ€sst sich zusammenfassend wie folgt beschreiben: Es soll eine kompakte, sichere und autonome Druckermanagement-Lösung entstehen, welche die manuelle Betreuung von Gast-DruckauftrĂ€gen durch Personal ĂŒberflĂŒssig macht, ohne dabei die Kontrolle ĂŒber die Ressourcennutzung zu verlieren. Der Erfolg des Projekts wird daran gemessen, dass GĂ€ste eigenstĂ€ndig DruckauftrĂ€ge anlegen können und diese nur im Falle einer Freigabe durch den Administrator und korrekter Codeeingabe zum Druck fĂŒhren. Gleichzeitig sollen Administratoren zu jedem Zeitpunkt den Ăberblick behalten und im Notfall eingreifen können (z.B. Druckauftrag abbrechen, Drucker vom Netz trennen). Durch diese Lösung werden AblĂ€ufe optimiert und der Aspekt der Digitalen Vernetzung â nĂ€mlich die intelligente Verbindung verschiedener Systeme (Web-Anwendung, Datenbank, IoT-Smart-Plug, Netzwerkkomponenten) â praxisgerecht umgesetzt.
2.2 Projektstruktur und Vorgehensmodell
Auf Basis der Anforderungen wurde ein Projektstrukturplan erstellt, der das Vorhaben in sinnvolle Teilaufgaben gliedert. Das Projekt wurde im Einzelauftrag durchgefĂŒhrt, sodass der Projektverlauf in Phasen gemÀà des klassischen Wasserfallmodells geplant wurde. Folgende Phasen wurden definiert:
- Planungs- und Analysephase: Ausformulieren des Projektauftrags, Aufnahme der Anforderungen (siehe oben), Evaluierung möglicher LösungsansÀtze und Technologien. Erstellung eines groben Systementwurfs (Komponentendiagramm, Netzplan) und eines Zeitplans. Geplante Dauer: ca. 10 Stunden.
- Design- und Konzeptionsphase: Detailentwurf der Softwarearchitektur (Datenbankmodell, API-Spezifikation, Ablaufdiagramme fĂŒr wichtige Use Cases wie âDruckanfrage stellenâ oder âOTP-Verifikationâ). Netzwerkkonzept konkretisieren (IP-Adressierung, Routingregeln, Sicherheitsrichtlinien). Auswahl konkreter Bibliotheken/Frameworks (z.B. Flask, FullCalendar, TP-Link API-Lösungen). Geplante Dauer: ca. 10 Stunden.
- Implementierungsphase: Umsetzung der Server-Software in Python/Flask, Entwicklung der REST-API-Endpunkte und der zugehörigen Logik. Einrichtung der SQLite-Datenbank und Entwicklung des DB-Schemas. Implementierung der Authentifizierungsmechanismen und Benutzerverwaltung. Parallel dazu Implementierung der Smart-Plug-Steuerung (Reverse Engineering und Coding der Ansteuerung) sowie Integration dieser Funktion ins Backend (z.B. als Modul oder Service). Entwicklung der Fallback-Webseiten mit Jinja2. Inbetriebnahme des Frontend-Raspberry Pi: Installation des Docker-Containers mit dem React/PNPM-Frontend, Kiosk-Konfiguration (Autostart des Browsers im Vollbild). Kontinuierliche Tests wĂ€hrend der Entwicklung (Unit-Tests fĂŒr wichtige Funktionen, manuelles Ausprobieren der Steckdosen-Schaltung etc.). Geplante Dauer: ca. 30â35 Stunden.*
- Test- und Integrationsphase: Gesamttest des Systems im Zusammenspiel aller Komponenten. TestfĂ€lle umfassen u.a.: erfolgreiche Druckanfrage bis Druck, Ablehnungsszenario, FehlerfĂ€lle (falscher OTP, Netzwerkunterbrechung), Mehrbenutzer-Szenario (zwei GĂ€ste fragen nacheinander, Kollision von Terminen), Ausfallszenarien (Neustart eines Raspberry Pi, Verlust WLAN-Verbindung). Behebung evtl. aufgedeckter Fehler, Feintuning (z.B. Timeout-LĂ€ngen fĂŒr OTP, Optimierung der UI-Texte). Geplante Dauer: ca. 10 Stunden.*
- Projektabschluss und Dokumentation: Erstellung der Projektdokumentation (dieses Dokument) gemÀà IHK-Vorgaben. Erstellung einer Kundendokumentation bzw. Bedienungsanleitung fĂŒr das System. AbschlussgesprĂ€ch mit dem Auftraggeber, Ăbergabe des Systems und der Dokumente. Geplante Dauer: ca. 10 Stunden.*
( Die Zeiten sind als Richtwerte geplant; die tatsÀchliche Verteilung wird im Projektabschluss reflektiert. )
Diese Phasen gingen weitgehend sequentiell ineinander ĂŒber, wobei kleinere iterative Feedback-Schleifen (z.B. erneute Anpassungen im Design nach ersten Testbefunden) dennoch stattfanden. Aufgrund der klar abgrenzbaren Anforderungen eignete sich das Wasserfallmodell hier gut â insbesondere die Trennung von Planungs- und Umsetzungsphasen entsprach auch den IHK-Richtlinien fĂŒr die ProjektdurchfĂŒhrung. FĂŒr die Aufgabenverwaltung wurde ein einfaches Kanban-Board (Trello) genutzt, um den Fortschritt festzuhalten und ToDos zu priorisieren. Meilensteine waren v.a. der Abschluss der Implementierungsphase (alle Muss-Anforderungen erfĂŒllt) und der erfolgreiche Systemtest vor der Abnahme.
2.3 Ressourcen- und Risikoplanung
In der Ressourcenplanung wurden alle benötigten Sachmittel und Hilfsmittel sowie mögliche Projektrisiken identifiziert:
Eingesetzte Hardware:
- Raspberry Pi 4 Model B (4 GB RAM) als Backend-Server. Dieser verfĂŒgt ĂŒber ausreichend Leistung, um den Flask-Webserver und die Datenbank zu betreiben, und bietet eine kabelgebundene Netzwerkschnittstelle fĂŒr stabile LAN-Anbindung.
- Raspberry Pi 4 Model B (2 GB RAM) als Frontend/Kiosk. Dieses GerĂ€t steuert das Touch-Display (bzw. Monitor mit Maus/Tastatur) und beherbergt das Frontend in einem Docker-Container. Zudem stellt es das WLAN fĂŒr GĂ€ste bereit (integriertes WiFi-Modul) und ĂŒbernimmt Routing-Aufgaben.
- TP-Link Tapo P110 Smart Plug zur Stromsteuerung des Druckers. Diese Steckdose misst auch den Energieverbrauch (letzteres wird im aktuellen Projekt nicht zentral ausgewertet, könnte aber fĂŒr zukĂŒnftige Auswertungen genutzt werden).
- Drucker : Ein vorhandener Laserdrucker (mit USB- oder Ethernet-Anschluss). FĂŒr das Projekt wurde angenommen, dass der Drucker manuell oder automatisch druckt, sobald er Strom hat und der Auftrag vom Nutzer ausgelöst wird. Die konkrete Integration des Druckdatenflusses (also das Ăbermitteln einer Druckdatei) war nicht Teil des Projekts â es ging primĂ€r um die Reservierung und Zugangssteuerung. Druckdateien werden entweder vom Nutzer direkt am GerĂ€t eingelegt (USB-Stick) oder von einem betreuenden Mitarbeiter nach OTP-Eingabe manuell angestoĂen. Dieses vereinfachte Vorgehen hĂ€lt den Projektumfang im Rahmen und konzentriert sich auf die Vernetzungsaspekte.
- NetzwerkgerÀte: Ein kleiner 5-Port-Switch zur Verbindung von Backend-Pi, ggf. Drucker und (bei Bedarf) einem Administrations-PC im LAN. Gegebenenfalls ein mobiler WLAN-Router als Backup, falls der Raspberry-Pi-basierte AP unerwartet ausfÀllt (dieser kam jedoch nicht zum produktiven Einsatz).
- Sonstige : HDMI-Monitor (7" Touchscreen fĂŒr Raspberry Pi) im Kiosk, Netzteile, GehĂ€use und Halterungen fĂŒr die Raspberry Pis, sowie ein Laptop als Administrations-/Entwicklungsrechner (fĂŒr Entwicklung und spĂ€tere Admin-Nutzung).
Software und Bibliotheken:
- Betriebssystem: Raspberry Pi OS Lite (basierend auf Debian) auf beiden Raspberry Pi. Keine Desktop-Umgebung auf dem Backend, eine minimale auf dem Frontend (um den Browser im Kiosk-Modus zu ermöglichen).
- Backend-Software: Python 3.11, Flask Framework fĂŒr Webserver und API. ZusĂ€tzliche Python-Bibliotheken: z.B. Flask-Login (Sitzungsverwaltung), Werkzeug (Passworthash), SQLAlchemy oder sqlite3 for DB-Zugriff, scapy (fĂŒr Netzwerkpaket-Analyse, falls beim Reverse Engineering benötigt), PyCryptodome (fĂŒr eventuelle Krypto-Funktionen zur Steckdosenansteuerung), etc.
- Frontend-Software: Node.js Umgebung innerhalb Docker zur AusfĂŒhrung der auf React basierenden Anwendung. Das UI verwendet shadcn/UI (ein auf Tailwind CSS basierendes Komponenten-Bibliothek) und FullCalendar fĂŒr die Kalenderanzeige. Der Frontend-Code kommuniziert ausschlieĂlich ĂŒber die definierte REST-API mit dem Backend. Alternativ greift der Kiosk-Browser auf die in Flask implementierten Jinja2-Templates zurĂŒck.
- Netzwerkservices: Hostapd und dnsmasq auf dem Frontend-Pi zur Bereitstellung des WLAN-Access-Points und DHCP-Services fĂŒr GĂ€ste. Konfiguration von iptables fĂŒr Routing/NAT zwischen WLAN und LAN. OpenSSL zum Erstellen der selbstsignierten Zertifikate.
- Entwicklungstools: Visual Studio Code auf dem Entwicklungsrechner, Git als Versionsverwaltung (lokales Repository), sowie Wireshark auf dem Laptop (fĂŒr Netzwerkmitschnitte beim Reverse Engineering der Steckdose).
Personal/Rollen: Das Projekt wurde eigenstĂ€ndig vom Auszubildenden durchgefĂŒhrt. Der Ausbilder stand als Berater zur VerfĂŒgung (z.B. fĂŒr Abnahme der Planung und Zwischendemonstrationen), griff aber nicht operativ ein. Die Abnahme erfolgte durch den fiktiven Auftraggeber (z.B. Abteilungsleiter IT), der zugleich als Betreuer fungierte.
Risikoanalyse: Bereits in der Planungsphase wurden potenzielle Risiken und passende GegenmaĂnahmen identifiziert:
- Risikofaktor Smart-Plug-Steuerung: Es war unsicher, ob die Tapo P110 ohne Internetanbindung steuerbar ist, da der Hersteller keine lokale API dokumentiert. GegenmaĂnahme: FrĂŒhzeitiges Reverse Engineering und Recherche nach Community-Projekten. TatsĂ€chlich fand sich heraus, dass nach initialer Einrichtung der Steckdose via Tapo-App und dem Verhindern des Internetzugangs die Steuerung lokal mittels verschlĂŒsselter HTTP-Pakete möglich ist. HierfĂŒr war es nötig, den Authentifizierungsprozess der Steckdose nachzuahmen (Token-Generierung). Im Worst Case stand als Alternativplan bereit, auf eine TP-Link Kasa HS100 -Serie Steckdose auszuweichen, die eine offene lokale API besitzt â dies wĂ€re jedoch mit Verzicht auf Energie-Monitoring einhergegangen.
- Risikofaktor Offline-Betrieb: Ohne Internet stehen keine Cloud-Dienste zur VerfĂŒgung. Falls das System dennoch unerwartet externe AbhĂ€ngigkeiten benötigt (z.B. NTP fĂŒr Zeit, CDNs fĂŒr Bibliotheken), könnte dies zu Problemen fĂŒhren. GegenmaĂnahme: Alle erforderlichen Ressourcen wurden im Vorfeld identifiziert und lokal bereitgestellt. FĂŒr die Zeit synchronisation im Netzwerk wurde ein lokaler NTP-Server eingerichtet, damit z.B. die Smart-Steckdose beim Start die Uhrzeit erhĂ€lt (einige GerĂ€te verweigern sonst Befehle). Die Raspberry Pis fungieren als Zeitserver im Netz, wodurch die Offline-Zeitbasis gesichert war.
- Risikofaktor Sicherheit: Obwohl das Netzwerk isoliert ist, bestehen interne AngriffsflĂ€chen (z.B. ein Gast könnte versuchen, per direkten API-Aufruf die Steckdose zu schalten). GegenmaĂnahme: Umsetzung eines strikten Rechtemodells im Backend â die relevanten API-Routen prĂŒfen die Rolle (nur Admin darf Freigaben erteilen oder Steckdose schalten). Zudem wurden Firewall-Regeln am Raspberry-Pi-AP gesetzt, um nur die notwendigen Ports zum Backend zuzulassen (z.B. Port 443 fĂŒr HTTPS, ggf. TCP-Port der Steckdose, alles andere geblockt). Die selbstsignierten Zertifikate könnten ein Risiko von Man-in-the-Middle vermindern, aber erfordern, dass die Clients sie als vertrauenswĂŒrdig einordnen. Hier wurde fĂŒr die genutzten GerĂ€te (Kiosk-Browser, Admin-Laptop) das Zertifikat vorab importiert.
- Risikofaktor Zeitplan: Die Implementierung unbekannter Komponenten (Steckdosen-API, Frontend-Docker) könnte mehr Zeit in Anspruch nehmen als vorgesehen. GegenmaĂnahme: Puffer im Zeitplan (etwa 10â15% der Gesamtzeit) und Fokussierung auf KernfunktionalitĂ€t. Auf optionale Features (z.B. ausgefeilte Statistiken, Druckdatei-Upload) wurde verzichtet, falls die Zeit knapp wĂŒrde. TatsĂ€chlich konnten alle Muss-Anforderungen im vorgesehenen Zeitrahmen umgesetzt werden, optionale Erweiterungen blieben ausgelagert.
- Risikofaktor Hardwareausfall: Raspberry Pis oder Steckdose könnten defekt sein. GegenmaĂnahme: Bereithalten von Ersatzhardware (ein zusĂ€tzlicher Raspberry Pi, Ersatz-SD-Karten sowie eine alternative WLAN-Steckdose zum Testen). WĂ€hrend der Entwicklung trat kein Hardwaredefekt auf; lediglich ein SD-Karten-Rewrite war einmal nötig, was durch regelmĂ€Ăige Backups der Konfiguration abgesichert war.
Mit dieser umfassenden Planung im RĂŒcken wurde das Projekt gestartet. In der nĂ€chsten Sektion wird die praktische DurchfĂŒhrung und Umsetzung im Detail geschildert.
DurchfĂŒhrung und Auftragsbearbeitung
3.1 Aufbau der Infrastruktur und Netzwerkkonfiguration
Die Implementierungsphase begann mit dem Aufsetzen der hardwareseitigen Infrastruktur. ZunÀchst wurden die beiden Raspberry Pi mit dem aktuellen Raspberry Pi OS Lite installiert und grundlegend konfiguriert. Beide Systeme erhielten statische IP-Adressen im vorgesehenen Subnetz 192.168.0.0/24
gemÀà Planung: der Backend-Pi (im Folgenden Server-Pi genannt) die IP 192.168.0.105
, der Frontend/Kiosk-Pi (im Folgenden Kiosk-Pi ) die IP 192.168.0.109
auf der LAN-Schnittstelle.
LAN-Backend: Der Server-Pi wurde per Ethernet an den Switch im Offline-Netz angeschlossen. In der /etc/dhcpcd.conf
wurde die statische IP samt Subnetzmaske (255.255.255.0) und Gateway (sofern ein dedizierter Router existiert, ansonsten kein Gateway) eingetragen. Da kein Internetzugang erforderlich war, wurde als DNS-Server eine interne IP (der Kiosk-Pi) konfiguriert, da dieser spĂ€ter DNS-Anfragen fĂŒr das WLAN handhabt. Der Server-Pi wurde mit Hostname myp-backend
versehen, um ihn im Netz einfacher identifizieren zu können.
WLAN-Frontend: Der Kiosk-Pi ĂŒbernahm die Rolle eines WLAN-Access-Points fĂŒr GĂ€ste. HierfĂŒr wurde ein separates WLAN-Netz konfiguriert, SSID z.B. âMYP-Printâ. Dieses WLAN lĂ€uft auf einer eigenen Netzadresse (geplant war 192.168.1.0/24
), um GĂ€ste vom LAN zu trennen. Auf dem Kiosk-Pi wurde hostapd installiert und so eingerichtet, dass das integrierte WLAN-Modul im Access-Point-Modus arbeitet (WPA2-verschlĂŒsseltes WLAN, vorab bekannt gegebener WLAN-SchlĂŒssel fĂŒr GĂ€ste). Parallel dazu stellt dnsmasq auf dem Kiosk-Pi DHCP- und DNS-Dienste fĂŒr das WLAN bereit, sodass verbundene Clients automatisch eine IP (z.B. 192.168.1.100
aufwĂ€rts) erhalten und Namensauflösung fĂŒr definierte Hosts funktioniert. Der Kiosk-Pi selbst erhielt auf seiner WLAN-Schnittstelle (wlan0) die feste IP 192.168.1.1
als Gateway-Adresse fĂŒr die WLAN-Clients.
Routing zwischen WLAN und LAN: Um den GÀsten den Zugriff auf den Druckerserver (Backend-Pi) zu ermöglichen, wurde auf dem Kiosk-Pi IP-Routing aktiviert. In der Datei /etc/sysctl.conf
wurde net.ipv4.ip_forward=1
gesetzt und ĂŒbernommen. Mithilfe von iptables wurden dann gezielte Regeln definiert: Zum einen wurde ein Masquerading (SNAT) fĂŒr Verbindungen vom WLAN ins LAN eingerichtet (iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
). Dadurch treten WLAN-Clients nach auĂen mit der IP des Kiosk-Pi im LAN (192.168.0.109
) auf, was die Kommunikation vereinfacht und keine speziellen Routen auf dem Backend-Pi erfordert. Zum anderen wurden Filterregeln etabliert, die den Traffic einschrĂ€nken: Erlaubt sind nur Verbindungen vom WLAN-Subnetz zur Backend-IP auf den Ports 443 (HTTPS fĂŒr die Web-API/UI) und 123 (NTP, siehe unten) sowie DNS-Anfragen an den Kiosk-Pi. Alle anderen Verbindungsversuche ins LAN werden verworfen. Somit konnte ein Gast zwar den Webdienst des MYP-Servers erreichen, aber keine anderen (evtl. vorhandenen) GerĂ€te im LAN scannen oder ansprechen. Dieses Routing- und Firewall-Setup wurde ausfĂŒhrlich getestet, bevor fortgefahren wurde, um sicherzustellen, dass das Netzabschottungskonzept wie vorgesehen greift.
Zeitserver und Steckdosen-Einbindung ins Netz: Eine besondere Anforderung war, dass die TP-Link Tapo P110 Steckdose im Offline-Betrieb funktioniert. Tests zeigten, dass die Steckdose nach einem Neustart versucht, einen Zeitserver (NTP) zu kontaktieren, da sie sonst Befehle verweigert (aus SicherheitsgrĂŒnden benötigt das GerĂ€t offenbar eine aktuelle Uhrzeit). Daher wurde der Kiosk-Pi so konfiguriert, dass er Anfragen an time.google.com
oder pool.ntp.org
(die von der Steckdose per DNS angefragt wurden) lokal beantwortet. Via dnsmasq wurde eine DNS-Weiterleitung eingerichtet, die z.B. pool.ntp.org auf die IP des Kiosk-Pi zeigt. Dort lief der Dienst chrony als NTP-Server und lieferte der Steckdose die Uhrzeit. Nach dieser Anpassung lieĂ sich die Steckdose vollstĂ€ndig offline steuern. Die Steckdose selbst wurde ins gleiche LAN integriert: Sie bekam per DHCP (konfiguriert im Router oder per reserviertem Lease im Kiosk-Pi, falls dieser auch DHCP fĂŒrs LAN ĂŒbernahm) die IP 192.168.0.110
und wurde unter dem Hostnamen druckersteckdose
bekannt gemacht. Der Backend-Pi benötigt diese IP, um Schaltbefehle an die Steckdose zu senden.
SSL/TLS-Konfiguration: Parallel zur Netzwerkeinrichtung wurde das SSL-Zertifikat erzeugt. Da keine offizielle Zertifizierungsstelle im Offline-Netz verwendet werden kann, wurde ein selbstsigniertes Zertifikat erstellt. Mit OpenSSL generierten wir ein eigenes Root-CA-Zertifikat und einen privaten SchlĂŒssel. Dieses CA-Zertifikat wurde dann benutzt, um ein Serverzertifikat fĂŒr den Backend-Pi (myp-backend
) auszustellen. So entstand ein Zertifikatspaar (CA und Server), das auf dem Backend-Pi in die Flask-Konfiguration eingebunden wurde. Der Flask-Server wurde so konfiguriert, dass er HTTPS auf Port 443 bedient und das Zertifikat + Private Key lĂ€dt. Das CA-Zertifikat wurde auf den Client-GerĂ€ten importiert (z.B. im Browser des Kiosk-Pi sowie im Firefox des Admin-Laptops), damit die Zertifikate als vertrauenswĂŒrdig anerkannt werden und keine Warnmeldungen die Nutzer verunsichern. Damit waren alle Voraussetzungen geschaffen, das Backend- und Frontend-System sicher im lokalen Netz zu betreiben.
3.2 Implementierung des Flask-Backends (Server)
Nach der Infrastrukturvorbereitung wurde die Backend-Software entwickelt. ZunĂ€chst wurde eine Grundstruktur fĂŒr die Flask-Anwendung angelegt. Das Projekt wurde in einem Git-Repository versioniert, was schrittweise Commits fĂŒr einzelne Funktionseinheiten ermöglichte.
Datenbankmodell: Vor dem Coding wurde das Datenbankschema entworfen. Aufgrund der Einfachheit der Anforderungen genĂŒgte SQLite als eingebettete Datenbank; diese benötigt keinen separaten Serverdienst und speichert die Daten in einer Datei (myp.db
) auf dem Backend-Pi. Das Schema umfasst u.a. folgende Tabellen:
benutzer
: EnthÀlt Benutzerkonten. Wichtige Felder:benutzer_id
(PrimĂ€rschlĂŒssel),benutzername
(Login-Name, eindeutig),passwort_hash
(verschlĂŒsselter Hash des Passworts),rolle
(ENUM mit Werten âAdminâ oder âGastâ). FĂŒr die Passwort-Hashes wurde die sichere Hash-Funktion PBKDF2 (ĂŒber die Flask-Bibliothek Werkzeug) genutzt, um Passwörter nicht im Klartext zu speichern.anfrage
: EnthÀlt Druckanfragen. Felder:anfrage_id
,benutzer_id
(Referenz auf den anfragenden Nutzer),zeitstempel_anfrage
(Erstellungszeitpunkt),gewĂŒnschter_zeitpunkt
(vom Nutzer gewĂŒnschtes Druckdatum/Uhrzeit, falls angegeben),status
(Status der Anfrage: âoffenâ, âgenehmigtâ, âabgelehntâ, âgedrucktâ etc.),otp_code
(der fĂŒr eine genehmigte Anfrage generierte Code, initial null). ZusĂ€tzlich ggf. ein Felddateiname
oderbeschreibung
fĂŒr Angaben zum Druckauftrag.reservierung
: Diese Tabelle wurde eingefĂŒhrt, falls Zeitfenster reserviert werden. Sie enthĂ€lt z.B.startzeit
,endzeit
,anfrage_id
(Referenz auf Anfrage). Alternativ hÀtte man Start/Endzeit direkt inanfrage
speichern können; das Design wurde modular gehalten, um evtl. mehrere Zeitfenster oder Ănderungen zu erlauben.ereignislog
: FĂŒr Verwaltungs- und Debugzwecke werden hier wichtige Ereignisse protokolliert (z.B. âAnfrage X erstelltâ, âAdmin Y hat Anfrage X genehmigtâ mit Zeitstempel). Dies erleichtert spĂ€ter die Nachvollziehbarkeit und kann im Admin-Interface als Verlauf angezeigt werden.
Das Datenmodell wurde mit Hilfe von SQLAlchemy (ein ORM fĂŒr Python) erstellt, was die Definition der Tabellen als Klassen ermöglichte. Alternativ stand die Nutzung von raw-SQL/SQLite im Raum; aus ZeitgrĂŒnden und aufgrund einfacher Anforderungen wurde schlussendlich teils raw SQL verwendet (direktes AusfĂŒhren von CREATE TABLE
Statements beim Erststart), um die AbhÀngigkeiten schlank zu halten.
API-Design und Routen: Das Flask-Backend wurde so gestaltet, dass es sowohl HTML-Seiten (fĂŒr die Jinja2-Fallback-OberflĂ€che) als auch REST-API-Endpunkte liefert. HierfĂŒr wurden Blueprints in Flask eingesetzt, um die Logik nach Modul zu trennen:
- Authentifizierungsrouten:
/login
(GET/POST) fĂŒr das Login-Formular bzw. API-Login,/logout
(GET) zum Abmelden. Flask-Login ĂŒbernahm das Session-Management bei HTML-Aufrufen. FĂŒr API-Zugriffe (vom React-Frontend) wurde eine Token-basierte Authentifizierung implementiert: Nach erfolgreichem Login erhĂ€lt der Client ein zeitlich begrenztes JWT (JSON Web Token), das bei nachfolgenden API-Aufrufen im Header mitgeschickt wird. Dies ersparte zustandsbehaftete Sessions im reinen API-Betrieb. Im Kiosk/HTML-Betrieb hingegen wurden klassische Sessions/Cookies genutzt, um Aufwand zu reduzieren. - Benutzerverwaltung:
/api/benutzer
(nur fĂŒr Admin, z.B. GET Liste aller Nutzer, POST zum Anlegen eines neuen Nutzers). Diese Routen wurden primĂ€r fĂŒr eventuelle Erweiterungen vorbereitet; im Minimum existierte ein default Admin-Account und einige Gast-Accounts, welche ĂŒber die Datenbank oder Konfigurationsdatei initial angelegt wurden. - Anfragen-Management:
POST /api/anfragen
: Wird von einem Gast aufgerufen, um eine neue Druckanfrage anzulegen. Die Request-Daten (z.B. gewĂŒnschter Zeitraum, Beschreibung) werden entgegen genommen, validiert (z.B. Pflichtfelder ausgefĂŒllt, Zeit in Zukunft, Nutzer hat nicht bereits eine offene Anfrage) und in der Datenbank als Status âoffenâ gespeichert. Das System kann optional sofort prĂŒfen, ob der gewĂŒnschte Zeitraum frei ist (Abgleich mit bestehenden genehmigten Reservierungen) â ein entsprechender Konflikt wĂŒrde dem Benutzer gemeldet.GET /api/anfragen
(Admin): Liefert die Liste der offenen (und/oder aller) Anfragen mit ihren Details, damit der Administrator sie anzeigen kann.PUT /api/anfragen/<id>/entscheidung
: Nimmt eine Entscheidung fĂŒr Anfrage<id>
entgegen. Diese Route erwartet im Payload z.B.{"aktion": "genehmigen"}
oder{"aktion": "ablehnen", "grund": "..."}
. Bei Genehmigung erzeugt der Server folgendes: Er generiert einen eindeutigen OTP-Code , bestehend z.B. aus 6 Ziffern, mittels einer Kryptografie-Funktion (um ausreichende ZufĂ€lligkeit zu gewĂ€hrleisten). Dieser Code wird in der Datenbank in der betreffenden Anfrage gespeichert und der Status der Anfrage auf âgenehmigtâ gesetzt. AuĂerdem wird ein entsprechender Termin in derreservierung
-Tabelle vermerkt (Start-/Endzeit, basierend auf gewĂŒnschtem Zeitraum oder aktuellen Zeitpunkt plus Puffer). Bei Ablehnung wird der Status auf âabgelehntâ gesetzt und der angegebene Grund gespeichert (optional). Nach beiden Aktionen könnte das Benachrichtigungssystem greifen (siehe unten).GET /api/anfragen/offen
(Admin): Optionaler Endpunkt, der nur die offenen Anfragen zĂ€hlt oder zurĂŒckgibt, um z.B. im UI eine âneue Anfrageâ-Benachrichtigung anzeigen zu können.
- Kalender/Reservierungsdaten:
GET /api/reservierungen
(authentifiziert: Gast sieht eigene und freie Slots, Admin sieht alle). Dieser Endpunkt liefert die genehmigten Drucktermine, formatiert fĂŒr die Nutzung in FullCalendar (JSON mit Feldern wie Title, Start, End, evtl. color etc.). GĂ€ste bekommen evtl. nur einen Teil der Informationen (z.B. als âbelegtâ markierte Zeiten ohne fremde Nutzernamen, aus DatenschutzgrĂŒnden). - Steuerungsfunktionen (Smart Plug):
POST /api/steckdose/schalten
(Admin oder intern): Dieser Endpunkt wird genutzt, um die Steckdose an- oder auszuschalten. Im Normalfall wird er vom System selbst aufgerufen, nicht direkt vom Benutzer: Wenn ein Gast seinen OTP-Code eingibt (ĂŒber UI), ruft das Frontend die API z.B.POST /api/auftrag/<id>/start
auf. Dieser wiederum prĂŒft den Code, und wenn korrekt, schaltet er ĂŒber die Steckdosen-API den Strom ein. Dennoch wurde die Steckdosen-Schaltfunktion gekapselt, um auch manuelle Steuerung zu erlauben (z.B. Administrator-Notfallknopf "Steckdose aus" bei Problemen).
SĂ€mtliche API-Routen prĂŒfen zunĂ€chst die Berechtigung. Dazu wurde eine Middleware bzw. Decorator in Flask implementiert, der bei jedem API-Request das JWT oder die Session ĂŒberprĂŒft und die Rolle aus der Nutzerinfo liest. Ein unerlaubter Zugriff (z.B. Gast ruft Admin-Route auf oder fehlende Authentifizierung) wird mit HTTP 401/403 beantwortet. In der Fallback-HTML-OberflĂ€che wurde Ă€hnliches ĂŒber Flask-Login accomplished, indem sensible Seiten @login_required und eine RollenprĂŒfung enthalten.
Implementierung der Backend-Logik: Nachdem die Routen definiert waren, wurden die dahinterliegenden Funktionen implementiert:
- Die Login-Funktion vergleicht den eingegebenen Usernamen/Passwort-Hash mit der DB. Bei Erfolg erstellt sie entweder eine Session (HTML) oder ein JWT (API) mit den nötigen Claims (BenutzerID, Rolle, GĂŒltigkeit z.B. 8 Stunden).
- Die Anfrage-Erstellen-Funktion erzeugt einen neuen Datensatz, initialisiert den Status âoffenâ und loggt das Ereignis ("Nutzer X hat Anfrage Y gestellt um..."). Falls ein gewĂŒnschter Zeitbereich angegeben ist, prĂŒft die Logik per SQL-Abfrage, ob dieser mit bereits genehmigten AuftrĂ€gen ĂŒberlappt. Falls ja, wird die Anfrage entweder abgelehnt oder markiert (je nach Policy: hier entschieden wir uns, dem Nutzer direkt mitzuteilen âZeitraum belegtâ und ihn einen anderen wĂ€hlen zu lassen, bevor die Anfrage gespeichert wird).
- Die Anfrage-Entscheidungs-Funktion bei Genehmigung verwendet Python's
random.SystemRandom
oder eine sichere Zufallsfunktion, um einen 6-stelligen Zahlencode zu generieren. Dieser Code wird dem Nutzer spĂ€ter prĂ€sentiert. Zudem setzt der Code intern einen Timer/Deadline: Ein genehmigter Auftrag muss innerhalb z.B. 15 Minuten gestartet werden, sonst verfĂ€llt er. Diese Frist wurde in der Datenbank als Feld (gĂŒltig_bis) notiert. Ein geplanter Druck zu einer spĂ€teren Zeit (z.B. in 2 Stunden) wĂŒrde bedeuten, dass der OTP-Code erst kurz vor Start freigegeben wird â der Einfachheit halber entschied man sich hier dafĂŒr, den Code sofort zu zeigen, aber den Drucker nicht vor dem reservierten Startzeitpunkt zu aktivieren. Das heiĂt, auch wenn der Nutzer den Code frĂŒher eingibt, wartet das System bis zur Startzeit, bevor es die Steckdose schaltet. Dies wurde im Code so gelöst, dass der/start
-Endpunkt bei Eingabe prĂŒft: aktuelle Zeit >= reservierte Startzeit. Falls zu frĂŒh, gibt er eine Meldung zurĂŒck âBitte zum vorgesehenen Zeitpunkt erneut versuchenâ. - Die OTP-PrĂŒfung und Steckdosen-Schaltung sind sicherheitskritisch. Beim Aufruf
POST /api/auftrag/<id>/start
werden AuftragID und OTP-Code entgegengenommen. Der Server gleicht den Code gegen die DB (fĂŒr Auftrag id) ab und prĂŒft, ob: a) der Status genehmigt und noch nicht gedruckt ist, b) der Code ĂŒbereinstimmt, c) die aktuelle Zeit innerhalb des erlaubten Fensters liegt. Nur wenn alles passt, erfolgt die Aktion: es wird der Befehl zum Einschalten der Steckdose abgesetzt (siehe nĂ€chster Abschnitt zur Umsetzung) und der Status der Anfrage auf âgedrucktâ (bzw. âin Bearbeitungâ und spĂ€ter âabgeschlossenâ) gesetzt. ZusĂ€tzlich startet ein Timer-Thread im Backend, der nach einer definierten Druckdauer (z.B. 5 Minuten oder sobald der Nutzer im UI meldet âfertigâ) die Steckdose automatisch wieder ausschaltet. Dadurch wird verhindert, dass der Drucker lĂ€nger als nötig an bleibt. Alle diese Aktionen werden im Ereignislog festgehalten. Bei falschem Code oder abgelaufener Zeit liefert der Endpunkt einen Fehler zurĂŒck, den das Frontend als Meldung anzeigen kann (âCode ungĂŒltigâ oder âZeitfenster abgelaufenâ). Nach dreimaliger Falscheingabe könnte das System den Auftrag sperren â diese Option wurde angedacht, aber im ersten Wurf nicht umgesetzt, da der Code ohnehin in kurzer Zeit verfĂ€llt.
Benachrichtigungssystem: Um Administratoren zeitnah ĂŒber neue Anfragen zu informieren, wurde ein einfaches Polling im Admin-Frontend umgesetzt: Alle 30 Sekunden fragt der Browser des Admins an /api/anfragen/offen
an, um zu sehen, ob neue AuftrĂ€ge hinzugekommen sind, und zeigt gegebenenfalls eine visuelle Markierung oder spielt einen Sound ab. Alternativ wurde ĂŒberlegt, WebSockets zu nutzen, um Push-Benachrichtigungen in Echtzeit zu ermöglichen. Aus EinfachheitsgrĂŒnden (Offline-Betrieb, bei dem keine Skalierungsprobleme zu erwarten sind) wurde jedoch auf WebSockets verzichtet und Polling gewĂ€hlt. FĂŒr den Gast wird Ă€hnlich verfahren: Nach dem Stellen einer Anfrage bleibt der Browser auf einer Statusseite, die periodisch den Status der Anfrage abfragt (/api/anfragen/<id>
). Sobald der Status auf genehmigt/abgelehnt wechselt, aktualisiert sich die Anzeige (z.B. âIhre Anfrage wurde genehmigt â Ihr Code lautet 123456â). Im Kiosk-Modus der Fallback-UI wurde das Polling integriert, um z.B. direkt nach Login eines Admin eine Benachrichtigung bei neuen Anfragen einzublenden.
Jinja2-Fallback-UI: Parallel zur API-Entwicklung wurden grundlegende HTML-Seiten mit Jinja2-Templates erstellt, um das System unabhÀngig vom React-Frontend nutzbar zu machen. Dies war sowohl zur Absicherung gedacht (falls der Docker-Container mit dem modernen Frontend ausfÀllt oder der Kiosk-Browser Probleme mit moderner Webapp hat) als auch zur einfachen direkten Nutzung am Kiosk-Pi. Die Fallback-OberflÀche umfasst z.B. folgende Seiten:
- Login-Seite (
login.html
): Einfache Maske zur Anmeldung, nutzt Flask-Login. - Gast-Startseite (
gast_index.html
): Formular zur Eingabe einer neuen Druckanfrage (Felder: Termin, Beschreibung etc.) und Anzeige der eigenen offenen/frĂŒheren Anfragen. Nach Absenden wird entweder eine BestĂ€tigung angezeigt (âAnfrage eingereichtâ) mit Hinweis auf Wartezeit. - Gast-Statusseite (
gast_status.html
): Zeigt den aktuellen Status der Anfrage an, insbesondere bei genehmigt den OTP-Code groĂ und gut lesbar. Im Kiosk-Flow wĂŒrde diese Seite dem Nutzer prĂ€sentiert werden, ggf. mit einer SchaltflĂ€che âDruck startenâ, die zur Codeeingabe auffordert (wenn der Code vom System generiert und dem Nutzer aber noch nicht automatisch angezeigt werden soll, was hier jedoch der Fall war â er sieht seinen Code ohnehin). - Admin-Ăbersichtsseite (
admin_dashboard.html
): Listet alle offenen Anfragen tabellarisch mit Details (Nutzer, Zeitpunkt, ggf. Dokumentinfo). Hier kann der Admin per Button âgenehmigenâ oder âablehnenâ klicken. Dies ruft intern eine JavaScript-Funktion auf, die per AJAX die entsprechende API (PUT Entscheidung) triggert. Alternativ bei deaktiviertem JS könnte es ĂŒber separate BestĂ€tigungsseiten laufen â aber wir setzten auf Ajax fĂŒr bessere Usability. Ferner zeigt die Admin-Seite alle kommenden Reservierungen (KalenderĂŒbersicht) und den Verlauf (log) der letzten Aktionen. - Admin-Benutzerverwaltung (
admin_users.html
): Ermöglicht das Anlegen neuer Benutzer oder Ăndern von Passwörtern. Diese Seite war rudimentĂ€r, da Benutzer meist vordefiniert werden. - Kiosk-OTP-Eingabe (
kiosk_otp.html
): Eine spezielle Seite, die im Kiosk-Modus genutzt wird, um einen OTP-Code einzugeben und den Druckvorgang zu starten. Hier sieht der Nutzer z.B. ein Nummernfeld zur Eingabe des 6-stelligen Codes. Diese Seite ist so gestaltet, dass sie auch ohne Tastatur auf einem Touchscreen bedient werden kann (digitale On-Screen-Nummernblock). Wenn der Code eingegeben und abgesendet wird, erfolgt im Hintergrund ein Aufruf der Start-API; bei Erfolg erscheint âDrucker wird jetzt aktiviert â bitte drucken Sie Ihr Dokumentâ und bei Misserfolg eine Fehlermeldung.
Diese Jinja2-Seiten wurden mit einfachem CSS gestaltet, um zumindest grundlegende ResponsivitĂ€t und ansprechende Optik zu bieten. Dabei wurde kein externes CSS genutzt, sondern das nötigste (Fonts, Layout) direkt eingebunden. FĂŒr komplexere Elemente wie Kalender oder Modal-Dialogs wurde im Fallback-UI verzichtet â diese stehen nur im modernen Frontend zur VerfĂŒgung. Somit bleibt die Fallback-OberflĂ€che simpel, aber robust.
Nach Abschluss der Backend-Entwicklung (API und Fallback-UI) wurden initiale Komponententests durchgefĂŒhrt. Beispielsweise wurden die API-Endpunkte mit cURL und einem REST-Client durchgespielt (fĂŒr Login, Anfrage erstellen, genehmigen etc.), um sicherzustellen, dass die Logik korrekt arbeitet, bevor die komplexe Steckdosenansteuerung und das Frontend hinzukamen.
3.3 Integration der Smart-Plug-Steuerung (TP-Link Tapo P110)
Ein zentrales technisch anspruchsvolles Element war die lokale Ansteuerung der TP-Link Tapo P110 WLAN-Steckdose. Da TP-Link offiziell vorsieht, dass die Tapo-GerĂ€te ĂŒber eine Cloud/App gesteuert werden, gab es keine offizielle lokale API-Dokumentation. Daher wurden zwei AnsĂ€tze kombiniert: Recherche nach bestehenden Lösungen und eigenstĂ€ndige Paket-Analyse.
Recherche und Vorbereitung: ZunĂ€chst wurde geprĂŒft, ob es Open-Source-Projekte gibt, die die Tapo-GerĂ€te lokal steuern können. Es wurde ein Python-Modul namens PyP100 gefunden, das grundsĂ€tzlich die Tapo P100/P110 ansprechen kann. Ein Blick in den Quellcode und Dokumentation zeigte, dass die Steckdose ĂŒber HTTP/HTTPS auf Port 443 angesprochen wird und JSON-Nachrichten annimmt. Die Kommunikation ist jedoch verschlĂŒsselt: ZunĂ€chst muss ein Handshake erfolgen, bei dem man sich mit Tapo-Cloud-Zugangsdaten authentifiziert (E-Mail und Passwort, die in der Tapo-App registriert wurden), daraus generiert die Steckdose oder Cloud ein Token und einen Session-Key, mit dem nachfolgende Befehle symmetrisch verschlĂŒsselt ĂŒbertragen werden. FĂŒr das Offline-Szenario bedeutete das: Die Steckdose wurde initial via Tapo-App in Betrieb genommen (einmalig, um sie ins WLAN zu bringen und dem TP-Link-Account zuzuordnen), danach der Internetzugang blockiert. Im lokalen Netz akzeptiert die Steckdose dann Verbindungen, wenn man den richtigen Authentifizierungsprozess nachbildet.
Reverse Engineering mit Wireshark/scapy: Um den Ablauf exakt zu verstehen, wurde ein Testaufbau gemacht: Die Steckdose wurde in ein Test-WLAN eingebunden, der Entwicklungs-Laptop mit Wireshark lauschte auf dem WLAN-Interface. Mit der offiziellen Tapo-App (auf einem Smartphone, verbunden mit selbem WLAN) wurden Ein- und Ausschalten der Steckdose durchgefĂŒhrt. Wireshark konnte die Pakete mitschneiden. Da TLS (HTTPS) verwendet wird, sah man nicht den Klartext, aber man konnte das Verbindungsmuster erkennen: ZunĂ€chst eine TLS-Handshake mit dem TP-Link Cloud-Server, dann (bei lokalem Befehl in gleicher Netzwerk?) interessanterweise auch Traffic an die lokale IP der Steckdose. Nach Recherche wurde klar: Die Tapo-App kommuniziert bei Steuerbefehlen direkt mit der Steckdose (Lokal), aber benötigt zuvor ein Token von der Cloud (daher initial Cloud-Aufruf). FĂŒr Offline-Betrieb musste dieser Mechanismus umgangen werden.
Mittels scapy (einem Python-Paket zur Paketanalyse und -manipulation) und der Analyse des PyP100 Moduls wurde der folgende Weg implementiert:
- Lokale Authentifizierung: Das Backend sendet an die Steckdose ein HTTPS-POST auf
/app
mit einem JSON, das die Anmeldeinformationen (verschlĂŒsselt) enthĂ€lt. Die VerschlĂŒsselung besteht aus RSA (öffentlicher SchlĂŒssel der Steckdose) fĂŒr den Initial-Handshake, danach AES fĂŒr Folgebefehle. Im Projekt wurde die Crypto-Bibliothek PyCryptodome genutzt, um diese VerschlĂŒsselung nachzustellen. Das RSA-Public-Key der Steckdose wurde aus einem initialen Info-Paket entnommen (die Steckdose liefert es bei einem unverschlĂŒsselten Info-Request). AnschlieĂend wird Benutzername/Passwort (TP-Link Account) damit verschlĂŒsselt und gesendet. - Token-Erhalt: Wenn die Credentials stimmen (die Steckdose hat sie lokal cached von der Erstinstallation), liefert sie ein Token zurĂŒck. Dieser Token ist eine Art Session-ID fĂŒr lokale Befehle. ZusĂ€tzlich teilt die Steckdose einen Session-SchlĂŒssel (AES-Key) mit, der fĂŒr weitere Kommunikation genutzt wird.
- Befehle senden: Mit dem erhaltenen Token wird nun der eigentliche Schaltbefehl abgesetzt. Dazu wird wiederum eine JSON-Struktur definiert, z.B.
{"method": "set_device_info", "params": {"device_on": true}}
um die Steckdose einzuschalten. Diese JSON wird mit dem Session-AES-Key verschlĂŒsselt (typischerweise in Base64 kodiert ĂŒbertragen). Der Backend-Server ruft also per HTTPS (unter Verwendung z.B. der Python-Requests-Bibliothek mit entspanntem Zertifikatscheck, da Steckdose ein selbstsign. Zert hat) die URLhttps://druckersteckdose/app?token=<Token>
auf, schickt den verschlĂŒsselten Payload. Die Steckdose antwortet mit einem JSON, das Erfolg oder Fehler meldet (ebenfalls verschlĂŒsselt, dann vom Backend wieder zu entschlĂŒsseln). - Implementierung im Code: Im Flask-Backend wurde diese Logik in einem separaten Modul
tapo_control.py
gekapselt. Um nicht jedes Mal neu authentifizieren zu mĂŒssen (relativ zeitaufwĂ€ndig, ca. 1-2 Sekunden), wurde ein Token-Cache implementiert: Beim ersten Schaltversuch authentifiziert sich das Backend bei der Steckdose und behĂ€lt den Token und Key im Speicher fĂŒr die Laufzeit. Solange die Steckdose nicht neu startet oder der Token ablĂ€uft, können direkt Schaltbefehle gesendet werden. Sollte ein Befehl fehlschlagen (z.B. Token ungĂŒltig), fĂ€ngt das Backend dies ab, fĂŒhrt erneut den Auth-Schritt aus und wiederholt den Befehl. So ist hohe Robustheit gewĂ€hrleistet. - Fehlerbehandlung: Falls die Steckdose nicht erreichbar ist (z.B. Netzwerkproblem), gibt das System dem Nutzer/Admin sinnvolle Fehlermeldungen (âSteckdose nicht erreichbar. Bitte prĂŒfen Sie die Netzwerkverbindung.â). Diese Situation trat im Test z.B. auf, wenn die Steckdose stromlos war oder sich neu verband â was in der Praxis aber selten sein sollte, solange sie dauerhaft eingesteckt bleibt.
Die Integration der Smart-Plug-Steuerung war nach erfolgreichen Tests abgeschlossen. Tests erfolgten durch direkte Aufrufe aus dem Python-Modul sowie aus der Anwendung heraus: Ein Administrator konnte ĂŒber die Admin-WeboberflĂ€che die Steckdose manuell schalten (fĂŒr Testzwecke wurde ein âAn/Ausâ-Toggle implementiert, nur sichtbar fĂŒr Admin, um unabhĂ€ngig vom OTP-Prozess die Funktion zu prĂŒfen). Die Reaktionszeit der Steckdose im lokalen Netz lag bei unter einer Sekunde â beim Klick auf âEinâ hörte man fast augenblicklich das Klicken des Relais. Dies bestĂ€tigte die erfolgreiche lokale Steuerbarkeit.
3.4 Frontend-Integration und Kiosk-Modus
WĂ€hrend das Hauptaugenmerk des PrĂŒflings auf Backend und Netzwerk lag, musste fĂŒr die Gesamtfunktion ein bedienbares Frontend vorhanden sein. Dieses gliederte sich in zwei Teile: das moderne Web-Frontend (Docker-Container mit React-App) und die bereits erwĂ€hnte Fallback-UI fĂŒr den Kiosk.
Docker-basiertes React-Frontend: Ein Kollege im Ausbildungsbetrieb hatte parallel eine auf Next.js/React basierende Anwendung erstellt, die als Frontend dienen konnte. Dieses Frontend wurde so konzipiert, dass es alle API-Funktionen des MYP-Backends nutzt. Es bietet ein ansprechenderes UI mit dem Design-Framework shadcn/UI (welches auf Tailwind CSS basiert) und umfangreiche InteraktivitĂ€t. Die Anwendung lief in einem Docker-Container, was die Bereitstellung auf dem Raspberry Pi erleichterte (Isolation der Node.js-Laufzeitumgebung, einfaches Deployment via Image). Der PrĂŒfling ĂŒbernahm die Aufgabe, dieses Frontend auf dem Kiosk-Pi zu installieren und mit dem Backend zu verbinden:
- ZunĂ€chst wurde Docker Engine auf dem Raspberry Pi installiert. Dann das Frontend als Container Image gebaut (die Build-Schritte werden in einem Dockerfile definiert, inkl. Installation aller Dependencies via pnpm). Dieses Image wurde auf den Pi ĂŒbertragen und gestartet. Der Container lauschte z.B. auf Port 3000 und servierte dort die Web-App.
- Die React-App war so konfiguriert, dass Aufrufe der API an den Backend-Pi geleitet wurden. Da beide auf demselben Hostnamen/Subnetz liefen, wurde z.B. die BASE_URL auf
https://myp-backend
gesetzt. Im Piâs /etc/hosts wurdemyp-backend
auf 192.168.0.105 gemappt, sodass der Container den Backend-Server findet (oder man nutzte direkt die IP in der Konfiguration). - Nach dem Start des Containers wurde getestet: Vom Admin-Laptop aus konnte man in der URL
https://192.168.0.109:3000
die React-App aufrufen (bzw. mit einem Port-Forward im Pi zu 80). Die App zeigte den Login-Screen, und nach Login als Admin sah man die Liste der Anfragen etc. Ebenso konnte man von einem WLAN-Client (Gast-Handy) ĂŒberhttp://192.168.1.1
(der Pi könnte im WLAN auch als Webserver fungieren) die App benutzen. In unserem Setup wurde erwogen, den Kiosk-Pi auch als Reverse Proxy einzusetzen: d.h. der Pi lauscht auf Port 80/443 und entscheidet, ob er die Anfrage an das React-Frontend oder das Flask-Backend weiterleitet, um CORS-/Port-Probleme zu minimieren. Aus ZeitgrĂŒnden und Einfachheit wurde im Test aber meist direkt gearbeitet (z.B. React auf 3000, Flask auf 443, und das React-Frontend greift via HTTPS auf Flask-API zu). - Die moderne Web-App bietet denselben Funktionsumfang wie die Fallback-UI, jedoch mit besserer User Experience: z.B. ein interaktiver Kalender, modale Dialoge fĂŒr die Codeeingabe, Live-Updates via React state (statt Polling, wobei intern auch hier Polling/Long Polling genutzt wurde). FĂŒr die PrĂŒfung selbst wurde primĂ€r die Funktion demonstriert; Detailunterschiede zwischen Frontend-Versionen wurden nicht vertieft, da Fokus auf dem Vernetzungsaspekt lag.
Kiosk-Modus Betrieb: Der Raspberry Pi Kiosk wurde so eingerichtet, dass beim Systemstart automatisch ein Browser im Vollbild die Anwendung öffnet. Dazu wurde ein leichtgewichtiges X-Window-System installiert und Chromium als Browser. In der Datei /etc/xdg/lxsession/LXDE-pi/autostart
wurde der Autostart des Browsers mit folgenden Optionen konfiguriert:
@chromium-browser --kiosk --app=https://myp-backend/kiosk_otp --ignore-certificate-errors --disableScreensaver
Diese Zeile bewirkt, dass Chromium ohne Fensterelemente (--kiosk
) direkt die Kiosk-OTP-Seite der Flask-Fallback-UI lÀdt. Die Option --ignore-certificate-errors
war nötig, da unser selbstsigniertes Zertifikat sonst eine Warnung erzeugt (alternativ hÀtte man das Zertifikat in Chromium hinterlegen können). --disableScreensaver
verhindert, dass der Bildschirm in den Energiesparmodus geht.
Beim Booten des Kiosk-Pi loggt sich ein dedizierter kiosk
-Benutzer automatisch ein (eingerichtet via raspi-config
Autologin) und startet die grafische Session mit obiger Autostart. Somit steht binnen weniger Sekunden nach Einschalten ein Terminal bereit, auf dem entweder der React-Frontend (wenn man die URL dahingehend Ă€ndert) oder die Fallback-UI angezeigt wird. In unserem Fall entschieden wir uns im Kiosk-Browser fĂŒr die Fallback-OTP-Eingabeseite, weil die React-App fĂŒr Touchbedienung nicht optimiert war. Stattdessen sah der Workflow so aus: Ein Gast stellt eine Anfrage entweder am Kiosk (ĂŒber die Fallback-Gast-Seite) oder mit eigenem GerĂ€t. Der Admin genehmigt am Admin-Interface. Dann geht der Gast zum Drucker/Kiosk, dort ist bereits die OTP-Eingabeseite offen (sie zeigt z.B. âBitte Code eingebenâ). Der Gast gibt den erhaltenen Code ein, drĂŒckt auf âStartâ. Die Seite ruft die API auf und bei Erfolg wechselt der Bildschirm zu âDrucker aktiv â bitte Dokument drucken...â und vielleicht einem Hinweis zum Drucken (wenn z.B. ein USB-Stick verwendet werden muss, etc.). Nach Ablauf der Druckzeit oder beim nĂ€chsten Vorgang setzt sich die Seite zurĂŒck.
Test der Kiosk-Interaktion: Dieser Ablauf wurde praktisch getestet. Beispielszenario im Test: Gast erstellt Anfrage am Kiosk selbst (d.h. nutzt den Kiosk-Pi UI als Gast). Admin am Laptop sieht die Anfrage und genehmigt. Kiosk-Pi (Gast-Seite) erkennt Genehmigung nach dem nĂ€chsten Polling und zeigt âIhr Code: 749201â. Gast drĂŒckt âDrucken startenâ, wechselt zur OTP-Seite (bzw. ist schon dort, je nach Implementation) und gibt 749201 ein. Die Steckdose schaltet ein, Drucker druckt eine Testseite, danach wird die Steckdose automatisch wieder ausgeschaltet. Das Testprotokoll vermerkte alle Schritte als erfolgreich. Auch ein negativer Test: Gast gibt falschen Code ein -> Meldung âfalscher Codeâ. Zweiter Versuch richtig -> klappt. Danach Versuch gleichen Code erneut -> Meldung âungĂŒltigâ (weil schon benutzt). Die Kiosk-Lösung erwies sich als bedienfreundlich; selbst ohne persönliche Einweisung konnte ein Kollege die Codeeingabe nachvollziehen und durchfĂŒhren.
3.5 QualitÀtssicherung und Tests
Nach Fertigstellung der Implementierung wurde das Gesamtsystem einem grĂŒndlichen Test unterzogen, um die ErfĂŒllung der Anforderungen sicherzustellen und Fehler zu finden. Die Tests wurden zum einen funktional (gegen die ursprĂŒnglichen Use-Cases) und zum anderen technisch (Netzwerksicherheit, Performance) durchgefĂŒhrt.
Funktionale Tests: Es wurden verschiedene Szenarien durchgespielt:
- Standardablauf Einzelauftrag: Ein Gast stellt im System eine Anfrage fĂŒr âjetzt sofort druckenâ. Der Admin genehmigt diese umgehend. Der Gast nutzt den OTP-Code und druckt. Erwartetes Ergebnis: Anfrage-Status wechselt korrekt, Code wird akzeptiert, Steckdose schaltet an, Druck möglich, Steckdose schaltet nach Zeit X ab, Status wird auf âabgeschlossenâ gesetzt. Ergebnis: Test erfolgreich, der Druckvorgang konnte durchgefĂŒhrt werden, im Admin-Interface erschien der Auftrag als erledigt.
- Ablehnungsszenario: Gast stellt eine Anfrage (z.B. fĂŒr spĂ€ter am Tag). Admin lehnt ab (mit BegrĂŒndung âDrucker derzeit nicht verfĂŒgbarâ). Erwartung: Gast wird benachrichtigt, kein OTP erstellt, Drucker bleibt aus. Ergebnis: Test erfolgreich, Gast-OberflĂ€che zeigte Meldung mit Ablehnungsgrund, Anfrage verschwand aus offenen Anfragen, Steckdose blieb aus (kein Einschaltversuch).
- Konflikt und Kalender: Zwei GĂ€ste wollten denselben Zeitraum reservieren (z.B. 10:00â10:15 Uhr). Gast A sendet Anfrage, Admin genehmigt. Gast B versucht kurz darauf denselben Zeitraum. Erwartung: System sollte zweiten Konflikt erkennen und nicht doppelt vergeben. Ergebnis: Der zweite Gast bekam beim Anfragestellen direkt einen Hinweis âZeitslot bereits belegtâ und musste einen anderen Slot auswĂ€hlen. Somit kam es gar nicht erst zu unlösbaren Kollisionen. Der Kalender im Admin-UI zeigte korrekt eine Reservierung um 10:00â10:15 fĂŒr Gast A.
- Timeout OTP: Ein genehmigter Auftrag wurde absichtlich nicht eingelöst (Gast erschien nicht). Erwartung: Nach Ablauf des Zeitfensters verfĂ€llt der Code und Druck nicht mehr möglich. Ergebnis: Nach der konfigurierten Frist (hier 15 Minuten nach genehmigter Zeit) Ă€nderte das System den Status auf âverfallenâ und ein spĂ€terer Versuch, den Code doch noch einzugeben, wurde vom System abgelehnt (âZeitfenster ĂŒberschrittenâ). Der Drucker blieb ausgeschaltet. Im Admin-Interface war die Anfrage entsprechend markiert.
- Benutzer- und RechteprĂŒfung: Versuche, ohne Login oder mit Gast-Account auf Admin-Funktionen zuzugreifen, wurden getestet (z.B. direkter API-Call auf
/api/anfragen
ohne Token, oder Aufruf der Admin-Seite als Gast). Erwartung: Zugriff verweigert. Ergebnis: Systeme reagierten korrekt mit Login-Redirect bzw. 403-Fehler, keine unbefugte Aktion war möglich. Auch ein direkter Aufruf der Steckdosen-API durch einen Client wurde blockiert durch die Firewall (Ping zur Steckdose aus WLAN ergab keine Antwort, HTTP-Aufruf aus WLAN auf Steckdose schlug fehl). Somit bestĂ€tigte sich die Sicherheitsarchitektur. - Mehrbenutzer-Betrieb: Zur Sicherheit wurde auch getestet, ob mehrere Nutzer parallel das System benutzen könnten (auch wenn in Praxis vielleicht selten). Zwei unterschiedliche Gast-Accounts loggten sich auf zwei GerĂ€ten ein, stellten nacheinander Anfragen. Der Admin genehmigte beide in beliebiger Reihenfolge. Ergebnis: Das System konnte beide Anfragen getrennt handhaben. Codes waren unterschiedlich, jeder Gast sah nur seinen Code. Die Steckdose konnte natĂŒrlich physisch nur einen Drucker bedienen â hier wurde angenommen, dass Drucke seriell erfolgen. Falls Admin versehentlich zwei gleichzeitige Zeitfenster genehmigt hĂ€tte, wĂ€re der zweite Druck erst nach manueller Umschaltung möglich. Aber dank der KalenderprĂŒfung passierte dies nicht.
Technische Tests:
- Netzwerk und Performance: Mit dem Tool Apache Bench (ab) wurden einfache Lasttests auf den Flask-Server durchgefĂŒhrt, um zu sehen, wie viele Requests pro Sekunde verarbeitet werden können. Ergebnis: ca. 50 req/s fĂŒr einen einfachen GET, was fĂŒr unsere geringe Nutzerzahl völlig ausreicht. Die Latenz fĂŒr einen typischen Workflow (Anfrage stellen bis OTP erhalten) lag bei wenigen Sekunden, hauptsĂ€chlich abhĂ€ngig davon, wann der Admin reagiert. Die Steckdosen-Schaltzeit (<1s) war ebenfalls zufriedenstellend.
- SystemstabilitĂ€t: Das System (besonders die Flask-App und das WLAN des Kiosk-Pi) wurde ĂŒber mehrere Stunden laufen gelassen. Der Speicherverbrauch des Flask-Servers blieb stabil (kein Memory Leak beobachtet). Die CPU-Last auf dem Backend-Pi war meist unter 5% idle, Spitze 20% beim gleichzeitigem Schalten der Steckdose (wegen Kryptoberechnungen) â vernachlĂ€ssigbar fĂŒr den Raspberry Pi 4. Der Kiosk-Pi zeigte etwas höhere Last (Chromium Browser ~15% dauernd, Docker/Frontend ~10-20%), aber auch das war im grĂŒnen Bereich. Kein Absturz trat auf.
- Wiederanlauf und Ausfallsicherheit: Ein Test wurde durchgefĂŒhrt, indem der Backend-Pi neu gestartet wurde, wĂ€hrend System in Wartestellung war. Nach dem Reboot war der Flask-Dienst automatisch per Systemd gestartet und das System wieder erreichbar. Der Kiosk-Browser zeigte erst Fehlermeldung (Verbindungsverlust), konnte aber nach einigen Sekunden durch Neuladen wieder den Dienst nutzen. Ebenso wurde das Szenario Stromausfall geĂŒbt: Alle Komponenten aus und wieder an â nach Boot standen WLAN und Backend nach ca. 1 Minute wieder bereit, und das System funktionierte ohne manuellen Eingriff. Die einzige Nacharbeit wĂ€re bei einem Zertifikatstausch nötig, was hier nicht vorkam.
Die Testphase zeigte, dass alle definierten Anforderungen erfĂŒllt wurden. Kleinere Probleme, die entdeckt wurden (z.B. eine falsche Fehlermeldung bei abgelaufenem OTP, oder ein Darstellungsproblem im Kiosk-Browser bei bestimmter Auflösung) konnten noch vor Projektabschluss behoben werden. Mit den erfolgreichen Tests war der Weg frei fĂŒr die Abnahme und Inbetriebnahme des Systems.
Projektabschluss
Nachdem Entwicklung und interner Test abgeschlossen waren, wurde das Projekt offiziell beendet und an den Auftraggeber ĂŒbergeben. Im Rahmen des Projektabschlusses fanden folgende AktivitĂ€ten statt:
Soll-Ist-Vergleich: Es wurde ein Abgleich der erzielten Ergebnisse mit den zu Projektbeginn formulierten Zielen durchgefĂŒhrt. Alle Muss-Anforderungen wurden erreicht, und auch einige optionale Verbesserungen konnten integriert werden:
- Die Druckerreservierung und Freigabe funktionierten im Offline-Netzwerk planmĂ€Ăig. GĂ€ste konnten selbststĂ€ndig Anfragen stellen; Administratoren behielten die Kontrolle ĂŒber die Freigabe.
- Die Smart-Plug-Steuerung ĂŒber den Tapo P110 klappte zuverlĂ€ssig ohne Cloud-Anbindung. Das zuvor bestehende manuelle Ein- und Ausschalten des Druckers wurde vollstĂ€ndig durch das digitale System ersetzt.
- Sicherheit und Zugriffsschutz entsprachen den Erwartungen: Unbefugte Zugriffe wurden verhindert, und vertrauliche Daten (Passwörter, OTP-Codes) waren zu keiner Zeit unverschlĂŒsselt im Netzwerk.
- Der Aspekt der Digitalen Vernetzung wurde in idealer Weise umgesetzt: Unterschiedlichste Komponenten (Webserver, Datenbank, IoT-GerÀt, WLAN/LAN) kommunizieren nahtlos und schaffen zusammen einen neuen digitalisierten GeschÀftsprozess.
- Die Umsetzung blieb innerhalb des Zeit- und Budgetrahmens. TatsĂ€chlich wurden rund 65 Stunden fĂŒr Entwicklung und Test benötigt und weitere ca. 12 Stunden fĂŒr Dokumentation und Ăbergabe â somit wurde die geplante 70-Stunden-Marke geringfĂŒgig ĂŒberschritten, was jedoch im Ausbildungsprojekt toleriert wurde. Finanziell entstanden nur geringe Kosten fĂŒr Steckdose und evtl. ein neues Raspberry-Pi-Netzteil; die meiste Hardware war bereits vorhanden.
Abnahme durch den Auftraggeber: In einer abschlieĂenden PrĂ€sentation wurde das System dem zustĂ€ndigen Verantwortlichen vorgefĂŒhrt. Dabei wurden die wichtigsten AnwendungsfĂ€lle live demonstriert: ein Gast stellte eine Anfrage, der Admin genehmigte per Webinterface, der Druck wurde mittels OTP gestartet. Der Auftraggeber prĂŒfte insbesondere die Sicherheit (z.B. Versuch, ohne Freigabe zu drucken â was fehlschlug) und die Nutzerfreundlichkeit (ein nicht IT-affiner Kollege ĂŒbernahm die Rolle des Gastes und konnte den Ablauf erfolgreich durchfĂŒhren). Das Feedback war durchweg positiv. Kleinere VerbesserungsvorschlĂ€ge des Auftraggebers betrafen vor allem Komfort-Funktionen, etwa:
- Eine E-Mail-Benachrichtigung an den Admin zusĂ€tzlich (derzeit wegen Offline nicht möglich, aber evtl. SMS ĂŒber GSM-Stick als Idee).
- Eine Druckfunktion, bei der der Gast sein Dokument direkt hochladen kann. Dies war bewusst aus Projektumfang ausgeschlossen worden, könnte aber in Zukunft als Modul ergĂ€nzt werden, falls Internet oder ein lokaler Fileshare verfĂŒgbar ist.
- Ein Report am Monatsende, der alle DruckvorgÀnge auflistet (Nutzer, Zeiten) zur internen Statistik. Das System sammelt diese Daten bereits (im Log), aber ein Export/Report wurde noch nicht implementiert.
Diese Punkte wurden als Ausblick formuliert. Sie zeigen, dass das System erweiterbar ist und zukĂŒnftig mit ĂŒberschaubarem Aufwand ergĂ€nzt werden kann, wenn es in Dauerbetrieb bleibt.
Projektdokumentation und Unterlagen: Alle wichtigen Dokumente wurden dem Auftraggeber bzw. PrĂŒfungsausschuss ĂŒbergeben. Dazu zĂ€hlen:
- Diese Projektdokumentation, welche den Verlauf und die technischen Details festhÀlt.
- Der Quellcode des Projekts (als ZIP-File und in einem Git-Repository), inklusive Installationshinweisen.
- Eine kurze Bedienungsanleitung (Kundendokumentation) fĂŒr Administratoren und Nutzer, um den Umgang mit dem System im Alltag zu erleichtern (siehe nĂ€chster Abschnitt).
- Ein Zeitnachweis, der die einzelnen Phasen und aufgewendeten Stunden dokumentiert.
- Der ursprĂŒngliche Projektantrag und die Genehmigung der IHK (als Kopie im Anhang).
Reflexion: RĂŒckblickend verlief das Projekt erfolgreich und lehrreich. Insbesondere das Einarbeiten in die IoT-GerĂ€te-Kommunikation (Smart-Plug) und die eigenstĂ€ndige Konfiguration eines abgetrennten Netzwerks stellten wertvolle praktische Erfahrungen dar. Einige Herausforderungen, wie die Notwendigkeit eines lokalen NTP-Servers oder die Integration zweier unterschiedlicher Frontends, wurden erfolgreich gemeistert. Aus Projektmanagement-Sicht war die Zeitplanung realistisch: die kritischen Entwicklungsaufgaben konnten rechtzeitig gelöst werden, wodurch genĂŒgend Puffer fĂŒr Tests blieb.
Im Hinblick auf die Ausbildung zum Fachinformatiker Digitale Vernetzung hat das Projekt deutlich gemacht, wie wichtig ein ganzheitlicher Blick auf vernetzte Systeme ist. Es reicht nicht, nur zu programmieren â man muss auch Netzwerkaspekte (IP-Planung, Routing, Security) sowie Hardware in die Lösung einbeziehen. Genau diese Schnittstellenkompetenz wurde hier angewendet.
Fazit: Das Projekt Manage Your Printer erreichte sein Hauptziel, den Druckerfreigabe-Prozess zu digitalisieren und zu sichern. Der manuelle Aufwand wurde minimiert, und Nutzern steht ein zuverlĂ€ssiger Service zur VerfĂŒgung. Der modulare Aufbau ermöglicht es, das System an verĂ€nderte Anforderungen anzupassen (z.B. weitere GerĂ€te, Online-Anbindung, mehr Automatisierung). Somit kann der Ausbildungsbetrieb bzw. der Auftraggeber das System in der Praxis einsetzen und bei Bedarf weiterentwickeln. Die erfolgreiche Umsetzung wurde durch den Abnahmebereicht bestĂ€tigt, und das System ging anschlieĂend in den internen Echtbetrieb ĂŒber.
Kundendokumentation
Die folgende Anleitung richtet sich an Benutzer des Druckerreservierungssystems âMYP â Manage Your Printerâ , insbesondere an gastierende Nutzer (GĂ€ste) sowie Administratoren, die das System verwalten. Sie erlĂ€utert die Bedienung aus Anwendersicht. Das System besteht aus einem Webportal und einem Drucker-Kiosk. FĂŒr die Nutzung sind keine besonderen IT-Kenntnisse erforderlich; folgen Sie einfach den Schritten in dieser Dokumentation.
5.1 Ăberblick zum System
MYP â Manage Your Printer ermöglicht es, Drucker in einer geschĂŒtzten Umgebung auf Anfrage freizugeben. Der Drucker ist standardmĂ€Ăig ausgeschaltet und wird erst aktiv, wenn ein autorisierter Druckvorgang stattfinden soll. Die Kommunikation mit dem System erfolgt ĂŒber eine Web-OberflĂ€che, die sowohl von Ihrem eigenen GerĂ€t (z.B. Laptop, Smartphone ĂŒber WLAN) als auch ĂŒber das fest installierte Kiosk-Terminal am Drucker verfĂŒgbar ist.
Es gibt zwei Arten von Benutzern:
- Gast â Ein Gast ist ein Nutzer, der einen Druckauftrag stellen möchte. GĂ€ste können Druckanfragen einreichen und erhalten bei Freigabe einen einmaligen Code zum Starten des Druckers.
- Administrator â Ein Administrator ist typischerweise ein Mitarbeiter des Veranstalters oder der Einrichtung, der die Kontrolle ĂŒber den Drucker behĂ€lt. Administratoren sehen alle eingehenden Anfragen und entscheiden ĂŒber Freigabe oder Ablehnung. AuĂerdem können sie bei Bedarf den Drucker manuell ein- und ausschalten sowie Benutzerkonten verwalten.
Ablauf in KĂŒrze: Ein Gast stellt ĂŒber die WeboberflĂ€che eine Anfrage und gibt ggf. einen gewĂŒnschten Druckzeitpunkt an. Der Administrator prĂŒft die Anfrage und genehmigt sie, wenn keine Konflikte oder EinwĂ€nde bestehen. Das System generiert daraufhin einen Einmal-Code (OTP). Der Gast erhĂ€lt diesen Code (angezeigt im Webportal) und nutzt ihn zur vorgesehenen Zeit am Drucker, um den Drucker einzuschalten. Nach Eingabe des Codes wird der Drucker fĂŒr eine begrenzte Dauer mit Strom versorgt, sodass der Gast sein Dokument drucken kann. AnschlieĂend schaltet sich der Drucker wieder ab.
Die WeboberflĂ€che ist ĂŒber das lokale WLAN âMYP-Printâ erreichbar. Stellen Sie sicher, dass Sie mit dem WLAN verbunden sind (fragen Sie ggf. das Personal nach dem WLAN-SchlĂŒssel). Auf dem Kiosk-Terminal ist die OberflĂ€che bereits geöffnet.
5.2 Anleitung fĂŒr GĂ€ste (Drucknutzer)
Schritt 1: Anmeldung im Webportal
Als Gast benötigen Sie ein Benutzerkonto, das Ihnen vom Administrator mitgeteilt wird (Benutzername und Passwort). Verbinden Sie Ihr GerĂ€t mit dem WLAN âMYP-Printâ. Ăffnen Sie dann einen Browser und rufen Sie die Seite https://myp-backend/
auf. (Alternativ können Sie die IP-Adresse direkt verwenden, z.B. https://192.168.0.105/
, falls der Name nicht auflöst. In vielen FĂ€llen öffnet sich auch automatisch eine Portal-Seite nach dem WLAN-Login.) Sie sehen nun die Anmeldeseite. Geben Sie Ihren Benutzernamen und Ihr Passwort ein und klicken Sie auf âAnmeldenâ. Sollte ein Sicherheitszertifikat-Hinweis erscheinen, akzeptieren Sie das Zertifikat â dies liegt daran, dass wir ein internes Zertifikat verwenden.
Hinweis: Falls Sie kein eigenes GerĂ€t nutzen möchten, können Sie zum am Drucker aufgestellten Kiosk-Terminal gehen. Dort ist das System bereits geöffnet. Melden Sie sich auch dort mit Ihren Zugangsdaten an. Das Terminal verfĂŒgt ĂŒber einen Touchscreen bzw. eine einfache Bedienung mit Maus und Tastatur.
Schritt 2: Druckanfrage stellen
Nach erfolgreicher Anmeldung sehen Sie das Gast-Panel. Hier können Sie eine neue Druckanfrage erstellen. Je nach Interface sieht dies etwas unterschiedlich aus:
- In der mobilen/Browser-Version klicken Sie auf âNeue Druckanfrageâ oder es erscheint direkt ein Formular. Geben Sie hier die benötigten Informationen ein. Typischerweise: GewĂŒnschter Druckzeitpunkt (Datum und Uhrzeit oder âsofort möglichstâ), sowie eine kurze Beschreibung oder Betreff (z.B. â10 Seiten PDF-Dokumentâ). Falls Sie an einem bestimmten Tag/Uhrzeit drucken möchten, wĂ€hlen Sie diesen im Kalender aus, der angezeigt wird. Freie Zeitfenster sind dort erkennbar.
- Am Kiosk-Terminal tippen Sie auf âDrucken anfragenâ. Sie werden ggf. aufgefordert, einen Zeitpunkt auszuwĂ€hlen und eine Beschreibung einzugeben. Nutzen Sie die Bildschirmtastatur, falls keine physische Tastatur vorhanden ist.
Haben Sie alle Angaben gemacht, bestĂ€tigen Sie mit âAnfrage sendenâ. Ihr Antrag wird nun im System gespeichert und dem Administrator zur PrĂŒfung vorgelegt. Sie sehen anschlieĂend eine Statusanzeige, z.B. âAnfrage eingereicht am [Zeit] â wartet auf Entscheidungâ.
Schritt 3: Warten auf Freigabe
Der Administrator erhĂ€lt nun Ihre Anfrage. Bitte haben Sie Geduld, bis die Anfrage bearbeitet ist. Sie mĂŒssen die Seite nicht stĂ€ndig neu laden; das System aktualisiert den Status automatisch alle halbe Minute. Sobald der Admin eine Entscheidung getroffen hat, sehen Sie eine Aktualisierung:
- Falls abgelehnt: Es erscheint eine Meldung âIhre Anfrage wurde abgelehnt.â Möglicherweise wird ein Grund angegeben (z.B. âDrucker heute nicht verfĂŒgbarâ). In diesem Fall können Sie bei Bedarf eine neue Anfrage zu einem anderen Zeitpunkt stellen oder RĂŒcksprache mit dem Personal halten.
- Falls genehmigt: Gratulation, Ihr Druckauftrag wurde genehmigt! Sie sehen nun eine Nachricht âAnfrage genehmigtâ. Ihnen wird ein einmaliger Code angezeigt, meist eine 6-stellige Zahl (z.B.
749201
). Dies ist Ihr persönlicher Druckcode.
Notieren Sie sich diesen Code oder merken Sie ihn sich gut. Wichtig: Dieser Code ist zeitlich begrenzt gĂŒltig. Nutzen Sie ihn daher möglichst zeitnah zum angegebenen Druckzeitpunkt. Wenn Sie den Druck zur spĂ€teren Zeit angefragt haben, nutzen Sie den Code erst dann.
Schritt 4: Druckauftrag durchfĂŒhren (OTP-Code eingeben)
Begeben Sie sich zum Druckerstandort (falls Sie nicht schon dort am Kiosk sind). Um den Drucker einzuschalten, mĂŒssen Sie nun Ihren Code eingeben:
- Am Kiosk-Terminal: Auf dem Bildschirm sollte ein Feld zur Code-Eingabe zu sehen sein (ĂŒberschrieben mit âBitte geben Sie Ihren Druckcode einâ). Tippen Sie Ihren 6-stelligen Code ein. Bei Touch-Bedienung steht Ihnen ein Ziffernfeld zur VerfĂŒgung â drĂŒcken Sie die entsprechenden Ziffern und bestĂ€tigen Sie mit âOKâ oder âStartâ.
- Mit eigenem GerĂ€t: Falls Sie den Drucker selbst ansteuern (z.B. weil Sie vom eigenen Laptop drucken möchten, der mit dem Drucker verbunden ist), öffnen Sie in Ihrem Browser die Seite zur Code-Eingabe. Klicken Sie im Portal auf âDruck startenâ â es öffnet sich eine Eingabemaske fĂŒr den OTP-Code. Geben Sie dort die Zahlen ein und bestĂ€tigen Sie.
Nach Eingabe des korrekten Codes wird das System verifizieren, ob alles in Ordnung ist. Dies dauert nur einen kurzen Moment (1â2 Sekunden). Ist der Code richtig und gĂŒltig, erhalten Sie die Meldung âDrucker ist jetzt freigeschaltetâ und meistens hören Sie ein leises âKlackâ, wenn die Steckdose den Drucker einschaltet. Jetzt können Sie Ihr Dokument drucken:
- Falls der Drucker netzwerkfĂ€hig ist und Sie vom Laptop drucken: Senden Sie nun den Druckjob an den Drucker (der Drucker sollte nun online angezeigt werden, evtl. mĂŒssen Sie einmal auf âVerbindenâ klicken).
- Falls der Drucker per USB-stick oder am Kiosk bedient wird: Folgen Sie den Anweisungen vor Ort, z.B. Dokument vom USB-Stick ĂŒber das Kiosk-Terminal drucken. (Anmerkung: Je nach Einrichtung wird entweder Personal den Druck auslösen oder es gibt ein Self-Service am PC.)
Sobald Sie Ihren Druck erledigt haben, lassen Sie den Drucker einfach eingeschaltet. Das System wird ihn nach einer festgelegten Zeit automatisch wieder ausschalten. Sie mĂŒssen nichts weiter tun. In der WeboberflĂ€che wird Ihre Anfrage nun als abgeschlossen markiert.
FehlerfÀlle und Hinweise:
- Wenn Sie einen falschen Code eingeben, erhalten Sie die Meldung âFalscher Code, bitte erneut versuchen.â Achten Sie darauf, sich nicht zu vertippen. Nach drei Fehleingaben wird der Vorgang aus SicherheitsgrĂŒnden gesperrt â wenden Sie sich dann an das Personal.
- Wenn Sie zu lange warten und der Code ablĂ€uft (z.B. GĂŒltigkeit 15 Minuten ĂŒberschritten), erscheint die Meldung âCode abgelaufenâ. In diesem Fall kontaktieren Sie den Administrator fĂŒr eine erneute Freigabe. Es kann sein, dass Sie dann eine neue Anfrage stellen mĂŒssen, je nach Regelung vor Ort.
- Sollte der Drucker trotz korrekten Codes nicht einschalten (kein GerĂ€usch, keine Status-LED am Drucker), prĂŒfen Sie die Verbindung: Ist die Steckdose eingesteckt? Leuchtet an der Steckdose eine Lampe? Eventuell liegt ein technisches Problem vor â informieren Sie dann bitte das Personal.
Schritt 5: Abmeldung
Nach getaner Arbeit können Sie sich aus dem Webportal abmelden. Klicken Sie auf Ihren Benutzernamen (oder das MenĂŒ) und wĂ€hlen Sie âAbmeldenâ. Dies ist besonders wichtig, wenn Sie das Kiosk-Terminal genutzt haben, damit kein nachfolgender Nutzer auf Ihr Konto zugreifen kann. Am Kiosk-Terminal erfolgt aus SicherheitsgrĂŒnden nach einigen Minuten InaktivitĂ€t automatisch eine Abmeldung.
5.3 Anleitung fĂŒr Administratoren
FĂŒr Administratoren gibt es ein spezielles Admin-Panel, ĂŒber das die Verwaltung der Druckanfragen und Benutzer erfolgt. Als Administrator haben Sie einen eigenen Login (mit Administratorrechten). Stellen Sie zunĂ€chst sicher, dass Ihr GerĂ€t mit dem internen Netzwerk verbunden ist (im BĂŒro-LAN oder ebenfalls im WLAN âMYP-Printâ, je nach Systemkonfiguration).
Anmeldung als Admin: Ăffnen Sie das Webportal wie oben (https://myp-backend/
im Browser). Loggen Sie sich mit Ihrem Admin-Benutzernamen und Passwort ein. Sie gelangen nun in die Admin-OberflĂ€che. Diese unterscheidet sich von der Gast-Ansicht: Sie sehen sofort eine Liste aller aktuellen Druckanfragen und zusĂ€tzliche MenĂŒpunkte.
Anfragen verwalten: Im Hauptbereich âDruckanfragenâ sind alle offenen Anfragen aufgefĂŒhrt, meist mit Angaben wie Benutzername des Gastes, angefragter Zeitpunkt und Beschreibung. PrĂŒfen Sie regelmĂ€Ăig, ob neue Anfragen vorliegen â neue EintrĂ€ge werden farblich hervorgehoben oder es erscheint ein Hinweis âNeue Anfrage eingegangenâ.
FĂŒr jede Anfrage haben Sie folgende Optionen:
- Details ansehen: Klicken Sie auf die Anfrage, um alle Informationen anzuzeigen (gewĂŒnschte Zeit, ggf. Kommentar des Gastes, bisherige Anfragen dieses Nutzers etc.).
- Genehmigen: Ist die Anfrage in Ordnung und kein Konflikt vorhanden, können Sie auf âGenehmigenâ klicken. BestĂ€tigen Sie den Vorgang, falls eine Sicherheitsabfrage erscheint. Das System wird nun im Hintergrund einen OTP-Code generieren und die Anfrage als genehmigt kennzeichnen. Der Gast wird automatisch benachrichtigt. Sie sehen dann den Code ebenfalls in der Detailansicht der Anfrage (falls Sie ihn dem Gast manuell mitteilen möchten).
- Ablehnen: Falls Sie die Anfrage nicht zulassen können oder wollen, klicken Sie auf âAblehnenâ. Es erscheint ein Feld, in dem Sie optional einen Ablehnungsgrund eingeben können (z.B. âZeitfenster ĂŒberschneidet sich mit Wartungâ oder âKeine Farbdrucke möglichâ). BestĂ€tigen Sie die Ablehnung. Der Gast erhĂ€lt ĂŒber das Portal die Mitteilung mit Ihrem angegebenen Hinweis.
Reservierungen/Kalender: Ăber den MenĂŒpunkt âKalenderâ oder im Dashboard sehen Sie eine Ăbersicht aller genehmigten und geplanten Drucktermine. Hier erkennen Sie, wann der Drucker reserviert ist. Dies hilft Ihnen auch, zukĂŒnftige Anfragen einzuschĂ€tzen â sollte ein Gast eine Anfrage fĂŒr einen bereits belegten Slot stellen, wird das System das verhindern, aber Sie können proaktiv planen. Sie haben im Admin-Panel ggf. die Möglichkeit, EintrĂ€ge im Kalender zu bearbeiten (z.B. verschieben oder löschen), was direkt auf die Anfragen wirkt. Ăndern Sie jedoch Reservierungen nur in Absprache mit dem jeweiligen Gast.
Steckdose manuell steuern: In AusnahmefĂ€llen möchten Sie den Drucker vielleicht unabhĂ€ngig vom OTP-Prozess ein- oder ausschalten (z.B. fĂŒr Wartung, Testdrucke oder NotfĂ€lle). In der Admin-OberflĂ€che gibt es dafĂŒr einen Bereich âSteckdosensteuerungâ oder âGerĂ€testeuerungâ. Dort finden Sie einen Schalter âDrucker AN/AUSâ. Dieser zeigt den aktuellen Status der Steckdose (GrĂŒn = an, Rot = aus). Sie können darauf klicken, um die Steckdose direkt zu schalten. Beachten Sie: Wenn Sie den Drucker manuell einschalten, wird dies im System protokolliert, aber es ist kein OTP erforderlich â nutzen Sie dies also nur intern. Vergessen Sie nicht, den Drucker anschlieĂend wieder auszuschalten, da sonst ein Gast ohne Code drucken könnte. Das System schaltet den Drucker nach einer bestimmten Leerlaufzeit zwar automatisch ab, aber manuelle Kontrolle ist hier wichtig.
Benutzerverwaltung: Unter âBenutzerâ können Sie die registrierten Konten einsehen. FĂŒr jeden Gast ist ein Account angelegt. Sie können neue Benutzer hinzufĂŒgen (z.B. wenn neue GĂ€ste berechtigt werden sollen). Klicken Sie auf âBenutzer hinzufĂŒgenâ, vergeben Sie einen Benutzernamen und ein initiales Passwort und eine Rolle (Gast oder Admin). Teilen Sie neue Zugangsdaten den betreffenden Personen vertraulich mit. Bestehende Benutzer können bearbeitet werden â z.B. Passwort zurĂŒcksetzen, falls jemand sein Passwort vergessen hat. Aus SicherheitsgrĂŒnden werden Passwörter nur gehashed gespeichert; Sie können also kein vergessenes Passwort einsehen, sondern nur neu setzen. Sie können Benutzer auch deaktivieren oder löschen, falls jemand keinen Zugang mehr haben soll.
SystemĂŒberwachung und Logbuch: Das System protokolliert wichtige Ereignisse im Hintergrund. Im Admin-Bereich gibt es oft ein âLogâ oder âAktivitĂ€tenâ. Dort sehen Sie z.B. â[Zeit] Benutzer MaxMuster hat Druckanfrage #5 gestelltâ oder â[Zeit] Admin hat Anfrage #5 genehmigt (Code 749201)â usw. Dieses Log hilft bei der Nachverfolgung. Sie können hierdurch auch UnregelmĂ€Ăigkeiten feststellen (z.B. falls jemand mehrfach falschen Code eingegeben hat). Das Log wird bei Bedarf automatisch bereinigt, um es ĂŒbersichtlich zu halten.
Wartung des Systems: Als Administrator kĂŒmmern Sie sich auch um den Betrieb:
- Start/Stop des Systems: Die beiden Raspberry Pi laufen in der Regel 24/7. Sollten Sie sie neu starten mĂŒssen (z.B. nach Updates oder falls sich etwas aufgehĂ€ngt hat), tun Sie dies möglichst auĂerhalb der reservierten Zeiten. Nach einem Neustart stellen Sie sicher, dass: der Backend-Pi seine Dienste gestartet hat (Webinterface erreichbar) und der Kiosk-Pi das WLAN und den Browser gestartet hat. Normalerweise passiert dies automatisch durch die Konfiguration. Testen Sie einmal das Login und ggf. einen Schaltbefehl, um sicherzugehen.
- Zertifikate erneuern: Die SSL-Zertifikate, die fĂŒr die HTTPS-VerschlĂŒsselung sorgen, haben ein Ablaufdatum (in unserem Fall typisch 10 Jahre gĂŒltig, da selbstsigniert). Sollte dennoch ein Tausch anstehen oder Sie dem System ein offizielles Zertifikat geben (wenn es doch ans Internet geht), folgen Sie der technischen Dokumentation im Anhang oder wenden Sie sich an einen IT-Administrator.
- Updates: Aktualisieren Sie die Raspberry Pi Systeme in regelmĂ€Ăigen AbstĂ€nden, sofern das System lĂ€nger in Betrieb ist. Da kein Internet besteht, könnte man nötige Updates via USB einspielen. Wichtig ist insbesondere, Sicherheitsupdates ins System zu bringen, auch wenn das Netzwerk isoliert ist.
- Backups: Das System speichert Daten (Benutzer, Anfragen) in einer SQLite-Datei auf dem Backend-Pi. Machen Sie hiervon in sinnvollen AbstÀnden eine Sicherheitskopie, um bei Hardwareproblemen keinen Datenverlust zu riskieren. Sie können dazu z.B. per SCP die
myp.db
Datei auf einen USB-Stick oder Admin-PC kopieren. - Reset der Steckdose: Sollte die Smart-Steckdose nicht mehr reagieren (z.B. nach Stromausfall blinkt rot und verbindet nicht), mĂŒssen Sie sie evtl. neu ins WLAN aufnehmen. DafĂŒr drĂŒcken Sie den kleinen Knopf an der Seite 5 Sekunden (bis das Licht schnell blinkt) und folgen der TP-Link-Anleitung zur Neueinrichtung â idealerweise aber unter Anleitung eines Technikers, da diese Konfiguration Teil des technischen Systems ist.
Support fĂŒr Nutzer: Weisen Sie Gastnutzer ein, wie sie das System verwenden (im Prinzip wie in Kapitel 5.2 beschrieben). Stellen Sie das ausgehĂ€ngte Infoblatt mit den Schritten in Sichtweite des Kiosk-Terminals auf. Bei Problemen stehen Sie als Administrator zur VerfĂŒgung. HĂ€ufige Fragen werden sein: âWie bekomme ich Zugangsdaten?â, âIch habe meinen Code vergessen/verloren â was tun?â (Antwort: Code im Admin-Interface nochmals nachschauen oder Anfrage stornieren und neu anlegen).
Mit dieser Kundendokumentation sollten sowohl GĂ€ste als auch Administratoren in der Lage sein, das Manage Your Printer -System effektiv zu nutzen. Halten Sie diese Dokumentation griffbereit und passen Sie sie bei Ănderungen des Systems entsprechend an.
Anhang
A. Projektantrag und Genehmigung:
Im Anhang A befindet sich der ursprĂŒngliche Projektantrag âEntwicklung eines Druckerreservierungssystems mit Offline-Netzwerkâ sowie das Schreiben der IHK zur Genehmigung des Projektthemas. Darin sind die Projektbeschreibung, Zielsetzung und Rahmenbedingungen nochmals zusammengefasst.
B. Zeitnachweis (Projektzeiterfassung):
Anhang B enthĂ€lt eine tabellarische Aufstellung der durchgefĂŒhrten Arbeitspakete mit Datumsangaben und Stundeneinsatz. Diese Ăbersicht dokumentiert den Projektverlauf und dient als Nachweis, dass der PrĂŒfling die vorgegebenen 70 Stunden eigenstĂ€ndig durchgefĂŒhrt hat. Die Tabelle ist unterteilt nach Phasen (Planung, Umsetzung, Test, Dokumentation) und zeigt die jeweiligen TĂ€tigkeiten (z.B. âInstallation Raspberry Pi Backend â 2hâ, âImplementierung Login und Rollen â 4hâ etc.) mit Summe.
C. Technische Dokumentationen und Listings:
- C.1 Netzwerkplan: Ein Diagramm, das die Netzwerktopologie darstellt (Raspberry Pi Backend im LAN, Raspberry Pi Kiosk als WLAN-AP, Smart Plug, Printer). Darin sind IP-Adressen, Subnetze und Verbindungen ersichtlich, um technischen Betreuern einen schnellen Ăberblick zu geben.
- C.2 Konfigurationsdateien (AuszĂŒge): Wichtige Konfigurationsdateien sind hier gelistet, z.B. Ausschnitte aus
hostapd.conf
(WLAN-Name, VerschlĂŒsselungseinstellungen),dnsmasq.conf
(DHCP-Range, DNS Overrides fĂŒr NTP), undflask_config.py
(Einstellungen des Flask-Servers, soweit sie keine Passwörter enthalten). Diese dienen dazu, das System bei Bedarf rekonstruieren oder anpassen zu können. - C.3 Quellcode-Auszug SmartPlug-Steuerung: Da diese Komponente besonders examensrelevant war, ist hier der Python-Code abgedruckt, der den Anmelde- und Schaltvorgang der Tapo P110 durchfĂŒhrt. Kommentare im Code erlĂ€utern den Ablauf. Der vollstĂ€ndige Code ist im beigelegten Repository enthalten; hier wird eine gekĂŒrzte Fassung gezeigt, um die Kernlogik hervorzuheben.
- C.4 API-Endpunkt-Ăbersicht: Eine Tabelle, die alle entwickelten REST-API-Endpunkte mit kurzem Zweck, Method (GET/POST...) und erforderlichen Rechten auflistet. Dies ist hilfreich fĂŒr zukĂŒnftige Entwickler oder Integrationen, die auf das System zugreifen wollen.
D. Tests und Abnahmeprotokoll:
In Anhang D findet sich das Testprotokoll mit einer Checkliste aller TestfĂ€lle und den Ergebnissen (Bestanden/Nicht bestanden, Bemerkungen). Ebenso ist ein Abnahmeprotokoll beigefĂŒgt, das vom Auftraggeber unterzeichnet wurde. Dieses bestĂ€tigt, dass das System gemÀà den Anforderungen umgesetzt wurde und betriebsbereit ist.
E. Benutzerhandbuch (kurz) und Schulungsunterlagen:
Falls ergĂ€nzend erstellt, enthĂ€lt Anhang E z.B. ein zweiseitiges Kurzhandbuch, das den Ablauf fĂŒr GĂ€ste in knapper Form darstellt (dies kann z.B. aushĂ€ngen) und ggf. Folien oder Notizen aus einer internen Schulung des Personals.
Dokumentation Ende.