Artikel in Arbeit – öffentliche Vorabversion; Fehler sind sicherlich noch enthalten.
Ein Freund hat zu Weihnachten eine TP-Link HS110 „Smart-Steckdose“ bekommen und ist davon begeistert. Ich habe vor Jahren bereits eine HS100 ausprobiert, aber meine Begeisterung für diese ganze Gerätegruppe unterschiedlicher Hersteller ist mittlerweile etwas abgeklungen. Die Geräte sind durchaus praktisch sind, sofern man etwas Vorsicht walten lässt, und man weiß, was das Gerät tut – ein Erfahrungsbericht.
WLAN-Steckdosen
Als ich mich für das Thema Smart Home zu interessieren begonnen habe, waren WLAN-Steckdosen gerade das Nonplusultra. In diversen Webshops habe ich danach gesucht und hatte für das kleinere Budget am Ende die Wahl zwischen Dosen mit und ohne „Energieverbrauchs“messung. In die engere Auswahl kamen TP-Link mit den Modellen HS100 und HS110 und Edimax mit SP-1101W und SP-2101W.
Meine erste WLAN-Steckdose – TP-Link HS100
Ich habe mich dann, wie bereits erwähnt, für die HS100 von TP-Link entschieden. Dieses Modell wird mittels der App „Kasa“ angesteuert, die relativ viel App-Speicher benötigte. Für mein damaliges Smartphone, das unter permanentem Speichermangel litt, war diese Lösung auf Dauer nichts.
Nur über die App steuern?!
Zum Glück gibt es OpenSource-Lösungen wie FHEM und das FHEM-Forum, an dem eine Menge kundige Leute mitarbeiten. Relativ schnell war ein Skript gefunden, das ein anderer Forenposter dort veröffentlicht hat. Im Zuge des Threads ergab sich, dass viele Geräte der Marke „Medion“, „TP-Link“, „Maginon“ und „Silvercrest“ im Grunde einer mit einer recht ähnlichen Sequenz angesteuert werden. Ich werde diese Erkenntnisse zusammenfassen und später näher erläutern.
Der nächste Schritt – WLAN+Funksteckdosen (433 MHz) – MD 16173
Aus Kostengründen bin ich dann, als eine Erweiterung anstand, zunächst auf ein Set aus WLAN-Steckdose und Funksteckdosen gestoßen. Der Artikel mit der Bezeichnung Medion MD 16173 besteht einerseits aus einer „intelligenten“ Dose und andererseits drei Funksteckdosen mit einer Fernbedienung, wie wir sie gemeinhin als „Baumarkt”-Funksteckdosen kennen. Angesteuert werden die Dosen über die App „icomen“ respektive „icomen x2“.
Andere Hersteller – und kompatible Funksteckdosen
Ich habe später auf Amazon äußerlich baugleiche Modelle sowohl der Wlan-Steckdose („Aplic“, „CSL“) als auch der Funksteckdosen („hama“) gefunden. Zusätzlich gibt es von hama und CSL kompatible Außensteckdosen.
Die Funksteckdosen sind als Zwischenstecker ausgeführt. Sie lassen sich mit den Fernbedienungen der jeweils anderen Scheinhersteller schalten.
WLAN-Funksteckdosen-Gateways
Über die zuvor genannten Apps icomen und icomen x2 können sowohl die WLAN-Steckdosen geschaltet werden, wozu auch ein Zeitschalt und Zufallszeit-Schaltprogramm wie bei der TP-Link HS100/HS110 gehört, als auch die Funksteckdosen, die zuvor an die jeweilige Steckdose als Gateway angelernt werden kann. Man kann sie also fortan beinahe wie über die Fernbediendung ansteuern. Eine Steckdose reagiert dabei auf zumindest bis zu drei verschiedene angelernte Codes. Der Nachteil dieser Funksteckdosen ist, dass man im Gegensatz zur Haupteinheit den Schaltzustand nicht überprüfen kann.
Recherchen
Pairing mittels App und Cloud
In den Steckdosen ist ein Modul „Hi-flying HF-LPB100“ verbaut. Die Steckdose verfügt über ein Webinterface mit dessen Hilfe sie im Grunde vollständig konfiguriert werden könnte. Im Regelfall wird man die Dose über die App einrichten. Dazu drückt muss man das Smartphone ins Ziel-WLAN-Netz einbuchen, worauf man den Ein-/Ausschalter der Dose drückt, bis seine LED schnell rot blinkt. Nun fügt dann das Gerät in der App hinzu. In der Folge muss man das WLAN über die App einrichten, während man sich in unmittelbarer Nähe des Gerätes befindet. Wenn die Dose über DHCP eine IP-Adresse und ein Gateway erhält, klappt das Pairing. Stellt man die Internetverbindung für unbekannte Geräte aber ab, schlägt auch das Pairing fehl. Wir haben es also an sich mit einem Cloud-Service zu tun.
Einrichten ohne Cloud
Möchte man auf die App verzichten, gibt es einen Trick: Die Steckdose ist im Werkszustand und im Pairing-Mode darauf ausgelegt, als Client der ESSID „LSD“ zu fungieren. Konfiguriert man einen offenen Access Point/WLAN-Router mit dieser Kennung, erhält die Steckdose eine IP-Adresse aus dessen Netz und kann über das Web-Interface des HF-LBP100 konfiguriert werden.
Die Funktionsweise kann je nach Hersteller abweichend sein. Mit einem WLAN-Sniffer kann man allerdings die unverschlüsselten Daten, die die Dose anfordert, sichbar machen.
Konfiguriert man das WLAN nun manuell, kann man die Dose über ihre IP mittels UDP-Befehlssequenzen ansprechen.
Befehlssequenzen
Das FHEM-Forum hat alle Informationen bereits zusammengetragen. Ein PHP-Skript des dortigen Nutzers „SebiM“ mit kleinen Modifikationen zum Anschalten von Funksteckdosen kann zur Ansteuerung dienen – hier ist sein rfswitch.php:
#!/usr/bin/php
<?php
// 2016 Sebi, public domain
// Insert your WiFi plug data here // Daten der eigenen WiFi-Funksteckdose hier eintragen
$ip = $argv[2];
$mac = getMacFromArp($ip);
if ($argc==4) {
$code = $argv[3]; // Company code + device code + auth code
} else {
$code=’C1117150′;
}
// Comment out the following line for WiFi plug switching instead of RF slave plug switching
// Folgende Zeile zum Schalten der WiFi-Dose selbst anstatt einer RF-Slave-Dose auskommentieren
if ($argc==5){
$rfslave = $argv[4];
}
function getMacFromArp($IP) {
$REACHABLE=shell_exec(‚ping -W1 -c1 ‚.$IP);
$MAC=shell_exec(‚echo -n $( egrep „‚.$IP.'“ /proc/net/arp | egrep -oe \'([0-9a-f]{2}:*){6}\‘ | sed \’s/\://g\‘ | tr [:lower:] [:upper:])
‚);
return „$MAC“;
}
function encodePacket($packet) {
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, “, MCRYPT_MODE_CBC, “);
$key = ‚0123456789abcdef‘;
mcrypt_generic_init($td, $key, $key);
$result = mcrypt_generic($td, $packet);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $result;
}
$msg = hex2bin(„0140{$mac}10“);
if (isset($rfslave)) {
if ($argv[1] == ‚on‘) {
$value = ’60‘;
} else if ($argv[1] == ‚off‘) {
$value = ’70‘;
} else {
exit(2);
}
$msg .= encodePacket(hex2bin(„00ffff${code}08${rfslave}${value}04040404“));
} else {
if ($argv[1] == ‚on‘) {
$value = ‚ff‘;
} else if ($argv[1] == ‚off‘) {
$value = ’00‘;
} else {
exit(2);
}
$msg .= encodePacket(hex2bin(„00ffff${code}010000${value}ff04040404“));
}
echo ‚UDP packet: ‚ . bin2hex($msg) . „\n“;
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
for ($i = 0; $i < 4; $i++) {
socket_sendto($sock, $msg, strlen($msg), 0, $ip, 8530);
usleep(50 * 1000); // 50 ms
}
socket_close($sock);
Zur Funktionsweise des Skripts
Das Skript ermittelt zunächst anhand der übergebenen Parameter die MAC-Adresse der Steckdose aus deren zuwiesener IP-Adresse. Anschließend wird eine Hexdezimalzahl der Länge 8 Byte (64 Bit) definiert, die sich von Gerät zu Gerät unterscheiden kann. Sie besteht aus dem Herstellercode, dem Gerätecode und einem Authcode. Innerhalb einer Geräteserie ist dieser Code jedenfalls ident und manche Hersteller verwenden offenbar denselben Code, der daher im Script als Fallback eingetragen ist: C1117150 (CX-Herstellercode, YY-Gerätecode; ZZZZ-Authcode. Der FHEM-User „enterpriseII“ hat dies gepostet: https://forum.fhem.de/index.php/topic,38112.msg501942.html#msg501942
Ein weiterer, optionaler Parameter enthält einen sechs Byte langen Code, der eine Funksteckdose, die zuvor angelernt worden ist, anspricht.
Das Skript generiert nun ein Paket, das anschließend über einen UDP-Socket als Unicast versendet wird. Seine Fracht enthält einen Präfix (0140), die Ziel-MAC-Adresse, einen Postfix (10) enthält, vermehrt um eine mit AES128 verschlüsselte Binärcodesequenz mit dem trivialen Schlüssel 0123456789abcdef
, die aus dem Präfix „00ffff, dem Gerätecode (C111750), der Zeichenfolge 08, dem angelernten Schaltcode der Funksteckdose, dem Schaltwert (70 für aus, 60 für ein und dem Postfix 4 mal 04 besteht. In Kenntnis dieser Details kann man es gut nachprogrammieren. Im simpelsten Fall kann ein Bash-Skript, das netcat (nc) aufruft diese Funktion erfüllen, solange man den 128 Bit Rijandel Algorithmus zur Verfügung hat.
Anlernen über die App, Auslesen der Schaltcodes aus der Cloud
Hat man die Funksteckdose über die App angelernt, kann man den Code mit einem weiteren Skript von SebiM vom Cloudserver abrufen. Man erhält dann einen JSON-Datensatz mit allen Dosen und deren zugehörigen Funksteckdosen.
php rfswitch.php {on|off} [IPADRESSE DER DOSE] [HERSTELLER-CODE, GERÄTECODE, AUTHCODE - Default :C1117150] [6 BYTE HEXADEZIMALZAHLEN]
- Zum Ansteuern der Funksteckdosen
php rfswitch.php {on|off} [IPADRESSE DER DOSE] [HERSTELLER-CODE, GERÄTECODE, AUTHCODE - Default :C1117150] [6 BYTE HEXADEZIMALZAHLEN]
Sicherheitsaspekte
Nutzlose Verschlüsselung
Man sollte sich dessen bewusst sein, dass die Schaltsequenzen, die gegen den String „0123456789abcdef“ verschlüsselt sind, trotz AES128/Rijandel ausgelesen werden können. Damit kann ein Angreifer, der Zugriff auf die Broadcastdomain erlangt grundsätzlich Euer SmartHome beeinflussen.
Seit der Entdeckung der WPA2-KRACK ist das kein abwegiges Szenario mehr, denn die WLAN-Schaltdosen verfügen über das HF-LBP100-Modul zusätzlich über einen Repeater-Mode. Zwar dürfte dieser simple Repeater-Modus kein WDS beherrschen und somit höchstwahrscheinlich nicht anfällig für Key-Replay-Attacken sein, dennoch ist die Firmware V1.0.04b nicht auf dem letzten Stand. Wer nun die glorreiche Idee haben sollte, die Firmware von der Herstellerseite des Moduls zu verwenden, sei gewarnt: Wer das HF-LPB100 updated, ruiniert die Funksteckdosen-Funktionalität auf seinem Gerät unwiderbringlich. Der jeweilige Hersteller hat die Firmware an die Erfordernisse seiner Cloud und seiner Relaisanordnung angepasst.
„ET nach Hause telefonieren“ – CloudApps
Wer die Cloud-App verwendet, sollte sich darüber im klaren sein, dass sämtliche Schaltzeiten nebst Username und Passwort auf einem chinesischen Cloud-Server landen. Freilich fehlt jeglicher Hinweis darauf, der im Sinne der DSGVO wäre. Auch das manuelle Schalten würde, damit die Schaltzustände mit der App synchron bleiben, einen derartigen Home-Call auslösen, wenn die WLAN-Steckdose über das Internet verbunden ist.
Wer das nicht möchte, dem sei angeraten, dies über die Firewall zu unterbinden. Freilich ist damit die App nutzlos. Alternativen zu ihr, samt fremden Cloudserver bestehen in selbstgehosteten Lösungen wie FHEM.
Ansteuerung via Cron-Script
Die beiden zuvor genannten Schaltbefehle lassen sich freilich auch ohne FHEM via Cron-Job anwenden. Der Linux-Server dienst somit als Zeitschaltuhr, die sich automatisch der Zeitumstellung anpasst.
Praktisch wird es, wenn dies etwa nach einem Backup die USB-Platte vom Netz trennt oder der SAT-IP-Server über Nacht abgeschaltet werden soll. Anwendungsmöglichkeiten gibt es viele.
Vorsicht…
… ist geboten, da es sich um Geräte handelt, die mit Netzstrom arbeiten. Achtet jedenfalls auf die maximal verträgliche Spitzen- und Dauerlast des jeweiligen Gerätes und beachtet die Sicherheitshinweise in der Bedienungsanleitung.
Noch ein Hinweis: wenn Du mehrere dieser WLAN-RF-Gateways verwendest, ist der RF-Code, wenn Du ihn über ein Skript steuerst, auf allen Dosen in Reichweite, die denselben Code angelernt haben, nutzbar. In der App ist eine Slave-Steckdose stets an einen einzigen Master gebunden. Du kannst die Befehle, die „fremde“ Slaves betreffen, aber auch in einer Schleife an all Deine Dosen senden. Das wird dann praktisch sein, wenn Du eine Funksteckdose nicht immer an derselben Wandsteckdose benützt, oder, wenn Du eine Dose im Empfangsbereich zweier Gateways hättest (1.+3. Stock Gateway, 2. Stock RF-Slave). Bei allen Dosen, die ich bisher getestet habe, besteht durchaus ein Reichweitenproblem mit der in ihnen verbauten RF-Feder-Antenne für 433 MHz. Anders als bei WLAN mit MiMo und mehreren Streams machen sich hier Abdeckungsprobleme innerhalb einer Wohnung stark bemerkbar.
Kennt man die Problem und Möglichkeiten, steht dem Spaß mit der Heimautomatisierung nicht mehr viel im Wege.
Feedback und Erfahrungen sind herzlich willkommen!
Ein herzliches Dankeschön an die Mitwirkenden im FHEM-Forum, ohne das dieser Beitrag nicht möglich gewesen wäre! Der nächste Artikel wird sich vielleicht FHEM widmen.