Beispiel zum Auslesen von www.wetter.net

@Olli

ich danke dir. läuft super.
Mirco

Hallo Olli,

wie gesagt läuft super. Eine Frage habe ich diesbezüglich noch.

Wie hast Du es hin bekommen, das die Bildchen sich automatisch aktualisieren? Bei Status bedeckt auch das Bildchen bedeckt? :confused:

Habe mir sämtliche Icons von wetter.net besorgt und in den ImagePool kopiert, aber ich weiß nicht wie ich es hinbekomme, das sich die Images aktualisieren.

Mirco

Hallo allezusammen

Ich bin hell begeistert von Ollis Idee, leider bin ich ein absoluter Neuling bei Ypsymcon und PHP.

Nun zu meinen Fragen:

Wo und wie lege ich die " global_functions.php " an und was sollte sonst noch in ihr stehen ?

Welche Variablen muss ich anlegen und wie verknüpfe ich sie mit dem Script?

Was heisst das genau in dieser Meldung?
<br />
<b>Warning</b>: require_once(globals_functions.php) [<a href=‚function.require-once‘>function.require-once</a>]: failed to open stream: No such file or directory in <b>C:\Program Files\IP-Symcon\scripts.currentscript</b> on line <b>10</b><br />
<br />
<b>Fatal error</b>: require_once() [<a href=‚function.require‘>function.require</a>]: Failed opening required ‚globals_functions.php‘ (include_path=’.;C:\php5\pear’) in <b>C:\Program Files\IP-Symcon\scripts.currentscript</b> on line <b>10</b><br />

Funktioniert das Script nur mit Postleitzahlen oder kann ich auch einen Städtenamen aus der Schweiz eingeben?

Wie ihr sehen könnt, ein absoluter Anfänger mit vielen Fragen, bitte helft mir

Gruss Storchy

Im Datenarray gibt es die Integer Einträge Zustand1, Zustand2 usw. - diese entsprechen den Numerierungen der Wetterbilder wie z.B. k_ani4.gif.

Diese Zustandsnummer kann man dann im Designer verwenden um ein Bild per IPS-Property ‚Picture‘ und einer Bitmask mit den Werten 1 bis 14 in der Anzeige zu steuern.

Gruss,
Olli

kleines Update zum wetter.net Script

v1.03:

  • Wingeschwindigkeit und Windrichtung hinzugefügt

-> Script: siehe nachfolgende Beiträge für neuere Version

Gruss,
Olli

Hallo Olli,

Klasse das Du Windrichtung und Geschwindigkeit auch noch eingearbeitet hast.

Aber ein kleines Problem habe ich noch.

Wie hast Du das mit den Bildern für die Windrichtung gelöst ? Man kann doch nur Integer variablen unterschiedlichen Bildern zuweisen und S-S-W ist ist doch String.

kannst Du mir da ein wenig helfen?

Danke im voraus.

Ich habe das Problem mit den Bildern für die Richtung der Windgeschwindigkeit bei mir nicht gelöst, da ich die nicht brauche :wink:

Aber anbei eine neue Version von dem Script bei dem das Datenarray um ‚WindrichtungSymbol‘ erweitert wurde - dort steht die Zahl für das zugehörige ‚wNN.gif‘ drin…

v1.04:

  • ‚WindrichtungSymbol‘ hinzugefügt

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : WETTER_www-wetter-net_GETDATA.ips.php
Trigger  : 
Interval : 
Version History:
   1.04: added: WindrichtungSymbol
         added: checking the number of matches in matching arrays
   1.03: added: Windgeschwindigkeit, Windrichtung
   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     = "Bern";   // <- Beispiel       // deine PLZ (ggf. auch Stadtname möglich wie 'Bern' oder 'Istanbul'
$PLZ     = "76137";  // <- Beispiel       // deine PLZ (ggf. auch Stadtname möglich wie 'Bern' oder 'Istanbul'
$varname = "WETTER_www-wetter-net.Data";  // diese IPS-Variable muss vom Typ 'String' sein! Falls nicht
                                          // nicht vorhanden, wird die Variable vom Script automatisch erstellt
                                          
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, 4);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVWindrichtung($s,'Windrichtung','WindrichtungSymbol') );
//file_put_contents( "w4.html", $s);
 
$s = GetUrl( $baseurl, $script, $PLZ, 5);
$data['VORHERSAGE'] = aMerge( $data['VORHERSAGE'], ParseVWindgeschwindigkeit($s,'Windgeschwindigkeit') );
//file_put_contents( "w5.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) );

//print_r($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)
   {
      preg_match( "#k_ani([0-9]+)\.gif#U", $line, $m);
      if(count($m)==2) $data[$tag]['Zustand'.$part] = $m[1];
 
      preg_match( '#ALT="(.*)"#U', $line, $m);
      if(count($m)==2) $data[$tag]['Zustand'.$part.'_Text'] = $m[1];
 
      $part++;
      if( $part > 3)    { $tag++; $part = 1;  }
      if( $tag > 3)     { break;              }
   }
   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);
      if(count($m)==2) $data[$tag][$key] = $m[1];
      
      $tag++;
      if( $tag > 3)     break;
   }
   return( $data);
}

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

// ---
function ParseVWindrichtung( $s, $key, $key2)
{
   $data = array();
   $a    = explode( "
", $s);
   $a    = preg_grep( '#/images/symbole/w#', $a);
   $tag  = 1;
   foreach( $a as $line)
   {
      preg_match( '#/images/symbole/w([0-9]+)\.gif.*TITLE="([NWSO\-]+)"#U', $line, $m);
      if( count($m)==3)
      {
         $data[$tag][$key2] = $m[1];
         $data[$tag][$key]  = $m[2];
      }
 
      $tag++;
      if( $tag > 3)     break;
   }
   return( $data);
}

// ---
function ParseVWindgeschwindigkeit( $s, $key)
{
   $data = array();
   $a    = explode( "
", $s);
   $a    = preg_grep( '#>[0-9]+<br>km/h#', $a);
   $tag  = 1;
   foreach( $a as $line)
   {
      preg_match( "#>([0-9]+)<#U", $line, $m);
      if(count($m)==2) $data[$tag][$key] = $m[1];
      
      $tag++;
      if( $tag > 3)     break;
   }
   return( $data);
}
?>

Beispiel des Inhaltes des Daten-Array’s:


Array
(
[VORHERSAGE] => Array
(
[1] => Array
(
[Zustand1] => 7
[Zustand1_Text] => Morgen: Regen
[Zustand2] => 7
[Zustand2_Text] => Tag: Regen
[Zustand3] => 5
[Zustand3_Text] => Abend: bedeckt
[TempMax] => 11
[TempMin] => 7
[Niederschlag1] => 90
[Niederschlag2] => 90
[Niederschlag3] => 40
[WindrichtungSymbol] => 6
[Windrichtung] => W-S-W
[Windgeschwindigkeit] => 22
[RelFeuchte1] => 90
[RelFeuchte2] => 81
[RelFeuchte3] => 87
)
[2] => Array
(
[Zustand1] => 5
[Zustand1_Text] => Morgen: bedeckt
[Zustand2] => 3
[Zustand2_Text] => Tag: wolkig
[Zustand3] => 7
[Zustand3_Text] => Abend: Regen
[TempMax] => 9
[TempMin] => 6
[Niederschlag1] => 40
[Niederschlag2] => 20
[Niederschlag3] => 90
[WindrichtungSymbol] => 5
[Windrichtung] => S-S-W
[Windgeschwindigkeit] => 25
[RelFeuchte1] => 82
[RelFeuchte2] => 60
[RelFeuchte3] => 70
)
[3] => Array
(
[Zustand1] => 7
[Zustand1_Text] => Morgen: Regen
[Zustand2] => 7
[Zustand2_Text] => Tag: Regen
[Zustand3] => 7
[Zustand3_Text] => Abend: Regen
[TempMax] => 10
[TempMin] => 7
[Niederschlag1] => 90
[Niederschlag2] => 90
[Niederschlag3] => 90
[WindrichtungSymbol] => 27
[Windrichtung] => S
[Windgeschwindigkeit] => 14
[RelFeuchte1] => 83
[RelFeuchte2] => 88
[RelFeuchte3] => 89
)
)
[UPDATEINFO] => Array
(
[RUNTIME] => 4
[BEGINDATE] => 06.12.2006
[BEGINTIME] => 23:23:56
[ENDDATE] => 06.12.2006
[ENDTIME] => 23:24:00
[MAXEXECUTIONTIME] => 300
)
)

Gruss,
Olli

Hallo Olli,

Danke :slight_smile: :slight_smile:

Hi,
wenn ich richtig zähle sind da 17 gif’s für die windrichtung, also fällt die Bitmask im Designer flach oder?

Wie habt ihr das so gelöst?:confused:

gruss
Torsten

Notfalls musst du mit zwei verschiedenen übereinandergelagerten Bildern arbeiten. Ggf. noch ein transparentes Gif erstellen (das muss dann eingeschaltet werden wenn das jeweils andere Picture Set aktiv ist).

Oder noch einfacher … denke ich:
Wenn das script gelaufen hat per copy der ‚richtigen‘ gif bereitstellen fur den designer.

wind1.gif … wind 17.gif angelegt im ordner.
script hat ‚S‘ angewiesen und kopiert wind12.gif und ersetzt den wind.gif.
Im designer wird nur wind.gif genutzt…

meine 2c

Klasse Script…

leider bin ich nicht der grosse Kodierer :confused:

da wäre es doch sicherlich auch möglich das aktuelle Wetter auszulesen z.Beispiel:

http://www.wetter.net/cgi-bin/wetter-net/wetter_stadt_ist.pl?ID=1215&ALIAS=Neutraubling

Vorab schon MERCI!

Hi Oli,

versuche seit zwei tagen die Variablen Zuweisung um die daten von deinem Tollen Script für den Diseiner zu erstellen :confused:

SetValueString („max_temp_heute“, (string)$max_temp_heute);

aber bekomme immer die Meldung -> unable to locate variable -max_temp_heute-

was mache ich falsch ??

Liegt warscheinlich daran das ich noch zu frisch für solch Objekte bin

Grüße Ralf


<?
$data = wddx_deserialize( GetValueString( "WETTER_www-wetter-net.Data") );
 
SetValueInteger("max_temp_heute", intval($data['VORHERSAGE'][1]['TempMax']) ); 
?>

„max_temp_heute“ ist dabei eine IPS-Variable vom Typ Integer. Wenn die Variable vom Typ String sein soll kannst du statt intval() strval() nehmen.

Hi Olli ,

erst mal vielen Dank für die schnelle Antwort.

Aber irgend wie wird das immer :confused:er also was ich vor habe ist die Werte welche Dein Script erzeugt in Variablen zu speichern die ich dann im Diseiner abrufen kann.

Hier das Script mit dem ich gerade am Testen bin.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : A_VarUpdate_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/
$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", intval($data['VORHERSAGE'][1]['TempMax') )];


$max_temp_morgen = $data['VORHERSAGE'][2]['TempMax'];

echo "$max_temp_morgen" ;

SetValueString ("max_temp_morgen", (string)$max_temp_morgen);



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

echo "Niderschlagswahrscheinlichkeit heute Abend: ".$niederschlag_heute_abend." %
";

$v = "Sprühregen";
$v = html_entity_decode( $v);
echo $v;

$v = "Morgen: heiter";
$v = preg_replace( '#.*: *#U', "", $v);
echo $v;


?>

Erst mal vielen Dank für Deine Zeit
Gruß Ralf

PS: habe mir das mal mit den Globvars genauer angeschaut ist es nicht sinnvoller die variablen dort abzulegen da sie ja ständig verwendet werden
aber wie macht man das ? Ich merk schon mir fehlt einfach noch der Hintergrung und die Erfahrung.

Du musst dabei beachten, dass es nur zwei verschiedene Variablenarten gibt nämlich die, die nur in deinem Script vorhanden sind und die die immer vorhanden sind. Deine PHP-Variablen, in deinem Script, sind bei jedem Scriptaufruf leer beziehungsweise undefiniert. Wenn du also in deinem Script wissen willst was IPS schon weiss musst du IPS erst nach dem inhalt der Variablen (getValueSowiso) fragen, damit du dir die Antwort in einer PHP-Variablen merken kannst.

Darum finde ich die Verwendung der Bezeichnungen „Globele“ und „Lokale“ irreführend. Ich habe auch im kleinen Programmierhandbuch mit voller Absicht immer PHP-Variablen bzw IPS-Variablen dazu gesagt. Man könnte nämlich durchaus hingehen und zum Beispiel globale Konstanten (Variablen, deren Wert sich nie ändert) definieren, ohne dass IPS davon etwas mitbekommt (Stichwort: Include).

Und zu der Anregung sie Dort abzulegen wo sie gebraucht werden: Nun, genau dort liegen sie. Bei IPS. Nur wenn IPS die variablen, also die IPS-Variablen, ständig überwacht, kann es, wenn die Temperatur im Wohnzimmer unter einen gewissen Punkt fällt, nachheizen.

Hoffe ich hab dich nicht noch mehr verwirrt.

Toni

[quote=Ra-Be;21129]also was ich vor habe ist die Werte welche Dein Script erzeugt in Variablen zu speichern die ich dann im Diseiner abrufen kann.


 
Der Code den ich oben gepostet macht genau das was du brauchst: er überträgt einen Wert aus dem Datenarray in die IPS-Variable "max_temp_heute".
 
Hier nochmal - diesmal mit dem IPS Kommentarkopf
 

```php

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : A_VarUpdate_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/
$data = wddx_deserialize( GetValueString( "WETTER_www-wetter-net.Data") );
 
SetValueInteger("max_temp_heute", intval($data['VORHERSAGE'][1]['TempMax']) ); 
?>

Die Variable „max_temp_heute“ muss natürlich als IPS-Variable vom Typ Integer angelegt worden sein - das kannst du in IPS unter Variables / Add Variable machen.

Desweiteren muss das Skript getriggert werden - d.h. es muss von IPS automatisch aufgerufen werden wenn sich die Daten aus dem Wetter-Array ändern. Dazu wählst du bei dem obigen Skript A_VarUpdate_www-wetter-net.ips.php den Button Events und fügst bei OnChange die IPS-Variable „WETTER_www-wetter-net.Data“ hinzu.

Danach kannst du die IPS-Variable „max_temp_heute“ im Designer nutzen.

Und erst wenn das läuft(!) erweiterst du das Skript um alle weiteren Variablen die du im Designer benutzen möchtest.

Gruss,
Olli

Hallo Tonic und Olli,
erst mal Danke für Eure schnelle Hilfe, erst habe ich mich in Tonics Handbuch festgelesen und dann mit Deiner Erkärung beschäftigt und solangsam wird mir einiges klar.
:slight_smile: :slight_smile:

Wenn ich das wiederholen unter Interval einstelle muß es doch auch gehn oder ??

Grüße Ralf

[quote="„Olli,post:57,topic:14580“]

Hi Olli,

ihrgend wie hänge ich habe alles so gemacht wie Du gesagt hast und Trotzdem immer wieder der Fehler.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : VarUpdate_www-wetter-net.ips.php
Trigger  : 
Interval : 
*/

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

SetValueString ("max_temp_heute", intval($data['VORHERSAGE'][1]['TempMax']) );

?>

<br />
<b>Warning</b>: Wrong parameter type for setvaluestring() in <b>C:\Haussteuerung\IP-Symcon\scripts.currentscript</b> on line <b>13</b><br />

13 ist der SetValueString

Gruß Ralf

Hallo Ralf,

kein Wunder!

Du übergibst der Funktion SetValueString(…) einen Integer-Wert. Diese erwartet natürlich keinen Integer sondern einen String.

Ersetze die Funktion intval(…) (liefert Integer) durch strval(…) (liefert String), dann stimmt zumindest der Datentyp, und die Fehlermeldung sollte ausbleiben.

Gruß
HJH