"Refactor configuration settings and tests"

This commit is contained in:
2025-05-29 22:23:34 +02:00
parent b3a1c66f8b
commit 2a1489b438
3 changed files with 265 additions and 143 deletions

View File

@@ -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")
print("\n====== TAPO P110 SOFORT-TEST ======\n")
test_connection()
print("\n====== TEST BEENDET ======\n")