PRTG Shelly

Wer mit ESP8266/ESP32-Systemen werkelt, wird irgendwann über die Produkte von Shelly stolpern, die von Hause aus mit einer sehr vielseitigen Firmware kommen. Es gibt Aktoren zum Schalten von 230V-Verbrauchern, die auch den Verbrauch messen und LEDs, die über das Netzwerk gesteuert werden können. Auf dieser Seite stelle ich PowerShell-Skript für den Einsatz mit PRTG vor. Die Shellys können ohne Cloud des Herstellers intern sowohl MQTT nutzen als auch per REST angesprochen werden. Es reicht also, wenn das Gerät per HTTP erreichbar ist. Sie sollten dazu natürlich sicherstellen, dass die Sicherheit gewährleistet ist. Leider sprechen die ESP8266-basierten Systeme kein HTTPS, so dass der Schutz ganz auf der WLAN-Verschlüsselung liegt.

Ich habe das bei mir so gelöst, dass all die IOT-Devices in einem eigenen Subnetz mit eigener SSID liegen und per Firewall dann nur vom PRTG-Server erreicht werden können.

Es gibt sehr viele ESP8266-basierte Geräte, die man sogar auf Tasmota umflashen kann. Auch diese Firmware erlaubt dann eine REST-Abfrage. Entsprechende Beispiele habe ich am Ende verlinkt.

Shelly Plug

Das erste Gerät ist ein Zwischenstecker, mit dem ich den 230V Geräte nicht nur schalten sondern auch den aktuellen Verbrauch und den kumulierten Verbrauch halbwegs genau ermitteln kann. Die Energie zu messen erlaubt auch indirekte Analysen des Verbrauchers, z.B. ob und wann das Hauswasserwerk wie lange gelaufen ist. Sie können aber auch das Ende einer gar nicht IOT-tauglichen Waschmaschine oder eines Trockners anhand der Verbrauchskurve erkennen oder die Laufzeit der Pool-Pumpe kontrollieren.

Der Zwischenstecker gibt es für unter 20€ zu kaufen und ist sehr schnell installiert. In meinem Fall habe ich den Stecker an einer Gartenpumpe installiert, die mit 1000W angegeben ist. Der Anlaufstrom sollte aber auch die 2500W nicht überschreiten und ich habe ja nicht vor, über das Relais die Pumpe unter Last zu schalten. Auf dem Bild sehen Sie sowohl den Schein der blauen StatusLED für eine aktive WLAN-Verbindung und das rote Licht für das eingeschaltete Relais.

Hinter dem ShellyPlugS steckt hier auch noch eine klassische Analoge Schaltuhr. Sie sorgt für eine "sichere Nachtruhe". Unabhängig von den Schaltuhren für die Beet- und Rasenbewässerung soll die Pumpe nachts zuverlässig aus bleiben. Nachdem das Gerät in ihrem LAN eingebunden ist, können Sie einfach per Browser drauf zugreifen:

Hier ist aber nur der momentane Verbrauch ersichtlich. Das ist mir dann doch zu wenig.

REST-API

Interessanter ist die ebenfalls vom Webserver angebotene REST-API, wenn Sie an die URL ein "/status" anhängen:

Auch Wireshark liefert die gleichen Daten. Ich habe aber extra noch mal einen "Float/Double"-Wert extrahiert, damit Sie das "Kommazeichen" sehen. im JSON ist das ein "Punkt".

Diese JSON-Antwort können Sie mit dem PRTG JSON-Sensor und einem passenden Template verarbeiten. Allerdings hätte ich schon gerne noch einige Daten z.B. im Status, die verbundene SSID und die Version der Firmware machen sich als Counter in PRTG nicht so gut. Mit JSON und PowerShell müssen Sie hinsichtlich PRTG noch etwas beachten. Bei einem einfachen Invoke-RestMethod mit nachfolgender Ausgabe konvertiert die PowerShell den Wert in einen "Dezimalwert", der dann von der Ländereinstellung des Clients den Dezimalpunkt ableitet.

PS C:\> (invoke-restmethod http://192.168.180.23/status).temperature
32,04

Hier steht also ein "Komma". Das müssen wir beim Code beachten, dass PRTG für "Float" einen "Punkt" erwartet. Zudem ist die Momentaufnahme der Leistung zwar nett aber bei 1 Min Intervallen nicht immer ausreichend, wie ich weiter unten noch ausführe.

Anhand der Beschreibung sehen sie, dass hier verschiedene Werte mit unterschiedlichen Einheiten kommen:

Wert JSON Powershell VarType Einheit Anmerkungen

.meters.power

0.99

0,99

Double

Watt

Aktueller Verbrauch in Watt

.meters.total

12345

12345

Int64

WattMinute

Aufsummierung der verbrauchten Energie in Watt-Minuten. Zur Umrechnung in die die gebräuchlichere Einheit kWh muss der Wert durch 600000 dividiert werden.

.wifi_sta.rssi

-54

-54

Int64

db

Empfangsstärke in Dezibel

.temperature

31.99

31,99

Double

Grad Celsius

Die Temperatur ist aufgrund der Eigenwärme höher als der Raum

Der Wert "meters.power" ist eine Momentaufnahme. Interessanter finde ich ".meters.total", welches den Energieverbrauch aufsummiert. Wenn wir dann die Differenz zur vorherigen Messung bilden, haben wir eine lückenlose Erfassung des Energiebedarfs. PRTG kommt aus dem "Netzwerk-Bereich" und da sind Bandbreiten/Sek und Pakete/Sek übliche Counter. Einen Energiebedarf in "Watt/s" zu auszugeben, ist nicht optimal. Das ist zwar nicht falsch aber auch nicht wirklich nützlich. Hinzu kommt noch, dass Shelly den aufsummierten Verbrauch in "WattMinute" erfasst. Ich kann aber den Wert "Wattminute" einfach "*60" rechnen um auf Wattsekunde zu kommen. Dann sollte PRTG den Durchschnittsverbrauch seit der letzten Messung in Watt anzeigen.

Da die Last der Abfrage in meinem kleinen LAN unkritisch ist, habe ich mir ein PowerShell-Skript gebaut:

prtg-shellyplugs.ps1 (Stand 14. Mai 2021)
Bitte im Verzeichnis CUSTOM/EXEXML ablegen und die Extension von ".TXT" nach ".ps1" umstellen.

Ich addiere dann den Sensor unter dem Device vom Typ" EXE/Advanced" und gebe neben dem Namen als Parameter natürlich die URL zur JSON-Quelle ein.

-url:"http://192.168.179.23/status"

oder

-url:"http://%host/status"

Und dann heißt es etwas warten, bis PRTG den Status nacheinander einliest. Nach dem ersten Einlesen sind schon die Counter vorhanden.

In der Status-Zeile übergebe ich zusätzliche Informationen, die nicht als Counter erfasst werden können, z.B. die MAC-SSID, Die Firmware-Version und die MAC-Adresse

2-Tage Ansicht

Bis die Grafiken später sinnvolle Werte anzeigen, dauert es dann natürlich noch etwas. Aber auf dem 2-Tage-Grapf sind die Schaltzeiten schon gut zu sehen. Morgens gegen 5 Uhr läuft die Pumpe z.B. für Tropfschläuche los. Da ist die "Einschaltdauer (ED)" aber nicht sehr hoch.

Von 6:00 - 07:00 Uhr wird dann aber schon deutlich mehr Strom verbraucht. Hier startet dann die Rasenbewässerung. Ich kann so also nicht nur schauen, ob die Funktion gegeben ist, sondern kann sogar erste Rückschlüsse draus ziehen, ob die Pumpe unterfordert ist. Dauernde "Ein/Aus"-Zyklen belasten den Motor ja höher und idealerweise läuft sie durch, wenn die Entnahmestelle die Menge auch liefern kann.

2-Stunden Ansicht

Leider ist meine Pumpe nicht Drehzahl-geregelt, d.h. sie misst nicht laufen den Druck und steuert nach sondern es gibt nur einen einfachen Schalter der bei einem oberen Druck abschaltet und bei zu wenig Druck wieder einschaltet. Diese Verhalten sehen Sie dann auf dem folgenden Bild:

Sie könnten annehmen, dass sie auf den ersten Blick erkennen, wann die Pumpe eingeschaltet ist und wann nicht. Die "Fläche" zeigt aber nur den Momentan-Verbrauch zum Zeitpunkt der Messung, die jede Minute erfolgt. Da sind natürlich Messungen dabei, bei denen die Pumpe läuft aber auch Messungen, bei denen die Pumpe aus ist, obwohl Wasser entnommen wird. Ein Druckausgleichsgefäß macht es möglich. Wenn der Sensor nur einmal pro Minute misst und die Pumpe vielleicht nur 20 Sek läuft, dann sieht PRTG nur bei jeder dritten Messung einen Momentan-Verbrauch. Erst wenn Ab 06:51 läuft die Pumpe dann wohl auf 100% ED, denn es gibt keine Lücke mehr in der Messung des Verbrauch von 1000 Watt.

Momentaufnahme und Differenzmessung

Das Problem der Abtastrate ist auf dem folgenden Bild noch mal deutlicher zu sehen.

Im diesem Bild sehen Sie eine rote schwach ansteigende Linie "Consumption Total (Wh)".Der primäre Sensor "Aktuell (Watt) zeigt aber nur einen Peak. Man könnte also glauben, dass die Pumpe genau einmal gelaufen ist. Das stimmt aber nicht, denn das ist ja nur eine Momentaufnahme und es kann ja sein, dass PRTG grade dann liest, wenn die Pumpe sich abgeschaltet hat aber das Wasser läuft und der Druckspeicher liefert. Das ist ein gutes Beispiel für die Probleme von "Momentaufnahmen" Erst aus der Differenz der Gesamt-Zählerstände zwischen zwei Messungen lässt sich der Energieverbrauch und damit die reale "Laufzeit" der Pumpe zuverlässig ermitteln, selbst wenn die Abtastrate des Sensors eigentlich zu grob ist.

So habe ich dann eine recht passable Kontrolle, ob und wann die Pumpe läuft. Auch wenn tagsüber manuell Wasser entnommen wird, kann PRTG dies erfassen. Da aber die Pumpenleistung auch vom Druck abhängig ist, kann ich nur sehr grob auf das geförderte Volumen schließen.

Weiterentwicklung

Aktuell ist PRTG hier nur "messend" aktiv. Der Shelly Plug S kann per HTTP oder MQTT auch aktiv gesteuert werden. Denkbar wäre schon die Ermittlung einer maximalen Betriebsdauer am Stück, so dass dann eine Notabschaltung über das eingebaute Relais erfolgen könnte. Auch die aktuell noch installiert mechanische Schaltuhr zwischen Shelly PlugS und der Pumpe zur "Nachtruhe" könnte der Shelly selbst per Software umsetzen. 1 Watt weniger wären auch 8,7kWh/Jahr (ca. 2,60€) eingespart.

Der Shelly kann natürlich seine Daten auch per MQTT an einen MQTT-Broker senden. Sobald PRTG z.B. diese Daten auch dort abgreifen kann, kann dieses Skript entfallen und die Belastung auf dem PRTG-Server weiter reduziert werden.

Weitere Links