"Refactor configuration settings and tests"

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

View File

@ -26,7 +26,7 @@ DATABASE_PATH = os.path.join(BASE_DIR, "database", "myp.db")
# ===== SMART PLUG KONFIGURATION ===== # ===== SMART PLUG KONFIGURATION =====
# TP-Link Tapo P110 Standardkonfiguration # TP-Link Tapo P110 Standardkonfiguration
TAPO_USERNAME = "till.tomczak@mercedes-benz.com" TAPO_USERNAME = "till.tomczak@mercedes-benz.com"
TAPO_PASSWORD = "744563017196" TAPO_PASSWORD = "744563017196A"
# Automatische Steckdosen-Erkennung aktivieren # Automatische Steckdosen-Erkennung aktivieren
TAPO_AUTO_DISCOVERY = True TAPO_AUTO_DISCOVERY = True

View File

@ -1 +1,175 @@
#!/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")

View File

@ -2,183 +2,131 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Sofort-Test für TP-Link Tapo P110-Steckdosen SOFORT-TEST für TP-Link Tapo P110-Steckdosen
Testet direkt die Verbindung zu allen konfigurierten Steckdosen Nutzt direkt PyP100 mit hardkodierten Anmeldedaten
""" """
import sys
import os import os
import subprocess import sys
import time import time
from datetime import datetime from datetime import datetime
# Anmeldedaten für Tapo-Steckdosen # TAPO Anmeldedaten direkt hardkodiert (wie in den funktionierenden Versionen)
TAPO_USERNAME = "till.tomczak@mercedes-benz.com" os.environ["TAPO_USERNAME"] = "till.tomczak@mercedes-benz.com"
TAPO_PASSWORD = "744563017196" os.environ["TAPO_PASSWORD"] = "744563017196A" # Das 'A' am Ende ist wichtig
# Standard-IPs für Tapo-Steckdosen # IPs der Steckdosen
# (falls nicht verfügbar, passen Sie diese an die tatsächlichen IPs in Ihrem Netzwerk an)
TAPO_IPS = [ 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.103",
"192.168.0.104", "192.168.0.104",
"192.168.0.105", "192.168.0.100",
"192.168.1.200", "192.168.0.101",
"192.168.1.201", "192.168.0.102"
"192.168.0.200",
"192.168.0.201",
] ]
def log_message(message, level="INFO"): def log(msg):
"""Logge eine Nachricht mit Zeitstempel""" """Protokolliert eine Nachricht mit Zeitstempel"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") timestamp = datetime.now().strftime("%H:%M:%S")
print(f"[{timestamp}] [{level}] {message}") print(f"[{timestamp}] {msg}")
def test_connection():
"""Teste Verbindung zu den Steckdosen"""
log("🔄 Teste PyP100-Import...")
def ping_address(ip_address, timeout=2):
"""Führt einen Ping-Test durch"""
try: try:
# Platform-spezifische Ping-Befehle from PyP100 import PyP100
import platform log("✅ PyP100-Modul erfolgreich importiert")
if platform.system().lower() == "windows": # Windows except ImportError:
cmd = ['ping', '-n', '1', '-w', str(timeout * 1000), ip_address] log("❌ PyP100-Modul nicht gefunden. Installiere es...")
else: # Unix/Linux/macOS try:
cmd = ['ping', '-c', '1', '-W', str(timeout), ip_address] import subprocess
subprocess.run([sys.executable, "-m", "pip", "install", "PyP100==0.0.12"], check=True)
result = subprocess.run( from PyP100 import PyP100
cmd, log("✅ PyP100-Modul installiert")
capture_output=True, except Exception as e:
text=True, log(f"❌ Fehler bei Installation: {str(e)}")
timeout=timeout + 1
)
return result.returncode == 0
except Exception:
return False return False
def test_tapo_connection(): # Anmeldedaten aus Umgebungsvariablen lesen
""" username = os.environ.get("TAPO_USERNAME")
Testet die Verbindung zu TP-Link Tapo P110-Steckdosen. password = os.environ.get("TAPO_PASSWORD")
"""
log_message("🔄 Überprüfe ob PyP100-Modul installiert ist...")
try: log(f"👤 Benutzername: {username}")
from PyP100 import PyP110 log(f"🔑 Passwort: {password}")
log_message("✅ PyP100-Modul erfolgreich importiert")
except ImportError:
log_message("❌ PyP100-Modul nicht installiert", "ERROR")
log_message(" Installiere jetzt mit: pip install PyP100==0.1.2")
try: # Teste jede IP
subprocess.run([sys.executable, "-m", "pip", "install", "PyP100==0.1.2"], check=True) success = False
log_message("✅ PyP100-Modul erfolgreich installiert")
# Erneut importieren
from PyP100 import PyP110
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_message("🔍 Starte Test für Tapo-Steckdosen...")
log_message(f"🔐 Anmeldedaten: {TAPO_USERNAME} / {TAPO_PASSWORD}")
successful_connections = 0
found_ips = []
for ip in TAPO_IPS: 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: try:
log_message(f" 🔄 Verbinde zu Tapo-Steckdose {ip}...") # Wichtig: Verwende PyP100 (nicht PyP110) wie in den funktionierenden Versionen
p110 = PyP110.P110(ip, TAPO_USERNAME, TAPO_PASSWORD) p100 = PyP100.P100(ip, username, password)
p110.handshake() # Authentifizierung
p110.login() # Login
# Geräteinformationen abrufen # Handshake und Login
device_info = p110.getDeviceInfo() log(" 🔄 Handshake...")
p100.handshake()
# Status abrufen log(" 🔄 Login...")
is_on = device_info.get('device_on', False) p100.login()
nickname = device_info.get('nickname', "Unbekannt")
log_message(f" ✅ Verbindung zu Tapo-Steckdose '{nickname}' ({ip}) erfolgreich") # Status abfragen
log_message(f" 📱 Gerätename: {nickname}") log(" 🔄 Status abfragen...")
log_message(f" ⚡ Status: {'Eingeschaltet' if is_on else 'Ausgeschaltet'}") device_info = p100.getDeviceInfo()
if 'on_time' in device_info: # Erfolg!
on_time = device_info.get('on_time', 0) state = "Eingeschaltet" if device_info.get("device_on", False) else "Ausgeschaltet"
hours, minutes = divmod(on_time // 60, 60) log(f"✅ ERFOLG! Steckdose {ip} erfolgreich verbunden")
log_message(f" ⏱️ Betriebszeit: {hours}h {minutes}m") log(f" 📱 Name: {device_info.get('nickname', 'Unbekannt')}")
log(f" ⚡ Status: {state}")
successful_connections += 1 # Steckdose ein-/ausschalten wenn gewünscht
found_ips.append(ip) if "--toggle" in sys.argv:
if device_info.get("device_on", False):
# Optionales Ein-/Ausschalten zum Testen log(" 🔄 Schalte Steckdose AUS...")
if len(sys.argv) > 1 and sys.argv[1] == '--toggle': p100.turnOff()
if is_on:
log_message(f" 🔄 Schalte Steckdose {nickname} AUS...")
p110.turnOff()
log_message(f" ✅ Steckdose ausgeschaltet")
else: else:
log_message(f" 🔄 Schalte Steckdose {nickname} EIN...") log(" 🔄 Schalte Steckdose EIN...")
p110.turnOn() p100.turnOn()
log_message(f" ✅ Steckdose eingeschaltet")
# Kurze Pause
time.sleep(1) time.sleep(1)
# Status erneut abrufen # Neuen Status abrufen
device_info = p110.getDeviceInfo() device_info = p100.getDeviceInfo()
is_on = device_info.get('device_on', False) state = "Eingeschaltet" if device_info.get("device_on", False) else "Ausgeschaltet"
log_message(f" ⚡ Neuer Status: {'Eingeschaltet' if is_on else 'Ausgeschaltet'}") log(f" ⚡ Neuer Status: {state}")
except Exception as e: success = True
log_message(f" ❌ Verbindung zu Tapo-Steckdose {ip} fehlgeschlagen: {str(e)}", "ERROR")
# Zusammenfassung # Konfiguration für settings.py ausgeben
log_message("\n📊 Zusammenfassung:") log("\n✅ KONFIGURATION FÜR SETTINGS.PY:")
log_message(f" Getestete IPs: {len(TAPO_IPS)}") log(f"""
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"""
# TP-Link Tapo Standard-Anmeldedaten # TP-Link Tapo Standard-Anmeldedaten
TAPO_USERNAME = "{TAPO_USERNAME}" TAPO_USERNAME = "{username}"
TAPO_PASSWORD = "{TAPO_PASSWORD}" TAPO_PASSWORD = "{password}"
# Automatische Steckdosen-Erkennung aktivieren
TAPO_AUTO_DISCOVERY = True
# Standard-Steckdosen-IPs # Standard-Steckdosen-IPs
DEFAULT_TAPO_IPS = {found_ips} DEFAULT_TAPO_IPS = ["{ip}"]
""") """)
else:
log_message("❌ Keine Tapo-Steckdosen gefunden!", "ERROR") # Nur die erste erfolgreiche Steckdose testen
log_message(" Bitte überprüfen Sie die IP-Adressen und Anmeldedaten") 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__": if __name__ == "__main__":
print("\n====== TAPO P110 STECKDOSEN-TEST ======\n") print("\n====== TAPO P110 SOFORT-TEST ======\n")
test_tapo_connection() test_connection()
print("\n====== TEST ABGESCHLOSSEN ======\n") print("\n====== TEST BEENDET ======\n")