FHEM Forum

FHEM => Sonstiges => Thema gestartet von: FhemPiUser am 25 Februar 2017, 10:51:58

Titel: [gelöst] HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 10:51:58
Ich möchte mir mit HTTPMOD die Warnungen für meine Region aus der JSONP-Schnittstelle Warnungen des Deutschen Wetterdienstes DWD (http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json (http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json)) extrahieren und suche dafür eine RegEx. Das schwierige ist, dass es mehrere Warnungen pro Region geben kann, die ich natürlich alle extrahieren muss.

Die Syntax des JSONP (siehe auch Link oben) ist im einfachsten Fall wie folgt:

...<RegionsID>...event:"<event>"...

Die <RegionsID> ist eine vorgegebene Zahl für die gesuchte Region, das <event> möchte ich extrahieren.

Dieser Fall funktioniert mit der RegEx:

<RegionsID>.+?event":"(.*?)"

Es kann aber auch sein, dass es mehrere events für eine RegionsID X gibt, z.B.

...<RegionsIDX>...event:"<event>"...event:"<event>"...<RegionsIDY>...event:"<event>"...

oder auch mehrere RegionsIDX-Einträge:

...<RegionsIDX>...event:"<event>"...event:"<event>"...<RegionsIDY>...<RegionsIDX>...event:"<event>"...

Im letzten Fall müsste die RegEx also alle 3 events extrahieren.

Folgende RegEx kann im Online RegEx Tester zumindest die events von mehreren RegionsIDX-Einträgen extrahieren, aber nicht mehrere Events von einem RegionsIDX-Eintrag.

{"<RegionsID>":\[.*?(?:event":"([^"]+)".+?)\]

Mit einer weiteren kann ich die letzten Matches bekommen:

{"<RegionsID>":\[.*?(?:event":"([^"]+)".+?)+\]

Hat ein RegEx-Experte einen Tip, wie man das mit einer HTTMPMOD RegExs erreichen kann? Oder geht das garnicht?


Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: frank am 25 Februar 2017, 12:16:39
Zitatoder auch mehrere RegionsIDX-Einträge:
...<RegionsIDX>...event:"<event>"...event:"<event>"...<RegionsIDY>...<RegionsIDX>...event:"<event>"...


Im letzten Fall müsste die RegEx also alle 3 events extrahieren.
was ist denn die bedeutung der unterschiedlichen struktur? hast du ein beispiel für diesen fall?
ich sehe zur zeit nur einfache paare.

du kannst natürlich auch mehrere capture groups in eine regex integrieren.
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 12:45:05
Beispiel ist wie folgt:

warnWetter.loadWarnings({"time":1488015792000,"warnings":{"903457002":[{"start":1488016800000,"end":1488106800000,"regionName":"Insel Borkum","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"NS","instruction":"","state":"Niedersachsen"}],"903461002":[{"start":1488016800000,"end":1488106800000,"regionName":"Kreis Wesermarsch - Küste","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"NS","instruction":"","state":"Niedersachsen"}],"103156000":[{"start":1487952000000,"end":1488020400000,"regionName":"Kreis Osterode am Harz","level":2,"type":5,"altitudeStart":null,"event":"FROST","headline":"Amtliche WARNUNG vor FROST","description":"Es tritt leichter Frost zwischen -1 °C und -4 °C auf.","altitudeEnd":null,"stateShort":"NS","instruction":"","state":"Niedersachsen"}],"901054002":[{"start":1488016800000,"end":1488106800000,"regionName":"Kreis Nordfriesland - Küste","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"103405000":[{"start":1488016800000,"end":1488106800000,"regionName":"Stadt Wilhelmshaven","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"NS","instruction":"","state":"Niedersachsen"}],"903452002":[{"start":1488016800000,"end":1488106800000,"regionName":"Kreis Aurich - Küste","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"NS","instruction":"","state":"Niedersachsen"}],"501000005":[{"start":1488006000000,"end":null,"regionName":"Nordfriesische Küste","level":3,"type":1,"altitudeStart":null,"event":"WIND","headline":"Amtliche Warnung des Seewetterdienstes Hamburg vor WIND","description":"Südwest 7, dabei Böen von 9 Beaufort.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"501000001":[{"start":1488006000000,"end":null,"regionName":"Ostfriesische Küste","level":3,"type":1,"altitudeStart":null,"event":"WIND","headline":"Amtliche Warnung des Seewetterdienstes Hamburg vor WIND","description":"Südwest 6 bis 7, dabei Böen von 8 Beaufort.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"901056002":[{"start":1488016800000,"end":1488106800000,"regionName":"Insel Helgoland","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"501000002":[{"start":1488006000000,"end":null,"regionName":"Helgoland","level":3,"type":1,"altitudeStart":null,"event":"WIND","headline":"Amtliche Warnung des Seewetterdienstes Hamburg vor WIND","description":"Südwest 7, dabei Böen von 9 Beaufort.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],...

(siehe http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json (http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json))
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: frank am 25 Februar 2017, 13:07:56
schlechtes beispiel: 10 unterschiedliche regionen mit jeweils einem event.
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 13:39:38
stimmt, sorry, momentan gibt es nicht so viele Warnungen.

Ich habe mal ein Beispiel zusammengebaut:

warnWetter.loadWarnings({"time":1488025931000,"warnings":{"901055002":[{"start":1488031200000,"end":1488092400000,"regionName":"Kreis Ostholstein - Küste","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf. In exponierten Lagen muss mit Sturmböen um 65 km/h (18m/s, 35kn, Bft 8) gerechnet werden.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"},{"start":1488031200000,"end":1488092400000,"regionName":"Kreis Ostholstein - Küste","level":2,"type":1,"altitudeStart":null,"event":"SCHNEE","headline":"Amtliche WARNUNG vor SCHNEE","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf. In exponierten Lagen muss mit Sturmböen um 65 km/h (18m/s, 35kn, Bft 8) gerechnet werden.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"101002000":[{"start":1488031200000,"end":1488092400000,"regionName":"Stadt Kiel","level":2,"type":1,"altitudeStart":null,"event":"WINDBÖEN","headline":"Amtliche WARNUNG vor WINDBÖEN","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf. In exponierten Lagen muss mit Sturmböen um 65 km/h (18m/s, 35kn, Bft 8) gerechnet werden.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"},{"start":1488031200000,"end":1488092400000,"regionName":"Stadt Kiel","level":2,"type":1,"altitudeStart":null,"event":"SCHNEE","headline":"Amtliche WARNUNG vor SCHNEE","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf. In exponierten Lagen muss mit Sturmböen um 65 km/h (18m/s, 35kn, Bft 8) gerechnet werden.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}],"901055002":[{"start":1488031200000,"end":1488092400000,"regionName":"Kreis Ostholstein - Küste","level":2,"type":1,"altitudeStart":null,"event":"FROST","headline":"Amtliche WARNUNG vor FROST","description":"Es treten Windböen mit Geschwindigkeiten um 55 km/h (15m/s, 30kn, Bft 7) aus südwestlicher Richtung auf. In exponierten Lagen muss mit Sturmböen um 65 km/h (18m/s, 35kn, Bft 8) gerechnet werden.","altitudeEnd":null,"stateShort":"SH","instruction":"","state":"Schleswig-Holstein"}]},"vorabInformation":{},"copyright":"Copyright Deutscher Wetterdienst"});

Region 901055002 hat jetzt 2 Einträge, eins mit 2 events, eins mit einem.

Ergebnis sollten also die 3 "event" captures "WINDBÖEN", "SCHNEE", "FROST" sein.
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 14:11:46
hmm, in meinem Regex tester klappt folgendes:

"901055002":\[\{.*?event":"([^"]+)"[^\}]*?\}(?:\,\{.*?event":"([^"]+)"[^\}]*?\})?

Damit kann ich allerdings nur bis zu 2 events pro Regionseintrag capturen, bei 3 gehen es nicht mehr.
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: frank am 25 Februar 2017, 14:15:42
ahh, jetzt weiss ich was du meinst. ich hatte immer nach regionName sortiert.
das ist auch hier viel eindeutiger. immer ein regionName mit jeweils einem event.

hiermit bekomme ich dann alle 3 events im regextester
"regionName":"Kreis Ostholstein - Küste".*?"event":"([^"]+)
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 14:24:14
Wow, super, das sieht deutlich einfacher aus, vielen Dank!

Ich teste es mal, jetzt muss es nurmal ein paar Unwetterwarnungen geben ;)
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: frank am 25 Februar 2017, 14:30:39
gibt es dieses json auch auf gemeindeebene?
Titel: Antw:HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: FhemPiUser am 25 Februar 2017, 14:38:42
noch nicht, aber ist geplant:

Zitat+++NEU+++ Ein JSONP-File auf Gemeindeebene in Form des Landkreis-JSONP wird derzeit noch nicht angeboten.
Hintergrund: Diese Datei ist Grundlage für die Datenversorgung der Warnanwendung im Internet.
Um das Datenmanagement für 11.000 Gemeinden zu organisieren, wurde die Dateistruktur so verändert, dass sie derzeit zum Auslesen von einzelnen Gemeinden nicht geeignet ist.
Ziel soll es aber sein, auch für Gemeinden so eine genial einfache Schnittstelle anzubieten.

siehe http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html (http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html)
Titel: Antw:[gelöst] HTTPMOD: Tricky RegEx für JSONP DWD Warnungen
Beitrag von: frank am 25 Februar 2017, 14:44:22
merci