Raspberry Pi: mit dem Amazon Dash Button eine WLAN-Steckdose schalten

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.

Der Minirechner: Raspberry Pi kann mit einem Amazon Dash Button die TP-Link HS100 bedienen

Amazon Dash Button, Raspberry Pi und die WLAN Steckdose TP-Link HS100

kostenloses Buch für die persönliche Entwicklung

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?

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:

Diese Diashow benötigt JavaScript.

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:

Diese Diashow benötigt JavaScript.

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.

vergeben einer statischen IP Adresse für die Funksteckdose

Beispielhaft: statische IP für Funksteckdose

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

 

Und hier noch eine klare Empfehlung für alle, die auch außerhalb des IT-Bereiches mehr erreichen wollen:

kostenloses Buch für die persönliche Entwicklung

 

Heiko Böhme

Heiko Böhme

Mein Name ist Heiko Böhme und ich bin Entwickler und Koordinator für Datenbanken, Data Warehouse Systeme und IT im Gesundheitswesen. Spezialisiert habe ich mich auf MS-SQL SSIS und SSAS. Im Jahr 2008 startete ich bei einem Pharmaunternehmen in Leipzig und seit 2015 bin ich in einem Krankenhaus beschäftig. Ich persönlich beschäftige mich vor allem mit den Themen Datenintegration, -qualität und -analyse. Das Tolle an meinem Job ist, dass ich immer sehr abwechslungsreiche und verantwortungsvolle Projekte begleiten darf. Im privaten Umfeld beschäftige ich mich gern mit den Themen Fotografie, Flugmodellbau und dem Wassersport. Ich freue mich darauf hier einige interessante Beiträge zu publizieren und überentsprechende Kritiken und Feedback.
Heiko Böhme

Hinterlasse einen Kommentar

11 Kommentare auf "Raspberry Pi: mit dem Amazon Dash Button eine WLAN-Steckdose schalten"

Benachrichtige mich zu:
avatar
Wolfgang
Gast
Wolfgang

Hallo und Danke für die tolle Anleitung,

leider habe ich NULL Wissen über Python, Script usw. aber RasPi läuft (Jessie light) mit verschiedenen Programmen (Hyperion, Motion, io.broker usw.). Habe alles so umgesetzt wie beschrieben, aber leider funzt nix.
Wenn ich direkt über Konsole den Befehl: „sudo python /home/pi/trigger.py“ absetze kommt folgende Fehlermeldung:
>>WARNING: No route found for IPv6 destination :: (no default route?)<<
Scheinbar (laut Google) läuft irgendwas mit Scapy falsch.
Vielleicht kannst du mir einen Tipp geben. Danke vorab.

Mit freundlichen Grüßen
Wolfgang

Wolfgang
Gast
Wolfgang

Hallo Heiko,

vielen Dank für deine schnelle und sehr hilfreiche und umfassende Rückantwort.

Es lag an der MAC-Adresse vom Button. Habe zwar alles in Kleinbuchstaben gesetzt aber einen Eingabefehler (anstatt 50 habe ich 5O -> eingegeben).

Nun klappt alles wunderbar. Aber es ist schon eine deutliche Verzögerung bemerkbar, macht aber nix.
Hauptsache es klappt mit einem nun 1,99 EUR (kurzfristige Preissenkung von Amazon) Wifi-Schalter.
Das ist sensationel 🙂
Vielen Dank nochmals.

Gruß Wolfgang

Wolfgang
Gast
Wolfgang

Hallo Heiko,

nochmal ich – habe noch eine Frage…
Wenn man einen weiteren Button verwenden will und damit einfach (per URL-Befehl) ein WLAN-Device starten oder stoppen möchte, was muß zusätzlich (natürlich die andere MAC-Adresse) in der trigger.py stehen und wie kann ich den Befehl absetzen (*.sh ???) oder??
Danke vorab.

Grüße aus Bayern
Wolfgang

Wolfgang
Gast
Wolfgang

Hallo Heiko,

vielen Dank für deine ausführliche Erklärung und die Geduld mit mir.
Soweit ist mir das mit der trigger.py nun klar. 🙂

In meinem privaten Netzwerk möchte ich damit gezielt Geräte ansteuern, deren Http-Adresse und URL-Befehle ich kenne, z.B um eine Gerät (hier eine Funksteckdose) EIN und auch wieder AUS zu schalten.
EIN: http://192.168.xxx.xxx/connair/index.php?action=on&type=device&id=4
AUS: http://192.168.xxx.xxx/connair/index.php?action=off&type=device&id=4

Ich müsste den URL-Befehl also in ein Python-script einbauen. Ich denke, da keine Rückmeldung kommt oder sonstiger Status abgefragt wird, dass dann nur ein Befehl geht -> Button drücken -> Lampe an?!
Kannst du mir zeigen wie das script hierzu aussehen würde?
Und – Danke für die links, werde sie mir heute Abend oder am WE mal durchsehen – vielleicht versteh ich dann etwas mehr davon 😉
Danke vorab

Grüße
Wolfgang

Wolfgang
Gast
Wolfgang

Hallo Heiko,

vielen Dank für das Script. Habe es natürlich gleich ausprobiert (Variante 2 – da ich momentan nur einen Button habe). Dein Script sieht daher so aus:
______________________________________________

from scapy.all import *
import sys, os
from pathlib import Path
my_file = Path("./connair")

def arp_display(pkt):
    if pkt.haslayer(DHCP):
        if pkt[Ether].src == "50:f5:da:e9:cb:e7":
            if my_file.exists():
                os.system('rm ./connair')
                return urllib.urlopen('http://192.168.xxx.xxx/connair/index.php?action=on&amp;type=device&amp;id=4')
            elif my_file.exist():
                 os.system('touch ./connair')
                 return urllib.urlopen('http://192.168.xxx.xxx/connair/index.php?action=off&amp;type=device&amp;id=4')


print sniff(prn=arp_display, store=0,count=0)

________________________________________________

Leider gibts eine Fehlermeldung – siehe unten:
________________________________________________
pi@HA-Bridge:~ $ sudo python /home/pi/trigger2.py
WARNING: No route found for IPv6 destination :: (no default route?)
Traceback (most recent call last):
File „/home/pi/trigger2.py“, line 3, in
from pathlib import Path
ImportError: No module named pathlib
________________________________________________

Ich habe Python Version 2.7.9 aufm RasPi und Jessie Light ist up to date.
Habe nun Python 3.6.2 installiert, aber da gibts dann diese Meldung:

________________________________________________
pi@HA-Bridge:~ $ sudo python3 /home/pi/trigger2.py
File „/home/pi/trigger2.py“, line 17
print sniff(prn=arp_display, store=0,count=0)
^
SyntaxError: invalid syntax
________________________________________________

Kannst du mir nochmals auf die Sprünge helfen.
Danke vorab.

Grüße
Wolfgang

Wolfgang
Gast
Wolfgang

Hallo Heiko,

das Ein-/Ausschalten mit 1 DashButton klappt nun einwandfrei. 🙂
Wenn der 2. Button da ist, teste ich mal beide mit 2 verschiedenen URL-Befehlen in der trigger.py und auch deine Variante 1!

Vielen Dank für deine freundliche Hilfe und Unterstützung.
Sollte ich aber – wider erwarten – Probleme haben, bin ich so frei und melde mich nochmals hier bei dir. 😉

Ich wünsche dir noch eine schöne Woche, hoffentlich mit mehr Sonnenschein als bei uns.
Hier regnet es seit gestern immer wieder …. bei tollen 15 Grad

Grüße
Wolfgang

wpDiscuz
Translate »