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.
- Python 3.10+
- TP-Link-Kasa-Steckdose im gleichen Netzwerk (HS100/HS110/KP115 o. ä.)
- UDP-Port 9999 muss für die Discovery erreichbar sein
pip install -r requirements.txt
python qasaplugqt.pyrequirements.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.
- Discovery per
kasa.Discover.discover(), automatisch alle 60 Sekunden (Settings.DISCOVERY_INTERVAL) sowie über den Button "Refresh Now" - Geräte werden über
device_ididentifiziert, 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_MONITORINGaktiv 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.
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install ruff mypy pytest pytest-qt pytest-asyncio PyQt6-stubsDie Dev-Abhängigkeiten stehen auch in pyproject.toml unter
[dependency-groups] dev.
ruff check .
mypy qasaplugqt.pyBeides 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.
QT_QPA_PLATFORM=offscreen pytestDie 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.
MIT, siehe LICENSE.