Wetterdaten von AccuWeather mit einem PHP-webserver zuverlässig abrufen

Wetterdaten von AccuWeather mit einem PHP-webserver zuverlässig abrufen

Sie möchten Wetterdaten in der Homematic haben, besitzen aber keine teuere Homematic Wetterstation? Wer auf sekundengenaue Daten verzichten kann, der kann die Daten bequem aus dem Internet importieren. Ich hatte schon eine Lösung vorgestellt, wie die Wetterdaten von AccuWeather abgerufen werden können. Diese Lösung war ziemlich einfach zu umsetzen, war aber nicht besonders zuverlässig.  Deswegen möchte ich eine zuverlässige Lösung vorstellen, wie man die Wetterdaten von AccuWeather mithilfe eines PHP-Skripts abgreifen kann und diese anschließend beliebig in Homematic Programmen wie z.B. in einer Gartenbewässerung usw. verwenden. Für diese Lösung wird ein PHP-Server (hier Synology Diskstation) benötigt.

Voraussetzungen

  • Internetanschluss
  • Homematic CCU / CCU2 / CCU3 / RaspberyMatic
  • Installiertes XML-API CCU Addon
  • Installiertes CUxD Daemon CCU Addon
  • PHP-Server mit der Unterstützung von cURL
    (hier: Sysnology Diskstation, es kann aber ein anderer Web-Server eingesetzt werden, der PHP und cUrl unterstützt, z. B. hier)

Funktionsprinzip

Das Abrufen von Wetterdaten von AccuWeather funktioniert so: Auf der CCU läuft ein Programm, das periodisch einen HTTP-Request an den PHP-Server sendet und das PHP-Skript auslöst. Das PHP-Sktipt nimmt die Wetterdaten von AccuWeather und verarbeitet diese. Die verarbeiteten Wetterdaten werden an die entsprechenden Systemvariablen in der CCU weitergeleitet, sofern die Verknüpfungen zu den Homematic Systemvariablen bestehen.

 

PHP-Server

Für diese Lösung wird ein PHP-Server mit cURL-Unterstützung benötigt. Es kann entweder ein lokaler oder ein globaler (z. B. hier) PHP-Server sein. Für diese Lösung benutze ich einen eigenen lokalen PHP-Server, der auf Synology Diskstation läuft. In diesem Kapitel werde ich beschreiben, wie ein PHP-Server auf Synology Diskstation eingerichtet wird. Falls ihr einen anderen PHP-Server verwendet oder den schon eingerichtet habt, könnt ihr das Kapitel überspringen.

Web-Server auf Synology Diskstation einrichten

Falls ihr einen anderen Web-Server verwendet, könnt ihr dieses Kapitel überspringen. Bei einem globalen Web-Server müsst ihr einen Fernzugriff auf CCU einrichten.

Hier wird als PHP-Webserver Synology DiskStation DS218j eingesetzt. Bitte vor dem Start darauf achten, dass Sie bereits Folgendes ausgeführt haben:

  • EZ-Internet ist eingerichtet und Port 80 ist konfiguriert, falls nicht, EZ-Internet öffnen und den weiteren Schritten des EZ-Internet-Assistenten folgen (Hinweis: Das Einrichten der Portweiterleitung mit EZ-Internet überschreibt die vorhandenen Portweiterleitungsregeln auf dem Router).
  • Web Station und PHP 5.6 bzw. PHP 7.2 sollen installiert werden

Mit der Web Station kann auf Synology DiskStation eine Website (in diesem Fall PHP-Skript) erstellt werden. Der freigegebene Standardordner „web“ wird von Web Station bereitgestellt, dort können die Webseitendateien zur Erstellung der Websites gespeichert werden. Die Webanwendung mithilfe von Web Station erstellen:

Die Web Station öffnen und zu Allgemeine Einstellungen gehen, um den HTTP Back-end-Server und das PHP-Profil auszuwählen. Hier habe ich zu Demonstrationszwecken der Nginx-Server sowie das Standardprofil (PHP 5.6) ausgewählt.

Zu den PHP-Einstellungen gehen und auf die Schaltfläche Bearbeiten (Edit) klicken, um die PHP-Erweiterungen zu aktivieren.

Wählen Sie Kontrollkästchen aus, um alle Erweiterungen zu aktivieren.

Im Web-Ordner /web ein weiteres Ordner AccuWeather erstellen (ist aber nicht zwingend notwendig).

Die Einrichtung von Synology DiskStation ist somit abgeschlossen.

API-Daten von AccuWeather

API Key von AccuWeather generieren

Anmelden bei developer.accuweather.com.

Klicken auf „My Apps“ → „Add a New App“, alles ausfüllen und anschließend auf „Create App“ klicken. Das neue App wird erstellt.

Auf das erstellte App klicken, dort findet man das API-Key (s. Bild unten).

Das Benutzen von AccuWeatehr-API ist für private Zwecke kostenlos, es gibt allerdings die Begrenzung der Tagesaufrufe der API: 50-mal/Tag pro Account. Pro Skripdurchlauf werden 2 API-Aufrufe gemacht. Wenn die Wetterdaten stündlich aktualisiert werden, wird 24*2 = 48 Aufrufe/Tag verbraucht, was noch unterhalb der Begrenzung liegt. Mit 2 Accounts (also 2 API-Keys) können die Wetterdaten halbstündlich aktualisiert werden.

Die unten stehende Tabelle zeigt, wie viele Abrufe der Wetterdaten pro Tag in Abhängigkeit von der Anzahl der API-Keys gemacht werden können:

Wetterstation ID suchen

Auf accuweather.com gehen, im Suchfeld der gewünschte Standort eingeben. In dem Adressenfeld des Browsers die 6-stellige Zahl merken, das ist das Wetterstation-ID.

System-Variablen am CCU anlegen

Um die Daten von AccuWeather in der CCU abzuspeichern, sollen Systemvariablen angelegt werden. Folgende zwei Tabellen zeigen Wetterdatenparameter, die von AccuWeather abgefragt werden können. Für jeweils einen Parameter, den ihr in CCU abspeichern wolltet, wird eine Systemvariable auf der CCU benötigt. Dabei ist es nicht notwendig, für alle Paramtern jeweils eine Systemvariable anlegen. Ihr könnt die Variablen für die Parameter anlegen, die ihr braucht. Die Namen für die angelegten Systemvariablen können beliebig gewählt werden. Die Verknüpfung der angelegten Variablen zu den AccuWeather Parametern erfolgt durch ime_id (XML-API) der Variblen und ist unabhängig von den Variablennamen, dazu kommen wir aber später. Wenn die Variablen angelegt sind, können wir zu dem nächsten Schritt gehen.

Wetterdaten für das aktuelles Wetter

Parameter Typ Beschreibung
WeatherText string Phrase description of the current weather condition. Displayed in the language set with language code in URL.
Temp float Rounded value in specified units. May be NULL.
RealFeelTemp float Patented AccuWeather RealFeel Temperature. Contains Metric and Imperial Values.
RealFeelTempShade float Patented AccuWeather RealFeel Temperature in the shade. Contains Metric and Imperial Values.
RelativeHumidity float Relative humidity. May be NULL.
DewPoint float Dew point temperature. Contains Metric and Imperial Values.
Wind_Direction_Deg float Wind direction in Azimuth degrees (e.g. 180 degrees is a wind coming from the south). May be NULL.
Wind_Direction string Direction abbreviated in the language specified by language code in URL.
Wind_Speed float Wind Speed. Contains Metric and Imperial Values.
WindGust_Speed float Wind gust speed. Contains Metric and Imperial Values.
UVIndex int32 Measure of the strength of the ultraviolet radiation from the sun. May be NULL.
UVIndexText string Text associated with the UVIndex.
Visibility float Visibility. Contains Metric and Imperial Values.
CloudCover float Number representing the percentage of the sky that is covered by clouds. May be NULL.
Ceiling float Cloud ceiling. Contains Metric and Imperial Values.
Pressure float Atmospheric pressure. Contains Metric and Imperial Values.
PressureTendencyText string Description of the pressure tendency in the language specified by language code in the URL.
Past24HTempDeparture float Departure from the temperature observed 24 hours ago. Contains Metric and Imperial Values.
ApparentTemp float Perceived outdoor temperature caused by the combination of air temperature, relative humidity, and wind speed. Contains Metric and Imperial Values.
WindChillTemp float Perceived air temperature on exposed skin due to wind. Contains Metric and Imperial Values.
WetBulbTemp float The temperature to which air may be cooled by evaporating water into it at constant pressure until it reaches saturation. Contains Metric and Imperial Values.
Precip1hr float Amount of precipitation (liquid water equivalent) that has fallen in the past hour. Contains Metric and Imperial Values.
TempSummary_Past6HRange_min float The minimum temperature observed over the past 6 hours. Contains Metric and Imperial Values.
TempSummary_Past6HRange_max float The maximum temperature observed over the past 6 hours. Contains Metric and Imperial Values.
TempSummary_Past12HRange_min float The minimum temperature observed over the past 12 hours. Contains Metric and Imperial Values.
TempSummary_Past12HRange_max float The maximum temperature observed over the past 12 hours. Contains Metric and Imperial Values.
TempSummary_Past24HRange_min float The minimum temperature observed over the past 24 hours. Contains Metric and Imperial Values.
TempSummary_Past24HRange_max float The maximum temperature observed over the past 24 hours. Contains Metric and Imperial Values.

Wetterdaten für die 1-tagiges Wettervorhersage

PHP-Script zum Abrufen der Wetterdaten von AccuWeather anpassen

Für Abrufen der Wetterdaten von AccuWeather und deren Weiterleitung an das CCU ist das PHP-Script verantwortlich. Das Skript kann hier heruntergeladen werden:

Herunterladen

Das heruntergeladene PHP-Skript soll mit eigenen Daten ergänzt werden:

In folgender Zeile soll die IP-Adresse von der CCU eingetragen werden: $ccuIP = "http://192.168.XXX.XXX";

Falls der PHP-Server sich nicht im lokalen Netzwerk befindet, kann hier auch die Webadrese der CCU eingetragen werden: $ccuIP = "http://ccu-adresse";. Die CCU soll in diesem Fall von Außen zugänglich sein.

In dieser Zeile soll Wetterstation-ID aus dem oberen Kapitel eingetragen werden: $wetterstationID = "XXXXXX";

Hier sollen Api-Keys (mindestens 1) eingetragen werden: $apiKeys = array("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

Bei AccuWeather gibt es aktuelle eine Begrenzung der API-Aufrufe, es können insgesamt 50 API-Aufrufe pro Tag erfolgen. In dem PHP-Skript erfolgen zwei AccuWeather API-Aufrufe pro Skriptdurchlauf. Diese bedeutet, dass mit einem Api-Key können die Wetterdaten 25-mal pro Tag von AccuWeather abgerufen werden, mit zwei Api-Keys dementsprechend 50-mal usw.

Somit würde ich empfehlen, sich bei mehreren Accounts anzumelden und bei jedem Account einen Api-Key erstellen, um die Zeit zw. zwei Abrufen der Wetterdaten zu minimieren. Zeit zwischen zwei Aktualisierungen der Wetterdaten in Abhängigkeit von der Anzahl der Api-Keys zeigt folgende Tabelle:

Im nächsten Abschnitt des PHP-Skripts sollen nun die Homematic Systemvariablen mit den jeweiligen AccuWeather-Parametern verknüpft. Die Homematic-Systemvariable ist mit dem AccuWeather-Parameter verknüpft, wenn ise_id der zu verknüpfenden Systemvariable bei jeweiligem AccuWeather-Parameter eingetragen ist. Es ist nicht notwendig, alle AccuWeather-Parameter mit Homematic Systemvariablen zu verknüpfen.  Die Wetterdaten werden nur den Homematic Systemvariablen übergeben, deren ise_id bei den AccuWeather-Parametern eingetragen ist. Hier findet ihr die ise_id’s der zuvor angelegten Homematic Systemvariablen:  http://CCU-IP-Adresse/addons/xmlapi/sysvarlist.cgi .

Bei mir sieht es z. B. so aus:

//ise_id von Homematic Variablen (general)
$WeatherProvider_ise_id = "10735";  //als Wert wird immer "AccuWeather" übertragen

//ise_id von Homematic Variablen
//Wetter momentan
$WeatherText_ise_id = "10412"; 
$Temp_ise_id = "10409";
$RealFeelTemp_ise_id = "10491";
$RealFeelTempShade_ise_id = "10495";
$RelativeHumidity_ise_id = "10411";
$DewPoint_ise_id = "";
$Wind_Direction_Deg_ise_id = "";
$Wind_Direction_ise_id = "";
$Wind_Speed_ise_id = "10408";
$WindGust_Speed_ise_id = "";
$UVIndex_ise_id = "10492";
$UVIndexText_ise_id = "10493";
$Visibility_ise_id = "";
$CloudCover_ise_id = "";
...

Programm anlegen

Das Abrufen der Wetterdaten erfolgt mit einem Programm im Web-UI, das periodische ausgeführt wird. Dafür ein neues Programm anlegen.

Bedingung: Wenn…: Zeitsteuerung mit folgenden Einstellungen:

Der Zeitinterwall kann in Abhängigkeit von der Anzahl der AccuWeather-API-Keys entsprechend der oben aufgeführten Tabelle eingetragen werden. Bei einem Api-Key ist der Zeitintervall z. B. 57 min.

Hier nochmal die Tabelle:

Aktivität Dann…: Script

!Wetterdaten anfordern............................................................

string url="http://Adresse-des-PHP-Servers/Wetter/AccuWeather.php";

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1); 
string responce = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

!responce = "OK" bei erfolg oder "ERROR" beim Fehler

if (responce == "ERROR") {
  ! Hier können die Abläufe ausgeführt werden,
  ! wenn der PHP-Skript ein Fehler beim Abruf
  ! der Wetterdaten meldet
  
}

Die Zeile string url="http://Adresse-des-PHP-Servers/wetter/AccuWeather.php"; soll mit ihrer eigener Adresse des PHP-Servers ergänzt werden. Ich verwende einen lokalen PHP-Server, der auf Synology Diskstation läuft, deswegen sieht es bei mir so aus: string url="http://192.168.xxx.xxx/Wetter/AccuWeather.php";

Das war’s! Der PHP-Skript wird periodisch abgerufen, somit bekommen die Homematic-Variablen periodisch aktuelle Wetterdaten.

Über die Favoriten kann man sich eine schöne Ansicht der Wetterdaten legen:

Für Anmerkungen, Vorschläge, Hinweise, Anregungen und konstruktive Kritik zu diesem Artikel bin ich euch dankbar!

Schreibe einen Kommentar

Menü schließen