Wetterdaten - Wunderground API

Ich würde dir raten dich dort anzumelden und die API zu nutzten. Mache ich auch. Bekommen die Daten dann im JSON Format. Kannst 500 abfragen am Tag machen - kostenlos. Danach bekommst du einfach eine Fehlermeldung

Warte gerade noch auf den Bestätigungslink :slight_smile:

Bei Fragen helfe ich gerne weiter

Kann man anstatt der GEolokalen Koordinaten auch die Station mit NAMEN hinterlegen?

ist ja im Beispielscript ganz am Anfang auch so drin.

Ähmm… wenn ich den Ort angebe… dann werden doch nicht die Daten von einer bestimmte User Wetterstation aus dem Ort verwendet? Oder…

Ich dachte: der Ort ist das eine… eine bestimmte USER Wetterstation etwas anderes :slight_smile:

Click mal direkt auf „Data Features“. Danke das es dann klarer wird. geolookup könnte bei der Bestimmung deiner „Quelle“ ganz hilfreich sein

Guck mal hier… da wird das genutzt!

So Key bekommen :slight_smile:

<?php
$api = "XYZ"; // key erhält man nach Registrierung bei http://www.wunderground.com/weather/api/

$zmw= "48.24236679,9.93274975";
/* ZMW kann man ermitteln mit dem Längengrad und Breitengrad, nachdem man sich einen API-Key besorgt hat*
http://api.wunderground.com/api/.... API-KEY..../geolookup/q/48.03688878166352,8.930683135986328.json
*/


// Create own variables for
$cur_temp_var = true;
$cur_cludy_icon = true;

/* Daten von der eigenen Wetterstation in Aktuell einbeziehen
   Falls nicht vorhanden einfach auf 0 setzen */
$cur_temp = 39140 /*[Aussentemperatur\Temperatur]*/;
$cur_hum  = 0;
$cur_wind = 0;
$cur_rain = 0;

// ----------------------------
$tag[0] = "Sonntag";
$tag[1] = "Montag";
$tag[2] = "Dienstag";
$tag[3] = "Mittwoch";
$tag[4] = "Donnerstag";
$tag[5] = "Freitag";
$tag[6] = "Samstag";

//aktuelles Wetter
    $xmlWetter = file_get_contents("http://api.wunderground.com/api/$api/forecast/q/zmw:$zmw.xml");
    $xmlWetterNow = file_get_contents("http://api.wunderground.com/api/$api/conditions/q/zmw:$zmw.xml");

    $xml = simplexml_load_string($xmlWetter);
    $xmlNow = simplexml_load_string($xmlWetterNow);
    $x = 0;
    $html = "<table >
                <tr>";
    // Aktuell
    if($cur_temp != 0){
       $temp_now = getvalue($cur_temp);
    } else {
       $temp_now = $xmlNow->current_observation->temp_c;
    }

    if($cur_hum != 0){
       $hum_now = GetValueFormatted($cur_hum);
    } else {
       $hum_now = $xmlNow->current_observation->relative_humidity;
    }

    if($cur_wind != 0){
       $wind_now = GetValueFormatted($cur_wind);
    } else {
       $wind_now = $xmlNow->current_observation->wind_kph."km/h";
    }

    if($cur_rain != 0){
       $rain_now = GetValueFormatted($cur_rain);
    } else {
       $rain_now = ($xmlNow->current_observation->precip_1hr_metric * 10 ).' mm';
    }
    if($cur_cludy_icon){
        SetValue(CreateVariableByName($IPS_SELF, "Weather_Icon", 3, ""), strval($xmlNow->current_observation->icon_url));
    }
    $html.= '<td align="center" valign="top"  style="width:110px;padding-left:20px;">
                    Aktuell<br>
                    <img src="'.$xmlNow->current_observation->icon_url.'" style="float:left;">
                    <div style="float:right">
                    '.$temp_now.'°C<br>
                    '.$hum_now.'<br>
                    </div>
                    <div style="clear:both; font-size: 10px;">Ø Wind: '.$wind_now.'<br>
                    Regen 1h: '.$rain_now.'
                    </div>
                </td>';
    // Vorhersage
    foreach($xml->forecast->simpleforecast->forecastdays->forecastday as $name=> $day){
        if( isToday($day->date->epoch)){
            $Wochentag = "Heute";
        } else {
            $Wochentag =$tag[date("w",intval($day->date->epoch))];
        }
        $html.= '<td align="center" valign="top"  style="width:110px;padding-left:20px;">
                        '.$Wochentag.'<br>
                        <img src="'.$day->icon_url.'" style="float:left;">
                        <div style="float:right">
                        '.$day->low->celsius.'°C<br>
                        '.$day->high->celsius.'°C
                        </div>
                        <div style="clear:both; font-size: 10px;">Ø Wind: '.$day->avewind->kph.' km/h<br>
                        Niederschlag: '.($day->qpf_allday->mm).' mm
                        </div>
                    </td>';
    }
    $html .= "</tr>
                </table>";
   SetValue(CreateVariableByName($IPS_SELF, "Wetter", 3, "~HTMLBox"), $html);
      if($cur_temp_var){
          $cur_temp = floatval($xmlNow->current_observation->temp_c);
        SetValue(CreateVariableByName($IPS_SELF, "Aktuelle Temperatur", 2, "~Temperature"),$cur_temp );
    }

function CreateVariableByName($id, $name, $type, $profile = "")
{
    # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

function isToday($time)
{
  $begin = mktime(0, 0, 0);
  $end = mktime(23, 59, 59);
  // check if given time is between begin and end
  if($time >= $begin && $time <= $end)
  {
    return true;
  } else {
    return false;
  }
}

Beim ersten ausführen .-> Fehler:

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\33587.ips.php on line 78
Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\33587.ips.php on line 78
Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\33587.ips.php on line 78

In Zeile 77/78 steht:
// Vorhersage
foreach($xml->forecast->simpleforecast->forecastdays->forecastday as $name=> $day){

Wenn ich die XML dieser Station aufrufe… gibts dort Forecastwerte
http://www.wunderground.com/cgi-bin/findweather/getForecast?query=48.24236679,9.93274975

Was fehlt da noch?

current_observation steht in den conditions. Ist zwar eine Weile her, aber ich glaube, zmw ist doch für die Unwetter?

ich hol mir auf jeden Fall diese Daten aus folgendem Link

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

Vielen Dank für den Anschubser… ich hab tatsächlich das falsche abgerufen… MIt Ortsangabe und deiner Vorlage klappts super!!!

Hier der Auszug, damit es ein komplettes „deutsches“ Beispiel gibt:

<?php
$api = "XYZKEY"; // key erhält man nach Registrierung bei http://www.wunderground.com/weather/api/
$ort = "BURGRIEDEN";
/* ZMW kann man ermitteln mit dem Längengrad und Breitengrad, nachdem man sich einen API-Key besorgt hat*
http://api.wunderground.com/api/.... API-KEY..../geolookup/q/48.03688878166352,8.930683135986328.json
*/


// Create own variables for
$cur_temp_var = true;
$cur_cludy_icon = true;

/* Daten von der eigenen Wetterstation in Aktuell einbeziehen
   Falls nicht vorhanden einfach auf 0 setzen */
$cur_temp = 0;
$cur_hum  = 0;
$cur_wind = 0;
$cur_rain = 0;

// ----------------------------
$tag[0] = "Sonntag";
$tag[1] = "Montag";
$tag[2] = "Dienstag";
$tag[3] = "Mittwoch";
$tag[4] = "Donnerstag";
$tag[5] = "Freitag";
$tag[6] = "Samstag";

//aktuelles Wetter
    $xmlWetter = file_get_contents("http://api.wunderground.com/api/$api/forecast/q/$ort.xml");
    $xmlWetterNow = file_get_contents("http://api.wunderground.com/api/$api/conditions/q/$ort.xml");

    $xml = simplexml_load_string($xmlWetter);
    $xmlNow = simplexml_load_string($xmlWetterNow);
    $x = 0;
    $html = "<table >
                <tr>";
    // Aktuell
    if($cur_temp != 0){
       $temp_now = getvalue($cur_temp);
    } else {
       $temp_now = $xmlNow->current_observation->temp_c;
    }

    if($cur_hum != 0){
       $hum_now = GetValueFormatted($cur_hum);
    } else {
       $hum_now = $xmlNow->current_observation->relative_humidity;
    }

    if($cur_wind != 0){
       $wind_now = GetValueFormatted($cur_wind);
    } else {
       $wind_now = $xmlNow->current_observation->wind_kph."km/h";
    }

    if($cur_rain != 0){
       $rain_now = GetValueFormatted($cur_rain);
    } else {
       $rain_now = ($xmlNow->current_observation->precip_1hr_metric * 10 ).' mm';
    }
    if($cur_cludy_icon){
        SetValue(CreateVariableByName($IPS_SELF, "Weather_Icon", 3, ""), strval($xmlNow->current_observation->icon_url));
    }
    $html.= '<td align="center" valign="top"  style="width:110px;padding-left:20px;">
                    Aktuell<br>
                    <img src="'.$xmlNow->current_observation->icon_url.'" style="float:left;">
                    <div style="float:right">
                    '.$temp_now.'°C<br>
                    '.$hum_now.'<br>
                    </div>
                    <div style="clear:both; font-size: 10px;">Ø Wind: '.$wind_now.'<br>
                    Regen 1h: '.$rain_now.'
                    </div>
                </td>';
    // Vorhersage
    foreach($xml->forecast->simpleforecast->forecastdays->forecastday as $name=> $day){
        if( isToday($day->date->epoch)){
            $Wochentag = "Heute";
        } else {
            $Wochentag =$tag[date("w",intval($day->date->epoch))];
        }
        $html.= '<td align="center" valign="top"  style="width:110px;padding-left:20px;">
                        '.$Wochentag.'<br>
                        <img src="'.$day->icon_url.'" style="float:left;">
                        <div style="float:right">
                        '.$day->low->celsius.'°C<br>
                        '.$day->high->celsius.'°C
                        </div>
                        <div style="clear:both; font-size: 10px;">Ø Wind: '.$day->avewind->kph.' km/h<br>
                        Niederschlag: '.($day->qpf_allday->mm).' mm
                        </div>
                    </td>';
    }
    $html .= "</tr>
                </table>";
   SetValue(CreateVariableByName($IPS_SELF, "Wetter", 3, "~HTMLBox"), $html);
      if($cur_temp_var){
          $cur_temp = floatval($xmlNow->current_observation->temp_c);
        SetValue(CreateVariableByName($IPS_SELF, "Aktuelle Temperatur", 2, "~Temperature"),$cur_temp );
    }

function CreateVariableByName($id, $name, $type, $profile = "")
{
    # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

function isToday($time)
{
  $begin = mktime(0, 0, 0);
  $end = mktime(23, 59, 59);
  // check if given time is between begin and end
  if($time >= $begin && $time <= $end)
  {
    return true;
  } else {
    return false;
  }
}

Schaut dann so aus:

Hi,
hat jemand schon mal ein Script geschrieben mit dem man Wetter an Wunderground posten kann? Wenn ich die Scripte richtig lese, dann holen die nur Daten.

Hi,

ich hatte heute Zeit und ein Script fertig mit dem man Daten der PWS (Personal Weather Station) an Wunderground posten kann.

Enno

Das komplette Script ist:

<?

//Infos zu WUNDERGROUND.COM
$WUURL 			= 'http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID=';
$WUID 			= 'XXXXXXXX';
$WUPassword    = 'XXXXXXXX';

// Variablen von der Wetterstation
$feuchtigkeit = GetValue(12345 /*[1 Komponenten\Klima\Wetterstation\HUMIDITY]*/);
$Temperatur = GetValue(12345 /*[1 Komponenten\Klima\Wetterstation\TEMPERATURE]*/);
$windrichtung = GetValue(12345 /*[1 Komponenten\Klima\Wetterstation\WIND_DIRECTION]*/);
$Windstaerke = GetValue(12345 /*[1 Komponenten\Klima\Wetterstation\WIND_SPEED]*/);
$Regen = GetValue(12345 /*[1 Komponenten\Klima\Wetterstation\RAINING]*/);
$Taupunkt = GetValue(12345 /*[3 Logik\Messen, Auswerten und Benachrichtigen\Bad 1 Taupunkt ermitteln\Taupunkt]*/);
$Niederschlagsmenge = GetValue(12345 /*[3 Logik\Messen, Auswerten und Benachrichtigen\Regenmenge\Niederschlagsmenge Tag]*/);

//Generate Date
$date = date('Y-m-d');
$hour = date('H');
$minute = date('i');
$second = date('s');
$time = $date.'+'.$hour.'%3A'.$minute.'%3A'.$second;

//Umrechnung in amerikanische Werte
$TempF = (($Temperatur * 9) /5 + 32);
$TaupunktF = Round((($Taupunkt * 9) /5 + 32),2);
$WindstaerkeM = ($Windstaerke / 1.6);
$NiederschlagInch = Round(($Niederschlagsmenge / 2.54),2);


//Daten an Wunderground Senden
$Response = file_get_contents($WUURL.$WUID."&PASSWORD=".$WUPassword."&dateutc=".$time."&tempf=".$TempF."&winddir=".$windrichtung."&windspeedmph=".$WindstaerkeM."&rainin=".$Regen."&humidity=".$feuchtigkeit."&dewptf=".$TaupunktF."&dailyrainin=".$NiederschlagInch);
Echo $Response;
?>

Hallo,

so sieht das bei mir aus:

<?
$name = "XXXXX";
$passwort = "XXXXX";
$timestamp = time();
$utc_diff = date("Z", $timestamp);  // Differenz von lokaler Zeit zu UTC in Sekunden
$utc = $timestamp - $utc_diff;  // Uhrzeit in UTC und Sekunden
$datum = date("Y-m-d+H:i:s", $utc);
// Daten
$luftfeuchtigkeit = GetValue(52432 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\HUMIDITY]*/);  // in Prozent
$temperatur = (GetValue(48230 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\TEMPERATURE]*/) * 1.8 + 32);  // in Fahrenheit
$taupunkt = (GetValue(36019 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\Berechnungen\Taupunkt Außen]*/) * 1.8 + 32);  // in Fahrenheit
$regen_stunde = (GetValue(34108 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\RAIN_COUNTER\letzte Stunde]*/) / 2.54);  // in Inch
$regen_tag = (GetValue(42559 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\RAIN_COUNTER\Heute]*/) / 2.54);  // in Inch
$windrichtung = GetValue(33308 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\WIND_DIRECTION]*/);
$windstaerke = (GetValue(39223 /*[Webfront\Wetter\Links\Wetterdaten\Wetterstation\WIND_SPEED]*/) / 1.609344);  // in mph
$html = "http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php";
$html .= "?ID=".$name."&PASSWORD=".$passwort;
$html .= "&dateutc=".$datum;
$html .= "&winddir=".$windrichtung;
$html .= "&windspeedmph=".$windstaerke;
$html .= "&tempf=".$temperatur;
$html .= "&dewptf=".$taupunkt;
$html .= "&humidity=".$luftfeuchtigkeit;
$html .= "&rainin=".$regen_stunde;
$html .= "&dailyrainin=".$regen_tag;
$html .= "&action=updateraw";
$senden = file_get_contents($html);
?>

Gruß
Mike

Hallo Zusammen,

ich habe mal eine Frage,
mich interessieren folgende Daten aus dem Skript:
Und zwar das Datum und den Niederschalg für die Zeiten 18,20 und 22 Uhr
und diese dann in jeweils eine Variable zu schreiben.
Das Problem ist das die Daten ja für 36 Stunden gelten. Ich also 36 Datensätze bekomme.

Stelle es mir so vor. Variable 1(18Uhr) und dann den Wert dazu, das gleich gilt dann für Variable 2(20Uhr) …ect

Hat einer eine Idee wie ich das umsetzen kann ??

Hallo Tim73,

du bekommst die Daten als JSON Objekt ($parsed_hy_json). Die Daten kann du dann parsen und in eine Variable schreiben. Oder du schreibst das Objekt als Ganzes als String in eine Variable und kannst dir Daten dann anschließend in einem anderen Skript verarbeiten. String einlesen und zum JSON Objekt wandeln.

Hi kann mir einer verraten was ich hier für eintragen muss:

//Infos zu WUNDERGROUND.COM
$WUURL = ‚http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID=‘;
$WUID = ‚XXXXXXXX‘;
$WUPassword = ‚XXXXXXXX‘;

Und wo finde ich die Infos ?

Egal was ich eintrage an Benutzerdaten, es kommt immer die Meldung :

INVALIDPASSWORDID|Password and/or id are incorrect

Hi,

mittlerweile hat Drapple mir gezeigt, welche Daten man hochladen kann. Ich vermisse die variable, mit der man UV Daten hochladen kann

http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID=

RapidFire Server

usage
action [action = updateraw]
ID [ID as registered by wunderground.com]
PASSWORD [PASSWORD registered with this ID]
dateutc - [YYYY-MM-DD HH:MM:SS (mysql format)]
winddir - [0-360]
windspeedmph - [mph]
windgustmph - [windgustmph ]
humidity - [%]
tempf - [temperature F]
rainin - [rain in]
dailyrainin - [daily rain in accumulated]
baromin - [barom in]
dewptf- [dewpoint F]
weather - [text] – metar style (+RA)
clouds - [text] – SKC, FEW, SCT, BKN, OVC
softwaretype - [text] ie: vws or weatherdisplay

Hat jemand eine Idee wie? Danke!

UV Werte kannst Du mit

&UV=".$UVIndex

hochladen … also einfach oben an der Script anhängen unnatürlich vorher den $UVIndex irgendwoher ziehen & definieren.

Ich habe Folgendes Problem seit einiger Zeit

Wenn ich über folgende Code meine Daten abrufen will

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

  $parsed_json = json_decode($json_string);

  $icon = $parsed_json->{'current_observation'}->{'estimated'}->{'icon'};
  $temp_c = $parsed_json->{'current_observation'}->{'temp_c'};
  $min_temp = $parsed_json->{'current_observation'}->{'dewpoint_c'};
  $humid = $parsed_json->{'current_observation'}->{'relative_humidity'};
  $wind_speed = $parsed_json->{'current_observation'}->{'wind_kph'};
  $wind_dir = $parsed_json->{'current_observation'}->{'wind_dir'};
  $luftdruck = $parsed_json->{'current_observation'}->{'pressure_mb'};
  $wetter = $parsed_json->{'current_observation'}->{'weather'};
  $sichtweite = $parsed_json->{'current_observation'}->{'visibility_km'};

kommt folgende Fehlermeldung

Warning:  file_get_contents(): php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 24

Warning:  file_get_contents(http://api.wunderground.com/api/XXXXXXXXXXXXXXXX/geolookup/conditions/lang:DL/q/DL/Karlsdorf-Neuthard.json): failed to open stream: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 24

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 29

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 29

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 29

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 30

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 30

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 31

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 31

Notice:  Trying to get property of non-object in C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on line 32
Abort Processing during exceed of maximal ErrorCount: Trying to get property of non-object
   Error in Script C:\Program Files (x86)\IP-Symcon\scripts\53186.ips.php on Line 32

Der Code hat Monatelang super funktioniert.

KAnn mir da jemand helfen?Stehe auf dem Schlauch

Was kommt, wenn du die URL im Browser direkt aufrufst? Wahrscheinlich gibt es die Station nicht mehr.