Komplette Anleitung für das Verbinden eines Amazon Dash Button mit einer TP Link HS 100 WLAN – Steckdose
In diesem Artikel möchte ich zeigen, wie du mit einem Amazon Dash Button als Taster und einem Raspberry Pi eine TP-Link HS 100 Funksteckdose steuern kannst. Dazu zeige ich, welche Artikel du brauchst, welche Software du auf dem Raspberry Pi installieren musst und wie am Ende eine Kommunikation hergestellt wird.
Inhalt
Etwas Allgemeines:
Wie kann der Dash Button dazu genutzt werden, um die Funksteckdose zu schalten? Exemplarisch habe ich für diesen Blogeintrag eine TP-Link HS 100 Steckdose genutzt.
Der Amazon Dash Button ist ein WLAN fähiger Taster. Er verbindet sich mit deinem WLAN und würde eigentlich ein von dir vorgesehenes Produkt bestellen. Ausschließlich nach dem Tastendruck stellt der Button eine WLAN-Verbindung her, sonst ist der Button außer Betrieb und somit wird kein Strom verbraucht. Um das Signal des Button aufzufangen überwacht ein Raspberry Pi permanent den kompletten WLAN Datenverkehr und löst bei entsprechendem Ereignis eine beliebige Aktion aus. Diese Aktion kann dann das Schalten einer Funksteckdose sein. Andere Szenerien, wie eine Türklingel, Garagentoröffner, Arbeitszeiterfassung oder ähnliches sind ebenso denkbar.
Artikelliste:
Was brauchen wir für den Aufbau?
- Amazon Dash Button als Taster (ca. 5€, an Aktionstagen 2,99€)
- Raspberry Pi Zero W Set für die Netzwerküberwachung (ca. 25€ im Set)
- TP-Link HS 100 als Funksteckdose (ca. 30€)
mögliche Wege den Dash Button an den Raspberry Pi zu koppeln:
Ich möchte kurz die Möglichen Wege skizzieren, die es gibt, um den Dash Button mit der Funksteckdose zu koppeln:
Möglichkeit 1: DNS-Redirect
Der Dash Button baut bei jedem Tastendruck eine Verbindung zu der Webseite parker-gw-eu.amazon.com auf. Den Request könntest du lokal abfangen und durch eine DNS-Umleitung auf ein lokales System führen. Dieses lokale System führt dann die entsprechende Aktionen aus.
Möglichkeit 2: Ping-Test
Der Dash Button bekommt am Router eine feste IP vergeben. Auf dem Raspberry Pi lasst man ein Python Script laufen, welches z.B. jede Sekunde diese IP des Buttons via ping zu erreichen versucht und je nach Rückgabe, bzw. ob der Button antwortet oder nicht, lässt man ein Script eine Aktion ausführen.
Möglichkeit 3: ARP-Sniff
Du installierst auf deinem Raspberry Pi eine Python-Software ( Scapy ) welches den WLAN-Netzwerkverkehr auf dem Raspberry Pi überwacht. Du startest ein Script, in dem du diese Überwachung aktiviert. Als Überwachungsparameter gibst du die MAC-Adresse deines Dash Buttons an. Wenn dann der Dash Button ein sogenannten ARP-Request macht, stellt das der Raspberry Pi fest und du weißt somit, dass der Button gedrückt worden ist. In deinem Script reagierst du darauf, in dem du z.B. deine Steckdose schaltest.
Möglichkeit 4: DCHP-Sniff
Ist identisch zur Möglichkeit 3. Jedoch wird hier nicht geprüft, ob ein ARP-Request durchgeführt wird, sondern ob ein DHCP-Request kommt. D.h. wenn der Dash Button sich vom Router, bzw. dem DHCP Server, eine IP holt, registriert der Raspberry Pi die Anfrage und das überwachende Script löst das Schaltsignal für die WLAN-Steckdose aus. Ich habe für mich für die Implementierung dieser Variante entschieden, da der Raspberry Pi im Vortest nicht jeden ARP-Request aufgezeichnet hatte. Im Folgenden gehe ich auf die Implementierung ein.
Möglichkeit 5: Dash AWS IoT Button
Amazon bietet seit neustem auch einen AWS IoT Button an ( Amazon IoT Button 25€ ). Der Button sieht aus, wie der normale Dash-Button, verbindet sich aber zur AWS-Infrastruktur, die man selbst nutzen kann. Amazon bietet auch eine kostenlose 12 monatige Testphase an. Das Einbinden vorhandener API ist damit möglich und bietet somit einen deutlich erweiterten Funktions- und Nutzungsumfang. Die Nutzung der AWS-Infrastruktur ist für professionelle Bereiche durchaus besser geeignet als das sniffen von ARP oder DHCP Request. Solltet ihr Interesse haben, kann ich gern zum AWS IoT Button ein Tutorial erstellen.
Vorbereitung:
Amazon Dash Button in das WLAN einbinden
Die Einbindung des Amazon Dash Button ist sehr einfach gestaltet:
Auf dem Smartphone muss die Amazon Shopping App installiert sein. Alle weiteren Schritte für die Installation sind in der Bildergalerie nachvollziehbar:
Die Steckdose in das WLAN einbinden:
Das Einrichten der WLAN Funksteckdose TP-Link HS100 ist sehr einfach und über die von TP-Link bereitgestellt App „Kasa“ möglich. Die notwendigen Schritte sind in der Bildergalerie zu sehen:
Nachdem der Dash Button sowie die Funksteckdose in das WLAN eingebunden sind, werden weitere Konfiguration durchgeführt:
DHCP: statische IP-Adressen auf dem Router vergeben
Auf dem Router, der die IP-Adressen für die Clients vergibt, solltest du eine statische IP-Adresse für die Funksteckdose vergeben. Das Script, welches auf dem Raspberry Pi läuft und die Steckdose steuert, kann dann die statisch vergebene IP-Adresse genutzt werden. Somit muss kein Steckdosen-Suchprozess implementiert werden. Ich habe auf meinem DHCP-Server in den Service-Optionen die statische IP 192.168.1.113 vergeben.
Implementierung:
Ich setze jetzt einen fertigen vorkonfigurierten Raspberry Pi mit WLAN und SSH voraus ( siehe dazu: Raspberry Pi: meine Standardkonfiguration)
Als erstes installiere ich den Sniffer scapy
Scapy
Scapy ist ein Python-Tool mit dem der Netzwerktraffic analysiert werden kann, sowie sich Pakete gezielte manipulieren lassen. Ich nutze scapy, um den WLAN-Verkehr zu überwachen und die DHCP-Requests abzufangen. Das heißt, wenn ein DHCP – Request von der MAC Adresse des Dash-Button aufgezeichnet wird, ist das der Trigger, mit dem nun beliebige Aktionen ausgelöst werden können
$ sudo apt-get install -y scapy
Node.JS
Ich nutze einen Raspberry Pi Zero für den Aufbau. Das ist wichtig zu wissen, da wir jetzt einen Node.js Server installieren. Der Raspberry Pi Zero verwendet eine ARMv6 CPU-Architektur und benötigt deshalb eine andere Version als z.B. der Raspberry Pi 3 (ARMv8). In der Wikipedia-Übersicht erkennt man, welcher Raspberry Pi welche CPU-Architektur verwendet und unter Link findet man jeweils die aktuelle Node.js Verison.
Was macht Node.js? Node.js ist ein Webserver, der serverseitig JavaScript ausführt und eignet sich besonders für eine Client/Server Kommunikation. Ich nutze den Node.js Server an dieser Stelle, da die API zum Ansprechen der Funksteckdose für Node.js zur Verfügung gestellt wurde.
Wir laden also das Node.js Paket herunter, entpacken es und kopieren es nach /usr/local
cd /home/pi/
wget https://nodejs.org/dist/v7.9.0/node-v7.9.0-linux-armv6l.tar.gz
tar -xvf node-v7.9.0-linux-armv6l.tar.gz
cd node-v7.9.0-linux-armv6l/
sudo cp -R * /usr/local/
HS100 API
Die API, die die Kommunikation zur Funksteckdose bereitstellt wurde auf GitHub bereit gestellt. Wir legen die API der Einfachheit halber direkt im PI Home Verzeichnis ab – dafür clonen wir das Git Repository. Wer gern mit der API weiter arbeiten möchte, sollte einen Blick in die Readme werfen.
sudo apt-get install -y git
git clone https://github.com/plasticrake/hs100-api.git
trigger.py : das Dash Button Signal mit dem Raspberry Pi abfangen
Dieses python script lauscht auf den WLAN-Netzwerkverkehr, überwacht die DHCP Requests und prüft, ob die MAC Adresse vom Dash Button stammt. Wenn das Script feststellt, dass ein DHCP-Request von einem Dash Button stammt, ruft es die plug_switch.js
-Datei auf.
from scapy.all import * import sys, os def arp_display(pkt): if pkt.haslayer(DHCP): if pkt[Ether].src == "ac:63:be:xx:xx:xx": #die MAC Adresse des Button mit Kleinbuchstaben! #print (pkt[Ether].src) os.system("node /home/pi/plug_switch.js") print sniff(prn=arp_display, store=0,count=0)
plug_switch.js
Der js-code zur Steuerung der Funksteckdose (liegt bei mir im Home Verzeichnis des pi-User /home/pi/
)
Ablauf:
- Zuerst wird eine Verbindung via API zur Steckdose hergestellt
- der aktuelle Schaltzustand der Steckdose wird abgefragt
- der gegenteilige neue Schaltzustand wird gesendet
const Hs100Api = require('./hs100-api'); const client = new Hs100Api.Client(); // Meine lokale IP der Steckdose: const ip = '192.168.1.113'; const lightplug = client.getPlug({host: ip}); // Hole den aktuellen Schaltzustand und sende es negiert an die Steckdose zurück lightplug.getPowerState() .then(value => {if (value) { lightplug.setPowerState(false)} else {lightplug.setPowerState(true)};}) .catch(error => {console.log(error)}); setInterval(() => { process.exit(); },1000);
Autostart
Damit das trigger.py
script ausgeführt wird, wenn der Raspberry Pi bootet, lasse ich es über einen Eintrag in der Crontab starten:
$ sudo cronbtab -e
Am Ende der Datei folgende Zeile einfügen:
@reboot sudo python /home/pi/trigger.py
Soweit sollte das Funktionieren. Wenn Du noch Fragen haben solltes oder mir Hinweise geben möchtest, hinterlasse bitte einen Kommentar. Wenn Du willst, trage dich in die E-Mail-Abonnenten-Liste ein, um stets über Updates informiert zu werden!
Quellen:
- https://www.golem.de/news/reverse-engineering-mehr-spass-mit-amazons-button-1701-125359.html (Sehr lesenswerter Artikel)
- Controlling the TP-LINK HS100 Wi-Fi smart plug
- Raspberry PI for controlling TP-Link POWER
- https://github.com/plasticrake/hs100-api
- http://t3n.de/magazin/serverseitige-javascript-entwicklung-nodejs-einsatz-231152/
- https://de.wikipedia.org/wiki/Raspberry_Pi#Eigenschaften
- http://hypfer.de/blog/2016/09/02/amazon-button-zweckentfremden-ohne-arp-1n
- Befehlesreferenz: Linux Befehlsreferenz
- Synology: Nextcloud Automatisierung mit cron jobs - 28. Mai 2018
- Synology: Nextcloud und Docker installieren - 24. Mai 2018
- Meteorit über Deutschland - 16. November 2017
Pingback: Ein paar Infos zum #DashButton - Übermüdet