[gelöst] HTTPMOD: Tricky RegEx für JSONP DWD Warnungen

Begonnen von FhemPiUser, 25 Februar 2017, 10:51:58

Vorheriges Thema - Nächstes Thema

FhemPiUser

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) 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?



frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

FhemPiUser

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)

frank

schlechtes beispiel: 10 unterschiedliche regionen mit jeweils einem event.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

FhemPiUser

#4
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.

FhemPiUser

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.

frank

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":"([^"]+)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

FhemPiUser

Wow, super, das sieht deutlich einfacher aus, vielen Dank!

Ich teste es mal, jetzt muss es nurmal ein paar Unwetterwarnungen geben ;)

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

FhemPiUser

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

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html