Wetter vorlesen lassen mit deutschen Wetterservern?

  • 162 Antworten
  • Letztes Antwortdatum
ich hab mal in den letzten Tagen - inspiriert durch die in diesem Thread vorgestellte Lösung - versucht, etwas eigenes zu basteln. An Gummibaers_ Lösung störte mich, daß man eine Postleitzahl benötigte (oder einen Code für AT).

Wenn das Android-Phone (zumindest ich setze Tasker zum Wetter Vorlesen auf dem Telefon ein) schon eine Ortsbestimmung machen und Koordinaten liefern kann, warum dann von Hand eine PLZ eingeben? Wenn man unterwegs ist, interessiert doch auch eigentlich eher das Wetter vor Ort. Aber wie ist jetzt grad die PLZ, wo ich mich aufhalte?

Mit den vom Mobifon gelieferten Koordinaten kann man dann - ich habe die Yahoo! Weather - API genommen - wunderbar die ortsbasierten Wetterdaten abfragen. (Reguläre Ausdrücke habe ich nie richtig verstanden, daher schreckte mich Gummibaers Lösung da auch ein wenig ab. :))


Die für das Script passenden Koordinaten bekommt man in Tasker, indem man %LOCN (ich verwende die netzbasierte Koordinate, weil ich GPS meist aus habe ) einmal mit Variablesplit aufteilt und dann die beiden Teilvariablen beim HTTP-Get verwendet.

alles andere (was Tasker betrifft) funktioniert genau so wie hier schon in vorhergehenden Beiträgen erklärt wurde.

Aber genug der Vorrede - hier mein PHP-Script:
PHP:
<?php

/*********************************************************************************
 * Einfaches Script zum Abrufen ortsbasierter Wetterdaten von Yahoo! Wetter      *
 * Syntax: scriptname.php?lat=12.345&lon=12.345&debug=true                       *
 *         der Parameter "debug" ist optional                                    *
 *                                                                               *
 * Datum: 26.11.2012                                                             *
 * Version: 1.1 vom 27.11.2012                                                   *
 *                                                                               *
 * Funktionen für Windrichtungen und Übersetzungen der Weather-Conditions        *
 * von http://www.phpgangsta.de/mit-wetterdaten-arbeiten-yahoo-weather-api       *
 *                                                                               *
 *********************************************************************************/

//Einstellungen für das Script
$logging = "off"; //erwartet "on" oder "off"
//Einstellungen Ende
 
unset($errors);    //Fehlervariable zurücksetzen

//Funktionsdeklarationen
function logdata($weather, $lati, $longi){
    $data = date("Ymd.His").";".$_SERVER["REMOTE_ADDR"].";$lati;$longi";
    foreach ($weather as $dataobject){
        $data.= ";".$dataobject;
    }
    $data.="\n";
    $filename = "zugriff.txt";
    $file = fopen($filename, "a");
    fwrite($file, $data);
    fclose($file);
}

function debugprint($variable){
    if ((isset($_GET['debug'])) and ($_GET['debug'] = "true")){
        echo "<pre>";
        print_r($variable);
        echo "</pre><br>";
    }
}

function get_wind_direction($wind_direction){
    if (($wind_direction >= 348.75) AND ($wind_direction <=360.00)){
        $wind_direction_converted = "Nord";
    }
    elseif (($wind_direction >= 0.00) AND ($wind_direction <11.25)){
        $wind_direction_converted = "Nord";
    }
    elseif (($wind_direction >= 11.25) AND ($wind_direction <33.75)){
        $wind_direction_converted = "Nordnordost";
    }
    elseif (($wind_direction >= 33.75) AND ($wind_direction <56.25)){
        $wind_direction_converted = "Nordost";
    }
    elseif (($wind_direction >= 56.25) AND ($wind_direction <78.75)){
        $wind_direction_converted = "Ostnordost";
    }
    elseif (($wind_direction >= 78.75) AND ($wind_direction <101.25)){
        $wind_direction_converted = "Ost";
    }
    elseif (($wind_direction >= 101.25) AND ($wind_direction <123.75)){
        $wind_direction_converted = "Ostsuedost";
    }
    elseif (($wind_direction >= 123.75) AND ($wind_direction <146.25)){
        $wind_direction_converted = "Suedost";
    }
    elseif (($wind_direction >= 146.25) AND ($wind_direction <168.75)){
        $wind_direction_converted = "Suedsuedost";
    }
    elseif (($wind_direction >= 168.75) AND ($wind_direction <191.25)){
        $wind_direction_converted = "Sued";
    }
    elseif (($wind_direction >= 191.25) AND ($wind_direction <213.75)){
        $wind_direction_converted = "Suedsuedwest";
    }
    elseif (($wind_direction >= 213.75) AND ($wind_direction <236.25)){
        $wind_direction_converted = "Suedwest";
    }
    elseif (($wind_direction >= 236.25) AND ($wind_direction <258.75)){
        $wind_direction_converted = "Westsuedwest";
    }
    elseif (($wind_direction >= 258.75) AND ($wind_direction <281.25)){
        $wind_direction_converted = "West";
    }
    elseif (($wind_direction >= 281.25) AND ($wind_direction <303.75)){
        $wind_direction_converted = "Westnordwest";
    }
    elseif (($wind_direction >= 303.75) AND ($wind_direction <326.25)){
        $wind_direction_converted = "Nordwest";
    }
    elseif (($wind_direction >= 326.25) AND ($wind_direction <348.75)){
        $wind_direction_converted = "Nordwest";
    }
    else{
        $wind_direction_converted = NULL;
    }
    return ($wind_direction_converted);
}

function translate_conditions($input) {
    if($input == "Light Rain") $data = "Leichter Regen";
    elseif($input == "Haze") $data = "Dunst";
    elseif($input == "Unknown Precipitation") $data = "Niederschlag";
    elseif($input == "Partly Cloudy") $data = "Teilweise bewoelkt";
    elseif($input == "Cloudy") $data = "Bewoelkt";
    elseif($input == "Mostly Cloudy") $data = "ueberwiegend bewoelkt";
    elseif($input == "Blowing Snow") $data = "Schneetreiben";
    elseif($input == "Drizzle") $data = "Nieselregen";
    elseif($input == "Light Rain Shower") $data = "Leichter Regenschauer";
    elseif($input == "Sunny") $data = "Sonnig";
    elseif($input == "Fair") $data = "Heiter";
    elseif($input == "Light Drizzle") $data = "Leichter Nieselregen";
    elseif($input == "Wintry Mix") $data = "Winterlicher Mix";
    elseif($input == "Clear") $data = "Klar";
    elseif($input == "Light Snow") $data = "Leichter Schneefall";
    elseif($input == "Fog") $data = "Nebel";
    elseif($input == "Mist") $data = "Nebel";
    elseif($input == "Showers in the Vicinity") $data = "Regenfaelle in der Naehe";
    elseif($input == "Light Rain/Windy") $data = "Leichter Regen/Windig";
    elseif($input == "Rain and Snow") $data = "Schneeregen";
    elseif($input == "Light Snow") $data = "Leichter Schneefall";
    elseif($input == "Snow") $data = "Schneefall";
    elseif($input == "Rain") $data = "Regen";
    elseif($input == "Mostly Clear") $data = "ueberwiegend Klar";
    elseif($input == "Foggy") $data = "neblig";
    elseif($input == "Freezing Drizzle") $data = "gefrierender Nieselregen";
    elseif($input == "Freezing Rain") $data = "gefrierender Regen";
    elseif($input == "Mostly sunny") $data = "ueberwiegend sonnig";
    elseif($input == "Light Rain/Freezing Rain") $data = "Leichter Regen/Gefrierender Regen";
    elseif($input == "Light Snow Shower") $data = "Leichter Schneeschauer";
    elseif($input == "Ice Crystals") $data = "Eiskristalle";
    elseif($input == "Thunder") $data = "Gewitter";
    elseif($input == "Heavy Thunderstorm") $data = "Schweres Gewitter";
    elseif($input == "Thunderstorm") $data = "Gewitter";
    elseif($input == "Heavy Rain") $data = "Starker Regen";
    elseif($input == "Light Rain with Thunder") $data = "Leichter Regen mit Gewitter";
    elseif($input == "Thunder in the Vicinity") $data = "Gewitter in der Umgebung";
    elseif($input == "Partly Cloudy/Windy") $data = "Teilweise bewoelkt/windig";
    elseif($input == "Light Rain Shower/Windy") $data = "Leichter Regenschauer/windig";
    elseif($input == "Patches of Fog") $data = "Nebelfelder";
    elseif($input == "Rain Shower") $data = "Regenschauer";
    elseif($input == "Light Freezing Rain") $data = "Leichter gefrierender Regen";
    elseif($input == "Rain Shower/Windy") $data = "Regenschauer/Windig";
    elseif($input == "Mostly Cloudy/Windy") $data = "Meist wolkig/Windig";
    elseif($input == "Snow Shower") $data = "Schneeschauer";
    elseif($input == "Patches of Fog/Windy") $data = "Nebelfelder/Windig";
    elseif($input == "Shallow Fog") $data = "flacher Nebel";
    elseif($input == "Cloudy/Windy") $data = "Wolkig/Windig";
    elseif($input == "Light Snow/Fog") $data = "Leichter Schneefall/Nebel";
    elseif($input == "Heavy Rain Shower") $data = "Starker Regenschauer";
    elseif($input == "Light Rain Shower/Fog") $data = "Leichter Regenschauer/Nebel";
    elseif($input == "Rain/Windy") $data = "Regen/Windig";
    elseif($input == "Drizzle/Windy") $data = "Nieselregen/Windig";
    elseif($input == "Heavy Drizzle") $data = "starker Nieselregen";
    elseif($input == "Squalls") $data = "Boeen";
    elseif($input == "Heavy Thunderstorm/Windy") $data = "Schweres Gewitter/Windig";
    elseif($input == "Snow Grains") $data = "Schneegriesel";
    elseif($input == "Partial Fog") $data = "teilweise Nebel";
    elseif($input == "Snow/Windy") $data = "Schnee/Windig";
    elseif($input == "Fair/Windy") $data = "Heiter/Windig";
    elseif($input == "Heavy Snow/Windy") $data = "Starker Schneefall/Windig";
    elseif($input == "Heavy Snow") $data = "Starker Schneefall";
    elseif($input == "Light Snow Shower/Fog") $data = "Leichter Schneeschauer/Nebel";
    elseif($input == "Heavy Snow Shower") $data = "Starker Schneeschauer";
    elseif($input == "Light Snow/Windy") $data = "Leichter Schneeschauer/Windig";
    elseif($input == "Drifting Snow/Windy") $data = "Schneetreiben/Windig";
    elseif($input == "Light Snow/Windy/Fog") $data = "Leichter Schneeschauer/Windig/Nebel";
    elseif($input == "Freezing Drizzle/Windy") $data = "Gefrierender Nieselregen/Windig";
    elseif($input == "Light Snow/Freezing Rain") $data = "Leichter Schneefall/Gefrierender Regen";
    elseif($input == "Light Sleet") $data = "Leichter Schneeregen";
    elseif($input == "Light Freezing Drizzle") $data = "Leichter gefrierender Nieselregen";
    elseif($input == "Light Snow Grains") $data = "Leichter Schneegriesel";
    elseif($input == "Clear/Windy") $data = "Klar/Windig";
    elseif($input == "Heavy Rain/Windy") $data = "Starker Regen/Windig";
    elseif($input == "Fog/Windy") $data = "Nebel/Windig";
    elseif($input == "Unknown") $data = "unbekannt";
    elseif($input == "Sunny/Windy") $data = "Sonnig/Windig";
    elseif($input == "Sleet and Freezing Rain") $data = "Schneeregen und gefrierender Regen";
    elseif($input == "Clear/Windy") $data = "Klar/Windig";
    elseif($input == "Thunderstorm/Windy") $data = "Gewitter/Windig";
    elseif($input == "Light Snow with Thunder") $data = "Leichter Schneefall mit Gewitter";
    elseif($input == "Light Rain/Fog") $data = "Leichter Regen/Nebel";
    elseif($input == "Light Snow/Windy/Fog") $data = "Leichter Schneefall/Windig/Nebel";
    elseif($input == "Sleet/Windy") $data = "Schneeregen/Windig";
    elseif($input == "Rain and Snow/Windy ") $data = "Regen und Schnee/Windig";
    elseif($input == "Fog/Windy") $data = "Nebel/Windig";
    elseif($input == "Rain and Snow/Windy") $data = "Regen und Schnee/Windig";
    elseif($input == "Light Freezing Rain/Fog") $data = "Leichter gefrierender Regen/Nebel";
    elseif($input == "Drifting Snow") $data = "Schneetreiben";
    else $data = $input;
    return $data;
}

function get_WOEID($latitude, $longitude){
    $yqlquery = "http://query.yahooapis.com/v1/public/yql?q=select * from geo.placefinder where text=\"$latitude, $longitude\" and gflags=\"R\"";
    $yqlresult = simplexml_load_file($yqlquery);
    debugprint($yqlquery);
    debugprint($yqlresult);
    return (string)$yqlresult->results->Result->woeid;
}

//hier geht das Script dann los... ;)
if (isset($_GET['lat']) && isset($_GET['lon'])){
    //Länge und Breite wurden übergeben, jetzt auf float prüfen
    $lat = $_GET['lat'];
    $lon = $_GET['lon'];
    if (!is_float((float)$lat)) {
        $errors[] = "lat ist nicht float!";
    }    
    if (!is_float((float)$lon)) {
        $errors[] = "lon ist nicht float!";
    }
}
else{
    //Ohne Längen- und Breitenangaben aufgerufen!
    $errors[] = "Länge und Breite nicht angegeben! script erwartet Parameter script.php?lat=0.0&lon=0.0";
}

//WOE-ID (Yahoo Where on Earth ID) ermitteln
unset ($woeid);
$woeid = get_WOEID($lat, $lon);

if (empty($woeid)){
    //WOE-ID konnte nicht bestimmt werden
    $errors[] = "WOE-ID konnte nicht bestimmt werden, keine Wetterdaten zur aktuellen Position abrufbar";
}

if (empty($errors)){
    //keine Fehler bisher? Dann loslegen und Wetterdaten holen :)
    $weather_query = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid=$woeid%20and%20u=%27c%27"; 
    debugprint($weather_query);
    $weather_data = file_get_contents($weather_query);
    $weather_data = str_replace('<yweather:', '<yweather_', $weather_data);
    $weather_xml  = simplexml_load_string($weather_data);
    
    $weather_array['Datenalter'] = strtotime((string)$weather_xml->results->channel->item->pubDate);
    $weather_array['Stadt'] = (string)$weather_xml->results->channel->yweather_location['city'];
    $weather_array['gefuehlte_Temp'] = (string)$weather_xml->results->channel->yweather_wind['chill'];
    $weather_array['Windrichtung_Grad'] = (float)$weather_xml->results->channel->yweather_wind['direction'];
    $weather_array['Windrichtung_Text'] = get_wind_direction($weather_array['Windrichtung_Grad']);
    $weather_array['Windgeschwindigkeit'] = str_replace(".", ",", (string)$weather_xml->results->channel->yweather_wind['speed']);
    $weather_array['Luftfeuchte'] = (string)$weather_xml->results->channel->yweather_atmosphere['humidity'];
    $weather_array['Luftdruck'] = str_replace(".", ",", (string)$weather_xml->results->channel->yweather_atmosphere['pressure']);
    $weather_array['Sicht'] = str_replace(".", ",", (string)round((float)$weather_xml->results->channel->yweather_atmosphere['visibility'], 1));
    $weather_array['Sonnenaufgang'] = (string)$weather_xml->results->channel->yweather_astronomy['sunrise'];
    $weather_array['Sonnenuntergang'] = (string)$weather_xml->results->channel->yweather_astronomy['sunset'];
    $weather_array['Temperatur'] = (string)$weather_xml->results->channel->item->yweather_condition['temp'];
    $weather_array['Beschreibung'] = translate_conditions((string)$weather_xml->results->channel->item->yweather_condition['text']);
    $weather_array['Temp_max'] = (string)$weather_xml->results->channel->item->yweather_forecast[0]['high'];
    $weather_array['Temp_min'] = (string)$weather_xml->results->channel->item->yweather_forecast[0]['low'];
    debugprint($weather_array);
    echo "Wetterdaten zur Verfuegung gestellt von Yahoo! Weather.<br>"; //muß sein gemäß der Terms of use von Yahoo! Wetter (http://developer.yahoo.com/weather/#terms)
    $format = "DESCRIPTION: Um %s betrug die Aussentemperatur in %s %s Grad. %s. Die gefuehlte Temperatur liegt bei %s Grad. Der Wind weht mit %s Kilometern pro Stunde aus %s. Die Sichtweite betraegt %s Kilometer. Die Luftfeuchtigkeit liegt bei %s Prozent, der Luftdruck betraegt %s Hektopaskal. Fuer heute wird eine Hoechsttemperatur von %s sowie eine Tiefsttemperatur von %s Grad erwartet.";
    $return = sprintf($format, date("G \U\h\\r i",$weather_array['Datenalter']), $weather_array['Stadt'], $weather_array['Temperatur'], $weather_array['Beschreibung'], $weather_array['gefuehlte_Temp'], $weather_array['Windgeschwindigkeit'], $weather_array['Windrichtung_Text'], $weather_array['Sicht'], $weather_array['Luftfeuchte'], $weather_array['Luftdruck'], $weather_array['Temp_max'], $weather_array['Temp_min']);
    echo $return;
    if ($logging == "on"){    
        logdata($weather_array, $lat, $lon);
    }
}

if (isset($errors)){
    //Fehler im Scriptablauf? Dann Fehlermeldungen ausgeben. 
    foreach($errors as $f) { 
        echo $f."<br>";
    }
}
    
?>
der Aufruf wird bereits im oben stehenden Kommentar erklärt:
http://domain.tld/scriptname.php&lat=52.00&lon=14.00
(wobei im Tasker dann wieder die Zahlen durch die Platzhalter der %LOCN-Teilvariablen ersetzt werden müssen :))

Wer den Debug-Output mit sehen möchte (hatte ich beim Entwickeln mit eingebaut um zu sehen, was an Rohdaten aufläuft), kann noch den Parameter &debug=true an die aufrufende URL anfügen. Ist aber für den "normalen" Anwender eher uninteressant. :)

Außerdem habe ich im Script noch eine Logfunktion verbaut (zu konfigurieren über die Variable $logging am Anfang des Scripts), die die Daten von jedem Scriptaufruf in eine Logdatei schreibt. Hier ebenfalls um zu sehen, ob noch irgendwelche Probleme in der Umsetzung Koordinate -> Ortsname oder auch bei den Wetterdaten bestehen.


viel Spaß mit dem PHP-Script :)


Tante Edit:
Ich hab mir erlaubt, das Script mal "von außen" erreichbar zu machen. Unter
http://androidwetter.selfhost.bz/wetter/wetter_yahoo.php?lat=XX.XXXXXX&lon=YY.YYYYYY
(natürlich mit durch eure Koordinaten zu ersetzenden Parameter :)) ist das Script benutzbar. Ich weise aber darauf hin, daß ich das Logging noch aktiv habe (um Fehler zu finden) und daß das Script auf meinem Server zu Haus liegt, es also auch mal sein kann, daß der Server für ein paar Minuten nicht errecihbar ist. Wenn die Zugriffe ins Unermeßliche steigen behalte ich mir auch vor, das Script wieder vom Netz zu nehmen.
Wer damit nicht einverstanden ist, muß das PHP-Script auf einen eigenen Server parken und von dort verwenden.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Beutelbär und mase80
Wow da hat sich ja jemand den Kopf zerbrochen. Super :thumbup:
So wird das "tool" immer besser wenn jeder seine Ideen abgibt.

Danke dir.

getapatalked mit meinem GT-I9100G
 
Vielen vielen Dank hierfür! Irrsinnig praktisch. Ich habe mir noch einzwei Sachen drumherum gebaut, damit ich erst "ja" sagen muss, bevor das Wetter vorgelesen wird. Wenn ich nicht aufpasse, wird daraus noch mein eigener Voice Assistant (wenn man herumliest, scheint das aber eine völlig normale Beschäftigung mit Tasker zu sein :D )

Wäre es vielleicht möglich, auch eine "light" Variante von dem Skript ansprechen zu können? Wenn man sich das vorlesen lässt, wird man erstmal ganz schön zugequatscht :D

Ich würde das sicher auch selber hinkriegen, wüsste aber nicht, wo/wie ich das neue Skript hosten sollte.
 
Zuletzt bearbeitet:
ich vermute, du meinst mein PHP-Script mit dem Wunsch nach einer Wetteransage "light".

nun - "light" definiert jeder etwas anders. ;) Ich kann mal schauen, ob ich es noch gebacken bekomme, die einzelnen Wetterdaten per Parameter konfigurierbar zu machen (hatte mir anfangs zwar vorgeschwebt, aber ich wollte dann doch alles haben *g*). Kann aber noch nicht versprechen, wie schnell ich das umgesetzt bekomme. Ich bin nämlich zur Zeit eigentlich noch hinter etwas anderem her, nämlich mir morgens nach dem Wetterbericht auch meine Tagestermine ansagen zu lassen :) (so viel zum Thema Voice Assistant *gg*)
 
  • Danke
Reaktionen: magic.dave
obelix76 schrieb:
ich vermute, du meinst mein PHP-Script mit dem Wunsch nach einer Wetteransage "light".

Ja genau. Ich wollte eigentlich auch quoten und betonen, dass ich nur für diesen Post und dieses Dankeschön an dich hier angemeldet habe, aber dann hats mich während dem Schreiben wieder ausgeloggt und mein schöner post war weg. Deswegen ist es eine etwas hektischere Version geworden

Danke jedenfalls für deine Antwort

obelix76 schrieb:
nun - "light" definiert jeder etwas anders. ;) Ich kann mal schauen, ob ich es noch gebacken bekomme, die einzelnen Wetterdaten per Parameter konfigurierbar zu machen (hatte mir anfangs zwar vorgeschwebt, aber ich wollte dann doch alles haben *g*). Kann aber noch nicht versprechen, wie schnell ich das umgesetzt bekomme. Ich bin nämlich zur Zeit eigentlich noch hinter etwas anderem her, nämlich mir morgens nach dem Wetterbericht auch meine Tagestermine ansagen zu lassen :) (so viel zum Thema Voice Assistant *gg*)

Hehehe. Konfigurierbarkeit wäre natürlich enorm cool. Hoffentlich findest du Zeit dafür :D Ich behalte den Thread auf jeden Fall im Auge.
 
ich hab das PHP-script angepaßt... ab sofort neben komplettem Bericht auch einzelne Wetterparameter nutzbar... ;)

hier erstmal das Script, falls es jemand selbst hosten will:
PHP:
<?php

/*************************************************************************************************
 * Einfaches Script zum Abrufen ortsbasierter Wetterdaten von Yahoo! Wetter                      *
 * Syntax: scriptname.php?lat=12.345&lon=12.345&debug&W&St&T&T_gef&B&Si&Lf&Ld&T_maxmin&full      *
 *         der Parameter "debug" ist optional, die Parameter für die                             *
 *         Wetterdaten werden wie folgt benötigt:                                                *
 *           St       ... für die Ansage der Stadt/Region der Wetteransage                       *
 *           T        ... Temperatur                                                             *
 *           T_gef    ... gefühlte Temperatur                                                    *
 *           B        ... Beschreibungstext                                                      *
 *           W        ... Windrichtung und -geschwindigkeit                                      *
 *           Si       ... Sichtweite                                                             *
 *           Lf       ... Luftfeuchtigkeit                                                       *
 *           Ld       ... Luftdruck                                                              *
 *           T_maxmin ... erwartete Maximal-/Minimaltemperatur                                   *
 *           full     ... komplette Ansage aller Parameter, wird bei gleichzeitiger Angabe eines *
 *                        der anderen Wetterparameter ignoriert                                  *
 *                                                                                               *
 * Datum: 06.11.2012                                                                             *
 * Version: 1.2 vom 02.12.2012                                                                   *
 *                                                                                               *
 * Funktionen für Windrichtungen und Übersetzungen der Weather-Conditions                        *
 * von http://www.phpgangsta.de/mit-wetterdaten-arbeiten-yahoo-weather-api                       *
 *                                                                                               *
 *************************************************************************************************/

//Einstellungen für das Script
$logging = "on";
//Einstellungen Ende
 
unset($errors);    //Fehlervariable zurücksetzen

//Funktionsdeklarationen
function logdata($weather, $lati, $longi){
    $data = date("Ymd.His").";".$_SERVER["REMOTE_ADDR"].";$lati;$longi";
    foreach ($weather as $dataobject){
        $data.= ";".$dataobject;
    }
    $data.="\n";
    $filename = "wetterzugriff.txt";
    $file = fopen($filename, "a");
    fwrite($file, $data);
    fclose($file);
}

function replace_specialchars($inputstring){
    $output = str_replace("ä", "ae", utf8_decode($inputstring));
    $output = str_replace("Ä", "Ae", $output);
    $output = str_replace("ö", "oe", $output);
    $output = str_replace("Ö", "Oe", $output);
    $output = str_replace("ü", "ue", $output);
    $output = str_replace("Ü", "Ue", $output);
    $output = str_replace("ß", "ss", $output);
    return $output;
}

function debugprint($variable){
    if (isset($_GET['debug'])){
        echo "<pre>";
        print_r($variable);
        echo "</pre><br>";
    }
}

function get_wind_direction($wind_direction){
    if (($wind_direction >= 348.75) AND ($wind_direction <=360.00)){
        $wind_direction_converted = "Nord";
    }
    elseif (($wind_direction >= 0.00) AND ($wind_direction <11.25)){
        $wind_direction_converted = "Nord";
    }
    elseif (($wind_direction >= 11.25) AND ($wind_direction <33.75)){
        $wind_direction_converted = "Nordnordost";
    }
    elseif (($wind_direction >= 33.75) AND ($wind_direction <56.25)){
        $wind_direction_converted = "Nordost";
    }
    elseif (($wind_direction >= 56.25) AND ($wind_direction <78.75)){
        $wind_direction_converted = "Ostnordost";
    }
    elseif (($wind_direction >= 78.75) AND ($wind_direction <101.25)){
        $wind_direction_converted = "Ost";
    }
    elseif (($wind_direction >= 101.25) AND ($wind_direction <123.75)){
        $wind_direction_converted = "Ostsuedost";
    }
    elseif (($wind_direction >= 123.75) AND ($wind_direction <146.25)){
        $wind_direction_converted = "Suedost";
    }
    elseif (($wind_direction >= 146.25) AND ($wind_direction <168.75)){
        $wind_direction_converted = "Suedsuedost";
    }
    elseif (($wind_direction >= 168.75) AND ($wind_direction <191.25)){
        $wind_direction_converted = "Sued";
    }
    elseif (($wind_direction >= 191.25) AND ($wind_direction <213.75)){
        $wind_direction_converted = "Suedsuedwest";
    }
    elseif (($wind_direction >= 213.75) AND ($wind_direction <236.25)){
        $wind_direction_converted = "Suedwest";
    }
    elseif (($wind_direction >= 236.25) AND ($wind_direction <258.75)){
        $wind_direction_converted = "Westsuedwest";
    }
    elseif (($wind_direction >= 258.75) AND ($wind_direction <281.25)){
        $wind_direction_converted = "West";
    }
    elseif (($wind_direction >= 281.25) AND ($wind_direction <303.75)){
        $wind_direction_converted = "Westnordwest";
    }
    elseif (($wind_direction >= 303.75) AND ($wind_direction <326.25)){
        $wind_direction_converted = "Nordwest";
    }
    elseif (($wind_direction >= 326.25) AND ($wind_direction <348.75)){
        $wind_direction_converted = "Nordwest";
    }
    else{
        $wind_direction_converted = NULL;
    }
    return ($wind_direction_converted);
}

function translate_conditions($input) {
    if($input == "Light Rain") $data = "Leichter Regen";
    elseif($input == "Haze") $data = "Dunst";
    elseif($input == "Unknown Precipitation") $data = "Niederschlag";
    elseif($input == "Partly Cloudy") $data = "Teilweise bewoelkt";
    elseif($input == "Cloudy") $data = "Bewoelkt";
    elseif($input == "Mostly Cloudy") $data = "ueberwiegend bewoelkt";
    elseif($input == "Blowing Snow") $data = "Schneetreiben";
    elseif($input == "Drizzle") $data = "Nieselregen";
    elseif($input == "Light Rain Shower") $data = "Leichter Regenschauer";
    elseif($input == "Sunny") $data = "Sonnig";
    elseif($input == "Fair") $data = "Heiter";
    elseif($input == "Light Drizzle") $data = "Leichter Nieselregen";
    elseif($input == "Wintry Mix") $data = "Winterlicher Mix";
    elseif($input == "Clear") $data = "Klar";
    elseif($input == "Light Snow") $data = "Leichter Schneefall";
    elseif($input == "Fog") $data = "Nebel";
    elseif($input == "Mist") $data = "Nebel";
    elseif($input == "Showers in the Vicinity") $data = "Regenfaelle in der Naehe";
    elseif($input == "Light Rain/Windy") $data = "Leichter Regen/Windig";
    elseif($input == "Rain and Snow") $data = "Schneeregen";
    elseif($input == "Light Snow") $data = "Leichter Schneefall";
    elseif($input == "Snow") $data = "Schneefall";
    elseif($input == "Rain") $data = "Regen";
    elseif($input == "Mostly Clear") $data = "ueberwiegend Klar";
    elseif($input == "Foggy") $data = "neblig";
    elseif($input == "Freezing Drizzle") $data = "gefrierender Nieselregen";
    elseif($input == "Freezing Rain") $data = "gefrierender Regen";
    elseif($input == "Mostly sunny") $data = "ueberwiegend sonnig";
    elseif($input == "Light Rain/Freezing Rain") $data = "Leichter Regen/Gefrierender Regen";
    elseif($input == "Light Snow Shower") $data = "Leichter Schneeschauer";
    elseif($input == "Ice Crystals") $data = "Eiskristalle";
    elseif($input == "Thunder") $data = "Gewitter";
    elseif($input == "Heavy Thunderstorm") $data = "Schweres Gewitter";
    elseif($input == "Thunderstorm") $data = "Gewitter";
    elseif($input == "Heavy Rain") $data = "Starker Regen";
    elseif($input == "Light Rain with Thunder") $data = "Leichter Regen mit Gewitter";
    elseif($input == "Thunder in the Vicinity") $data = "Gewitter in der Umgebung";
    elseif($input == "Partly Cloudy/Windy") $data = "Teilweise bewoelkt/windig";
    elseif($input == "Light Rain Shower/Windy") $data = "Leichter Regenschauer/windig";
    elseif($input == "Patches of Fog") $data = "Nebelfelder";
    elseif($input == "Rain Shower") $data = "Regenschauer";
    elseif($input == "Light Freezing Rain") $data = "Leichter gefrierender Regen";
    elseif($input == "Rain Shower/Windy") $data = "Regenschauer/Windig";
    elseif($input == "Mostly Cloudy/Windy") $data = "Meist wolkig/Windig";
    elseif($input == "Snow Shower") $data = "Schneeschauer";
    elseif($input == "Patches of Fog/Windy") $data = "Nebelfelder/Windig";
    elseif($input == "Shallow Fog") $data = "flacher Nebel";
    elseif($input == "Cloudy/Windy") $data = "Wolkig/Windig";
    elseif($input == "Light Snow/Fog") $data = "Leichter Schneefall/Nebel";
    elseif($input == "Heavy Rain Shower") $data = "Starker Regenschauer";
    elseif($input == "Light Rain Shower/Fog") $data = "Leichter Regenschauer/Nebel";
    elseif($input == "Rain/Windy") $data = "Regen/Windig";
    elseif($input == "Drizzle/Windy") $data = "Nieselregen/Windig";
    elseif($input == "Heavy Drizzle") $data = "starker Nieselregen";
    elseif($input == "Squalls") $data = "Boeen";
    elseif($input == "Heavy Thunderstorm/Windy") $data = "Schweres Gewitter/Windig";
    elseif($input == "Snow Grains") $data = "Schneegriesel";
    elseif($input == "Partial Fog") $data = "teilweise Nebel";
    elseif($input == "Snow/Windy") $data = "Schnee/Windig";
    elseif($input == "Fair/Windy") $data = "Heiter/Windig";
    elseif($input == "Heavy Snow/Windy") $data = "Starker Schneefall/Windig";
    elseif($input == "Heavy Snow") $data = "Starker Schneefall";
    elseif($input == "Light Snow Shower/Fog") $data = "Leichter Schneeschauer/Nebel";
    elseif($input == "Heavy Snow Shower") $data = "Starker Schneeschauer";
    elseif($input == "Light Snow/Windy") $data = "Leichter Schneeschauer/Windig";
    elseif($input == "Drifting Snow/Windy") $data = "Schneetreiben/Windig";
    elseif($input == "Light Snow/Windy/Fog") $data = "Leichter Schneeschauer/Windig/Nebel";
    elseif($input == "Freezing Drizzle/Windy") $data = "Gefrierender Nieselregen/Windig";
    elseif($input == "Light Snow/Freezing Rain") $data = "Leichter Schneefall/Gefrierender Regen";
    elseif($input == "Light Sleet") $data = "Leichter Schneeregen";
    elseif($input == "Light Freezing Drizzle") $data = "Leichter gefrierender Nieselregen";
    elseif($input == "Light Snow Grains") $data = "Leichter Schneegriesel";
    elseif($input == "Clear/Windy") $data = "Klar/Windig";
    elseif($input == "Heavy Rain/Windy") $data = "Starker Regen/Windig";
    elseif($input == "Fog/Windy") $data = "Nebel/Windig";
    elseif($input == "Unknown") $data = "unbekannt";
    elseif($input == "Sunny/Windy") $data = "Sonnig/Windig";
    elseif($input == "Sleet and Freezing Rain") $data = "Schneeregen und gefrierender Regen";
    elseif($input == "Clear/Windy") $data = "Klar/Windig";
    elseif($input == "Thunderstorm/Windy") $data = "Gewitter/Windig";
    elseif($input == "Light Snow with Thunder") $data = "Leichter Schneefall mit Gewitter";
    elseif($input == "Light Rain/Fog") $data = "Leichter Regen/Nebel";
    elseif($input == "Light Snow/Windy/Fog") $data = "Leichter Schneefall/Windig/Nebel";
    elseif($input == "Sleet/Windy") $data = "Schneeregen/Windig";
    elseif($input == "Rain and Snow/Windy ") $data = "Regen und Schnee/Windig";
    elseif($input == "Fog/Windy") $data = "Nebel/Windig";
    elseif($input == "Rain and Snow/Windy") $data = "Regen und Schnee/Windig";
    elseif($input == "Light Freezing Rain/Fog") $data = "Leichter gefrierender Regen/Nebel";
    elseif($input == "Drifting Snow") $data = "Schneetreiben";
    else $data = $input;
    return $data;
}

function get_WOEID($latitude, $longitude){
    $yqlquery = "http://query.yahooapis.com/v1/public/yql?q=select * from geo.placefinder where text=\"$latitude, $longitude\" and gflags=\"R\"";
    $yqlresult = simplexml_load_file($yqlquery);
    debugprint($yqlquery);
    debugprint($yqlresult);
    return (string)$yqlresult->results->Result->woeid;
}

//hier geht das Script dann los... ;)
if (isset($_GET['lat']) && isset($_GET['lon'])){
    //Länge und Breite wurden übergeben, jetzt auf float prüfen
    $lat = $_GET['lat'];
    $lon = $_GET['lon'];
    if (!is_float((float)$lat)) {
        $errors[] = "lat ist nicht float!";
    }    
    if (!is_float((float)$lon)) {
        $errors[] = "lon ist nicht float!";
    }
}
else{
    //Ohne Längen- und Breitenangaben aufgerufen!
    $errors[] = "Länge und Breite nicht angegeben! script erwartet Parameter!";
    $errors[] = "Syntax: script.php?lat=0.0&lon=0.0";
}

//WOE-ID (Yahoo Where on Earth ID) ermitteln
unset ($woeid);
$woeid = get_WOEID($lat, $lon);

if (empty($woeid)){
    //WOE-ID konnte nicht bestimmt werden
    $errors[] = "WOE-ID konnte nicht bestimmt werden, keine Wetterdaten zur aktuellen Position abrufbar";
}

if (empty($errors)){
    //keine Fehler bisher? Dann loslegen und Wetterdaten holen :)
    $weather_query = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid=$woeid%20and%20u=%27c%27"; 
    debugprint($weather_query);
    $weather_data = file_get_contents($weather_query);
    $weather_data = str_replace('<yweather:', '<yweather_', $weather_data);
    $weather_xml  = simplexml_load_string($weather_data);
    
    $weather_array['Datenalter'] = strtotime((string)$weather_xml->results->channel->item->pubDate);
    $weather_array['Stadt'] = replace_specialchars((string)$weather_xml->results->channel->yweather_location['city']);
    $weather_array['gefuehlte_Temp'] = (string)$weather_xml->results->channel->yweather_wind['chill'];
    $weather_array['Windrichtung_Grad'] = (float)$weather_xml->results->channel->yweather_wind['direction'];
    $weather_array['Windrichtung_Text'] = get_wind_direction($weather_array['Windrichtung_Grad']);
    $weather_array['Windgeschwindigkeit'] = str_replace(".", ",", (string)$weather_xml->results->channel->yweather_wind['speed']);
    $weather_array['Luftfeuchte'] = (string)$weather_xml->results->channel->yweather_atmosphere['humidity'];
    $weather_array['Luftdruck'] = str_replace(".", ",", (string)$weather_xml->results->channel->yweather_atmosphere['pressure']);
    $weather_array['Sicht'] = str_replace(".", ",", (string)round((float)$weather_xml->results->channel->yweather_atmosphere['visibility'], 1));
    $weather_array['Sonnenaufgang'] = (string)$weather_xml->results->channel->yweather_astronomy['sunrise'];
    $weather_array['Sonnenuntergang'] = (string)$weather_xml->results->channel->yweather_astronomy['sunset'];
    $weather_array['Temperatur'] = (string)$weather_xml->results->channel->item->yweather_condition['temp'];
    $weather_array['Beschreibung'] = translate_conditions((string)$weather_xml->results->channel->item->yweather_condition['text']);
    $weather_array['Temp_max'] = (string)$weather_xml->results->channel->item->yweather_forecast[0]['high'];
    $weather_array['Temp_min'] = (string)$weather_xml->results->channel->item->yweather_forecast[0]['low'];
    debugprint($weather_array);
    echo "Wetterdaten zur Verfuegung gestellt von Yahoo! Weather.<br>"; //muß sein gemäß der Terms of use von Yahoo! Wetter (http://developer.yahoo.com/weather/#terms)
    echo "DESCRIPTION: Das Wetter von ".date("G \U\h\\r i",$weather_array['Datenalter']).": ";
    if (isset($_GET['St'])){
        echo "Fuer die Ortslage ".$weather_array['Stadt'].". ";
        $parameter[] = "Stadt";
    }
    if (isset($_GET['T'])){
        echo "Die Aussentemperatur betraegt ".$weather_array['Temperatur']." Grad. ";
        $parameter[] = "Temperatur";
    }
    if (isset($_GET['T_gef'])){
        echo "Die gefuehlte Temperatur liegt bei ".$weather_array['gefuehlte_Temp']." Grad. ";
        $parameter[] = "Gefühlte Temperatur";
    }
    if (isset($_GET['B'])) {
        echo $weather_array['Beschreibung'].". ";
        $parameter[] = "Beschreibung";
    }
    if (isset($_GET['W'])) {
        echo "Der Wind weht mit ".$weather_array['Windgeschwindigkeit']." Kilometern pro Stunde aus ".$weather_array['Windrichtung_Text'].". ";
        $parameter[] = "Windrichtung und -geschwindigkeit";
    }
    if (isset($_GET['Si'])){
        echo "Die Sichtweite liegt bei ".$weather_array['Sicht']." Kilometern. ";
        $parameter[] = "Sichtweite";
    }
    if (isset($_GET['Lf'])) {
        echo "Die Luftfeuchtigkeit liegt bei ".$weather_array['Luftfeuchte']." Prozent. ";
        $parameter[] = "Luftfeuchtigkeit";
    }
    if (isset($_GET['Ld'])) {
        echo "Der Luftdruck betraegt ".$weather_array['Luftdruck']." Hektopaskal. ";
        $parameter[] = "Luftdruck";
    }
    if (isset($_GET['T_maxmin'])) {
        echo "Fuer heute wird heine Hoechsttemperatur von ".$weather_array['Temp_max']." sowie eine Tiefsttemperatur von ".$weather_array['Temp_min']." Grad erwartet. ";
        $parameter[] = "Temperatur max/min";
    }
    if ((isset($_GET['full'])) && (empty($parameter))){
        $format = "Die Aussentemperatur betraegt in %s %s Grad. %s. Die gefuehlte Temperatur liegt bei %s Grad. Der Wind weht mit %s Kilometern pro Stunde aus %s. Die Sichtweite betraegt %s Kilometer. Die Luftfeuchtigkeit liegt bei %s Prozent, der Luftdruck betraegt %s Hektopaskal. Fuer heute wird eine Hoechsttemperatur von %s sowie eine Tiefsttemperatur von %s Grad erwartet.";
        $return = sprintf($format, $weather_array['Stadt'], $weather_array['Temperatur'], $weather_array['Beschreibung'], $weather_array['gefuehlte_Temp'], $weather_array['Windgeschwindigkeit'], $weather_array['Windrichtung_Text'], $weather_array['Sicht'], $weather_array['Luftfeuchte'], $weather_array['Luftdruck'], $weather_array['Temp_max'], $weather_array['Temp_min']);
        echo $return;
    }
    if (!(isset($_GET['full'])) && (empty($parameter))){
        echo " Nicht verfuegbar, da keine Wetterparameter uebergeben wurden! (nutzbare Wetterparameter sind W, St, T, T_gef, B, Si, Lf, Ld, T_maxmin sowie full)";
    }
    if ($logging == "on"){    
        logdata($weather_array, $lat, $lon);
    }
}

if (isset($errors)){
    //Fehler im Scriptablauf? Dann Fehlermeldungen ausgeben. 
    foreach($errors as $f) { 
        echo $f."<br>";
    }
}
    
?>
im Kommentar oben sind auch die Parameter erklärt. Wer alles so haben will wie bisher, verwendet einfach den Parameter "full". Ansonsten kann man sich auch seine "eigene" Ansage mit Hilfe der Parameter zusammenstellen. Die Reihenfolge der Einzelparameter im URL-Aufruf ist nicht maßgebend für die "Sortierung" des zurückgegebenen Strings, ich habe auf die Schnelle keine Auswertung dafür programmiert.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: magic.dave
Der Hammer! Vielen Dank!!
 
@obelix76

Riesen Dank dafür! :) Hatte genau das gleiche vor gehabt mit deinem (ohnehin schon sehr nützlichen) Skript. Hätte mich aber erstmal in php einlesen müssen und leider fehlt mir momentan die Zeit dafür.
 
Ich wollte dein Skript mal auf einem Webspace hosten, kriege aber immer folgende Meldung:

Code:
Warning: simplexml_load_file() [function.simplexml-load-file]: http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/www/cwcity/hosting/m/a/magicdave/htdocs/weather.php on line 220

Warning: simplexml_load_file(http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20geo.placefinder%20where%20text=%22%2C%20%22%20and%20gflags=%22R%22) [function.simplexml-load-file]: failed to open stream: no suitable wrapper could be found in /home/www/cwcity/hosting/m/a/magicdave/htdocs/weather.php on line 220

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20geo.placefinder%20where%20text=%22%2C%20%22%20and%20gflags=%22R%22" in /home/www/cwcity/hosting/m/a/magicdave/htdocs/weather.php on line 220
Länge und Breite nicht angegeben! script erwartet Parameter!
Syntax: script.php?lat=0.0&lon=0.0
WOE-ID konnte nicht bestimmt werden, keine Wetterdaten zur aktuellen Position abrufbar

Weißt du woran das liegen kann?
 
magic.dave schrieb:
Ich wollte dein Skript mal auf einem Webspace hosten, kriege aber immer folgende Meldung: [...]
Weißt du woran das liegen kann?

Hm - ich bin mir nicht sicher, könnte auch daran liegen, daß simplexml, womit ich die Daten auseinanderpflücke, erst ab einer bestimmten PHP-Version dabei war, bei dir fehlt und das Script deswegen nicht mag.

mach dir mal eine kleine PHP-Datei mit folgendem Inhalt:
PHP:
<?php
phpinfo();
?>
und ruf die auf. Der Befehl in dem Script gibt dir Informationen über die PHP-Version, die auf deinem Webspace läuft. Irgendwo müßte es auch einen Abschnitt SimpleXML geben, der dir sagt, ob die Extension aktiv ist oder nicht.

Ich glaub, simplexml ist ab PHP 5 dabei.
 
Danke für deine schnelle Antwort.

Herausgefunden habe ich das die PHP Version 5.3.4 ist und SimpleXML habe ich angehängt.
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    1,9 KB · Aufrufe: 348
Wie macht man das
Die für das Script passenden Koordinaten bekommt man in Tasker, indem man %LOCN (ich verwende die netzbasierte Koordinate, weil ich GPS meist aus habe ) einmal mit Variablesplit aufteilt und dann die beiden Teilvariablen beim HTTP-Get verwendet.
 
Variable -> Variable aufteilen -> bei Name "%LOCN", Teiler ","
(in der Eingabemaske vom Tasker muß es natürlich ohne die "" eingegeben werden)

das erzeugt dir zwei neue Variablen - %LOCN1 und %LOCN2, die die Teile des Inhalts der Variable %LOC vor und nach dem Komma enthalten.
%LOCN1 und %LOCN2 verwendet man dann bei der Anfrage an das PHP-Script an den passenden Stellen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: tormos
alles klar danke..jetzt noch ne andere Frage ..hab den script auf mein server bei t-online hochgeladen..wenn ich den aber ausführen will, wird er nur downgeladet:(..hat jemand ein Tip..
 
ich würde jetzt mal ins blaue hinein raten, daß dein Webspace keine PHP-unterstützung hat. Wenn der Server PHP kann, und die Datei auch als script.php (wichtig: Dateiendung php) auf dem Server liegt, sollte sie ausgeführt werden und nicht zum Download übergeben werden.
 
ehrlich: ich hab keinen Dunst, was für einen Vertrag du hast bei der Telekom (meine Glaskugel ist schon im Urlaub ;)) - es gibt bei denen bestimmt auch Hostingverträge die PHP beinhalten.
Selbst "einstellen" wirst du das im Allgemeinen nicht können - außer eben du läßt den Support deinen Vertrag auf ein Hosting mit PHP-unterstützung umstellen. (Was dann vermutlich Kosten verursacht).

Aber wie gesagt - ob bzw. wie dein Webspace PHP-unterstützung bekommt, kann ich dir nicht sagen, frage im Zweifel den Support. ;)

Warum nutzt du nicht das Script, so wie ich es auf meinem Webspace hoste? (siehe hier: https://www.android-hilfe.de/forum/...wetterservern.297343-page-3.html#post-4581976 ) Oder hast du selbst noch was spezielles dazuprogrammiert?
 

Ähnliche Themen

S
Antworten
9
Aufrufe
328
holms
holms
H
Antworten
0
Aufrufe
264
Horgul123
H
M
Antworten
27
Aufrufe
1.078
MeinNickname
MeinNickname
Zurück
Oben Unten