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.
Infolge der Kodierung klappt es nicht so einfach, eine neue Zeitperiode einzutragen. Vielmehr gilt es, zuerst den aktuellen Zustand der Dose abzufragen, die Hex-Zahlen passend zu manipulieren und anschließend den kompletten String wieder zurückzuschicken.
Ist der RasPi der alleinige Herr der Steckdose, entfällt die Abfrage – vorausgesetzt, der Mini-PC merkt sich den aktuellen Status. Für das Festlegen eines Reboot-Zeitpunkts gelingt es sogar noch einfacher: Die Steckdose steht in der Regel auf ON (der Zeitplan enthält nur eine Zeichenkette aus F). Vor dem Herunterfahren berechnet der RasPi den Zeitraum bis zum nächsten Boot-Vorgang und setzt dafür die Werte auf 0. Nach dem nächsten Booten löscht der RasPi die Nullen dann wieder.
Steuer-Software
Bei Github gibt es diverse Projekte, die sich mit dem Steuern von Edimax-Steckdosen autark von der Cloud des Herstellers beschäftigen. Eine einfache Python-Klasse gibt es online [2], eine C#-Version ebenfalls [3]. Da die Python-Klasse aber nur das An- und Abschalten unterstützt, laden Sie am besten das Projekt des Autors [4] herunter. Diese Bibliothek besteht aus verschiedenen Klassen und unterstützt alle Funktionen der Steckdose. Der Kasten “Ediplug installieren” beschreibt die Installation.
Listing 5 zeigt ein paar Beispiele. Da die Edimax SP1101W ihre IP-Adresse per DHCP erhält, spürt das Programm die Dose zuerst im lokalen Netz auf (ab Zeile 6). Normalerweise sucht der PlugFinder das gesamte eigene Subnetz ab und findet so alle unterstützten Steckdosen. Eine Bedingung dafür: Alle Steckdosen verwenden dasselbe Passwort.
Um die Suche abkürzen, füttern Sie den PlugFinder mit Zusatzinformationen – etwa einem IP-Adressbereich, einer Liste von Namen oder der maximalen Anzahl an Plugs, die die Klasse zurückgibt (Zeilen 9 bis 11). Alternativ, wenn Sie die IP-Adresse kennen, erzeugen Sie die Instanz des Plug-Objekts direkt.
Die Methoden des Plug-Objekts fragen Informationen der Edimax-Dose ab oder ändern deren Zustand. Zeile 16 liefert eine Map mit allen Informationen zum System. Das Skript schaltet anschließend die Steckdose an (Zeile 19), wartet zehn Minuten und schaltet sie wieder aus (Zeile 21). Bei diesem Beispiel sollte der RasPi nicht an der geschalteten Steckdose hängen.
Verwaltet der RasPi als alleiniger Herr die Steckdose und speichert er einen eigenen Zeitplan, dann genügen schon diese beiden Befehle, um die Edimax SP1101W komplett zu steuern. Autark führt die Dose aber in diesem Szenario keine Schaltvorgänge aus.
Listing 5
#!/usr/bin/python import time from ediplug import * pf = PlugFinder(password='1234') plugs = pf.search() #plugs = pf.search(network='192.168.2.100-192.168.2.120') #plugs = pf.search(maxCount=1) #plugs = pf.search(plugnames=['plug1','plug2']) plug = plugs.values()[0] #plug = plugs['plug1'] info = plug.getSystemInfo() print info['Device.System.Name'] plug.setPowerState(active=True) time.sleep(600) plug.setPowerState(active=False)
Ediplug installieren
Zur Installation klonen Sie zunächst einmal das Github-Projekt [4] des Autors mithilfe des Befehls aus der ersten Zeile von Listing 6. Anschließend kopieren Sie die Python-Bibliothek in einen Pfad, in dem Python nach Paketen sucht (Zeile 2 und 3). Dann installieren Sie ein paar benötigte Python-Pakete (Zeile 4 und 5). Raspbian “Jessie” benötigt nur die beiden oben aufgeführten Pakete, auf anderen Plattformen fehlt vielleicht noch python-requests. Die korrekte Installation testen Sie mit dem folgenden Kommando:
$ samples/testinstall.py
Hat sich die Steckdose ins Netz eingebucht, überprüfen Sie die Kommunikation mittels des folgenden Befehls:
$ samples/powerstate.py -p 1234
Achten Sie darauf, dass Sie das Passwort gegebenenfalls anpassen. Aus Ihren eigenen Programmen heraus laden Sie die Bibliothek mit dem folgenden Einzeiler:
from ediplug import *
Eine Übersicht über die Klassen und Methoden der Bibliothek finden Sie in der Dokumentation zum Paket (README.md).
Listing 6
git clone https://github.com/bablokb/ediplug.git cd ediplug/src sudo cp -a ediplug /usr/local/lib/python2.7/dist-packages sudo apt-get update sudo apt-get install python-netaddr python-netifaces
Wake on RTC
Die Zeilen 11 bis 20 aus Listing 7 zeigen den ursprünglichen Fall: Der Raspberry Pi programmiert hier das Abschalten in fünf Minuten und das Einschalten der Dose in einer Stunde (Zeilen 11 bis 13 und Zeile 17). Anschließend löst er den eigentlichen Shutdown mit dem Befehl in Zeile 20 aus.





