PRTG und OpenWeatherMap

Ich überwache mit PRTG natürlich auch meine Solarzellen. Um die Daten besser einschätzen zu können, würde ich gerne die Außentemperatur und vor allem die Wolkendichte erfassen. die Außentemperatur könnte ich ja noch selbst mit einem Sensor einsammeln. Mit der Bewölkung tue ich mich aber etwas schwer. Noch habe ich keinen Raspberry mit einer Kamera, der den Himmel betrachtet. Aber es gibt ja Wetterdienste wie z.B. OpenWeatherMap", welche per API diverse Daten für nahezu jeden Ort der Welt bereitstellen. Wenn man nur eine Abfrage alle 10 Minuten macht, dann kostet der API-Zugriff nicht mal Geld.

API von OpenWeatherMap

Auf der Seite https://openweathermap.org/current#one beschreiben die Betreiber die API. Über einen einfachen HTTP-Request steuern Sie die API über Parameter der URL und erhalten eine JSON oder XML-Antwort zurück. Der einzige Schutz ist quasi eine AppID, die sie sich vorher anfordern müssen

Auf der Seite http://openweathermap.org/appid gibt es einen Link zu http://home.openweathermap.org/Users/sign_up, wo Sie sich ein Konto anlegen müssen. Genau genommen reicht eine Mailadresse und ein Kennwort. Es wird zwar eine Willkommensmail an die Adresse gesendet aber es erfolgt keine Überprüfung. Mit der dem eingerichteten Kennwort kommen Sie ins Portal und können sich einen API-Key anlegen. Den brauchen wir dann für den Aufruf

Für den Aufruf der API brauche ich natürlich noch meinen Ort. Dazu gibt es laut OpenWeatherMap nur einen Weg. Ich habe aber noch einen zweiten einfacheren Weg gefunden.

  • Suchen in der CityList
    Unter der URL http://bulk.openweathermap.org/sample/city.list.json.gz steht ein GZIP Archiv mit einer Liste aller Städte und der dazugehörigen ID bereit. gz-Dateien kann Windows selbst nicht auspacken. 7-Zip hilft aber dabei. Dennoch ist das Suchen in der Datei alles andere als einfach
  • Wetter-URL
    Ich bin daher einen anderen Weg gegangen und über die URL http://openweathermap.org/city kann ich einfach nach einer Stadt suchen und die Daten anzeigen. In der Adressliste sehe ich dann aber auch gleich die ID des Standorts:

Diese Nummer und meine AppID brauche ich nun, um die URL für die Daten abzurufen. Auch das kann ich im Browser simulieren. Ich fordere einfach die URL wie folgt an:

Sie sehen hier die ID der Stadt und den Anfang meiner AppID. Die Rückgabe ist hier eine JSON-Datei. PowerShell kann das mit Invoke-RESTMethod problemlos laden und verarbeiten.

Sensor für PRTG

Ausgestattet mit dem Wissen konnte ich nun wieder ein PowerShell-Script schreiben, welches PRTG als PRTG Custom Sensor regelmäßig aufruft. Da ich nur eine "Free"-Subscription nutze, darf ich natürlich maximal alle 10 Minuten eine Abfrage starten, was für Wetterdaten aber locker ausreicht. Das Skript habe ich daher so gestaltet, dass es die abgefragten Werte in einer Cache-Datei ablegt und über das "LastWriteTime"-Attribut prüft, ob die Daten schon älter als 10 Minuten sind. Nur dann wird wieder ein Request an den Service gestellt. So verhindere ich, dass das Throttling zum Einsatz kommt, d.h. dass OpenWeatherMap meine Anfragen nicht korrekt beantwortet.

prtg-openweathermap.ps1.txt
Nach dem Download die TXT-Extension wegnehmen, im EXEXML-Verzeichnis einer PRTG-Probe ablegen und natürlich die Parameter für den Ort und die AppID anpassen

Sie können das Skript direkt in das Verzeichnis "EXEXML" auf einer PRTG-Probe installieren, die auch Zugang zum Internet hat. Ich habe den Ort auf "Hövelhof" stehen lassen aber die AppID ist natürlich nicht gültig. Sie können das Skript gerne auch direkt per PowerShell starten. Es erkennt, wenn es nicht unter PRTG gestartet wird und aktiviert dann die Verbose-Ausgabe:

Das Skript ist allerdings erst eine erste Version. Ich habe bislang noch keine "Fehler" damit produzieren können. Es gibt daher auch noch keine Fehlerbehandlung im Skript, die z.B.: bei Nichterreichbarkeit des OpenWeatherMap-Service eine passende Meldung und Warnung als Status zurück gibt. Natürlich prüfe ich auch nicht vorher, ob der Platz und die Rechte zum Schreiben der Cache-Datei vorhanden ist. Da ist sicher noch Optimierungspotential. Das Skript schreibt auch die Cache-Datei im gleichen Verzeichnis. Wer hier vorbehalte hat, möge den Pfad der Datei in den Parametern entsprechend anpassen.

Einbindung in PRTG

Ein Sensor muss immer unter einem "Device" sein. Ich habe es mir eigentlich angewöhnt, solche Cloud-Dienste als eigenes "Device" anzulegen, selbst wenn ich dann 127.0.0.1 als IP-Adresse hinterlege. Das geht aber mit "Custom-Sensoren" nicht, die ein Skript aufrufen. Diese müssen immer unter einen Probe angelegt werden. Wenn Sie das Sensor-Skript schon in den Ordner "EXEXML" abgelegt haben, dann können Sie einen "Custom Sensor Extended" addieren und das Skript auswählen. Vergessen Sie aber nicht, vorher im Skript ihre APPID und den Ort einzutragen oder in PRTG als Parameter zu übergeben. Zudem sollten Sie sicherstellen, dass das Skript nicht häufiger als alle 10 Minuten die Daten abfragt, da sie ansonsten wieder die alten Messwerte bekommen.

Nach dem der erste Wert angekommen ist, können Sie die Kanäle noch etwas anpassen, damit die Anzeige später besser passt. Ich habe die Einheit aber vor allem die MIN/MAX-Werte manuell vorgeben, z.B.:

Kanal Einheit Min Max

TempC

2C"

-20

+50

Cloudiness

%

0

100

pressure mbar

mbar

900

1200

humidity

%

0

100

So weiß PRTG dann von vorneherein, wie der die Werte in die Grafiken einzeichnen soll

Beispieldaten

Mit einem Intervall von 15Min kommen natürlich bei weitem nicht so viele Messwerte zusammen, wie bei einer Messung je Minute. Bei "Wetter" ist das aber auch sicher ausreichend. Auf der Überblick-Seite können Sie gut die letzten Messwerte erkennen und prüfen, ob das so zutrifft.

Über einige Stunden hinweg sehen Sie dann schon die ersten Temperaturverläufe und die Veränderung der Luftfeuchte, die OpenWeatherMap berichtet.

Bislang habe ich noch nicht heraus gefunden, welche Wetterstation die Daten beisteuert aber bislang passen die Werte recht gut. Sie sehen z.B. auch, dass die Bewölkung zugenommen hat und daher auch die relative Feuchte zugenommen haben soll. Zumindest meldet das OpenWeatherMap.

Weiterentwicklung

Mit dem Wissen um die Temperatur kann man natürlich auch "aktiv" werden. So könnte ein anderes Skript z.B. die Temperaturen auslesen und entsprechend die Standheizung im Auto anwerfen. Das ist besonders interessant, wenn man ein E-Auto oder Plugin-Hybrid fährt, der am Stromnetz hängt und schon mal den Innenraum und die Batterie durch die Versorgungleitung temperieren kann, damit die Reichweite der Batterie weniger reduziert wird.

Ich habe mich aktuell auch auf die aktuelle Wettersituation beschränkt. über OpenWeatherMap kann man natürlich auch eine Wettervorhersage abfragen. In der "Free-Version" allerdings nur wenige Stunden in die Zukunft. Aber es könnte schon interessant sein die Vorhersagen genauso abzulesen und später zu prüfen, wie genau diese eingetroffen sind.

Weitere Links