Beispiel zum Auslesen von www.wetter.net

Hi @all,

kann jemand das Script um Windrichtung und Windgeschwindigkeit erweitern. Bin leider ein „php-Azubi“ und kann es leider nicht. Aber die beiden Daten wären schon schön zu haben.

Gruß

Jimmy

Danke Olli für das Script,

läuft soweit prima, bekomme aber über execute folgende Fehlermeldung.
Hat jemand einen Tipp.

Jürgen

Das ist richtig. Zum darstellen der Ergebnisse folgenes Script.

/*
*******************************
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);

Grüße Mirco

@Olli,

da Du ja die Wetterbildchen wahrscheinlich schon auf deinem Rechner hast, kannst Du diese zur Verfügung stellen.
Ich möchte die im Designer einbinden und wenn ich jetzt warte bis mal alle Wettersituationen eingetoffen sind, damit ich die Bilder herunterladen kann, geht ja noch etwas Zeit ins Land.

Wie schafft ihr es die Ergebnisse im Designer an zu zeigen?

Ich lege wie gewohnt ein „Label“ an, unter „Property“ sage ich „Caption“ und unter „Configuration“ gebe ich ihm die passende Variable.

So habe ich es jeden falls gemacht um die eingegangen Emails an zu zeigen.
Mit den Wetterdaten geht es nicht.:confused:

Grüße Mirco

@hbraun:
sieh dir mal folgendes an: http://www.wetter.net//images/symbole/k_ani1.gif
Die Gif’s haben die Nummern 1 bis 14.

@coolice:
Die Daten aus dem Array musst du einzelnen IPS-Variablen zuweisen. Also musst du für jeden Wert den du im Designer darstellen willst auch eine eigene IPS-Variable erstellen und die Werte mit den Daten aus dem Wetter-Array updaten. Vieleicht komme ich dazu dir heute Abend ein Beispiel dafür zu liefern…

Gruss,
Olli

Hallo Olli, das ist schon klar mit den einzelnen Variabeln. Problem ist nur wenn ich wie oben beschrieben das ganze im Designer anzeigen lassen möchte, ist das Label leer.

Mirco

Ok, du hast der Eigenschaft ‚Caption‘ eine Variable zugewiesen und ein passendes Intervall gewählt (OnChange).

Hast du diese Eigenschaft auch aktiviert? Siehe Spalte ‚Active?‘ in der Liste der IPS-Designer Eigenschaften.

Gruss,
Olli

ist natürlich aktiviert. Hatte den Intervall zwar auf 1 min gesetzt, aber auch mit OnChange steht nichts im Feld.

Mirco

Kannst du Screenshot’s machen? Für das entsprechende Label Screenshot’s vom Object Inspector und dem IP-Symcon Designer Property Editor ?

Kleiner Hinweis am Rande: zeitliche Intervalle nur dann verwenden wenn sie absolut Notwendig sind (ich persönlich habe keine einzige Variable bei der das der Fall ist) - wenn möglich OnUpdate oder OnChange verwenden.

Gruss,
Olli

Na klar. Nichts leichter als das.

Tipp: negative Temperaturen funktionieren nicht - sie werden vom regulären Ausdruck nicht erkannt. Ich schätze ich war gestern noch nicht bereit mir den kommenden kalten Winter zu verinnerlichen… :wink:

Lösung: den Ausdruck um ein -* an der richtigen Stelle ergänzen.

Skript mit dem Bugfix:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : WETTER_www-wetter-net_GETDATA.ips.php
Trigger  : 
Interval : 
Version History:
   1.02: fixed regular expression in ParseVTemp() for negativ values
         (added '-*' in reg-pattern)
   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) );
//echo "END
";
return(true);

// ---------------------------------------------------------------------------
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);
}
?>

Gruss,
Olli

Dein IPS-Skript zum setzen der für den Designer notwendigen IPS-Variablen ist nicht korrekt.

Nun, ein kleiner Haftungsauschluss für das nachfolgende Skript: :wink:

Das folgende Skript ist ein Beispiel wie ich MEINE IPS-Variablen setzte!

Das folgende Skript kann nicht per Copy and Paste in ein eigenes IPS-System eingesetzt werden in der Hoffnung das es dann funktioniert!

Das folgende Skript verwendet IPS-Variablen, Datei-Includes und Funktionen die auf keinem anderen IPS-System vorhanden sind!

Das folgende Skript verwendet die Funktion SetVar() - das entspricht in etwa den passenden IPS-Befehlen SetValue…() (siehe Doku/Wiki)!

Das folgende Skript ist nur ein BEISPIEL!


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : D_VarUpdate_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/
require_once( "globals_functions.php");
$prefix = "D_WETTER_www-wetter-net";

$varname = "WETTER_www-wetter-net.Data";  // this ips-variable must be type 'String' !
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);
 
$dayindex = GetValueInteger( $prefix.".DayIndex");
if( $dayindex<1 || $dayindex>3)
{
   $dayindex = 1;
   SetVar( $prefix.".DayIndex", $dayindex);
}
 
switch( $dayindex)
{
   case 1:  $dayname = 'Heute';        break;
   case 2:  $dayname = 'Morgen';       break;
   case 3:  $dayname = 'Übermorgen';   break;
}

SetVar( $prefix.".DayString", $dayname);
SetVar( $prefix.".Icon1", $data['VORHERSAGE'][$dayindex]['Zustand1']);
SetVar( $prefix.".Icon2", $data['VORHERSAGE'][$dayindex]['Zustand2']);
SetVar( $prefix.".Icon3", $data['VORHERSAGE'][$dayindex]['Zustand3']);
SetVar( $prefix.".RelFeuchte1", $data['VORHERSAGE'][$dayindex]['RelFeuchte1']);
SetVar( $prefix.".RelFeuchte2", $data['VORHERSAGE'][$dayindex]['RelFeuchte2']);
SetVar( $prefix.".RelFeuchte3", $data['VORHERSAGE'][$dayindex]['RelFeuchte3']);
SetVar( $prefix.".Niederschlag1", $data['VORHERSAGE'][$dayindex]['Niederschlag1']);
SetVar( $prefix.".Niederschlag2", $data['VORHERSAGE'][$dayindex]['Niederschlag2']);
SetVar( $prefix.".Niederschlag3", $data['VORHERSAGE'][$dayindex]['Niederschlag3']);
SetVar( $prefix.".TempMax", $data['VORHERSAGE'][$dayindex]['TempMax']);
SetVar( $prefix.".TempMin", $data['VORHERSAGE'][$dayindex]['TempMin']);
?>

Hallo Olli,

vielen Dank für die schönen scripte. Könntest zur Vervollständigung noch den Auszug der „global.functions.php“ posten, indem die Funktion „SetVar“ definiert ist. Dann sollte auch die Ausgabe problemlos laufen.

Danke
TK


/**********************************************************************
**********************************************************************/
function SetVar( $varname, $value, $force=false )
{
 $type = IPS_GetVariableType( $varname );
 switch( $type )
 {
  case 'Float' : $value = floatval($value);      break;
  case 'Boolean': $value = $value ? true : false; break;
  case 'Integer': $value = intval($value);        break;
  case 'String' : $value = strval($value);        break;
  default    : return( false);
 }
 
 if( !$force)
 {
  switch( $type )
  {
   case 'Float' : $force = GetValueFloat(   $varname) != $value; break;
   case 'Boolean': $force = GetValueBoolean( $varname) != $value; break;
   case 'Integer': $force = GetValueInteger( $varname) != $value; break;
   case 'String' : $force = GetValueString(  $varname) != $value; break;
  }
 }
 
 if( $force)
 {
  switch( $type )
  {
   case 'Float' : return( SetValueFloat(   $varname, $value));
   case 'Boolean': return( SetValueBoolean( $varname, $value));
   case 'Integer': return( SetValueInteger( $varname, $value));
   case 'String' : return( SetValueString(  $varname, $value));
  }
 }
}

Gruss,
Olli

Hallo Olli,
hab das Script gerade ausprobiert und bin begeistert. Was mich aber wundert:im Orginal läuft es ohne Meldung, ändere ich die PLZ (z.B. 38446 ), kommt eine Fehlermeldung:
<br />
<b>Notice</b>: Undefined offset: 1 in <b>E:\IP-SYMCON\scripts.currentscript</b> on line <b>156</b><br />
<br />
<b>Notice</b>: Undefined offset: 1 in <b>E:\IP-SYMCON\scripts.currentscript</b> on line <b>156</b><br />
Woran kann das liegen?
Gruß
Jürgen

hast du die bisher letzte Version v1.02 verwendet?
-> http://www.ipsymcon.de/forum/showpost.php?p=16943&postcount=32

Gruss,
Olli

Hallo Olli,

die hatte ich völlig übersehen. Jetzt läufts prima. Besten Dank

Jürgen

@Olli

nachdem ich das agnze Thema auf Eis gelegt hatte, nervt mich meine Frau damit, das sie wissen möchte wie das Wetter die nächsten Tage wird.

Ich habe die Scripte also wieder aus der Schublade geholt und stecke an der selben Stelle fest wie beim letzten mal auch.

Habe um die Werte im Designer darzu stellen dieses Script benutzt

$varname = "WETTER_www-wetter-net.Data";
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);

//print_r( $data);

$max_temp_heute = $data['VORHERSAGE'][1]['TempMax'];

echo "$max_temp_heute" ;

?>

über Execute bekomme ich auch den richtigen Wert. Für heute 14 ( Grad ) :smiley:

Jetzt möchte ich diesen Wert in die Variable max_temp_heute schreiben.

Habe es wie folgt probiert

$varname = "WETTER_www-wetter-net.Data";
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);

//print_r( $data);

$max_temp_heute = $data['VORHERSAGE'][1]['TempMax'];

echo "$max_temp_heute" ;

SetValueString ("max_temp_heute", (string)$data);

Unter Variables bekomme ich aber nicht den Wert sondern Array angezeigt.

Ich weiss es liegt an dem Versuch es in die Variable zu bekommen. Da ich aber eine 0 in Sachen PHP bin und mir dies un das aus diesem super Forum „klaue“ :o brauche ich hilfe.

Grüße Mirco

Hallo Mirco,

so sollte es gehen:


$varname = "WETTER_www-wetter-net.Data";
$s       = GetValueString( $varname);
$data    = wddx_deserialize( $s);
 
//print_r( $data);
 
$max_temp_heute = $data['VORHERSAGE'][1]['TempMax'];
 
echo "$max_temp_heute" ;
 
SetValueString ("max_temp_heute", (string)$max_temp_heute);

Gruss,
Olli