#!/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()