O
obelix76
Ambitioniertes Mitglied
- 9
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:
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.
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>";
}
}
?>
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: