Projektarbeit-MYP/backend/app/test_tapo_sofort.py

207 lines
7.3 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
SOFORT-TEST für TP-Link Tapo P110-Steckdosen
Testet die Verbindung mit echten Anmeldedaten und findet alle verfügbaren Steckdosen.
"""
import sys
import time
import subprocess
from datetime import datetime
# Tapo-Anmeldedaten (HARDKODIERT)
TAPO_USERNAME = "till.tomczak@mercedes-benz.com"
TAPO_PASSWORD = "744563017196"
# IP-Bereiche zum Testen
IP_RANGES_TO_SCAN = [
"192.168.1.{}",
"192.168.0.{}",
"10.0.0.{}",
"172.16.0.{}"
]
def log_message(message, level="INFO"):
"""Logge eine Nachricht mit Zeitstempel"""
timestamp = datetime.now().strftime("%H:%M:%S")
print(f"[{timestamp}] [{level}] {message}")
def test_ping(ip_address):
"""Teste ob eine IP erreichbar ist"""
try:
result = subprocess.run(
['ping', '-n', '1', '-w', '1000', ip_address],
capture_output=True,
text=True,
timeout=2
)
return result.returncode == 0
except:
return False
def test_tapo_connection(ip_address):
"""Teste Tapo-Verbindung zu einer IP"""
try:
from PyP100 import PyP110
log_message(f"Teste Tapo-Verbindung zu {ip_address}...")
p110 = PyP110.P110(ip_address, TAPO_USERNAME, TAPO_PASSWORD)
p110.handshake() # Authentifizierung
p110.login() # Login
# Geräteinformationen abrufen
device_info = p110.getDeviceInfo()
log_message(f"✅ ERFOLG: {ip_address} ist eine Tapo-Steckdose!")
log_message(f" 📛 Name: {device_info.get('nickname', 'Unbekannt')}")
log_message(f" ⚡ Status: {'EIN' if device_info.get('device_on', False) else 'AUS'}")
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")
return True, device_info
except Exception as e:
error_msg = str(e).lower()
if "login" in error_msg or "credentials" in error_msg:
log_message(f"{ip_address}: Falsche Anmeldedaten")
elif "timeout" in error_msg:
log_message(f"{ip_address}: Timeout")
elif "connect" in error_msg or "unreachable" in error_msg:
log_message(f"{ip_address}: Nicht erreichbar")
else:
log_message(f"{ip_address}: {str(e)}")
return False, None
def main():
"""Hauptfunktion: Scanne Netzwerk nach Tapo-Steckdosen"""
log_message("🚀 SOFORT-TEST: TP-Link Tapo P110-Steckdosen")
log_message(f"👤 Benutzername: {TAPO_USERNAME}")
log_message(f"🔐 Passwort: {'*' * len(TAPO_PASSWORD)}")
print()
# PyP100 Import testen
try:
from PyP100 import PyP110
log_message("✅ PyP100-Modul erfolgreich importiert")
except ImportError:
log_message("❌ FEHLER: PyP100-Modul nicht gefunden!", "ERROR")
log_message(" Installiere mit: pip install PyP100", "ERROR")
return
print()
log_message("🔍 Scanne Netzwerk nach erreichbaren Geräten...")
# Erst bekannte IP-Adressen testen
known_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"
]
found_steckdosen = []
for ip in known_ips:
if test_ping(ip):
log_message(f"🌐 {ip} ist erreichbar - teste Tapo...")
success, device_info = test_tapo_connection(ip)
if success:
found_steckdosen.append((ip, device_info))
else:
log_message(f"{ip} nicht erreichbar")
# Wenn keine gefunden, erweiterte Suche
if not found_steckdosen:
log_message("🔍 Keine Steckdosen in Standard-IPs gefunden - erweitere Suche...")
for ip_range in IP_RANGES_TO_SCAN:
log_message(f"Scanne Bereich {ip_range.format('1-20')}...")
for i in range(1, 21): # Erste 20 IPs pro Bereich
ip = ip_range.format(i)
if test_ping(ip):
log_message(f"🌐 {ip} erreichbar - teste Tapo...")
success, device_info = test_tapo_connection(ip)
if success:
found_steckdosen.append((ip, device_info))
# Ergebnisse
print()
log_message("📊 ERGEBNISSE:")
if found_steckdosen:
log_message(f"🎉 {len(found_steckdosen)} Tapo-Steckdose(n) gefunden!")
print()
for i, (ip, device_info) in enumerate(found_steckdosen, 1):
log_message(f"Steckdose #{i}:")
log_message(f" IP: {ip}")
log_message(f" Name: {device_info.get('nickname', 'Unbekannt')}")
log_message(f" Status: {'EIN' if device_info.get('device_on', False) else 'AUS'}")
log_message(f" Modell: {device_info.get('model', 'Unbekannt')}")
print()
# Steckdosen-Test durchführen
log_message("🧪 Teste Ein/Aus-Schaltung der ersten Steckdose...")
test_ip, _ = found_steckdosen[0]
try:
from PyP100 import PyP110
p110 = PyP110.P110(test_ip, TAPO_USERNAME, TAPO_PASSWORD)
p110.handshake()
p110.login()
# Aktuelle Status abrufen
device_info = p110.getDeviceInfo()
current_state = device_info.get('device_on', False)
log_message(f"Aktueller Status: {'EIN' if current_state else 'AUS'}")
# Gegenteil schalten
if current_state:
log_message("Schalte AUS...")
p110.turnOff()
time.sleep(2)
log_message("✅ Erfolgreich ausgeschaltet!")
log_message("Schalte wieder EIN...")
p110.turnOn()
time.sleep(2)
log_message("✅ Erfolgreich eingeschaltet!")
else:
log_message("Schalte EIN...")
p110.turnOn()
time.sleep(2)
log_message("✅ Erfolgreich eingeschaltet!")
log_message("Schalte wieder AUS...")
p110.turnOff()
time.sleep(2)
log_message("✅ Erfolgreich ausgeschaltet!")
log_message("🎉 STECKDOSEN-STEUERUNG FUNKTIONIERT PERFEKT!")
except Exception as e:
log_message(f"❌ Fehler beim Testen der Schaltung: {str(e)}", "ERROR")
else:
log_message("❌ KEINE Tapo-Steckdosen gefunden!", "ERROR")
log_message("Mögliche Ursachen:", "ERROR")
log_message("1. Steckdosen sind in einem anderen IP-Bereich", "ERROR")
log_message("2. Anmeldedaten sind falsch", "ERROR")
log_message("3. Netzwerkprobleme", "ERROR")
log_message("4. Steckdosen sind nicht im Netzwerk", "ERROR")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
log_message("Test abgebrochen durch Benutzer", "INFO")
except Exception as e:
log_message(f"Unerwarteter Fehler: {str(e)}", "ERROR")
import traceback
traceback.print_exc()