PRTG mit Edimax SP2101W

Auf der Seite Edimax SP2101W habe ich die technischen Hintergründe zur Funktion der Schaltsteckdose Edimax SP-2101W analysiert. Wenn Sie in meinem WLAN ist, kann ich sie aber auch direkt per HTTP ansprechen. Diese Seite beschreibt die Integration in PRTG mit einem CustomSensor und damit ist ein Sensor für PRT nicht mehr weit.

Auswerten mit PowerShell

Nachdem ich auf Edimax SP2101W herausgefunden habe, wie ich die Daten per HTTP direkt von dem SP2101W beziehen kann, war es natürlich klar, dass der Schritt zu einem PowerShell-Script nur kurz ist. Vorarbeiten hatte ich z.B. auf PS HTTPClient schon geleistet. Mein erster Versuch war folgender:

[string] $strUser = 'admin'
[System.Security.SecureString]$strPass = ConvertTo-SecureString -String "1234" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)

$data= Invoke-WebRequest `
   -Method post `
   -credential $cred `
   -Uri "http://192.168.178.62:10000/smartplug.cgi" `
   -Body '<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><NOW_POWER></NOW_POWER></CMD></SMARTPLUG>'

Ganz so einfach geht es aber dann noch nicht, denn das PowerShell-Kommando macht darauf zwei Pakete und das Device antwortet schon nach dem ersten Paket.

 

Der Fehler ist hier nicht bei der PowerShell, sondern das Device ignoriert den "Content-Length" und antwortet schon, obwohl der Request noch nicht komplett ist.

Alternativ kann man den Invoke-RestMethode nutzen, der etwas mehr "Intelligenz" mit bringt.

[string] $strUser = 'admin'
[System.Security.SecureString]$strPass = ConvertTo-SecureString -String "1234" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)

$data= Invoke-RestMethod  `
   -Method post `
   -credential $cred `
   -Uri "http://192.168.178.62:10000/smartplug.cgi" `
   -Body '<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><NOW_POWER></NOW_POWER></CMD></SMARTPLUG>'

Auf meinem Notebook geht die Anforderung in einem Paket samt Authentifizierung an das Device, welches dann antwortet.

 

In der Variable "$DATA" sind die Daten dann einfach abzurufen.

Interessant ist auf den ersten Blick hier der Counter "Device.System.Power.NowPower". Der Strom macht ohne die Spannung nicht viel Sinn und die Summenwerte sind für eine Momentanzeige durchaus nett aber natürlich keine Grafik. Interessanterweise kann das identische Skript auf einem Windows 2008R2-Server die Daten wieder nicht abholen, weil der Request aufgeteilt wird und das SP2101W nicht mit einem "1090 Continue" antwortet, sondern den partiellen Request mit einem 417 beendet.

Selbst der Versucht mit dem "System.Net.WebClient" funktioniert auf meinem Windows 7 Notebook aber nicht auf einem Windows 2008R2 Server:

$webclient = new-object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($deviceuser,$devicepass)
[xml]$sp2101wdata = $webclient.UploadString($deviceURL, '<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><NOW_POWER></NOW_POWER></CMD></SMARTPLUG>')

Erst der Rückfall noch eins tiefer auf "System.Net.HttpWebRequest" erlaubt es, über den "ServicePoint" das Property "Expect100Continue" auf $false zu setzen und so die getrennte Übertragung von Header und Body zu unterbinden.

PRTG Custom Sensor

Werte per PowerShell auszulesen ist ja nur die halbe Miete. Irgendwo will ich die Werte ja speichern, visualisieren und ggfls. Alarmieren oder darauf reagieren. PRTG ist natürlich nun kein Hausautomatisierungssystem wie FHEM u.a., insofern habe ich nicht vor mit PRTG abhängig von der Produktion der Solarzellen (Siehe PRTG Kostal) dann den SP2101W auch noch zu schalten.

Von den vier Kennzahlen ist der aktuelle Verbraucht natürlich erst mal interessant. Aber der Wert ist eine "Momentaufnahme". Daher kann es durchaus interessant sein, auch die summierten Werte zu nutzen. PRTG kann nämlich auch "Differenz-Werte" ermitteln und damit den Verbrauch eines Intervalls anhand des Start-Werts und End-Werts errechnen. Das hat Vorteile, wenn der Verbraucher stark schwankende Lasten hat oder die Messintervalle größer also die Einschaltdauer sind und damit die Messing ungenau wird. Aber auch die Messung der Differenzen ist nicht problemlos, dann wenn die Intervalle kurz bzw. der Verbrauch niedrig ist, hat sich der Counter gar nicht erhöht und wird als "0" geführt. Der Verbraucher muss dabei aber gar nicht ausgeschaltet gewesen sein. Sein Verbrauch war einfach unterhalb der Messempfindlichkeit des Summenzählers. Hier kann dann der "NoPower"-Counter wieder besser sein. Also werde ich einfach alle vier Kennzahlen auslesen und an PRTG übergeben.

Um z.B. alle 5 Minuten die Daten abzufragen. Ich bediene mich dazu wieder dem PRTG:Custom Sensor. den ich regelmäßig aufrufen lasse, so dass der per PowerShell die XML-Anfrage sendet und die Antwort als XML-Datei weiter sendet. Da es sich hier nur um vier Werte handelt, habe ich auf umfangreiche Vorschleifen verzichtet und einfach über Parameter die URL, username und Kennwort angefragt, dann per HTTPWebRequest die Anfrage gestellt um die Ergebnisse dann als XML an PRTG zu übergeben.

prtg-sp2101w.1.0.ps1

Der Sensor wird als "EXE/XML Custom Sensor" eingerichtet.

Kopieren Sie dazu das PS1-Skript in das EXEXML-Verzeichnis ihrer PRTG Probe (Siehe auch PRTG:Custom Sensor)

Wenn Sie nicht per Parameter die DeviceURI übergeben, sollten Sie im Skript den Default auf ihre Umgebung anpassen. Und schon sollten Sie die vier Messwerte auch sehen. Hier ein Beispiel der ersten Messwerte:

 Das hier angeschlossene System misst übrigens einen kleinen Bautrockner im Keller, der abhängig von der Luftfeuchtigkeit den Kompressor ein und ausschaltet aber der Lüfter als Grundlast immer die Luft umwälzt. Wenn der Wasserbehälter voll ist, dann schaltet er Kompressor und Lüfter ab und braucht nur noch etwas "Standby"-Strom. Hier einmal ein Auszug:

Man sieht die regelmäßigen Ein- und Abschaltvorgänge des Kompressors, der ca. 25Min läuft und dann ca. 20Min Pause macht. Man sieht aber auch, dass der Energieverbrauch auf dem Berg immer noch etwas weiter zunimmt. Die tiefen Spalten zeigen Zeiten, zu denen das Gerät keinen Strom verbraucht hat. Ich habe meine Frau angesprochen und sie hat bestätigt, dass Sie in der Zeit das Gerät ausgeschaltet hatte und einmal das Wasser geleert hat.

Die feine hellblaue in den zeigt den Strom in Ampere und ist nicht wirklich aussagekräftig, es sei denn man möchte erkennen, ob das Gerät wegen Überlast (16A) abschaltet. Wenig hilfreich in der Grafik sind natürlich auch die "Summenwerte", die den Stromverbrauch pro Tag (Day), Woche (Week) oder Monat (Month) ausgeben. Die kann man in der Konfiguration von PRTG aber auch Ausblenden. Erfassen möchte sich sie trotzdem, da man sie später als CSV-Datei exportieren könnte. Hier mal eine längere Auswertung:

Hier ist dann auch gut zu sehen, wie "Mittelwerte" die normale Spitze von ca. 400W absenken und wie die Summencounter für Tag, Woche und Monat als Integral auflaufen und wieder zurück gesetzt werden.

Einschränkungen

Die Box kann per WiFi in ein WPA2-Personalnetz aufgenommen werden. Das geht per App innerhalb von Minuten. Sie misst den Stromverbraucht und kann aus der Ferne geschaltet werden. Das ist der einfach Part. Ein paar Kröten müssen sie aber dennoch schlucken

  • APP only, keine Webseite
    Die Einrichtung des Geräts in ein WLAN ist aktuell nur über die App möglich. Bei den heutigen Entwicklungsschritte bei Mobiltelefonen und Tablets und Updates von Betriebssystemen muss man darauf hoffen, dass Edimax diese App auch immer weiter entwickelt und bereit hält. Leider gibt es nicht mal eine triviale Möglichkeit per Browser bei der Ersteinrichtung die Daten zu setzen oder den aktuellen Status zu sehen. Wenn die API offen gelegt wäre, könnte man ja ein PHP, Perl, PowerShell oder anderes Skript entwickeln und die Abhängigkeit von Smartphones und Apps lösen. So bin ich schon fast sicher, das es nur wenige Jahre dauern wird und das Gerät ist Elektromüll.
  • Stromausfall = Datenreset
    Wenn das Gerät kurz ohne Strom ist, verliert es zwar nicht seine Konfiguration aber die bislang aufgezeichneten Verbrauchsdaten sind alle wieder auf 0 zurück gesetzt. Durch meine PRTG-Erfassung stört mich das nicht, aber wer damit längere Zeiträume ohne PC erfassen will, wird dies nicht mögen.
  • Erzwungene Verbindung zur Cloud
    Dass das Gerät versucht eine Verbindung über eine Edimax-Cloud aufzubauen, damit der Anwender auch unterwegs auf die Daten zugreifen kann, ist ein Zugeständnis an das "Internet der Dinge". Aber dass das Gerät ohne Internet keinen Zeitserver bekommt und dann alle Werte permanent auf "0" stehen, blockiert den Einsatz in einem geschlossenen Netzwerk. Ich hoffe, dass hier ein Update Abhilfe schafft.
  • AGB für Cloud Service
    Wenn ein Gerät schon ungefragt mit der Cloud kommuniziert, dann wären ein paar klärende Worte dazu angebracht. So ganz ohne "Vertrag" ist das vielleicht nicht mit hiesigen Gesetzen konform. Edimax sammelt die Daten sicher nicht um den weltweiten Stromverbrauch zu ermitteln. Wenn ich dann über das Smartphone von unterwegs die Daten einsehen und schalten kann, und die Absicherung nur ein Kennwort ist und eine "bekannte" (TLS) Verschlüsselung scheinbar nicht genutzt wird, dann ist das für mich einen klare Abwertung.
  • Webservice ohne "100 Continue"-Support
    Dann ist es nur noch ein kleiner Bug, dass man beim direkten Zugriff den POST komplett senden muss, weil das Gerät keinen "100 Continue" unterstützt.
  • Messgenauigkeit
    Leider habe ich keine Geräte um die Genauigkeit der Messung zu verifizieren. Es gibt auch seitens Edimax hier keine Aussagen zu, bzw. ich habe sie nicht gefunden. für Abrechnungszweck ist es nicht zu gebrauchen aber als grobes Schätzeisen für Großverbraucher einsetzbar.
  • APP-Reconnect-Probleme
    Bei mir hat sich die App beim Start nicht mit dem Gerät verbinden können. ich musste immer das Gerät erst entfernen und dann wieder anlernen. Auch die App hat dann aber alles mit "0" angezeigt, wenn die Schaltsteckdose nicht mit dem Internet kommunizieren konnte, obwohl dann die App anscheinend dort direkt auf das Gerät zugreift.

Das Thema mit "Internet der Dinge" und Sicherheit wird uns aber sicher noch in Zukunft beschäftigen. Wer weiß, vielleicht kann man dieses Gerät mit einer passenden Firmware zum "Schnüffler" im Haus-LAN erweitern. Es ist damit auf jeden Fall kein Gerät für kritische oder empfindliche Netzwerke und Stromverbraucher. Ich weiß schon, warum ich die Schaltfunktion per Lötbrücke außer Kraft gesetzt habe.

Einschätzung

Ich finde es immer wieder erstaunlich, wie viele Funktionen heute in so kleinen Boxen konzentriert werden können. Das ist ein Embedded-Computer mit Steuerung, Netzwerk und Messeinheit und das alles ist für weniger als 50€ erhältlich. Mag sein, dass ein Smartphone oder Tablet elektronisch noch hochwertiger sind aber die Entwicklung und Produktion, Versand und Vertrieb wollen alle bezahlt sein. Man muss natürlich im Hinterkopf haben, dass Edimax mit dem SP2101W auf der "aktuellen "Internet of Things"-Welle mit schwimmt und zuerst an eine App für Smartphones und Tablets gedacht hat. Was davon zu halten ist, dass diese (und tausende Kopien) ungefragt eine Verbindung zu einem Edimax-Service aufbauen und es dazu kein Hinweisblatt weder im Karton noch in der App gibt, finde ich persönlich bedenklich. Andererseits bin ich vielleicht einfach "älter" und sehe das kritischer als die WhatsApp-Generation.

Andere Stromsteckdosen

Es gibt natürlich immer mehr Geräte, die sich per "App" auslesen lassen. Solange sich diese nicht per Bluetooth direkt verbinden, sondern irgendwie direkt oder indirekt im LAN erscheinen und nicht allzu kryptisch anzusprechen sind, können diese sicher auch eingelesen werden. Hier ein paar Links ohne vollständig zu sein.

Weitere Links