Openweathermap (Wettervorhersage)

„OpenWeatherMap ist ein Onlineservice, der eine frei nutzbare Programmierschnittstelle (API) für Wetterdaten, Wettervorhersagen, sowie historische Wetterdaten für die Entwickler von Webanwendungen und mobilen Geräten bereitstellt. OpenWeatherMap verwendet OpenStreetMap zur Darstellung von Wetterkarten.
OpenWeatherMap stellt eine freie API für den Zugriff auf freie Wetterdaten, Wettervorhersagen, sowie Wetterkarten mit Informationen über Wolken, Windgeschwindigkeiten und Luftdruck zur Verfügung. Alle Wetterdaten können im JSON, XML oder HTML Format bezogen werden.“
Quelle: Wikipedia

Es wurde in der Zwischenzeit einiges geändert.
Hier der Link zu einem aktuellen Beispiel:
https://www.symcon.de/forum/threads/28210-IP-Symcon-Wie-kann-ich-2-0?p=259929#post259929

Das folgende Beispiel soll als Anregung die eigene Anwendung dienen. In ihm wird die zu erwartende Regenmenge von morgen ermittelt. So kann z.B. entschieden werden, ob es Sinn macht heute den Rasen zu bewässern. Besitzer von Solaranlagen oder Wärmepumpen können mit Hilfe einer Temperaturvorhersage ihr Energiemanagement optimieren. Dabei ist zu beachten, dass die Temperatur in Kelvin angegeben wird – es muss also -273.15 abgezogen werden. Ferner lässt die Beschattung eines Gebäudes optimieren, wenn die zu erwartende Sonnenscheindauer und Höchsttemperatur vorher bekannt sind. In der API muss nur noch lediglich der eigene Standort / ID verändert werden.

Hier noch einige nützliche Links:

[ul]
[li]Openweathermap (Bild 1)[/li][li]Beschreibung der API[/li][li]Online JSON Viewer (Bild 2)[/li][li]UNIX Timestamp Rechner[/li][/ul]

MST

jsonviewer.JPG

Wenn Du uns jetz noch beibringst wie wir an die City ID kommen ist alles perfekt

Geh mal auf die Seite und Suche „Weather in your City“ ganz oben.
Wenn du deine Ortschaft dann auswaehlst steht die ID in der URL.
Beispiel Frankfurt : http://www.openweathermap.org/city/2925535

Moin…
erstmal Danke Steiner für die Info zum Dienst und der Api. Hab wieder was zum spielen! :slight_smile:

Hier was für alle die nicht rechnen wollen! :slight_smile:
Das „&units=metric“ am Ende der Adresse gibt die Werte in °C aus.


$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/forecast/daily?id=2911298&lang=de&mode=json&units=metric");  // <---- &units=metric gibt alle Temp-Werte gleich in °C aus.
$json = json_decode($content);

Gruß,
Peter

Danke für die Info

Und hier die Anpassung der HTML Tabelle von Stele99 für das Webfront (mit JSON).


$forecastDays = 5; // Tage für Prognose

$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/weather?id=$locationID&lang=en&mode=json&units=metric&APPID=$key_owm");
$json = json_decode($content);
	
// Create overview table
$iconOWMURL = "http://openweathermap.org/img/w/".($json->weather[0]->icon).".png";
$htmlOWM = "<table><tr>";
$htmlOWM .= "<td align='center' valign='top'  style='width:140px;padding-left:20px;'>
	Current<br/>
	<img src='".$iconOWMURL ."' style='float:left;padding-left: 17px;'>
	<div style='float:right; font-size: 15px; padding-right: 17px;'>
	".round($json->main->temp)."°C<br/>
	".round($json->main->humidity)."%<br/>
	</div>
	<div style='clear:both; font-size: 11px;'>
		Ø Wind: ".($json->wind->speed)." km/h<br/>
		Rain 3h: ".($json->rain->{'3h'})." mm
	</div>
	</td>";
}

$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/forecast/daily?id=$locationID&lang=en&mode=json&units=metric&cnt=$forecastDays&APPID=$key_owm");
$json = json_decode($content);
	
// Add forecast
$isExclude = true;
foreach($json->list as $day) {
	if(isToday($day->dt)){
		$weekDay = "Today";
		$isExclude = false;
	} else {
		//$Wochentag =$tag[date("w",intval($day->dt))]; // Wochentage auf Deutsch
		$weekDay = date("l",intval($day->dt));
	}
	if (!$isExclude) { // Forecast enthält auch gestern daher ist filtern nötig
		$iconOWMURL = "http://openweathermap.org/img/w/".($day->weather[0]->icon).".png";
		$htmlOWM .= "<td align='center' valign='top'  style='width:140px;padding-left:20px;'>
		              ".$weekDay."<br>
		              <img src='".$iconOWMURL."' style='float:left; padding-left: 17px;'>
		              <div style='float:right; padding-right: 17px'>
		               ".round($day->temp->min)."°C
		               ".round($day->temp->max)."°C
		              </div>
		              <div style='clear:both; font-size: 11px;'>Ø Wind: ".$day->speed." km/h<br/>
		              Rain: ".($day->rain)." mm<br/>
		              Cloudiness: ".($day->clouds)." %
		              </div>
		          </td>";
	}
}
$htmlOWM .= "</tr></table>";
SetValue(CreateVariableByName($_IPS['SELF'], "Wetter", 3, "~HTMLBox"), $htmlOWM);


Beim Vergleich mit WU gibt es bei mir schon wichtige Unterschiede beim Forecast. Welcher besser ist könnte ich aber noch nicht sagen.

Gruß
Zapp

OWMvsWU_forecast2_60.png

Habe versucht das Skript bei mir zu implementieren, bekomme jedoch folgende Fehlermeldung:

<?
$forecastDays = 5; // Tage für Prognose
$locationID = 2831872;
$key_owm = 16d8ac9fb46d9161cf5855a64d0620bc;
$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/weather?id=$locationID&lang=en&mode=json&units=metric&APPID=$key_owm");
$json = json_decode($content);

// Create overview table
{
$iconOWMURL = "http://openweathermap.org/img/w/".($json->weather[0]->icon).".png";
$htmlOWM = "<table><tr>";
$htmlOWM .= "<td align='center' valign='top'  style='width:140px;padding-left:20px;'>
    Current<br/>
    <img src='".$iconOWMURL ."' style='float:left;padding-left: 17px;'>
    <div style='float:right; font-size: 15px; padding-right: 17px;'>
    ".round($json->main->temp)."°C<br/>
    ".round($json->main->humidity)."%<br/>
    </div>
    <div style='clear:both; font-size: 11px;'>
        Ø Wind: ".($json->wind->speed)." km/h<br/>
        Rain 3h: ".($json->rain->{'3h'})." mm
    </div>
    </td>";
}

$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/forecast/daily?id=$locationID&lang=en&mode=json&units=metric&cnt=$forecastDays&APPID=$key_owm");
$json = json_decode($content);

// Add forecast
$isExclude = true;
foreach($json->list as $day) {
    if(isToday($day->dt)){
        $weekDay = "Today";
        $isExclude = false;
    } else {
        //$Wochentag =$tag[date("w",intval($day->dt))]; // Wochentage auf Deutsch
        $weekDay = date("l",intval($day->dt));
    }
    if (!$isExclude) { // Forecast enthält auch gestern daher ist filtern nötig
        $iconOWMURL = "http://openweathermap.org/img/w/".($day->weather[0]->icon).".png";
        $htmlOWM .= "<td align='center' valign='top'  style='width:140px;padding-left:20px;'>
                      ".$weekDay."<br>
                      <img src='".$iconOWMURL."' style='float:left; padding-left: 17px;'>
                      <div style='float:right; padding-right: 17px'>
                       ".round($day->temp->min)."°C
                       ".round($day->temp->max)."°C
                      </div>
                      <div style='clear:both; font-size: 11px;'>Ø Wind: ".$day->speed." km/h<br/>
                      Rain: ".($day->rain)." mm<br/>
                      Cloudiness: ".($day->clouds)." %
                      </div>
                  </td>";
    }
}
$htmlOWM .= "</tr></table>";
SetValue(CreateVariableByName($_IPS['SELF'], "Wetter", 3, "~HTMLBox"), $htmlOWM);

?>

Fehlermeldung:

Parse error: syntax error, unexpected ‚d8ac9fb46d9161cf5855a64d0620bc‘ (T_STRING) in C:\IP-Symcon\scripts\17748.ips.php on line 4
Abort Processing during Fatal-Error: syntax error, unexpected ‚d8ac9fb46d9161cf5855a64d0620bc‘ (T_STRING)
Error in Script C:\IP-Symcon\scripts\17748.ips.php on Line 4

Habe jetzt die ID in ‚…‘ gesetzt.

Jetzt kommt folgende Fehlermeldung:

Notice: Undefined property: stdClass::$rain in C:\IP-Symcon\scripts\17748.ips.php on line 21

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\17748.ips.php on line 21

Fatal error: Call to undefined function isToday() in C:\IP-Symcon\scripts\17748.ips.php on line 32
Abort Processing during Fatal-Error: Call to undefined function isToday()
Error in Script C:\IP-Symcon\scripts\17748.ips.php on Line 32

Habe das Script nicht getestet, aber allgemein sollten die Zeilen oben wie folgt aussehen:

$locationID = "2831872"; 
$key_owm = "16d8ac9fb46d9161cf5855a64d0620bc"; 

Wenn man sich anschaut, wie alt das Script doch schon ist, könnte man auch vermuten, dass sich an der API etwas geändert hat und dass das Script noch einige andere Anpassungen benötigt. Das kann dir vlt. jemand sagen, der das Script im Einsatz hat.

Grüße,
Chris

OK. Danke.
Hab ich angepasst.
Fehlermeldung bleibt die gleiche :confused:

Notice: Undefined property: stdClass::$rain in C:\IP-Symcon\scripts\17748.ips.php on line 21

du musst da ein paar Anpassungen vornehmen. rain ist nicht mehr am selben Ort drin, deswegen die Fehlermeldung. Die Api ist ja recht gut beschrieben.

Also wenn ich das richtig interpretiere ist rain nach wie vor am selben Ort.
Was würdest Du sagen, wo sich rain im Moment befindet?

Daher kann ich die Fehlermeldung nicht nachvollziehen.

Und was hat es mit „isToday“ auf sich?

wenn ich die Ausgabe mit print_r mache, sehe ich nirgends etwas von rain.

Die Ausgabe wovon?
Kann Dir nicht folgen, Sorry.

Also die Fehlermeldung mit dem Rain ist jetzt weg, warum auch immer. Habe nix geändert.

Jetzt ist nur noch das „isToday“ fehlerhaft.

Hat nicht irgendjemand ne funktionierende Wettervorhersage?

Wenn ich das „isToday“ rausschmeiße bekomm ich auf Zeile 50 wieder den Fehler mit „rain“

Hier im Forum gibt es einige verschiedene Wettervorhersage-Scripte :slight_smile: wetter.com, yahoo.de, …

Oder direkt im IPS das DWD nutzen :slight_smile:

Grüße,
Chris

Ich habe leider noch kein funktionierendes script gefunden.

DWD hatte ich auch schon, fand ich aber nicht so ansprechend.

Nur mal so als Beispiel:

das Skript von „dfhome“ liefert:

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\45944.ips.php on line 17