Lidl WI-FI Steckdose SWS-A1 SilverCrest IAN 103043

Begonnen von ext23, 14 Juni 2015, 09:22:22

Vorheriges Thema - Nächstes Thema

biopio

#270
Hallo @epek,

zufällig wollte ich Dir auch schreiben, weil ich noch etwas getestet habe, auch mit Linux und da gibt es tatsächlich Probleme.

Ich habe nur die 'original' Lidl SWS-A1-Dosen.

1. Nutzung unter Windows (Win 10)
Funktioniert bei mir tadellos. Ich habe nochmal eine Dose komplett resetted ('blaues Blinken') und sowohl zu Hause als auch in einem anderen WLAN-Netz (im Büro) mit dem Modul angemeldet bekommen.
Schade, dass es bei Dir mit Windows nicht klappt (mal Timeout mit `ws.timeout = ...` auf 30 Sekunden gesetzt? Wird Python evt. durch die Windows-Firewall blockiert?), ich werde noch mal schauen, ob das evt. mit der Python-Version zusammenhängt. Die habe ich gerade nicht parat. Und ich werde es auch mit anderen Win-10-Rechnern mal testen.

2. Nutzung mit Linux (Ubuntu 20.??)
Hier habe ich tatsächlich auch Probleme.
- Wenn ich in der Methode `create_socket()`die Zeile 743: `s.bind((my_ip, udp_port))` mit einem # auskommentiere, kann ich auch unter Linux eine Dose reproduzierbar im WLAN-Netz verbinden (mit `send_password(passwort)`)!
- Mit der Änderung empfängt der Rechner aber keine Rückmeldung, d.h. Kommandos werden zwar abgeschickt, aber das Warten auf Bestätigung führt immer zum Timeout.
- Aber: Ich kann die Dosen dann auch unter Linux schalten! D.h. wenn Du die MAC und IP Deiner Dosen kennst, kannst Du mal probieren, mit `switch((mac, ip), 'on')` (oder ..., 'off')) Deine Dosen zu schalten. Das funktioniert bei mir! Das Auslesen von Daten leider nicht (timeout).

Da gibt es zwischen Windows und Linux offensichtlich einige Unterschiede im Handling von Sockets in Python. Ich werde mich noch ein paar Stunden damit beschäftigen, ob ich es 'cross platform' zum Laufen bekomme.

Wie ich verbinde: Ich tippe das Kommando (`send_password`) schon ein, ohne Enter zu drücken, betätige die Taste an der Dose, bis sie schnell rot (oder blau) blinkt, lasse los, vergewissere mich, dass die Dose schnell rot blinkt und drücke erst dann Enter und starte damit die Übertragung des Passworts.

Wenn Du "php-Skript von @SebiM" schreibst, meinst Du wahrscheinlich das Perl-Modul?

epek

#271
Kurzfassung: Tip 2 klappt.

Die Ursache für das Nichtfunktionieren von bind ist Deine Definition von my_ip, die im Ergebnis hostname -s liefert.

Ich habe in Zeile 281 eingefügt:
import netifaces

Dann habe ich my_ip wie folgt definiert:
my_ip = netifaces.ifaddresses('wlan0')[netifaces.AF_INET][0]['addr']

Und die Ex-Zeile 743, nun bei mir 745 mit dem Bind wieder eingefügt.
-> Klappt

find_sockets mag aber immer noch nicht.

biopio

Aah, danke für den Hinweis zu `my_ip`.

Kannst ja mal probieren, ob der Austausch von Zeile 240:
my_ip = socket.gethostname()
zu:
my_ip = socket.gethostbyname(socket.gethostname())

das Gleiche bewirkt wie Dein netifaces-Ansatz.

epek

#273
Bei meiner /etc/hosts bewirkt das die Ausgabe von 127.0.1.1 und wirft für ws.find_sockets einen OSError No. 22 Invalid argument.
Ich würde den netifaces-Ansatz bevorzugen, da der stabil auf ein Interface bezogen ist. Eventuell kann man den Interface-Name über ws.iface='Devicename' in der init.py (oder wie immer Du das Skript über das Du wifisockets.py instanzierst) aufnehmen und die von mir vorgeschlagene Zeile hinsichtlich des jetzt noch hardgecodeten Parameters 'wlan0' als Variable verwenden.

Am Grund, warum find_sockets noch nicht funktioniert, recherchiere ich noch.
find_sockets(IP-Adresse) oder find_sockets(Wildcard-MAC) liefert diese eine Dose zurück, obwohl in der BC-Domain noch fünf weitere zu finden wären.

biopio

Ich habe auf einen "Trick" zurückgegriffen, um die "echte" IP des Rechners, auf dem das Modul läuft, herauszufinden. Interessanterweise läuft es bei mir auf meinen Windows 10-Rechnern auch mit dem Rechnernamen als IP.
Jetzt läuft es aber auch auf meinem Ubuntu mit allen Funktionen, die ich getestet habe. Es kommt z.T. noch die Meldung 'Timeout', aber trotzdem werden die Daten auch von den Dosen gelesen. `find_sockets()` funktioniert auch. Immer daran denken, dass UDP-Kommunikation fehleranfällig ist. Verlängern der Timeout-Zeit kann helfen, alle Dosen zu finden.

Ich lade den Code morgen auf Github hoch.