Openweathermap (Wettervorhersage)

Hallo Zusammen,

global $IPS_SELF
Wird im Script nur für die Kompatibilität mit dem Raspberry / Linux benötigt. Derzeit gibt’s einen offenen Bug, dass $IPS_SELF unter Unix nicht überall bekannt ist… durch die global-Deklaration kann man dennoch auf die globale Systemvariable zugreifen, bis das IPS-Team den Bug endlich gefixt hat :-).
Siehe hierzu auch: IPS auf Raspberry - noch bekannte Fehler

Viele Grüße,
Markus

Bei mir funktioniert es auf diese Weise auch (if function… auskommentiert):

<?
/** Konfiguration: **/
$locationID = "2831872";

/************************************************************************************************************************************/
/** Variablen-Profil "OpenWeatherAPI" anlegen wenn nicht bereits vorhanden **/
if (!IPS_VariableProfileExists("OpenWeatherAPI"))
    IPS_CreateVariableProfile("OpenWeatherAPI", 1);

$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/weather?id=".$locationID."&lang=de&units=metric&mode=json");
$json = json_decode($content);

/** Aktuelles Wetter über openweathermap auslesen & Variablen anlegen **/
$OrtID = CreateVariableByName($_IPS['SELF'], "Ort", 3, $profile = "", $icon = "", $pos = 0, $hidden=false);
$PressureID = CreateVariableByName($_IPS['SELF'], "Pressure", 2, $profile = "~AirPressure.F", $icon = "Gauge", $pos = 0, $hidden=false);
$TemperatureID = CreateVariableByName($_IPS['SELF'], "Temperatur", 2, $profile = "~Temperature", $icon = "Temperature", $pos = 0, $hidden=false);
$HumidityID = CreateVariableByName($_IPS['SELF'], "Humidity", 1, $profile = "~Humidity", $icon = "Gauge", $pos = 0, $hidden=false);
$WeatherDescID = CreateVariableByName($_IPS['SELF'], "Weather Description", 3, $profile = "", $icon = "", $pos = 0, $hidden=false);
$WindSpeedID =  CreateVariableByName($_IPS['SELF'], "Wind Speed", 2, $profile = "~WindSpeed.kmh", $icon = "WindSpeed", $pos = 0, $hidden=false);
$WindDirectionID =  CreateVariableByName($_IPS['SELF'], "Wind Direction", 2, $profile = "~WindDirection.F", $icon = "WindDirection", $pos = 0, $hidden=false);
$CloudsID = CreateVariableByName($_IPS['SELF'], "Cloud Cover", 1, $profile = "~Intensity.100", $icon = "Cloud", $pos = 0, $hidden=false);
$Rain3hID = CreateVariableByName($_IPS['SELF'], "Rain 3h", 2, $profile = "~Rainfall", $icon = "Rainfall", $pos = 0, $hidden=false);
$WeatherID = CreateVariableByName($_IPS['SELF'], "Weather ID", 1, $profile = "OpenWeatherAPI", $icon = "", $pos = 0, $hidden=false);
SetValueString($OrtID, $json->name);
SetValueFloat($TemperatureID, $json->main->temp);
SetValueFloat($PressureID, $json->main->pressure);
SetValueInteger($HumidityID, $json->main->humidity);
SetValueString($WeatherDescID, $json->weather[0]->description);
SetValueFloat($WindSpeedID, $json->wind->speed);
SetValueFloat($WindDirectionID, $json->wind->deg);
SetValueInteger($CloudsID, $json->clouds->all);
if(isset($json->rain->{'3h'}))
{
    SetValueFloat($Rain3hID, $json->rain->{'3h'});
}
else
{
   SetValueFloat($Rain3hID, 0);
}
SetValueInteger($WeatherID, $json->weather[0]->id);

/** Variablen-Profil "OpenWeatherAPI" aktualisieren **/
if (!IPS_VariableProfileExists("OpenWeatherAPI"))
    IPS_CreateVariableProfile("OpenWeatherAPI", 1);

IPS_SetVariableProfileAssociation("OpenWeatherAPI", $json->weather[0]->id, $json->weather[0]->description, "", -1);


/************************************************************************************************************************************/
/* IP Symcon-Variable anlegen
0    Legt eine Variable vom Typ Boolean an
1    Legt eine Variable vom Typ Integer an
2    Legt eine Variable vom Typ Float an
3    Legt eine Variable vom Typ String an
 */

//if (!function_exists('CreateVariableByName'))
//{
function CreateVariableByName($id, $name, $type, $profile = "", $icon = "", $pos = 0, $hidden=false)
{
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false)
  {
    $vid = IPS_CreateVariable($type);
    IPS_SetParent($vid, $id);
    IPS_SetName($vid, $name);
    IPS_SetPosition($vid, $pos);
    IPS_SetIcon($vid, $icon);
    IPS_SetHidden($vid, $hidden);
    IPS_SetVariableCustomProfile($vid, $profile);
    IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  }
  return $vid;
}
//}
?>

Bei mir sieht das dann so aus:

Wie bekomm ich alles in Deutsch?
Wie kann ich die Umlaute anpassen?

Hallo,

die Variablen-Namen kannst du recht einfach anpassen. Du findest im Script unter anderem Zeilen, die wie diese aufgebaut sind:

$PressureID = CreateVariableByName($_IPS['SELF'], "Pressure", 2, $profile = "~AirPressure.F", $icon = "Gauge", $pos = 0, $hidden=false); 

Hier wird eine Variable „Pressure“ angelegt, dieser wird das Variablenprofil „~AirPressure.F“ zugeordnet, das Icon „Gauge“ angelegt, im Objektbaum mit an der Stelle 0 einsortiert und das Verborgen-Flag auf False gesetzt (=sichtbar).

Änderst du jetzt das Pressure in einen anderen Namen - ist alles wieder gut :slight_smile:
CreateVariableByName($_IPS[‚SELF‘], „Pressure“, 2, $profile = „~AirPressure.F“, $icon = „Gauge“, $pos = 0, $hidden=false);

Zum Thema Umlaute: Das ist ein Problem des Zeichensatzes… Bist du auf einem Raspberry / Linux unterwegs?

Grüße,
Markus

Danke für die Info.

Nee, ich bin auf Win-PC

Habt ihr ne Idee, wie man jetzt die Vorhersage integrieren kann?

Die Umlaute von Weather Description bekommt man auf PC korrekt. Statt:

SetValueString($WeatherDescID, $json->weather[0]->description);

Ändern in:

SetValueString($WeatherDescID, utf8_decode($json->weather[0]->description));

Aber warum hat Wetter ID auch einen Text?

Danke. Funktioniert!

WeatherID habe ich rausgeschmissen, da ich damit nix anfangen konnte.

Jetzt also:

<?
/** Konfiguration: **/
$locationID = "2831872";

/************************************************************************************************************************************/
/** Variablen-Profil "OpenWeatherAPI" anlegen wenn nicht bereits vorhanden **/
if (!IPS_VariableProfileExists("OpenWeatherAPI"))
    IPS_CreateVariableProfile("OpenWeatherAPI", 1);

$content = Sys_GetURLContent("http://api.openweathermap.org/data/2.5/weather?id=".$locationID."&lang=de&units=metric&mode=json");
$json = json_decode($content);

/** Aktuelles Wetter über openweathermap auslesen & Variablen anlegen **/
//$OrtID = CreateVariableByName($_IPS['SELF'], "Ort", 3, $profile = "", $icon = "", $pos = 0, $hidden=false);
$PressureID = CreateVariableByName($_IPS['SELF'], "Luftdruck", 2, $profile = "~AirPressure.F", $icon = "Gauge", $pos = 0, $hidden=false);
$TemperatureID = CreateVariableByName($_IPS['SELF'], "Temperatur", 2, $profile = "~Temperature", $icon = "Temperature", $pos = 0, $hidden=false);
$HumidityID = CreateVariableByName($_IPS['SELF'], "rel. Feuchte", 1, $profile = "~Humidity", $icon = "Gauge", $pos = 0, $hidden=false);
$WeatherDescID = CreateVariableByName($_IPS['SELF'], "Beschreibung", 3, $profile = "", $icon = "", $pos = 0, $hidden=false);
$WindSpeedID =  CreateVariableByName($_IPS['SELF'], "Windgeschwindigkeit", 2, $profile = "~WindSpeed.kmh", $icon = "WindSpeed", $pos = 0, $hidden=false);
$WindDirectionID =  CreateVariableByName($_IPS['SELF'], "Windrichtung", 2, $profile = "~WindDirection.F", $icon = "WindDirection", $pos = 0, $hidden=false);
$CloudsID = CreateVariableByName($_IPS['SELF'], "Wolken", 1, $profile = "~Intensity.100", $icon = "Cloud", $pos = 0, $hidden=false);
$Rain3hID = CreateVariableByName($_IPS['SELF'], "Regen 3h", 2, $profile = "~Rainfall", $icon = "Rainfall", $pos = 0, $hidden=false);
$WeatherID = CreateVariableByName($_IPS['SELF'], "Weather ID", 1, $profile = "OpenWeatherAPI", $icon = "", $pos = 0, $hidden=false);
//SetValueString($OrtID, $json->name);
SetValueFloat($TemperatureID, $json->main->temp);
SetValueFloat($PressureID, $json->main->pressure);
SetValueInteger($HumidityID, $json->main->humidity);
SetValueString($WeatherDescID,utf8_decode($json->weather[0]->description));
SetValueFloat($WindSpeedID, $json->wind->speed);
SetValueFloat($WindDirectionID, $json->wind->deg);
SetValueInteger($CloudsID, $json->clouds->all);
if(isset($json->rain->{'3h'}))
{
    SetValueFloat($Rain3hID, $json->rain->{'3h'});
}
else
{
   SetValueFloat($Rain3hID, 0);
}
SetValueInteger($WeatherID, $json->weather[0]->id);

/** Variablen-Profil "OpenWeatherAPI" aktualisieren **/
if (!IPS_VariableProfileExists("OpenWeatherAPI"))
    IPS_CreateVariableProfile("OpenWeatherAPI", 1);

IPS_SetVariableProfileAssociation("OpenWeatherAPI", $json->weather[0]->id, $json->weather[0]->description, "", -1);


/************************************************************************************************************************************/
/* IP Symcon-Variable anlegen
0    Legt eine Variable vom Typ Boolean an
1    Legt eine Variable vom Typ Integer an
2    Legt eine Variable vom Typ Float an
3    Legt eine Variable vom Typ String an
 */

//if (!function_exists('CreateVariableByName'))
//{
function CreateVariableByName($id, $name, $type, $profile = "", $icon = "", $pos = 0, $hidden=false)
{
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false)
  {
    $vid = IPS_CreateVariable($type);
    IPS_SetParent($vid, $id);
    IPS_SetName($vid, $name);
    IPS_SetPosition($vid, $pos);
    IPS_SetIcon($vid, $icon);
    IPS_SetHidden($vid, $hidden);
    IPS_SetVariableCustomProfile($vid, $profile);
    IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  }
  return $vid;
}
//}
?>

Fehlt nur noch ne Vorhersage und die Portierung nach IPSView

WetterID ist eine Zahl, allerdings wird automatisch ein Variablen-Profil vom Script erzeugt und bei Bedarf automatisch ergänzt / vervollständigt.

Wirft man mal einen Blick auf die Zahlen, lassen sich Muster erkennen. Das wird dann benötigt, wenn du Aktionen z.B. auf Regen oder Sturm auslösen möchtest, unabhängig davon ob es sich um leichter Regen, Niesel Regen oder sonst einen Schweregrad handelt. Siehe hierzu auch folgende Seite:
http://openweathermap.org/wiki/API/Weather_Condition_Codes.
Man könnte zum Beispiel eine Meldung auslösen wenn die WetterID zwischen 200 und 232 ist, und bekommt damit eine Gewitter-Info unabhängig vom Schweregrad… Des weiteren kannst du auf die WetterID besser Aktionen / Events planen…

Daher stellt sich eher die Frage, ob ich den Langtext in der String-Variable überhaupt brauche? Ich kann ja auch mit der formatierten WetterID arbeiten…

Grüße,
Markus

Wo wird denn die Wetter ID im Skript automatisch ergänzt / vervollständigt?
Nur damit ich es verstehe. :slight_smile:

Irgendjemand ne Idee zur Erweiterung um Wettervorhersage???

genau hier:

/** Variablen-Profil "OpenWeatherAPI" aktualisieren **/ 
if (!IPS_VariableProfileExists("OpenWeatherAPI")) 
    IPS_CreateVariableProfile("OpenWeatherAPI", 1); 

IPS_SetVariableProfileAssociation("OpenWeatherAPI", $json->weather[0]->id, $json->weather[0]->description, "", -1); 

Hier wird das Variablen-Profil „OpenWeatherAPI“ angelegt, und durch IPS_SetVariableProfileAssociation die jeweilige Wetter-ID mit dem Langtext verknüpft. Wenn du dir die WetterID bzw. das Variablen-Profil in IPS mal anzeigen lässt, siehst du die Zuordnungen die bereits vom Script automatisch angelegt wurden…

Grüße,
Markus

Ja, du kannst die Vorhersage analog meinem Script eigenständig aufbauen.
Die API-URL ist dabei diese:
$content = Sys_GetURLContent(„http://api.openweathermap.org/data/2.5/forecast?id=“.$locationID."&lang=de&units=metric&mode=json");

Ansonsten ist das Script im Prinzip das Gleiche, du musst nur die JSON-Parts gemäß deinen Wünschen & dem XML-File anpassen. Schau dir einfach mein Script und die Ausgabe von $content an:

print_r($content);

und versuche zu verstehen, warum bei mir die JSON-Aufrufe (z.B. $json->weather[0]->id, $json->weather[0]->description) so sind wie sie sind…

Wenn du dann mein Script verstanden hast, kannst du das mit geringem Aufwand auf die Vorhersage adaptieren & hast dabei gleich die PHP-Kenntnisse ausgebaut :slight_smile:

Viele Grüße & viel Erfolg,
Markus

Danke Markus. Dass der Text in Wetter ID nur ein Variablen Profiltext ist hatte ich nicht bemerkt. Um so komischer ist aber, dass dort die Umlaute im Webfront nicht korrekt dargestellt werden. In der Konsole ist es normal lesbar.

Edit: hat sich erledigt.
Auch dort muss dann ein utf8_ decode rein.
>>>IPS_SetVariableProfileAssociation(„OpenWeatherAPI“, $json->weather[0]->id, utf8_decode($json->weather[0]->description), „“, -1);<<<

Hallo Markus,

Danke für deine Hinweise. Leider habe ich schon mehrere Tage versucht, die API zu verstehen, bzw. die notwendigen Daten auszulesen.
Naja, ich bin zumindest nah dran.

Die Visualisierung ist noch mal ein anderes Thema.

Ich kann allerdings nicht glauben, dass keiner ne brauchbare Wettervorhersage gebastelt hat.

Wozu? RWNs „eigene Wetterseite“ läuft immer noch hervorragend. Ich brauche dafür nur ein paar Wetterdaten die meine Station nicht liefert.

Ich bin mit den Scripts und Aenderungen schon recht weit gekommen.
Kann mir aber jemand sagen, wieso ich die Wetter Werte des Scripts in der IOS App nicht sehe? Auf dem Webfrontend werden sie angzeigt.

Danke
Danny

Leider läuft das openweathermap - Skript auch nicht mehr. Weiß jemand was an der API geändert wurde? Allgemein ist die Website noch vorhanden.

Ich würde mal sagen…lesen hilft :slight_smile: Diese Rückmeldung ist recht eindeutig :wink:

Invalid API key. Please see http://openweathermap.org/faq#error401 for more info.

>> OpenWeatherMap. Aplication ID

Und die Rückgabe hat sich auch ein klein wenig geändert, aber nur minimal. Man bekommt jetzt sogar noch einige Infos mehr :cool:
IP-Symcon - Wie kann ich… 2.0

-Chris-

Danke. Das habe ich in der Zwischenzeit auch gelesen. Aber auch du hast 16 Minuten dazu gebracht. :stuck_out_tongue: