Beispiel zum Auslesen von www.wetter.net

Hier ein Beispiel um Wetterinformationen der Seite www.wetter.net auszulesen und die ermittelten Daten strukturiert als PHP-Array in einer IPS-Stringvariablen abzuspeichern.

Folgendes Besonderheiten:

  • Auslesen von Webseiten ohne ‚WWW Reader‘ und ‚Text Parser‘
  • mehrere Webseiten werden aufgerufen und analysiert
  • die gesammelten Daten werden in einem PHP-Array mit Schlüsseln gespeichert
  • das Array wird in einer IPS-String-Variablen gespeichert
  • automatisches Anlegen der IPS-Dtring-Variablen falls diese nicht existiert

Skript: WETTER_www-wetter-net_GETDATA

[Edit]
Das aktuelle Skript v1.04 gibt es hier:

[Edit]

Das Skript kann dann in den Timer Wizard gehängt werden - bei mir läuft es z.B. alle 20 Minuten.

Um die Variable ‚WETTER_www-wetter-net.Data‘ für andere Skripte wieder in ein reguläres PHP-Array zu verwandeln kann das folgende Skript verwendet werden.

Skript: ShowData_www-wetter-net


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ShowData_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/
$varname = "WETTER_www-wetter-net.Data";  // this ips-variable must be type 'String' !
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);
print_r( $data);
?>

Das Skript erzeugt dann beispielsweise folgende Ausgabe im ‚Script Output Window‘:


Array
(
[VORHERSAGE] => Array
(
[1] => Array
(
[Zustand1] => 7
[Zustand1_Text] => Morgen: Regen
[Zustand2] => 6
[Zustand2_Text] => Tag: Regenschauer
[Zustand3] => 5
[Zustand3_Text] => Abend: bedeckt
[TempMax] => 18
[TempMin] => 6
[Niederschlag1] => 90
[Niederschlag2] => 50
[Niederschlag3] => 40
[RelFeuchte1] => 91
[RelFeuchte2] => 88
[RelFeuchte3] => 85
)
[2] => Array
(
[Zustand1] => 2
[Zustand1_Text] => Morgen: heiter
[Zustand2] => 2
[Zustand2_Text] => Tag: heiter
[Zustand3] => 1
[Zustand3_Text] => Abend: sonnig
[TempMax] => 16
[TempMin] => 8
[Niederschlag1] => 10
[Niederschlag2] => 10
[Niederschlag3] => 0
[RelFeuchte1] => 81
[RelFeuchte2] => 62
[RelFeuchte3] => 63
)
[3] => Array
(
[Zustand1] => 2
[Zustand1_Text] => Morgen: heiter
[Zustand2] => 3
[Zustand2_Text] => Tag: wolkig
[Zustand3] => 2
[Zustand3_Text] => Abend: heiter
[TempMax] => 18
[TempMin] => 10
[Niederschlag1] => 10
[Niederschlag2] => 20
[Niederschlag3] => 10
[RelFeuchte1] => 62
[RelFeuchte2] => 53
[RelFeuchte3] => 70
)
)
[UPDATEINFO] => Array
(
[RUNTIME] => 15
[BEGINDATE] => 29.10.2006
[BEGINTIME] => 18:20:00
[ENDDATE] => 29.10.2006
[ENDTIME] => 18:20:15
[MAXEXECUTIONTIME] => 300
)
)

Möchte man in eigenen Skripten nun z.B. auf die Regenwahrscheinlichkeit für den Abend des heutigen Tages zugreifen, kann man folgendes schreiben:


$niederschlag_heute_abend = $data['VORHERSAGE'][1]['Niederschlag3'];

Die weiteren Einträge des Array’s erklären sich, wenn man mal die Daten des Array’s mit der Seite von www.wetter-net vergleicht.

Gruss,
Olli

Hallo Olli,

danke für Dein Projekt - funktioniert :slight_smile:

Eine Frage: Array 1 = Heute, 2 = Morgen, 3 = Übermorgen? Und wie lautet der Link zu Wetter-Net

MST

Das ist korrekt :slight_smile: Die weiteren Tage von Wetter.Net kann man auch integrieren - dabei müssen dann aber mehrere Funktionen angepasst werden.

Die Werte 1, 2 und 3 für die Tage haben sich als praktisch erwiesen für die Steuerung des Designers…

Oben hat sich ein kleiner Tipp-Fehler bzgl. der Url eingeschlichen… aber wenn ich den Text editiere wird mir die Code-Formatierung nochmehr zerschossen :frowning:

hier die Link: http://www.wetter.net/

Gruss,
Olli

… klar: www.wetter.net - ich hätte ja auch in den Quellcode sehen können :rolleyes:

Jetzt muss ich nur noch verstehen, wie ich die Vorhersage für die Ostseeküste bekomme: http://www.wetter.net/deutschland/gebiet_7.html?REGION=Ostseek�ste

MST

Das Skript arbeitet nur mit Städten (und nicht mit Gebieten) und für eine Stadt kann direkt am Anfang des Skriptes hinter „// — EINSTELLUNGEN ---------“ eine PLZ (Postleizahl) hinterlegt werden.

Bei wetter.net kann man die Postleitzahl auf der linken Navigationsseite eingeben - z.B. „76131“ für Karlsruhe.

Gruss,
Olli

… wer Lesen kann ist auch hier wieder klar im Vorteil :wink:
… nur leider wird das Wetter schlechter, wenn ich die PLZ ändere :smiley:
… so nun noch kurz den Designer anpassen - hab’ ja heute eine Stunde extra :slight_smile:

Naja, ich habe extra Karlsruhe eingetragen, damit man beim ersten Test des Skriptes nicht total Depressiv wird :rolleyes:

PS bzgl. Designer: ich mache gleich evtl. noch einen Screenshot vom meinem Control… und soooo schnell war der Designer da nicht angepasst :wink:

hallo Olli,

Danke das Du Dein Script zur Verfügung gestellt hast :slight_smile:
Aber leider komme ich als PHP-Niete nicht ganz klar :frowning:

Hier habe ich nur meine PLZ eingetragen und mir eine Variable „WETTER_www-wetter-net.Data“ angelegt

Sieht bei mir auch so aus (natürlich mit anderen Daten :wink: )

Und dann habe ich diesen Teil versucht:

<?
$niederschlag_heute_abend = $data['VORHERSAGE'][1]['Niederschlag3'];
echo $niederschlag_heute_abend;
?>

Ich erhalte aber diese Fehlermeldung:
Undifined variable data in …

Was mache ich falsch, oder anders gefragt wie bekomme ich die Daten in Variblen damit ich die im Designer angezeigt bekomme?

Im Designer sieht das dann wie unten gezeigt aus.

Funktion:

  • Click auf das linke Wetter-Image: zeigt das Wetter von Heute
  • Click auf das mittlere Wetter-Image: zeigt das Wetter von Morgen
  • Click auf das rechte Wetter-Image: zeigt das Wetter von Übermorgen

Nach einer Zeit von 30 Sekunden wird automatisch wieder das Wetter von heute angezeigt.

Unter den Wetter-Icons wird die Regenwahrscheinlichkeit in Prozent dargestellt.

Die beiden Temperaturwerte sind die Min- (bzw. Nacht-) und die Max- (bzw. Tages-) Temperaturen.

Gruss,
Olli

Naja, die Zeile mit dem $niederschlag_heute_abend ist kein eigenständiges Script sondern bezieht sich auf das vorhergehende Script.

Versuch mal:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ShowData_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/
$varname = "WETTER_www-wetter-net.Data";  
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);
 
//print_r( $data);
 
$niederschlag_heute_abend = $data['VORHERSAGE'][1]['Niederschlag3'];
 
echo "Niderschlagswahrscheinlichkeit heute Abend: ".$niederschlag_heute_abend." %
";
?>

Nun klar, wo die ‚verloren‘ gegangene Variable $data herkommt?

Gruss,
Olli

Danke Olli,
jetzt klappt es. Ich werde es sicher nicht so schön im Designer darstellen können wie Du, aber ich bin jetzt dank Deiner Hilfe, einen Riesenschritt weiter.

Hallo Olli,

wenn ich normal auf die Seite von wetter.net gehe und meine Postleitzahl eingebe, bekomme ich 3 Orte zur Auswahl. Wie geht dein Script mit soetwas um?

2te Frage: Wie hast die Rückgenerierung der Werte zu den richtigen JPEGs im Designer hinbekommen?

Gruß

Jimmy

Hallo Olli,

Windrichtung und Windgeschwindigkeit gibt es in dem Script nicht ? Oder mache ich da auch was falsch? :o

Hallo Olli,

wie schon in meiner PM geschrieben, die Einbindung der Windrichtung wäre auch für mich ein klasse Feature.

Gruß Jimmy

Wer hätte gedacht, dass bei einer PLZ plötzlich 3 Orte zur Auswahl stehen… ich nicht :wink:

Ok, die drei Orte hängen geographisch zusammen und haben dasselbe Wetter - davon gehe ich nun zumindest aus.

Hier eine neue Version des Skriptes WETTER_www-wetter-net_GETDATA.

Die neue Version sollte das Problem multipler PLZ’s lösen - und funktioniert natürlich auch dann wenn dieses Problem nicht vorhanden ist.


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : WETTER_www-wetter-net_GETDATA.ips.php
Trigger  : 
Interval : 
Version History:
   1.01: fix for multiple plz's (Jimmy Neutron's problem)
   1.00: initial release
*/

// --- EINSTELLUNGEN ---------
$PLZ     = "76131";                       // deine PLZ
$varname = "WETTER_www-wetter-net.Data";  // diese IPS-Variable muss vom Typ 'String' sein!
ini_set( 'max_execution_time', 300);

//--- BEGIN --------
$t1 = time();
$baseurl = "http://www.wetter.net/cgi-bin/wetter-net/";
$data    = array();
$data['VORHERSAGE'] = array();
$data['UPDATEINFO'] = array();

//--- GET: VORHERSAGE --------
// Site-Script: wetter_stadt.pl  -> Vorhersage
// Parameter:   NAME   -> PLZ
//              PARA=0 -> Wetterzustand
//              PARA=1 -> Tagestemperatur (Max)
//              PARA=2 -> Nachttemperatur (Min)
//              PARA=3 -> Niederschlagsprognose
//              PARA=4 -> Windrichtung
//              PARA=5 -> Windgeschwindigkeit
//              PARA=6 -> Relative Feuchte
$script = "wetter_stadt.pl";
$s = GetUrl( $baseurl, $script, $PLZ, 0, true);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVZustand($s) );
//file_put_contents( "w0.html", $s);
 
$s = GetUrl( $baseurl, $script, $PLZ, 1);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVTemp($s,'TempMax') );
//file_put_contents( "w1.html", $s);
 
$s = GetUrl( $baseurl, $script, $PLZ, 2);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVTemp($s,'TempMin') );
//file_put_contents( "w2.html", $s);
 
$s = GetUrl( $baseurl, $script, $PLZ, 3);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVProzent($s,'Niederschlag') );
//file_put_contents( "w3.html", $s);
 
$s = GetUrl( $baseurl, $script, $PLZ, 6);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVProzent($s,'RelFeuchte') );
//file_put_contents( "w6.html", $s);

//--- GET: AKTUELLES WETTER --------
// Site-Script: wetter_stadt_ist.pl
// -> not yet implemented...

// --- UPDATE INFORMATION ----
$t2 = time();
$data['UPDATEINFO']['RUNTIME'] = $t2-$t1;                   // int (seconds)
$data['UPDATEINFO']['BEGINDATE'] = date( "d.m.Y", $t1);     // string
$data['UPDATEINFO']['BEGINTIME'] = date( "H:i:s", $t1);     // string
$data['UPDATEINFO']['ENDDATE']   = date( "d.m.Y", $t2);     // string
$data['UPDATEINFO']['ENDTIME']   = date( "H:i:s", $t2);     // string
$data['UPDATEINFO']['MAXEXECUTIONTIME'] = ini_get('max_execution_time');
// print_r( $data); exit;
// --- SAVE INTO IPS-VARIABLE ----
if( !IPS_VariableExists( $varname))
{
   IPS_CreateVariable( $varname, "String");
}
SetValueString( $varname, wddx_serialize_value($data) );
return(0);

// ---------------------------------------------------------------------------
function GetUrl( $baseurl, $script, &$plz, $param, $analyze_plz=false)
{
   $s = file_get_contents( MkUrl($baseurl, $script, $plz, $param) );
   if( empty($s))
      {  IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't get url content");   die;  }
   
   // test for multiple plz
   if( $analyze_plz && !preg_match("#k_ani([0-9]+)\.gif#U", $s) )
   {
      preg_match( '#wetter_stadt\.pl\?ID=([0-9]+)&ALIAS=(.*)"#U', $s, $m);
      if( count($m)!=3)
         {  IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't match PLZ");   die;   }
      $plz = "ID=".$m[1]."&ALIAS=".$m[2];
      // now retry with fixed 'plz'
      $s = file_get_contents( MkUrl($baseurl, $script, $plz, $param) );
      if( empty($s))
         {  IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't get url content");  die;  }
   }
   
   return( $s );
}

// ---
function MkUrl( $baseurl, $script, $plz, $param)
{
   $plz = str_replace( " ", "%20", $plz);  // quote possible spaces for parameter ALIAS=
   if( substr($plz,0,2) == "ID")
      return($baseurl.$script."?".$plz."&"."PARA=".$param);
   else
      return($baseurl.$script."?"."NAME=".$plz."&"."PARA=".$param);
}

// ---
function aMerge( $a_main, $a_merge)
{
   for( $i=1; $i<=3; $i++)
   {
      if( !array_key_exists( $i, $a_main)) $a_main[$i] = array();
      $a_main[$i] = array_merge( $a_main[$i], $a_merge[$i]);
   }
   return( $a_main );
}

// ---
function ParseVZustand( $s)
{
   $data = array();
   $a    = explode( "
", $s);
   $a    = preg_grep( "#k_ani#", $a);
   $tag  = 1;
   $part = 1;
   foreach( $a as $line)
   {
      // echo "T=".$tag."
";
      
      preg_match( "#k_ani([0-9]+)\.gif#U", $line, $m);
      $data[$tag]['Zustand'.$part] = $m[1];
      preg_match( '#ALT="(.*)"#U', $line, $m);
      $data[$tag]['Zustand'.$part.'_Text'] = $m[1];
      $part++;
      if( $part > 3)    { $tag++; $part = 1;  }
      if( $tag > 3)     { break;              }
   }
   //print_r( $data);   exit;
   return( $data);
}

// ---
function ParseVTemp( $s, $key)
{
   $data = array();
   $a    = explode( "
", $s);
   $a    = preg_grep( '#class="temp"#', $a);
   $tag  = 1;
   foreach( $a as $line)
   {
      preg_match( "#>([0-9]+)°#U", $line, $m);
      $data[$tag][$key] = $m[1];
      $tag++;
      if( $tag > 3)     break;
   }
   //print_r( $data);   exit;
   return( $data);
}

// ---
function ParseVProzent( $s, $key)
{
   $data = array();
   $a    = explode( "
", $s);
   $a    = preg_grep( "#%#", $a);
   //print_r( $a); exit;
   $tag  = 1;
   $part = 1;
   foreach( $a as $line)
   {
      //echo "T=".$tag."
";
      preg_match( "#([0-9]+)%#U", $line, $m);
      $data[$tag][$key.$part] = $m[1];
      $part++;
      if( $part > 3)    { $tag++; $part = 1;  }
      if( $tag > 3)     { break;              }
   }
   //print_r( $data);   exit;
   return( $data);
}
?>

@Jimmy Neutron: probier das Skript mal und sag Bescheid, ob es dein Problem löst.

Gruss,
Olli

@hbraun
@Jimmy Neutron

Bzgl.: Windrichtung und Windgeschwindigkeit

Nein, diese Werte (und auch einige andere) sind nicht im Skript drin. Falls ich mal wieder an die Nordsee ziehe und dort dem Windsurfen nachgehe werde ich sicherlich diese Werte in das Skript einbauen. Derzeit sind die Variablen drin die ich vor Ort brauche - alles andere: feel free to implement…

Gruss,
Olli

PS: mit dem bestehenden Gerüst sollten Erweiterungen durch andere Personen durchaus möglich sein.

PPS: durch Erweiterungen werden auch mehr Seiten aus dem Internet ‚gezogen‘.

OK,

Danke für die Antwort.

Hi Olli

das Script läuft jetzt ohne Fehler prima durch, nur kann der „Sprühregen“ nicht so recht umgesetzt werden:

Sprühregen

Danke für das fixe patchen.

Wahrscheinlich bin ich der einzige, bei dem es zu einer PLZ drei Orte gibt :wink:

Gruß

Jimmy

Hi Olli,

eine Frage hab ich noch. Wenn ich aus dem Array:

[Zustand1_Text] => Morgen: heiter

nur das „heiter“ auslesen möchte. Wie setze ich die String-Variable auf „heiter“?

Über einen Code-Schnipsel würde ich mich sehr freuen.

Gruß

Jimmy

@Jimmy Neutron

1) deine Frage zu ‚Sprühregen‘


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Test6.ips.php
Trigger  : 
Interval : 
*/
$v = "Sprühregen";
$v = html_entity_decode( $v);
echo $v;
?>

2) deine Frage zu ‚Morgen: heiter‘


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Test7.ips.php
Trigger  : 
Interval : 
*/
$v = "Morgen: heiter";
$v = preg_replace( '#.*: *#U', "", $v);
echo $v;
?>

Gruss,
Olli