diff --git a/backend/app/config/settings.py b/backend/app/config/settings.py index 1e503c42..3e5c8086 100644 --- a/backend/app/config/settings.py +++ b/backend/app/config/settings.py @@ -26,7 +26,7 @@ DATABASE_PATH = os.path.join(BASE_DIR, "database", "myp.db") # ===== SMART PLUG KONFIGURATION ===== # TP-Link Tapo P110 Standardkonfiguration TAPO_USERNAME = "till.tomczak@mercedes-benz.com" -TAPO_PASSWORD = "744563017196" +TAPO_PASSWORD = "744563017196A" # Automatische Steckdosen-Erkennung aktivieren TAPO_AUTO_DISCOVERY = True diff --git a/backend/app/test_p110.py b/backend/app/test_p110.py index 0519ecba..06fc2798 100644 --- a/backend/app/test_p110.py +++ b/backend/app/test_p110.py @@ -1 +1,175 @@ - \ No newline at end of file +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +P110-TAPO-TEST - Speziell für TP-Link Tapo P110-Steckdosen +Testet verschiedene Versionen des PyP100-Moduls +""" + +import sys +import time +import socket +import subprocess +from datetime import datetime + +# Anmeldedaten +TAPO_USERNAME = "till.tomczak@mercedes-benz.com" +TAPO_PASSWORD = "744563017196" + +# Standard-IP-Adressen zum Testen (anpassen an tatsächliche IPs) +TEST_IPS = [ + "192.168.0.103", # Diese IPs waren erreichbar im vorherigen Test + "192.168.0.104" +] + +def log(message): + """Logge eine Nachricht mit Zeitstempel""" + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + print(f"[{timestamp}] {message}") + +def check_connection(ip, port=80, timeout=1): + """Prüft eine TCP-Verbindung""" + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(timeout) + result = sock.connect_ex((ip, port)) + sock.close() + return result == 0 + except: + return False + +def install_package(package): + """Installiert ein Python-Paket""" + try: + log(f"Installiere {package}...") + subprocess.run([sys.executable, "-m", "pip", "install", package, "--force-reinstall"], check=True) + log(f"✅ {package} erfolgreich installiert") + return True + except Exception as e: + log(f"❌ Fehler bei Installation von {package}: {e}") + return False + +def test_p110_connection(): + """Testet verschiedene Möglichkeiten, um mit P110-Steckdosen zu kommunizieren""" + + log("🚀 TAPO P110 TEST - STARTER") + log(f"👤 Benutzername: {TAPO_USERNAME}") + log(f"🔑 Passwort: {TAPO_PASSWORD}") + + # Verfügbare Module testen + log("\n1️⃣ SCHRITT 1: Teste verfügbare Module") + + try: + from PyP100 import PyP110 + log("✅ PyP100 Modul gefunden") + except ImportError: + log("❌ PyP100 Modul nicht gefunden") + install_package("PyP100==0.1.2") + + try: + from PyP100 import PyP110 + log("✅ PyP100 Modul jetzt installiert") + except ImportError: + log("❌ Konnte PyP100 nicht importieren") + return + + # Erreichbare Steckdosen finden + log("\n2️⃣ SCHRITT 2: Suche erreichbare IPs") + + available_ips = [] + for ip in TEST_IPS: + if check_connection(ip): + log(f"✅ IP {ip} ist erreichbar") + available_ips.append(ip) + else: + log(f"❌ IP {ip} nicht erreichbar") + + if not available_ips: + log("❌ Keine erreichbaren IPs gefunden!") + return + + # P110-Verbindung testen + log("\n3️⃣ SCHRITT 3: Teste PyP100 Bibliothek") + + for ip in available_ips: + try: + log(f"🔄 Verbinde zu Steckdose {ip} mit PyP100.PyP110...") + + # Neue Instanz erstellen + from PyP100 import PyP110 + p110 = PyP110.P110(ip, TAPO_USERNAME, TAPO_PASSWORD) + + # Handshake und Login + log(" Handshake...") + p110.handshake() + log(" Login...") + p110.login() + + # Geräteinformationen abrufen + log(" Geräteinformationen abrufen...") + device_info = p110.getDeviceInfo() + + # Erfolg! + log(f"✅ ERFOLG! Steckdose {ip} gefunden") + log(f" Name: {device_info.get('nickname', 'Unbekannt')}") + log(f" Status: {'Eingeschaltet' if device_info.get('device_on', False) else 'Ausgeschaltet'}") + + # Ein-/Ausschalten testen + if "--toggle" in sys.argv: + current_state = device_info.get('device_on', False) + + if current_state: + log(" Schalte AUS...") + p110.turnOff() + else: + log(" Schalte EIN...") + p110.turnOn() + + time.sleep(1) + + # Status prüfen + device_info = p110.getDeviceInfo() + new_state = device_info.get('device_on', False) + log(f" Neuer Status: {'Eingeschaltet' if new_state else 'Ausgeschaltet'}") + + return True + + except Exception as e: + log(f"❌ Fehler bei Verbindung zu {ip}: {e}") + + # Alternative Bibliothek testen + log("\n4️⃣ SCHRITT 4: Teste PyP100 mit alternativer Version") + + if install_package("pytapo==1.1.2"): + try: + import pytapo + from pytapo.tapo import Tapo + + for ip in available_ips: + try: + log(f"🔄 Verbinde zu Steckdose {ip} mit pytapo...") + + # Neue Verbindung + tapo = Tapo(ip, TAPO_USERNAME, TAPO_PASSWORD) + + # Geräteinformationen abrufen + device_info = tapo.get_device_info() + + # Erfolg! + log(f"✅ ERFOLG mit pytapo! Steckdose {ip} gefunden") + log(f" Name: {device_info.get('nickname', 'Unbekannt')}") + + return True + + except Exception as e: + log(f"❌ Fehler bei pytapo-Verbindung zu {ip}: {e}") + except Exception as e: + log(f"❌ Fehler beim Import von pytapo: {e}") + + log("\n❌ Keine funktionierenden Tapo-Steckdosen gefunden!") + log("Bitte überprüfen Sie die Anmeldedaten und IP-Adressen") + +if __name__ == "__main__": + print("\n======= TAPO P110 TEST =======\n") + test_p110_connection() + print("\n======= TEST BEENDET =======\n") \ No newline at end of file diff --git a/backend/app/test_tapo_sofort.py b/backend/app/test_tapo_sofort.py index 5a3ae7bf..c8030a45 100644 --- a/backend/app/test_tapo_sofort.py +++ b/backend/app/test_tapo_sofort.py @@ -2,183 +2,131 @@ # -*- coding: utf-8 -*- """ -Sofort-Test für TP-Link Tapo P110-Steckdosen -Testet direkt die Verbindung zu allen konfigurierten Steckdosen +SOFORT-TEST für TP-Link Tapo P110-Steckdosen +Nutzt direkt PyP100 mit hardkodierten Anmeldedaten """ -import sys import os -import subprocess +import sys import time from datetime import datetime -# Anmeldedaten für Tapo-Steckdosen -TAPO_USERNAME = "till.tomczak@mercedes-benz.com" -TAPO_PASSWORD = "744563017196" +# TAPO Anmeldedaten direkt hardkodiert (wie in den funktionierenden Versionen) +os.environ["TAPO_USERNAME"] = "till.tomczak@mercedes-benz.com" +os.environ["TAPO_PASSWORD"] = "744563017196A" # Das 'A' am Ende ist wichtig -# Standard-IPs für Tapo-Steckdosen -# (falls nicht verfügbar, passen Sie diese an die tatsächlichen IPs in Ihrem Netzwerk an) +# IPs der Steckdosen TAPO_IPS = [ - "192.168.1.100", - "192.168.1.101", - "192.168.1.102", - "192.168.1.103", - "192.168.1.104", - "192.168.1.105", - "192.168.0.100", - "192.168.0.101", - "192.168.0.102", "192.168.0.103", "192.168.0.104", - "192.168.0.105", - "192.168.1.200", - "192.168.1.201", - "192.168.0.200", - "192.168.0.201", + "192.168.0.100", + "192.168.0.101", + "192.168.0.102" ] -def log_message(message, level="INFO"): - """Logge eine Nachricht mit Zeitstempel""" - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - print(f"[{timestamp}] [{level}] {message}") +def log(msg): + """Protokolliert eine Nachricht mit Zeitstempel""" + timestamp = datetime.now().strftime("%H:%M:%S") + print(f"[{timestamp}] {msg}") -def ping_address(ip_address, timeout=2): - """Führt einen Ping-Test durch""" - try: - # Platform-spezifische Ping-Befehle - import platform - if platform.system().lower() == "windows": # Windows - cmd = ['ping', '-n', '1', '-w', str(timeout * 1000), ip_address] - else: # Unix/Linux/macOS - cmd = ['ping', '-c', '1', '-W', str(timeout), ip_address] - - result = subprocess.run( - cmd, - capture_output=True, - text=True, - timeout=timeout + 1 - ) - - return result.returncode == 0 - except Exception: - return False - -def test_tapo_connection(): - """ - Testet die Verbindung zu TP-Link Tapo P110-Steckdosen. - """ - log_message("🔄 Überprüfe ob PyP100-Modul installiert ist...") +def test_connection(): + """Teste Verbindung zu den Steckdosen""" + log("🔄 Teste PyP100-Import...") try: - from PyP100 import PyP110 - log_message("✅ PyP100-Modul erfolgreich importiert") + from PyP100 import PyP100 + log("✅ PyP100-Modul erfolgreich importiert") except ImportError: - log_message("❌ PyP100-Modul nicht installiert", "ERROR") - log_message(" Installiere jetzt mit: pip install PyP100==0.1.2") - + log("❌ PyP100-Modul nicht gefunden. Installiere es...") try: - subprocess.run([sys.executable, "-m", "pip", "install", "PyP100==0.1.2"], check=True) - log_message("✅ PyP100-Modul erfolgreich installiert") - - # Erneut importieren - from PyP100 import PyP110 + import subprocess + subprocess.run([sys.executable, "-m", "pip", "install", "PyP100==0.0.12"], check=True) + from PyP100 import PyP100 + log("✅ PyP100-Modul installiert") except Exception as e: - log_message(f"❌ Fehler bei Installation von PyP100: {str(e)}", "ERROR") - log_message(" Bitte installieren Sie manuell: pip install PyP100==0.1.2") - return + log(f"❌ Fehler bei Installation: {str(e)}") + return False - log_message("🔍 Starte Test für Tapo-Steckdosen...") - log_message(f"🔐 Anmeldedaten: {TAPO_USERNAME} / {TAPO_PASSWORD}") + # Anmeldedaten aus Umgebungsvariablen lesen + username = os.environ.get("TAPO_USERNAME") + password = os.environ.get("TAPO_PASSWORD") - successful_connections = 0 - found_ips = [] + log(f"👤 Benutzername: {username}") + log(f"🔑 Passwort: {password}") + + # Teste jede IP + success = False for ip in TAPO_IPS: - log_message(f"🔄 Teste IP-Adresse: {ip}") + log(f"🔄 Teste Steckdose mit IP: {ip}") - # Ping-Test für Grundkonnektivität - ping_success = ping_address(ip) - if not ping_success: - log_message(f" ❌ IP {ip} nicht erreichbar (Ping fehlgeschlagen)") - continue - - log_message(f" ✅ IP {ip} ist erreichbar (Ping erfolgreich)") - - # Tapo-Verbindung testen try: - log_message(f" 🔄 Verbinde zu Tapo-Steckdose {ip}...") - p110 = PyP110.P110(ip, TAPO_USERNAME, TAPO_PASSWORD) - p110.handshake() # Authentifizierung - p110.login() # Login + # Wichtig: Verwende PyP100 (nicht PyP110) wie in den funktionierenden Versionen + p100 = PyP100.P100(ip, username, password) - # Geräteinformationen abrufen - device_info = p110.getDeviceInfo() + # Handshake und Login + log(" 🔄 Handshake...") + p100.handshake() - # Status abrufen - is_on = device_info.get('device_on', False) - nickname = device_info.get('nickname', "Unbekannt") + log(" 🔄 Login...") + p100.login() - log_message(f" ✅ Verbindung zu Tapo-Steckdose '{nickname}' ({ip}) erfolgreich") - log_message(f" 📱 Gerätename: {nickname}") - log_message(f" ⚡ Status: {'Eingeschaltet' if is_on else 'Ausgeschaltet'}") + # Status abfragen + log(" 🔄 Status abfragen...") + device_info = p100.getDeviceInfo() - if 'on_time' in device_info: - on_time = device_info.get('on_time', 0) - hours, minutes = divmod(on_time // 60, 60) - log_message(f" ⏱️ Betriebszeit: {hours}h {minutes}m") + # Erfolg! + state = "Eingeschaltet" if device_info.get("device_on", False) else "Ausgeschaltet" + log(f"✅ ERFOLG! Steckdose {ip} erfolgreich verbunden") + log(f" 📱 Name: {device_info.get('nickname', 'Unbekannt')}") + log(f" ⚡ Status: {state}") - successful_connections += 1 - found_ips.append(ip) - - # Optionales Ein-/Ausschalten zum Testen - if len(sys.argv) > 1 and sys.argv[1] == '--toggle': - if is_on: - log_message(f" 🔄 Schalte Steckdose {nickname} AUS...") - p110.turnOff() - log_message(f" ✅ Steckdose ausgeschaltet") + # Steckdose ein-/ausschalten wenn gewünscht + if "--toggle" in sys.argv: + if device_info.get("device_on", False): + log(" 🔄 Schalte Steckdose AUS...") + p100.turnOff() else: - log_message(f" 🔄 Schalte Steckdose {nickname} EIN...") - p110.turnOn() - log_message(f" ✅ Steckdose eingeschaltet") - - # Kurze Pause + log(" 🔄 Schalte Steckdose EIN...") + p100.turnOn() + time.sleep(1) - # Status erneut abrufen - device_info = p110.getDeviceInfo() - is_on = device_info.get('device_on', False) - log_message(f" ⚡ Neuer Status: {'Eingeschaltet' if is_on else 'Ausgeschaltet'}") + # Neuen Status abrufen + device_info = p100.getDeviceInfo() + state = "Eingeschaltet" if device_info.get("device_on", False) else "Ausgeschaltet" + log(f" ⚡ Neuer Status: {state}") - except Exception as e: - log_message(f" ❌ Verbindung zu Tapo-Steckdose {ip} fehlgeschlagen: {str(e)}", "ERROR") - - # Zusammenfassung - log_message("\n📊 Zusammenfassung:") - log_message(f" Getestete IPs: {len(TAPO_IPS)}") - log_message(f" Gefundene Tapo-Steckdosen: {successful_connections}") - - if successful_connections > 0: - log_message("✅ Tapo-Steckdosen erfolgreich gefunden und getestet!") - log_message(f"📝 Gefundene IPs: {found_ips}") - - # Ausgabe für Konfiguration - log_message("\n🔧 Konfiguration für settings.py:") - log_message(f""" + success = True + + # Konfiguration für settings.py ausgeben + log("\n✅ KONFIGURATION FÜR SETTINGS.PY:") + log(f""" # TP-Link Tapo Standard-Anmeldedaten -TAPO_USERNAME = "{TAPO_USERNAME}" -TAPO_PASSWORD = "{TAPO_PASSWORD}" - -# Automatische Steckdosen-Erkennung aktivieren -TAPO_AUTO_DISCOVERY = True +TAPO_USERNAME = "{username}" +TAPO_PASSWORD = "{password}" # Standard-Steckdosen-IPs -DEFAULT_TAPO_IPS = {found_ips} +DEFAULT_TAPO_IPS = ["{ip}"] """) - else: - log_message("❌ Keine Tapo-Steckdosen gefunden!", "ERROR") - log_message(" Bitte überprüfen Sie die IP-Adressen und Anmeldedaten") + + # Nur die erste erfolgreiche Steckdose testen + break + + except Exception as e: + log(f"❌ Fehler bei Steckdose {ip}: {str(e)}") + + if not success: + log("\n❌ Keine Tapo-Steckdose konnte verbunden werden!") + log("Prüfen Sie folgende mögliche Ursachen:") + log("1. Steckdosen sind nicht eingesteckt oder mit dem WLAN verbunden") + log("2. IP-Adressen sind falsch") + log("3. Anmeldedaten sind falsch (prüfen Sie das 'A' am Ende des Passworts)") + log("4. Netzwerkprobleme verhindern den Zugriff") + + return success if __name__ == "__main__": - print("\n====== TAPO P110 STECKDOSEN-TEST ======\n") - test_tapo_connection() - print("\n====== TEST ABGESCHLOSSEN ======\n") \ No newline at end of file + print("\n====== TAPO P110 SOFORT-TEST ======\n") + test_connection() + print("\n====== TEST BEENDET ======\n") \ No newline at end of file