Wetterbericht und Standort/Geolocation/GPS im Wohnmobil mit OpenWeatherMap API

Begonnen von Sprocki62, 13 April 2023, 14:13:05

Vorheriges Thema - Nächstes Thema

Sprocki62

Tach Gemeinde!
Ich hab nun schon viel mitgelesen und auch schon sehr viel Wissen hier aus dem Forum gezogen, konnte aber auf meinen Anwendungsbereich keine so richtig passenden Antworten finden.
Deshalb hab ich mich drangemacht und selbst mal was "gebastelt", was ich Euch gerne vorstellen möchte. Vielleicht hilft es ja dem einen oder anderen.
Hier mein "Fall":
Da ich in auf meinem Tablet im Wohnmobil immer den aktuellen Wetterbericht am jeweiligen Standort anzeigen lassen wollte und dabei auch die genauen Standortangaben (Adresse des Standorts) wissen möchte, hab ich mal ein wenig mit OpenWeatherMap und wechselnden GPS-Daten rumexperimentiert und möchte Euch gleich zwei funktionierende Lösungen für die Standort-Anzeige vorstellen.
Nutze dabei noch den API-Call Version 2.5. 

(Technische) Vorraussetzungen dabei:
Ein funktionierender Wetterbericht von Openweather (Setze ich jetzt hier mal als bekannt voraus)
z.B. defmod WoMoWetter Weather API=OpenWeatherMapAPI,endpoint:onecall,cachemaxage:600 apikey=xxxxxxxxxxxxx interval=3600
Setzen der aktuellen GPS-Daten, wenn ich unterwegs bin: mittels at-Job "set WoMoWetter newLocation [MQTT2_WoMo:lat],[MQTT2_WoMo:lon]" alle 15 min.

Edit: Bevor es zu Mißverständnissen kommt.. ich nutze die GPS-Daten zwei Mal.. einmal zur Bestimmung des Ortes für den Wetterbericht selbst (s.o.), und ein zweites Mal zum Bestimmung des OrtsNAMENS, der vom Weather-Modul bei mir mehr schlecht als recht bis garnicht angezeigt wird (das Reading "city" bleibt leer oder ist meistens falsch)
Deshalb die untenstehende "Übung", die mir die genauen Adressdaten meines jeweiligen Standortes liefert.


GPS-Daten:
a.) GPS-Daten werden mittels Android Handy/Tablet und OwnTracks über MQTT2 an den FHEM-Server im Womo gesendet(Raspberry 4).
Die GPS-Daten für unseren Zweck werden im OwnTracks-Device als userReadings definiert:
attr MQTT2_WoMo userReadings GPS { "lat=".(ReadingsVal("MQTT2_WoMo","lat",0))."&lon=".(ReadingsVal("MQTT2_WoMo","lon",0)) }
und liegen dann als Zeichenkette in der Form "lat=XX.XXXX&lon=YY.YYYY" vor. 
oder
b.) GPS-Daten werden über GPS-Empfänger (Wemos D1 mit Espeasy) über die ESP-Bridge an den FHEM-Server geschickt.
Die GPS-Daten für unseren Zweck werden im ESP-Device als userReadings definiert:
attr ESPEASY_GPS userReadings ESP_GPS { "lat=".(ReadingsVal("ESPEASY_GPS","latitude",0))."&lon=".(ReadingsVal("ESPEASY_GPS","longitude",0)) }und liegen dann als Zeichenkette in der Form "lat=XX.XXXX&lon=YY.YYYY" vor.

Die GPS-Quelle ist aber erst einmal egal, hauptsache GPS-Daten sind irgendwie vorhanden.

Problem: Standortbestimmung "Ortsname aus GPS-Daten", wenn nicht über Openweather angezeigt

Lösung 1: über den Geoservice der openweathermap-API.
Der API-Key ist dabei der gleiche wie für den Wetterbericht.
Abfrage:
http://api.openweathermap.org/geo/1.0/reverse?appid=xxxDein_API-Keyxxxx&lat=XXXX&lon=XXXX

Ergebnis ist eine JSON_Antwort, die mittels HTTPMOD weiterverarbeitet wird.

Definition (direkt zum Einfügen in eine RAW definition):
defmod geolocation HTTPMOD none 0
attr geolocation enableControlSet 1
attr geolocation enableCookies 1
attr geolocation enforceGoodReadingNames 1
attr geolocation extractAllJSON 1
attr geolocation get01Encode UTF-8
attr geolocation get01Name adress
attr geolocation get01URL http://api.openweathermap.org/geo/1.0/reverse?appid=xxxxxxxxxxxxxxxxxxxxxxxx&%%gps_data%%
attr geolocation getHeader1 Content-Type: application/json
attr geolocation getHeader2 Accept: */
attr geolocation replacement01Mode reading
attr geolocation replacement01Regex %%gps_data%%
attr geolocation replacement01Value MQTT2_WoMo:GPS
attr geolocation room Wetter
attr geolocation stateFormat 01_name
Die GPS-Daten (lat=XX.XXXX&lon=YY.YYYY) für die URL (in get01URL)  werden mit der Variable %%gps_data%%  (Wert aus dem Device MQTT2_WoMo:GPS) angehängt

Es wird dann u.a. ein Reading in der Form  01_name - MeinStandort erzeugt, was man dann z.B. in FTUI anzeigen kann.

Lösung 2: über den Geoservice von OSM OpenStreetMap.
Vorteil: Es wird KEIN API-Key benötigt!
Abfrage:
https://nominatim.openstreetmap.org/reverse?format=json&lat=XX.XXXX&lon=YY.YYYY

Ergebnis ist wiederum eine JSON_Antwort, die mittels HTTPMOD weiterverarbeitet wird.

Definition (direkt zum Einfügen in eine RAW definition):
defmod OSM_Location HTTPMOD none 0
attr OSM_Location enableControlSet 1
attr OSM_Location extractAllJSON 1
attr OSM_Location get01CheckAllReadings 1
attr OSM_Location get01Encode UTF-8
attr OSM_Location get01Name adress
attr OSM_Location get01URL https://nominatim.openstreetmap.org/reverse?format=json&%%gps_data%%
attr OSM_Location getHeader1 Content-Type: application/json
attr OSM_Location getHeader2 Accept: */
attr OSM_Location replacement01Mode reading
attr OSM_Location replacement01Regex %%gps_data%%
attr OSM_Location replacement01Value ESPEASY_GPS:ESP_GPS
attr OSM_Location room Wetter
attr OSM_Location stateFormat address_road address_house_number<br>\
address_postcode address_town (address_suburb)<br>\
address_county, address_state
Die GPS-Daten (lat=XX.XXXX&lon=YY.YYYY) für die URL (in get01URL) werden mit der Variable %%gps_data%%  (Wert aus dem Device ESPEASY_GPS:ESP_GPS) angehängt.

Es werden dann u.a. diverse Readings in der Form
 
address_town MeinStandort 
address_county MeinLandkreis
address_house_number 123
address_postcode 12345
address_road MeineStraße
address_state MeinBundesland

erzeugt, welche man dann z.B. in FTUI anzeigen oder auch im state  des Device anzeigen kann (siehe stateFormat).

Aktualisiert werden die Readings zur Zeit noch manuell mittels "get OSM_Location adress" bzw "get geolocation adress".
Eine regelmäßige Aktualisierung ist aber auch über das HTTPMOD [interval] oder per at-Job möglich.

Viel Spass beim Ausprobieren!

Grüße
Sprocki62

Dr. Boris Neubert

Danke für Deinen Beitrag, Sprocki62!

Ich habe noch einen Ergänzungsvorschlag: statt HTTPMod kannst Du auch das Weather-Modul verwenden, welches seit kurzem das OpenWeather-API unterstützt und auch ein Attribut hat, vom global abweichende Koordinaten zu setzen.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!