#!/usr/bin/env python3 """ Skript zum Einrichten und Testen der 6 Standard-Drucker """ import sys import os from datetime import datetime # Pfad zum Backend hinzufügen sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from app import app from models import init_database, Printer, User, get_db_session from utils.tapo_status_manager import tapo_status_manager from utils.logging_config import get_logger logger = get_logger("test_printer_setup") # Die 6 Standard-Drucker für Mercedes-Benz STANDARD_PRINTERS = [ { "name": "3D-Drucker 1 - Halle A", "model": "Prusa MK3S+", "location": "Halle A - Arbeitsplatz 1", "ip_address": "192.168.1.101", "plug_ip": "192.168.1.201", "plug_username": "admin", "plug_password": "tapo_password" }, { "name": "3D-Drucker 2 - Halle A", "model": "Prusa MK3S+", "location": "Halle A - Arbeitsplatz 2", "ip_address": "192.168.1.102", "plug_ip": "192.168.1.202", "plug_username": "admin", "plug_password": "tapo_password" }, { "name": "3D-Drucker 3 - Halle B", "model": "Ultimaker S5", "location": "Halle B - Arbeitsplatz 1", "ip_address": "192.168.1.103", "plug_ip": "192.168.1.203", "plug_username": "admin", "plug_password": "tapo_password" }, { "name": "3D-Drucker 4 - Halle B", "model": "Ultimaker S5", "location": "Halle B - Arbeitsplatz 2", "ip_address": "192.168.1.104", "plug_ip": "192.168.1.204", "plug_username": "admin", "plug_password": "tapo_password" }, { "name": "3D-Drucker 5 - Labor", "model": "Formlabs Form 3", "location": "Labor - SLA-Bereich", "ip_address": "192.168.1.105", "plug_ip": "192.168.1.205", "plug_username": "admin", "plug_password": "tapo_password" }, { "name": "3D-Drucker 6 - Werkstatt", "model": "Markforged X7", "location": "Werkstatt - Spezialbereich", "ip_address": "192.168.1.106", "plug_ip": "192.168.1.206", "plug_username": "admin", "plug_password": "tapo_password" } ] def setup_printers(): """Richtet die 6 Standard-Drucker ein""" logger.info("🚀 Starte Drucker-Setup...") with app.app_context(): db_session = get_db_session() # Prüfen, ob schon Drucker existieren existing_count = db_session.query(Printer).count() if existing_count > 0: logger.info(f"ℹ️ Es existieren bereits {existing_count} Drucker in der Datenbank") response = input("Möchten Sie diese löschen und neu anlegen? (j/n): ") if response.lower() == 'j': logger.info("🗑️ Lösche existierende Drucker...") db_session.query(Printer).delete() db_session.commit() else: logger.info("⏩ Überspringe Drucker-Setup") return # Drucker erstellen for i, printer_data in enumerate(STANDARD_PRINTERS, 1): logger.info(f"📋 Erstelle Drucker {i}/6: {printer_data['name']}") printer = Printer() printer.name = printer_data["name"] printer.model = printer_data["model"] printer.location = printer_data["location"] printer.ip_address = printer_data["ip_address"] printer.plug_ip = printer_data["plug_ip"] printer.plug_username = printer_data["plug_username"] printer.plug_password = printer_data["plug_password"] printer.status = "offline" printer.active = True printer.created_at = datetime.now() db_session.add(printer) db_session.commit() logger.info("✅ Alle 6 Drucker erfolgreich erstellt!") db_session.close() def test_printer_status(): """Testet den Status aller Drucker""" logger.info("\n🔍 Teste Drucker-Status...") with app.app_context(): # Status aller Drucker abrufen all_status = tapo_status_manager.get_all_printer_status() logger.info(f"📊 Status für {len(all_status)} Drucker abgerufen:\n") # Status-Zusammenfassung status_summary = { "on": 0, "off": 0, "unreachable": 0, "unknown": 0 } for status in all_status: plug_status = status.get("plug_status", "unknown") status_summary[plug_status] = status_summary.get(plug_status, 0) + 1 # Detaillierte Ausgabe logger.info(f"🖨️ {status['name']}") logger.info(f" 📍 Standort: {status['location']}") logger.info(f" 🔌 Steckdosen-IP: {status.get('plug_ip', 'Keine')}") if status.get("has_plug"): status_text = tapo_status_manager.STATUS_DISPLAY.get(plug_status, {}).get("text", "Unbekannt") logger.info(f" ⚡ Status: {status_text}") if status.get("plug_reachable"): logger.info(f" ✅ Steckdose erreichbar") else: logger.info(f" ❌ Steckdose nicht erreichbar") if status.get("error"): logger.info(f" ⚠️ Fehler: {status['error']}") else: logger.info(f" ℹ️ Keine Steckdose konfiguriert") if status.get("current_job"): job = status["current_job"] logger.info(f" 🏃 Aktiver Job: {job['name']} (von {job['user']})") if status.get("next_job"): job = status["next_job"] logger.info(f" ⏰ Nächster Job: {job['name']} (in {job['starts_in_minutes']} Minuten)") logger.info("") # Zusammenfassung logger.info("📈 Status-Zusammenfassung:") logger.info(f" ✅ Eingeschaltet: {status_summary.get('on', 0)}") logger.info(f" ⭕ Ausgeschaltet: {status_summary.get('off', 0)}") logger.info(f" ❌ Nicht erreichbar: {status_summary.get('unreachable', 0)}") logger.info(f" ❓ Unbekannt: {status_summary.get('unknown', 0)}") def test_plug_control(): """Testet die Steckdosen-Steuerung""" logger.info("\n🎮 Teste Steckdosen-Steuerung...") with app.app_context(): db_session = get_db_session() # Ersten Drucker für Test auswählen printer = db_session.query(Printer).first() if not printer: logger.error("❌ Keine Drucker gefunden!") return logger.info(f"🎯 Teste Steuerung für: {printer.name}") # Aktuellen Status abrufen current_status = tapo_status_manager.get_printer_status(printer.id) logger.info(f"📊 Aktueller Status: {current_status.get('plug_status', 'unknown')}") if not current_status.get("can_control"): logger.warning("⚠️ Steckdose kann nicht gesteuert werden") if current_status.get("error"): logger.warning(f" Grund: {current_status['error']}") return # Versuche ein/auszuschalten response = input("\nMöchten Sie versuchen, die Steckdose zu steuern? (j/n): ") if response.lower() == 'j': action = "on" if current_status.get("plug_status") == "off" else "off" logger.info(f"🔄 Versuche Steckdose zu '{action}' zu schalten...") success, msg = tapo_status_manager.control_plug(printer.id, action) if success: logger.info(f"✅ {msg}") # Neuen Status abrufen new_status = tapo_status_manager.get_printer_status(printer.id) logger.info(f"📊 Neuer Status: {new_status.get('plug_status', 'unknown')}") else: logger.error(f"❌ Fehler: {msg}") db_session.close() def main(): """Hauptfunktion""" logger.info("=" * 60) logger.info("🏭 Mercedes-Benz 3D-Druck-Management - Drucker-Setup & Test") logger.info("=" * 60) try: # Datenbank initialisieren with app.app_context(): init_database() # Drucker einrichten setup_printers() # Status testen test_printer_status() # Optional: Steuerung testen response = input("\n🎮 Möchten Sie die Steckdosen-Steuerung testen? (j/n): ") if response.lower() == 'j': test_plug_control() logger.info("\n✅ Test abgeschlossen!") except Exception as e: logger.error(f"❌ Fehler aufgetreten: {str(e)}", exc_info=True) return 1 return 0 if __name__ == "__main__": sys.exit(main())