Wetterdaten - Wunderground API

Ich habe da vor einiger Zeit mal ein Modul für OpenWeather gemacht: Modul OpenWeatherMap

Ansonsten werden ich mich mit Wunderground-API noch beschäftigen, Solbad die neuen API-Key’s erhältlich sind (sollte eigentlich seit gestern soweit sein). Die API-Key’s sind aber, so wie es zur zeit aussieht, nur für Leute kostenlos, die auch mit eigener Wetterstation Daten liefern (was ich tue).

Gruß
demel

Diese Info kam heute zum Thema der neuen Keys:

Dear kind PWS users!

I write to make sure you know you are not forgotten. We are working hard to prepare the gateway to distribute the new API keys. Thank you for your continuing attention and patience.

I expect that it will be open by Friday, February 22 at the latest, and perhaps as early as Monday, February 18.

I will email you again just as soon as I have better information!

Yours very truly,

Victoria Gardner
Weather Underground API customer service

Ich werde auch mein Modul nachführen, also das PWS Upload Modul, falls es was zu tun gibt. Laut Victoria wird sich der Upload nicht ändern, aber wenn sich was tut werde ich es einbauen.

Ich hab hier ein Script für darksky gepostet. OpenWeatherMap ist bei mir sehr ungenau.

Baue Deinen eigenen Wetterdienst - Dark Sky API

Sebastian

als alternative habe ich hier aus gleichem grund mit apixu gearbeitet und bin damit eigentlich ganz zufrieden:

Wetter APIXU Script

Sven

Ich bohre gerade mein Modul auf, so das diejenigen die Wetterdaten zu Wunderground laden, auch wieder Daten laden können.

Wer hochlädt bekommt eine kostenlosen Schlüssel um Weather.com Daten zu laden - die Qualitativ bestimmt recht gut sind. Man muss halt auch hochladen.

Ich denke ich bin übers Wochenende fertig.

Update landet hier.

[Modul] Wunderground Wetterstation (PWS) Upload

Ich bin gerade dabei, SymconMisc/Wunderground anzupassen.

Eine Info, die ich von Wunderground bekommen habe: (fasst DU es noch nicht wissen solltest): der Forcaste funktioniert für die Keys der PWS-Besitzer kostenfrei nur als 5days-Variante (getestet). Ich hatte vorgestern erst mit der 7days-Variante getestet und bin immer gescheitert und habe denen dann geschrieben.

Bzgl des Upload der Daten zu Underground: da habe ich die Info von Wunderground, das sich da nichts ändert. Hast Du da andere Informationen?

Gruß
demel

Ja - die Infos decken sich. Upload bleibt gleich / Download ist neu.

vom Grundsatz her bin ich mit der Anpassung schon durch … ich muss nur noch details bearbeiten und die Übersetzung

Funktionen umfassen:

  • Download von „Übersichtswetter“ (1-5 Tage)
  • Download von Detailwetter (Dayparts - 1 - 12)
  • Möglichkeit die Art des Wetters zu wählen (Temp, Rain, Wind usw)
  • Möglichkeit Text vorhersagen einzeln zu wählen

Natürlich bleibt der Upload erhalten bez. wird erweitert.

Anbei mal ein Screenshot - evtl. müssen wir nicht alles doppelt machen.

Ach ja … die API liefert eine MENGE an Daten!!! Ich glaube wenn man alles lesen würde, benötigt man alleine dafür eine Unlimited Lizenz :slight_smile:

Ich werde vermutlich heute Nachmittag eine Beta in Github stellen. Aktuell bastel ich noch an der Konfigurierbarkeit, da es sonst zu viele Variablen werden.

Ok, dann machen ich erstmal nicht weiter, denn wenn dein Modul ja alles (soweit möglich) liefert, kann man ja darauf umsteigen, Module brauchen nicht doppelt zu sein. Ich selbst benutze nur einen Bruchteil davon (nur die 12h-Vorhersage für Temperatur und bräuchte auch die Regenvorhersage)

Wenn Du das Modul online hast, würde ich das gerne testen …

demel

Hi … Modul steht als Beta zum testen bereit.

Bitte Fehler und Ideen usw hier posten: [Modul] Wunderground Wetterstation (PWS) Upload - Seite 2 (in dem Fred gibt es noch ein paar Infos).

Ich denke es reicht auch einfach die Aussentemperatur zu laden um einen Key zu bekommen - wäre mal einen Versuch wert :rolleyes:

Hallo,

  1. Versuch:

Grund: ich hatte die Geo-Position mit Komma eingegeben. Wäre es nicht besser, die Properes als Float zu machen denn als String? Du müsste natürlich die Float entsprechend formatieren …
Ich habe das bei einigen Module auch so gemacht, wenn die Werte 0 sind hole ich die Position aus dem Location-Modul …

  1. Versuch

nach Korrektur der Position

Debug-Dump ist attached.

Ich kann natürlich gerne auch danach suchen, nur dann kollidieren ggfs. meine Korrekturen mit Änderungen von Dir?

Wenn ich das auf die schnelle richtig sehe ist der Wert, der in die Variable geschrieben werden soll, leer.

Um das abzufangen verwende ich immer eine solche Funktion


    protected function SetValue($Ident, $Value)
    {
        @$varID = $this->GetIDForIdent($Ident);
        if ($varID == false) {
            $this->SendDebug(__FUNCTION__, 'missing variable ' . $Ident, 0);
            return;
        }

        if (IPS_GetKernelVersion() >= 5) {
            $ret = parent::SetValue($Ident, $Value);
        } else {
            $ret = SetValue($varID, $Value);
        }
        if ($ret == false) {
            $this->SendDebug(__FUNCTION__, 'mismatch of value "' . $Value . '" for variable ' . $Ident, 0);
        }
    }

und einfach so aufrufen


$this->SetValue('DP0QPF', $DP0QPF);

Man muss zwar bei fehlende oder leeren Angaben den Inhalt (hier wäre ja eine 0 korrekt) sinnvollerweise abfangen, aber so knallt es nicht…

Eine Nachfrage zu dem Upload: Du hast in der Doku angegeben, das man das WU-Passwort angeben soll. Nicht den Station-Key? Ich mache im Rahmen von meinem Netatmo-Modul auch den Upload und da verwende ich Station-ID und Station-Key.

Gruß
demel

dump.txt (22.9 KB)

Hi Demel,

danke für Dein Feedback und die guten Hinweise. Ich schaue was ich wie einbauen kann - ich habe die Tage Zeit und kann rundschleifen.

Updates kommen dann im Modul Thread ebenso der Hinweis wann ich Updates habe.

Eine Sache die wirklich sehr suboptimal seitens der API ist, ist der Umstand das immer mal Werte leer sind. Ich werde es mal im WU Forum posten.

Wie findest Du die Konfigurierbarkeit? Ist sie ausreichend granular?

Enno

Ach ja … und zu

Eine Nachfrage zu dem Upload: Du hast in der Doku angegeben, das man das WU-Passwort angeben soll. Nicht den Station-Key? Ich mache im Rahmen von meinem Netatmo-Modul auch den Upload und da verwende ich Station-ID und Station-Key.

Station ID und Passwort werden benötigt. Dein Modul schaue ich mal mal an - da ich keine Netatmo habe, war das nicht auf dem Radar. Weiterhin muss ich meine Upload noch deutlich erweitern, da meine DAVIS eine Menge mehr Daten liefert (aktuell erfolgt der Upload via Meteobridge). Es gibt also noch einiges zu tun.

Das ist meiner Erfahrung nach ein Problem, das viele API’s haben.
Ich verwende daher meistens eine Funktion


    private function GetArrayElem($data, $var, $dflt)
    {
        $ret = $data;
        $vs = explode('.', $var);
        foreach ($vs as $v) {
            if (!isset($ret[$v])) {
                $ret = $dflt;
                break;
            }
            $ret = $ret[$v];
        }
        return $ret;
    }

die wird so aufgerufen


$temperature = $this->GetArrayElem($jdata, 'main.temp', 0);
$conditions = $this->GetArrayElem($ent, 'weather.0.description', '');

  • data ist als array aufgebaut (also json_decode(xxx, true))
  • var ist der Namen des Array-Elementes, wenn das Element tiefer in der Hierarchie liegt werden die einzelnen Ebenen der Pfad hierzu durch ‚.‘ getrennt
  • dflt ist der Standardwert, den ich einsetze, wenn das Element nicht da ist / leer ist

Tja, das ist immer so ein Frage. Da ich eine unlimited Version habe, ist die Anzahl der Variablen nicht so relevant. Du rufst ja sowieso hier nur den Forecast ab, nicht die aktuelle Daten (https://api.weather.com/v2/pws/observations/current). Zwischen den zwei Call würde ich dann unterscheiden.

Die aktuellen Daten hat man ja selber geliefert … wobei (um deine Idee aufzugreifen) … wenn man nur z.B. die Temperatur liefert - bekommt man bei diesem Abruf nur diese Information oder zB den Wind dazu?
Für mich kein Thema, weil ich alle Daten selbst ermittle (ausser UV und Sonneneinstrahlung) und für Dich ja eher auch nicht (wenn ich dich richtig verstehe). Man kann aber auch die aktuellen Daten anderer PWS abrufen …

Zusammengefasst - mir würde die granulieren völlig ausreichen.

Hierzu vielleicht noch eine Anregung: ggfs ist es ja erforderlich, die Daten, die man schicken will, umzurechnen (Windgeschwindigkeit hat der eine in m/s und der andere in km/h).
Man kann das natürlich so machen, das man sich selbst in IPS eine Zusatzvariable erstellt und laufen berechnet und diese dann verwendet - klar geht das. Finde ich aber irgendwie nicht so dolle (ganz persönliches „Gefühl“).
In IPSymconOpenWeatherMap/OpenWeatherStation machen ich das daher so, das ich optional ein Script aufrufe, das bekommt alle vorher ermittelten Daten und liefert diese dann, ggfs umgerechnet oder ergänzt, zurück. Diese zurückgelieferten Daten verwenden ich dann um OpenWeatherMap mit Daten zu versorgen.

Gruß
demel

Ich denke meine Theorie sollten gehen, da der Download von Wetterdaten als Forecast an Geodaten und nicht an die Station gekoppelt ist. Die „Station“ benötigt man „nur“ damit man einen API Schlüssel bekommt - das sollte es sein.

Ich schaue mir das die Woche mal genauer an - wenn das geht kann man die API mehr oder weniger wie bisher nutzen und bekommt genaue Wetterdaten.

sehe ich auch so.

meine letzte Anmerkung war nur auf current (also die aktuellen Daten) bezogen, also schickt Temperatur zu WU und bekommt dann aber den Ist-Zustand von Wind und Regen zurück.
Aber klar, ist eine andere Baustelle.

demel

Ja klar … Current kann nur das liefern was da ist. Bei uns gibt es theoretisch 2 Stationen im Ort und eine 5km weg … wer wirklich auf Wetterdaten angewiesen ist, benötigt lokale Sensoren - da ist m.E. auch WU was ansich genau ist, zu ungenau - es sei denn der Nachbar hat eine Wetterstation.

Hi Demel,
mal eine Frage … verwendest Du die von dir beschriebene Funktion für jede Variable? Wenbn ich den Code richtig lese, die prüfst Du jede Variable ob sie leer ist und ersetzt sie dann mit einem Validen Wert. Das ist soweit ja auch sinnvoll, aber bei über 200 potentiellen Variablen die evtl. leer sind eine Menge Code mit überschaubarem Nutzen?

Sehe ich hier was falsch? Natürlich wäre es super die NULL’s abzufangen. Evtl… macht es Sinn das nur bei denen zu tun wo es oft der Fall ist und das wäre das aktuelle Segment (daypart0).

Sehe ich hier was falsch?

Hallo,

es geht natürlich nur über die Variablen, die Du auch auswerten willst, das ist klar.

Aber unabhängig davon, wie viele es sind, stellen sich ja immer zwei Probleme

a) man greift auf eine Element (egal ob Objekt oder Array) der json-Struktur zu. Ist das nicht da, rumst es, das Script bricht ab.
Also muss man jeden Zugriff mit isset testen - der Code ist dann schon umfangreicher.

Meiner Erfahrung nach kann man sich nie darauf verlassen, das alle Emelente da sind. Ich habe früher auch weniger geprüft, habe aber dann in der Nacharbeit immer wieder mit Abbrüchen aufgrund fehlender Felder zu tun gehabt.

b) was macht man, wenn das Feld zwar da ist, aber keinen Inhalt hat? Es ist natürlich eine eigenen Frage, wie man damit umgeht, wenn für eine bestimmte Variable keine Werte mehr kommen. Manchmal mag das bedeuten, das es keinen (neuen) Wert gibt und der alte weiter gilt, meiner Erfahrung nach ist es aber i.d.R. nicht so zu verstehen, der bisherige Wert ist nicht mehr gültig
Das muss man natürlich selbst entscheiden, wie man das gewichtet bzw. wie das auch in der jeweiligen API zu verstehen ist.

leider gibt es bei den IPS-Variablen nicht einen NULL-Wert - also nicht die Zahl 0, sondern das NICHTS. Das wäre mir am liebsten, denn dann wäre klar, es gibt diesen Wert im Augenblick nicht, also versuche ich Ersatzwerte zu nehmen, die möglichst nicht „falsch“ sind bzw dem Wert entsprechend, die in IPS für neue Variablen verwendet werden (also false für bool bzw. 0 für int/float).

Das eigene SetValue() benutze ich ja, damit das Script nicht rumst, wenn der Datentyp nicht zum IPS-Variablentyp passt.

Eine Menge Code sehe ich da allerdings nicht, das ist ja nicht mehr als der Zugriff auch die Variable

das hier


$temperature = $jdata['main']['temp'];
SetValue($this->GetIDForIdent("TEMP"), $temperature);

bzw das hier


if (isset($jdata['main']['temp'])) {
    $temperature = $jdata['main']['temp'];
    SetValue($this->GetIDForIdent("TEMP"), $temperature);
}

ist doch nicht kürzer als das hier?


$temperature = $this->GetArrayElem($jdata, 'main.temp', 0); 
$this->SetValue('TEMP', $temperature );

Gruß
demel

FYI … am 22.03.2019 wird die alte API für den Wetterdownload abgestellt … wie man an neue Keys kommt steht nochmal in dem Dokument. Für den Download der Wetterdaten könnt ihr das Wunderground PWS Sync Modul verwenden [Modul] Wunderground Wetterstation (PWS) Upload

Turning off PWS-associated keys | The WeatherAPI Community Customer Community

Wichtig auf der Hinweis, dass man den neuen Key am besten mit Chrome oder Edge erstellt wenn man den Link aufruft :slight_smile: