Wetterdaten - Wunderground API

Das werd ich jetzt im Anschluß probieren. Leider habe ich mit dem Befüllen der Datenfelder teilweise massive Probleme. Mal stimmt alles, führe ich das Skript Sekunden darauf wieder aus, kommen falsche Werte.
Auffallen tut es mir dann in IPS View, wenn das Bild vom heutigen Tag nicht vorhanden ist. Das verschwindet dann nämlich auch immer, weil in der Variable „0“ steht… :confused:

… dann hätte ich noch folgende Vorschläge:
In Zeile 34 und 70 Germany durch Austria ersetzen und evtl. die Variable $ort durch Hochkommas und Punkt richtig im String einbetten.
34:

    $json_fc_string = file_get_contents("http://api.wunderground.com/api/$api/forecast/lang:DL/q/Austria/".$ort.".json");

70:

    $json_ast_string = file_get_contents("http://api.wunderground.com/api/$api/astronomy/q/Austria/".$ort.".json");

und evtl. Zeile 17

$json_string = file_get_contents("http://api.wunderground.com/api/$api/geolookup/conditions/lang:DL/q/DL/".$ort.".json");

Änderungen durchgeführt, wobei ich schon kurz vorher auf „Austria“ geändert hatte.
Die Fehlermeldung bekomme ich jetzt seit einiger Zeit nicht mehr, jedoch habe ich beim heutigen Tag immer Ausfälle beim Icon und dem Text. Es kommen teilweise keine Werte, sodass auch das Icon in IPS View nicht angezeigt wird.

Ich hab zwischendurch auch andere Orte in der Nähe probiert. „Linz“ sollte wunderground aber auf alle Fälle kennen…
Wie gebt ihr den Ort ein? Mittels Name oder Koordinaten?

Kommando retour, der Fehler ist immer noch da!

28.05.2018 20:00:02 | ScriptEngine | Ergebnis für Ereignis 37526

<br />
<b>Notice</b>: Undefined offset: 0 in <b>/var/lib/symcon/scripts/28905.ips.php</b> on line <b>132</b><br />

Wie gebt ihr den Ort ein? Mittels Name oder Koordinaten?

Ich benutze diese Form

$pws = "pws:ILINZ82"; // Station ID: ILINZ82
$json_string = file_get_contents("http://api.wunderground.com/api/$api/geolookup/conditions/lang:DL/q/DL/".$pws.".json");

da zwischen der allgemeinen Ortsangabe und meinem Standort 100m Höhenunterschied sind, obwohl es nur 1500m Entfernung sind, und auf dieser Höhenlage auch eine Meßstation ist.
Übrigens das Limit für das APi sind 500 Abfragen / Tag. Ich weiß nicht was dabei raus kommt wenn man das überschreitet.

Hi,

wollte heute mal meine Statistiken von API mal angucken. Uns was sehene ich da :eek:

To improve our services and enhance our relationship with our users, we will no longer provide free weather API keys as part of our program. If you have been directed to download our Weather Underground free API key by a third party provider, please contact your vendor for resolution.

API | Weather Underground

Es gibt keine freie API mehr?
Was wird mit denen die schon eine haben?

Gruß

Hallo sewo,

ich nutze ebenfalls die API von Wunderground mit einem Skript. Bislang funktioniert es jedenfalls noch - hoffen wir, dass es so bleibt :wink:

Gruß
Hans

Hi,

bei mir läuft auch noch alles :slight_smile:
Mal gucken wie lange.
zugrif auf die Abfrage Statistiken habe ich aber keine mehr.

Gruß

Welches Skript nutzt ihr da alle? Das kann ja nicht sein, dass es nur bei mir zu Problemen kommt.
Konkret habe ich im Moment mit den Tagesdaten schwierigkeiten. Es fehlen immer wieder Daten wie z.B. WetterIcon (0), WetterText (kein Inhalt), Windrichtung (-9999) usw.
Wie kann das sein?

@sewo
Hab jetzt mal dein Skript getestet. Nach einer kleinen Änderung ist der Fehler auch weg, jedoch bekomme ich keine Daten unter WetterIcon und WetterText im Reiter Aktueller Zustand rein. Werden die Icons online abgerufen oder liegen die bei dir am Server?

Hallo Loewenkoenig,
ich habe ausgiebig gesucht und probiert. Ich bin dabei auch auf einen evtl. Fehler in der Abfrage gestoßen. Für Linz sollte die Abfrage z.B.

$json_string = file_get_contents("http://api.wunderground.com/api/".$api."/geolookup/conditions/lang:DL/q/OS/".$ort.".json");

lauten - siehe https://www.wunderground.com/weather/api/d/docs?d=resources/country-to-iso-matching
Hab’ mich auch eine kurze Zeit gefreut das es sehr gut lief. Jetzt funzt es wieder eher schlecht. Dann habe ich, wenn das Feld icon leer ist, bis zu 5 „retries“ mit einem sleep von 4Sek. eingebaut - das kompensiert das Problem etwas.

Kurzum, das Problem ist wirklich die Abfrage für Linz. Für meinen eigenen Standort hatte ich noch keinen einzigen Fehler.
Auch wenn ich nicht den Ortsnamen Linz angebe sondern Kürzel für Wetterstationen bleibt der Fehler der Gleiche. Falls Du an dem Code mit „retries“ und „sleep“ interessiert bist, bitte ein kurzes „feedback“.

Hallo Klaus,
danke für deine Versuche!
Habe mittlerweile auf „OS“ umgestellt, jetzt bekomme ich auf einmal auch den Wettertext. Wie du aber richtig sagst, bleibt der Fehler, dass einmal Daten geliefert werden und einmal nicht bzw. nicht richtig, bestehen.
Bin auf jeden Fall an deinem Lösungsversuch interessiert!

Peter

Bin auf jeden Fall an deinem Lösungsversuch interessiert!

… heute wird scheinbar die Variable für " Vorhersage max. Temperatur für Heute " auch mal wieder bestückt.:wink:
Hier mein Versuchsaufbau den Fehler zu kompensieren:

  <?
  // max. Scriptlaufzeit definieren
  ini_set('max_execution_time', 40);
 
 
  $api = "****************"; // Eigenen key einsetzen
 
  $ort = "Linz";

  $land = "Austria";

  $landAbk = "OS"; /* https://www.wunderground.com/weather/api/d/docs?d=resources/country-to-iso-matching */

  $IDEigen    = $_IPS['SELF'];
  $IDParent   = IPS_GetParent ($IDEigen);

// IDs heraussuchen
  $IDKat0Aktuell             = IPS_GetCategoryIDByName ("Aktueller Zustand",        $IDParent);
  $IDKat1Tag                 = IPS_GetCategoryIDByName ("Tag 1 Heute",              $IDParent);
  $IDKat2Tag                 = IPS_GetCategoryIDByName ("Tag 2 Morgen",             $IDParent);
  $IDKat3Tag                 = IPS_GetCategoryIDByName ("Tag 3 Übermorgen",         $IDParent);

  if ($_IPS['SENDER']=='Execute') { echo "aktuelles Wetter: 
";}
  // aktuelles Wetter
  $i = 1;
  retry: /* Schleife für den Fall, dass die Variable icon leer ist */
  $json_string = file_get_contents("http://api.wunderground.com/api/".$api."/geolookup/conditions/lang:DL/q/".$landAbk."/".$ort.".json");
  if(empty($json_string)){echo "...keine Antwort vom Server";}
  
  $parsed_json = json_decode($json_string);
  
  // print_r($parsed_json);
  if(empty($parsed_json->{'current_observation'}->{'icon'})){Echo "Die Icon Variable ist leer - Versuch Nr.:".$i."
 4 Sekunden warten
"  ;sleep(4);$i++; if($i<=5){goto retry;}else{Echo ($i-1)."x probiert";return;} }
  // echo $parsed_json->{'current_observation'}->{'icon'}."
";
  setvalue ( IPS_GetVariableIDByName ("WetterIcon"      ,$IDKat0Aktuell), IconCheck     ($parsed_json->{'current_observation'}->{'icon'}));
  setvalue ( IPS_GetVariableIDByName ("WetterText"      ,$IDKat0Aktuell),                  $parsed_json->{'current_observation'}->{'weather'});
  setvalue ( IPS_GetVariableIDByName ("TempAktuell"      ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'temp_c'}));
  setvalue ( IPS_GetVariableIDByName ("Feuchte"          ,$IDKat0Aktuell), NurZahl        ($parsed_json->{'current_observation'}->{'relative_humidity'}));
  setvalue ( IPS_GetVariableIDByName ("WindSpeed"      ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'wind_kph'}));
  setvalue ( IPS_GetVariableIDByName ("WindRichtung"  ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'wind_degrees'}));
  setvalue ( IPS_GetVariableIDByName ("Luftdruck"      ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'pressure_mb'}));
  setvalue ( IPS_GetVariableIDByName ("Sichtweite"      ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'visibility_km'}));
  setvalue ( IPS_GetVariableIDByName ("UV Index"          ,$IDKat0Aktuell), NurZahl         ($parsed_json->{'current_observation'}->{'UV'}));




// Vorhersage
  $json_fc_string = file_get_contents("http://api.wunderground.com/api/$api/forecast/lang:DL/q/".$land."/".$ort.".json");
  $parsed_fc_json = json_decode($json_fc_string);
  $prognose = $parsed_fc_json->{'forecast'}->{'simpleforecast'}->{'forecastday'};
 // print_r($parsed_fc_json);

if ($_IPS['SENDER']=='Execute') {echo "heute: 
";}
//heute
  setvalue ( IPS_GetVariableIDByName ("TagBezeichnung"          ,$IDKat1Tag),                      $prognose[0]->date->weekday) ;
  setvalue ( IPS_GetVariableIDByName ("WetterIcon"              ,$IDKat1Tag), IconCheck     ($prognose[0]->icon)) ;
  setvalue ( IPS_GetVariableIDByName ("WetterBezeichnung"      ,$IDKat1Tag), utf8_decode    ($prognose[0]->conditions)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMin"                  ,$IDKat1Tag), NurZahl         ($prognose[0]->low->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMax"                  ,$IDKat1Tag), NurZahl         ($prognose[0]->high->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("WindMax"                  ,$IDKat1Tag), NurZahl         ($prognose[0]->maxwind->kph)) ;
  setvalue ( IPS_GetVariableIDByName ("Schneefall cm"          ,$IDKat1Tag), NurZahl         ($prognose[0]->snow_allday->cm)) ;
if ($_IPS['SENDER']=='Execute') {echo "morgen: 
";}
//morgen
  setvalue ( IPS_GetVariableIDByName ("TagBezeichnung"          ,$IDKat2Tag),                      $prognose[1]->date->weekday) ;
  setvalue ( IPS_GetVariableIDByName ("WetterIcon"              ,$IDKat2Tag), IconCheck     ($prognose[1]->icon)) ;
  setvalue ( IPS_GetVariableIDByName ("WetterBezeichnung"      ,$IDKat2Tag), utf8_decode    ($prognose[1]->conditions)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMin"                  ,$IDKat2Tag), NurZahl         ($prognose[1]->low->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMax"                  ,$IDKat2Tag), NurZahl         ($prognose[1]->high->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("WindMax"                  ,$IDKat2Tag), NurZahl        ($prognose[1]->maxwind->kph)) ;
  setvalue ( IPS_GetVariableIDByName ("Schneefall cm"          ,$IDKat2Tag), NurZahl         ($prognose[1]->snow_allday->cm)) ;

//übermorgen
if ($_IPS['SENDER']=='Execute') {echo "übermorgen: 
";}
  setvalue ( IPS_GetVariableIDByName ("TagBezeichnung"          ,$IDKat3Tag),                      $prognose[2]->date->weekday) ;
  setvalue ( IPS_GetVariableIDByName ("WetterIcon"              ,$IDKat3Tag), IconCheck     ($prognose[2]->icon)) ;
  setvalue ( IPS_GetVariableIDByName ("WetterBezeichnung"      ,$IDKat3Tag), utf8_decode    ($prognose[2]->conditions)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMin"                  ,$IDKat3Tag), NurZahl         ($prognose[2]->low->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("TempMax"                  ,$IDKat3Tag), NurZahl         ($prognose[2]->high->celsius)) ;
  setvalue ( IPS_GetVariableIDByName ("WindMax"                  ,$IDKat3Tag), NurZahl         ($prognose[2]->maxwind->kph)) ;
  setvalue ( IPS_GetVariableIDByName ("Schneefall cm"          ,$IDKat3Tag), NurZahl         ($prognose[2]->snow_allday->cm)) ;

//Astronomie
    $json_ast_string = file_get_contents("http://api.wunderground.com/api/$api/astronomy/q/".$land."/".$ort.".json");
    $parsed_ast_json = json_decode($json_ast_string);

  setvalue ( IPS_GetVariableIDByName ("Mondstatus"      ,$IDKat0Aktuell), $parsed_ast_json->{'moon_phase'}->{'percentIlluminated'});
  
function IconCheck ($Eingang){
    // Icon wird durch eine Zahl ersetzt
    switch ($Eingang){
        case "chanceflurries":                 $Ausgang = 01; break;
        case "chancerain":                     $Ausgang = 02; break;
        case "chancesleet":                     $Ausgang = 03; break;
        case "chancesnow":                     $Ausgang = 04; break;
        case "chancetstorms":                 $Ausgang = 05; break;
        case "clear":                             $Ausgang = 06; break;
        case "cloudy":                         $Ausgang = 07; break;
        case "flurries":                         $Ausgang = 08; break;
        case "fog":                             $Ausgang = 09; break;
        case "hazy":                             $Ausgang = 10; break;
        case "mostlycloudy":                 $Ausgang = 11; break;
        case "mostlysunny":                     $Ausgang = 12; break;
        case "partlycloudy":                 $Ausgang = 13; break;
        case "partlysunny":                     $Ausgang = 14; break;
        case "sleet":                             $Ausgang = 15; break;
        case "rain":                             $Ausgang = 16; break;
        case "snow":                             $Ausgang = 17; break;
        case "sunny":                             $Ausgang = 18; break;
        case "tstorms":                         $Ausgang = 19; break;
        case "nt_chanceflurries":             $Ausgang = 20; break;
        case "nt_chancerain":                 $Ausgang = 21; break;
        case "nt_chancesleet":                 $Ausgang = 22; break;
        case "nt_chancesnow":                 $Ausgang = 23; break;
        case "nt_chancetstorms":             $Ausgang = 24; break;
        case "nt_clear":                         $Ausgang = 25; break;
        case "nt_cloudy":                     $Ausgang = 26; break;
        case "nt_flurries":                     $Ausgang = 27; break;
        case "nt_fog":                         $Ausgang = 28; break;
        case "nt_hazy":                         $Ausgang = 29; break;
        case "nt_mostlycloudy":             $Ausgang = 30; break;
        case "nt_mostlysunny":                 $Ausgang = 31; break;
        case "nt_partlycloudy":             $Ausgang = 32; break;
        case "nt_partlysunny":                 $Ausgang = 33; break;
        case "nt_sleet":                         $Ausgang = 34; break;
        case "nt_rain":                         $Ausgang = 35; break;
        case "nt_snow":                         $Ausgang = 36; break;
        case "nt_sunny":                         $Ausgang = 37; break;
        case "nt_tstorms":                     $Ausgang = 38; break;
        default: $Ausgang = 0; break;
        }
return $Ausgang;}




function NurZahl ($Input){
    if ($_IPS['SENDER']=='Execute') {echo $Input."
";}
    // Filtert aus dem String nur die Zahl heraus
    if ($Input == "N/A" or empty($Input)){$Output = -1;
    }else{
    preg_match("/-?\d+(,|\.)?\d*/",$Input,$result);
    $Output = $result[0];}
return $Output;}

?>  

Hallo Klaus,

habe dein Update soeben getestet. Es kommt zwar kein Skript-Fehler, aber er aktuallisiert auch keine Daten und als Echo-Meldung kommt der Text:
aktuelles Wetter:
Die Icon Variable ist leer - Versuch Nr.:1
4 Sekunden warten
Die Icon Variable ist leer - Versuch Nr.:2
4 Sekunden warten
Die Icon Variable ist leer - Versuch Nr.:3
4 Sekunden warten
Die Icon Variable ist leer - Versuch Nr.:4
4 Sekunden warten
Die Icon Variable ist leer - Versuch Nr.:5
4 Sekunden warten
5x probiert

Tja mein erster Aufruf hat funktioniert, der Zweite auch mit
WU.png

Das liegt an den Daten, die vom Wundergroung Web-Server geliefert werden sollten, der aber wiederum vom DB-Server keine Daten rechtzeitg bekommt und bevor der Endkunde einen timeout bekommt, gibt es scheinbar lieber einen leeren Inhalt.
Es liegt definitiv an dem API Aufruf für Linz. Ich habe gerade keine weitere Idee, sorry.

Das heißt, bei dir funktionierts? Auch mit den „Linzer“ Daten?

Hi,

hast du mal die JSON abfrage mal im Browser angeschaut?


http://api.wunderground.com/api/$api/geolookup/conditions/lang:DL/q/DL/$ort.json

Wenn im IPS ein Falscher oder gar kein Wert steht. Würde ich den Link einfach im Browser öffnen und nachgucken was da so drin steht.

Gruß

Das war jetzt der entscheidende Tipp!
Wenn ich mir die JSON-Abfrage im Browser ansehe, besteht hier das gleiche Problem! Einmal sind alle Daten vollständig und korrekt vorhanden, eine Abfrage (2 Sekunden) später, fehlen Werte… Das Skript kann also gar nichts dafür. Jetzt kommt natürlich das Skript mit der Mehrfachabfrage von Klaus wieder ins Spiel :slight_smile:

Hallo zusammen,

vielleicht solltet ihr euch eine Abfrage einbauen, ob Daten überhaupt vorhanden und dann erst reagieren.!

Vereinfacht so manches.

Dann müsste man aber festlegen, was passiert, wenn keine Daten vorhanden sind.
Man könnte eine Abfrage starten und wenn keine Daten vorhanden sind, dann nach x Minuten wieder versuchen. So lange, bis Daten vorhanden sind. Wenn diese wieder abrufbar sind, dann übernehmen. Wie siehts hier mit einer Timer-Verknüpfung aus? Macht das Sinn?