Files
Projektarbeit-MYP/backend/scripts/test_printer_setup.py

258 lines
8.9 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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.hardware_integration import printer_monitor
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 = printer_monitor.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 = printer_monitor.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 = printer_monitor.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 = printer_monitor.control_plug(printer.id, action)
if success:
logger.info(f"{msg}")
# Neuen Status abrufen
new_status = printer_monitor.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())