Seite 1 von 1

How-to: Wetterdaten zu OpenWeatherMap hochladen, Beispiel Weatherman2.0

Verfasst: 23.11.2020, 21:34
von sailor79
Hallo zusammen,

letztes Wochenende konnte ich endlich meinen Weatherman 2 nach dieser Anleitung in Betrieb nehmen,
Danke auch nochmal an Eugen (@funkleuchturm):
wm2.png
Weatherman2 Bausatz stall.biz integriert in Gestell aus ausgemusterter HM-Station

Nun möchte ich die Daten regelmäßig an OpenWeatherMap.org, (nachfolgend OWM genannt), mittels CURL-POST direkt aus der CCU/ Rasperrymatic/ o.a. schicken.

Hierfür hat OWM eine eigene JSON-Schnittstelle, dessen marginale Beschreibung mich jedoch viel Zeit mittels trial&error gekostet hat.
Daher möchte ich im Folgenden meine Lösung zur Wiederverwendung posten:

ANLEITUNG
Es sind folgende Schritte notwendig:
  • 1. Vorbereitung: Free-Account auf OWM eröffnen, App Key generieren und Station registrieren
    2. Homematic-Programm erstellen
    3. Homematic-Script anpassen
    4. Erfolgreichen Datenempfang auf OWM prüfen
1. Vorbereitung
Die Voraussetzungen zum Betreiben einer Station auf OWM sind ein vorhandener Account, ein damit generierter App Key (="appid) und eine initial registrierte Station (="station_id). Beide IDs werden später im Script benötigt. Dies ist leider auch der aufwändigste Teil der Übung.

Hierfür sei auf folgende Schritt-für-Schritt Anleitung verwiesen im WXForum.net , ggf. unter zur Hilfenahme eines Advanced Rest Clients zum Abholen der Station ID (per API Response), falls mein keine anderen Bordmittel zur Verfügung hat.
:!: Hinweis: Nach Eröffnen eines Accounts UND generieren einer AppID kann es mehrere Stunden dauern, bis die AppID ansprechbar ist.

Ergänzend zum wxforum ist zu sagen, dass die station_id in der API Response in einem Advanced Rest Client nur id heißt:
Bildschirmfoto 2020-11-23 um 20.34.28.png
Daten hinterlegen und mit SEND absenden
Bildschirmfoto 2020-11-23 um 20.38.04.png
In der Antwort weiter unten "ID" rauskopieren -> Das ist benötigte station_id.
2. Homematic-Programm erstellen
Bildschirmfoto 2020-11-23 um 19.38.05.png
CCU Prog - Post alle 15min
3. Homematic-Script einfügen und anpassen, siehe Kommentare innerhalb des Scripts:

Hinweis: Das Script ist bewusst so gestaltet, das für den Weatherman (2) mit integrierter automatische Setvar-Funktion nur die appid sowie die station_id im 1. Abschnitt angepasst werden müssen.
Gleichzeitig können im Bedarfsfall in dem im Script nachfolgenden 2. Abschnitt jedoch die Systemvariablen einfach angepasst werden.
Falls Daten wie z.B. Windrichtung nicht vorhanden sind, müssen die zugehörigen Variablen im 3. Abschnitt entfernt werden.

Code: Alles auswählen

! Wetterdaten vom Weatherman2 zu openweathermap.org (OWM) mit Curl hochladen
! Version: 0.21, Autor: sailor79, Stand: 24.11.20

! Basis_ Weatherman 2.0, siehe https://www.stall.biz/project/der-weatherman-2-die-ideale-wetterstation-fuer-die-hausautomation
! Verfügbaren Variablen auf OWM, siehe https://openweathermap.org/stations#measurement

! #########################################################################################
! ### 1. Abschnitt                                                                      ###
! ### Einrichten einer eigenen Station vorher auf OWM, siehe Anleitung im Forum-Thread  ###
! ### unter https://homematic-forum.de/forum/viewtopic.php?f=31&t=62884#p620975         ###
! #########################################################################################

! Hier den eigenen API key von OWM zwischen den "" eintragen:
string appid = "1234abc";
! Hier den eigene numerische Stations-ID von OWM eintragen: Achtung - nicht "name" oder "external_id" von OWM verwenden.)
string station_id = "1111zzz";
! Falls im Weatherman das Variablen-Suffix _w geändert wurde, bitte hier anpassen:
string wm_suffix ="w_";

! #########################################################################################
! ### 2. Abschnitt                                                                      ###
! ### Weatherman-2: ab hier nichts mehr machen.                                         ###
! ### Andere Wetterstation: Ab hier Korrektur der vorhanden Systemvariablen, wenn nötig.###
! #########################################################################################

!  Aussen-Temperatur (in Grad Celsius) // Das Tages-Mittel ermittelt OWM.
string Aussentemperatur = (wm_suffix)#"temperatur";
!  Taupunkt (in Grad Celsius)
string Taupunkt = (wm_suffix)#"taupunkt";
!  Rel. Luftfeuchtigkeit (in %)
string Luftfeuchtigkeit_rel = (wm_suffix)#"feuchte_rel";
!  Luftdruck N.N. (in hPa) // Die Höhe stellt man sowohl im Weatherman also auch auf OWM einmalig vorher
string Luftdruck = (wm_suffix)#"barometer";
!  Mittlere Windgeschwindigkeit (in m/s)
!  Hinweis: Weatherman stellt die Werte in km/h zur Verfügung, auch wenn die Systemvariable mittels automatischer setvar in Weatherman versehentlich die Einheit m/s anzeigt, Stand 22.11.20
string Windgeschwindigkeit_mittel = (wm_suffix)#"wind_mittel";
!  Windspitze (in m/s)
string Windspitze = (wm_suffix)#"wind_spitze";
!  Windrichtung (0-360°)
string Windrichtung = (wm_suffix)#"wind_dir";
!  Regenmenge letzte Stunde (in mm)
string Regenmenge1h = (wm_suffix)#"regen_letzte_h";
!  Regenmenge vorheriger Tag (in mm)
string Regenmenge_gestern = (wm_suffix)#"regen_mm_gestern";

! #########################################################################################################################
! ### 3. Abschnitt                                                                                                      ###
! ### Im Falle nicht genutzter Variablen unter 3. Variablendeklaration + CURL String diese Variablen zwingend entfernen ###
! #########################################################################################################################

! *** Variablendeklaration für OWM und Werte holen ***
integer dt = system.Date("%F %T").ToTime().ToInteger(); ! *** OWN erwartet die Unix-Zeit ***
real temperature = dom.GetObject(Aussentemperatur).Value();
real dew_point = dom.GetObject(Taupunkt).Value();
real humidity = dom.GetObject(Luftfeuchtigkeit_rel).Value();
real pressure = dom.GetObject(Luftdruck).Value();
real windspeedkmh = dom.GetObject(Windgeschwindigkeit_mittel).Value();
real wind_speed = windspeedkmh / 3.6; ! Umrechnung in m/s
real windgustkmh = dom.GetObject(Windspitze).Value();
real wind_gust = windgustkmh / 3.6; ! Umrechnung in m/s
integer wind_deg = dom.GetObject(Windrichtung).Value();
real rain_1h = dom.GetObject(Regenmenge1h).Value();
real rain_24h = dom.GetObject(Regenmenge_gestern).Value();

! *** OWM URL Stand 22.11.20 & AppID zusammensetzen  ***
string wurl = "http://api.openweathermap.org/data/3.0/measurements?appid="#appid#"";

! *** Curl String zusammenstellen, Nomenklatur gemäß https://openweathermap.org/stations#measurement, Stand 22.11.20 ***
string postreq = "curl -X POST -H \"Content-Type: application/json\" "#wurl#" -d '[{\"station_id\":\""#station_id#"\",\"dt\":"#dt#",\"temperature\":"#temperature#",\"dew_point\":"#dew_point#",\"humidity\":"#humidity#",\"pressure\":"#pressure#",\"wind_speed\":"#wind_speed#",\"wind_gust\":"#wind_gust#",\"wind_deg\":"#wind_deg#",\"rain_1h\":"#rain_1h#",\"rain_24h\":"#rain_24h#"}]'";

! *** Werte an OWM mittel Curl POST senden.  ***
system.Exec(postreq);
! WriteLine(dt); ! Optional Ausgabe der Unixtime - zum Testen ! am Anfang dafür entfernen


4. Erfolgreichen Datenempfang auf OWM prüfen

Ca. 5min nach ausführen des CCU-Programms sollten die Daten auf OWM abrufbar sein.
Zum Testen, ob das CCU-Programm erfolgreich ausgeführt wurde UND Daten bei OWM angekommen sind, benutze ich wie unter 1. einen Advanced Rest Client oder einfacher, gebe nachfolgende Zeile direkt in den Browser ein, in meinem Fall Chrome:

Code: Alles auswählen

http://api.openweathermap.org/data/3.0/measurements?appid=1234abc&station_id=1111zzz&type=h&limit=100&from=1606136000&to=1606236620
Hierbei ist allerdings Eure appid=..., die station_id=... anzupassen sowie ein Zeitraum einzugeben, welcher vor Eurem Curl-Post startete (from=...) und nach dem Post (to=...) endete.
:!: Der Zeitraum wird hier in Unix-Time angegeben werden. In Homematic unter Script testen z.B. so:

Code: Alles auswählen

integer unixtime_jetzt = system.Date("%F %T").ToTime().ToInteger();
WriteLine(unixtime_jetzt);
Wenn alles sauber konfiguriert ist, sollte im Browser etwa so etwas ausgeben werden: :mrgreen:
Bildschirmfoto 2020-11-23 um 20.14.01.png
4. Browsertest - Daten erfolgreich zur Station gepostet
Wenn nichts hochgeladen wurde, aber die IDs und damit die Authentifizierung korrekt sind, dann lautet die Ausgabe etwa(Array(0)).

Viele Grüße
Marc

--
Edit 24.11.20: Code Abschnitte im Script ergänzt, passend zur Beschreibung im Beitrag

Re: How-to: Wetterdaten zu OpenWeatherMap hochladen, Beispiel Weatherman2.0

Verfasst: 24.11.2020, 10:08
von funkleuchtturm
... sehr schön! :D

Wenn Du einverstanden bist, dann verlinke ich auf meiner Webseite den WEATHERMAN-Beitrag mit diesem Thread.

Re: How-to: Wetterdaten zu OpenWeatherMap hochladen, Beispiel Weatherman2.0

Verfasst: 24.11.2020, 10:33
von sailor79
funkleuchtturm hat geschrieben:
24.11.2020, 10:08
... sehr schön! :D

Wenn Du einverstanden bist, dann verlinke ich auf meiner Webseite den WEATHERMAN-Beitrag mit diesem Thread.
Gerne ;-)