Skip to content

vaultecki/qasaplug

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QasaPlug

Ein PyQt6-Programm zum Steuern von TP-Link-Kasa-Steckdosen im lokalen Netzwerk. Sucht Geräte per Discovery, zeigt sie in einer Liste an und schaltet sie per Klick.

Kleines Ein-Datei-Hobbyprojekt (qasaplugqt.py, ~350 Zeilen). Keine gepflegte Bibliothek, kein Produkt, kein Anspruch auf Vollständigkeit.

Voraussetzungen

  • Python 3.10+
  • TP-Link-Kasa-Steckdose im gleichen Netzwerk (HS100/HS110/KP115 o. ä.)
  • UDP-Port 9999 muss für die Discovery erreichbar sein

Installation

pip install -r requirements.txt
python qasaplugqt.py

requirements.txt verlangt python-kasa>=0.10.0. Der Code nutzt die aktuelle python-kasa-API (device_type, modules[Module.Energy]), geprüft gegen Version 0.10.2. Das ist nicht mit echter Hardware getestet, nur gegen die installierte kasa-Bibliothek und mit gemockten Geräten in den Tests (siehe unten) — ob es an echten Steckdosen tatsächlich funktioniert, ist damit nicht abgedeckt.

Funktionsumfang (laut Code)

  • Discovery per kasa.Discover.discover(), automatisch alle 60 Sekunden (Settings.DISCOVERY_INTERVAL) sowie über den Button "Refresh Now"
  • Geräte werden über device_id identifiziert, nicht über ihre IP-Adresse — ändert sich die IP eines Geräts (z. B. DHCP), wird die bestehende Zeile aktualisiert statt eine zweite "Geister"-Zeile anzulegen
  • Fehler beim Aktualisieren eines einzelnen Geräts (Timeout, nicht erreichbar, Auth-Fehler) brechen nicht den ganzen Scan ab — nur dieses eine Gerät wird als offline markiert bzw. übersprungen, die anderen werden trotzdem verarbeitet
  • Geräteliste mit Name, IP-Adresse, Ein/Aus-Button und Status-Punkt (grün = an, grau = aus, rot = offline)
  • Leistungsanzeige für Geräte mit Energy-Modul (z. B. HS110, KP115), sofern Settings.ENABLE_POWER_MONITORING aktiv ist
  • Optimistisches UI-Update beim Umschalten: Button-Zustand ändert sich sofort und wird bei Fehler zurückgesetzt
  • Fehler erscheinen als QMessageBox-Dialog

Settings.AUTO_RECONNECT existiert als Flag, wird im Code aber nirgends gelesen — es hat aktuell keine Wirkung.

Offline-Geräte werden nicht aus der Liste entfernt, sondern bleiben grau markiert stehen (auch wenn sie das Netzwerk endgültig verlassen haben) — das ist eine bewusste Design-Entscheidung, kein Bug. Zugangsdaten für Geräte, die lokale Authentifizierung verlangen (neuere Kasa/Tapo-Firmware), werden nicht unterstützt; Discover.discover() wird ohne credentials aufgerufen.

Es gibt keine Konfigurationsdatei; Einstellungen ändert man direkt in der Settings-Klasse im Quellcode.

Entwicklung

Setup

python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install ruff mypy pytest pytest-qt pytest-asyncio PyQt6-stubs

Die Dev-Abhängigkeiten stehen auch in pyproject.toml unter [dependency-groups] dev.

Linten und Typprüfung

ruff check .
mypy qasaplugqt.py

Beides läuft aktuell fehlerfrei durch. Wichtig dabei: qasaplugqt.py hat keine Typannotationen, mypy prüft deshalb faktisch wenig — die meisten Werte werden implizit als Any behandelt.

Tests

QT_QPA_PLATFORM=offscreen pytest

Die Tests in tests/ decken die UI-Logik ab (Widget-Aufbau, Statusanzeige, Verarbeitung der Discovery-Ergebnisse, Toggle inklusive Fehlerfall) — mit einem FakeDevice-Double statt echter Kasa-Hardware oder einer echten python-kasa-Verbindung. Sie belegen also, dass der Code intern konsistent ist, nicht, dass er mit echten Geräten funktioniert.

Lizenz

MIT, siehe LICENSE.

About

Switching python-kasa SmartPlugs with PyQt5 GUI

Resources

License

Stars

0 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors

Languages