Aus Raspberry Pi Geek 03/2016

WLAN-Steckdose mit dem Raspberry Pi steuern (Seite 2)

Möchten Sie sich nicht in die Abhängigkeit einer externen Firma begeben und sehen das Überwachen aller Vorgänge kritisch, sollten Sie per Zugangskontrolle im Router der Steckdose den Kontakt ins Internet verbieten. Üblicherweise gelingt das über eine Negativliste von sogenannten MAC-Adressen (Hardware-Adresse des WLAN-Moduls in der Steckdose).

Ohne Zugang ins Internet ist allerdings die Smartphone-App ebenfalls nutzlos, aber Datensicherheit und Bequemlichkeit lassen sich nun mal nur in seltenen Fällen vereinen. Zum Glück kann der Raspberry Pi alle sonst von der Cloud bereitgestellten Funktionen übernehmen.

Kommunikation

Die Edimax SP1101W verfügt über einen eingebauten Webserver, es werkelt dort der bekannte kleine Lighttpd. Sie steuern die Steckdose über sogenannte HTTP-Post-Requests. Ein beliebiges Skript beziehungsweise Programm (etwa die zitierte App) schickt die Befehle verpackt in XML an den Webserver und bekommt die Antwort ebenfalls als XML zurück.

Um die Steckdose zu aktivieren, kopieren Sie die Zeilen aus Listing 1 in die Datei an.xml und rufen danach das folgende Kommando auf:

$ curl [email protected] http://admin:[email protected]:10000/smartplug.cgi

Falls Sie das Programm Curl noch nicht installiert haben, finden Sie es wie üblich in der Paketverwaltung. In der URL passen Sie die IP-Adresse der Steckdose an Ihr lokales Netz an, ersetzen also 192.168.1.4 mit der korrekten Adresse in Ihrem LAN. Diese finden Sie normalerweise in einer Übersicht im Router – diese führen Buch über angemeldete Geräte und deren Adressen. Haben Sie bei der ersten Konfiguration das Passwort der Steckdose geändert, ersetzen Sie 1234 durch den entsprechenden Wert.

Listing 1

 

<?xml version="1.0" encoding="utf-8"?>
  <SMARTPLUG id="edimax">
    <CMD id="setup">
       <Device.System.Power.State>ON</Device.System.Power.State>
    </CMD>
</SMARTPLUG>

Analog funktionieren das Ausschalten (hierzu setzen Sie in der vierten XML-Zeile ein OFF statt des ON ein) und diverse weitere Befehle. Neben den Setup-Kommandos (Zeile 3: id="setup") gibt es Kommandos zur Abfrage mit id="get" als Attribut. Mit dem XML-Format aus Listing 2 gibt die Steckdose den aktuellen Status zurück.

Listing 2

 

<?xml version="1.0" encoding="UTF8"?>
  <SMARTPLUG id="edimax">
    <CMD id="get">
      <Device.System.Power.State></Device.System.Power.State>
    </CMD>
</SMARTPLUG>

Damit können Sie bereits auf einen Teil der Funktionen der Edimax-Steckdose zugreifen. Da die Befehle und damit die XML-Dateien statisch ausfallen, läge es nahe, es beim Skripting mit Curl zu belassen. Das Steuern nach einem Zeitplan ist aber etwas komplexer, weil hier erst eine Kodierung stattfindet – deshalb weichen Sie dazu auf Python aus.

Zeitsteuerung

Die Smartplug SP1101W unterstützt Zeitpläne sowohl über programmierte Schaltzeitpunkte als auch durch eine Art Stundenplan. Widersprechen sich die Schaltzeitpunkte und der Stundenplan, so sticht der (in der App übrigens unsichtbare) Stundenplan. Warum Edimax die Daten doppelt speichert, ließ sich im Test nicht nachvollziehen. Da aber normalerweise das Steuern rein über die App passiert, stellt das in der Praxis kein Problem dar.

Für jeden Wochentag getrennt legen Sie fest, wann der Strom fließt und wann nicht (Abbildung 2). Das ist zwar einerseits nicht optimal, denn auf diese Weise lässt sich der Zeitpunkt für den Start nur innerhalb der kommenden sieben Tage festlegen; andererseits genügt das aber den Anforderungen vieler Einsatznischen. Listing 3 zeigt die Abfrage des aktuell gespeicherten Plans, Listing 4 die (um einige Nullen gekürzte) Antwort des Webservers.

Abbildung 2: Der Zeitplan – hier im Screenshot der Android-App – erlaubt es Ihnen, die Zeitpunkte für Anschalten und Abschalten festzulegen.

Abbildung 2: Der Zeitplan – hier im Screenshot der Android-App – erlaubt es Ihnen, die Zeitpunkte für Anschalten und Abschalten festzulegen.

Listing 3

 

<?xml version="1.0" encoding="UTF8"?>
<SMARTPLUG id="edimax">
  <CMD id="get">
    <SCHEDULE/>
  </CMD>
</SMARTPLUG>

Listing 4

 

<?xml version="1.0" ?>
<SMARTPLUG id="edimax">
  <CMD id="get">
   <SCHEDULE>
    <Device.System.Power.Schedule.0.List>30401-50701</Device.System.Power.Schedule.0.List>
    <Device.System.Power.Schedule.1.List/>
    <Device.System.Power.Schedule.2.List/>
    <Device.System.Power.Schedule.3.List/>
    <Device.System.Power.Schedule.4.List/>
    <Device.System.Power.Schedule.5.List/>
    <Device.System.Power.Schedule.6.List/>
    <Device.System.Power.Schedule.0 value="ON">000000000000000000000000000000000000000000000FFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000...000</Device.System.Power.Schedule.0>
    <Device.System.Power.Schedule.1 value="ON">000...000</Device.System.Power.Schedule.1>
    <Device.System.Power.Schedule.2 value="ON">000...000</Device.System.Power.Schedule.2>
    <Device.System.Power.Schedule.3 value="ON">000...000</Device.System.Power.Schedule.3>
    <Device.System.Power.Schedule.4 value="ON">000...000</Device.System.Power.Schedule.4>
    <Device.System.Power.Schedule.5 value="ON">000...000</Device.System.Power.Schedule.5>
    <Device.System.Power.Schedule.6 value="ON">000...000</Device.System.Power.Schedule.6>
  </SCHEDULE>
 </CMD>
</SMARTPLUG>

Auf den ersten Blick ergeben die vielen Buchstaben und Nullen keinen Sinn, aber die Bedeutung erschließt sich schnell: Die Einträge in den Nodes Device.System.Power.Schedule.?.List kodieren die Zeitpunkte im Format “StundeMinuteStundeMinute1”, wobei das erste “StundeMinute”-Paar den Zeitpunkt zum Anschalten angibt, das zweite den zum Ausschalten. Es folgt noch eine redundante 1.

In der fünften Zeile von Listing 4 ist die Dose also am Sonntag von drei bis vier (30401) und von fünf bis sieben an (50701). Stunden und Minuten größer als neun kodieren Sie fortlaufend mit den Buchstaben des Alphabets (erst klein, dann groß) bis hin zu “X”, was der Zahl 59 entspricht.

Die Nodes mit den Namen Device.System.Power.Schedule.? enthalten dieselbe Information in einem anderen Format, hier kodiert die Steckdose jede Minute binär als 1 oder 0 und fasst dann vier Minuten zu einer Hex-Zahl zusammen. Ein F (1111b) bedeutet also, dass die Steckdose vier Minuten hintereinander an bleibt. Einen ganzen Tag geben Sie fortlaufend als 360 Hex-Ziffern an – nicht sehr effizient, aber diese Art des Kodierens vermeidet Zeichen im XML-Code, die der Parser nicht versteht.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben