[CLASS] Abfahrtstafeln von bahn.de auslesen

Der Onkel hat mal wieder was zusammengeschraubt :smiley:

Ziel war das auslesen und aufbereiten der Abfahrtstafel der DB anhand von Bahnhof, Datum, Zeit.
Das ganze klappt auch für den ÖPNV. Also Busse, Straßenbahnen etc.

Ganz unten gibts dann mal eine Beispielanzeige :smiley:

Hier gleich mal ein Beispiel wie man die PHP-Klasse benutzt:


require_once("class.bahn.php"); // Klasse einbinden

// Neue Instanz
//Parameter 1 ist der Bahnhof oder die Haltestelle
//(es muss kein Bahnhof sein, Bushaltestelle gehen auch)
// Parameter 2 ist die Art der Tafel: "Abfahrt" oder "Ankunft"
$bahn=new bahn("Hannover Hbf","abfahrt");


// Hier werden Verkehrsmittel ausgeschlossen
/*
$bahn->TypeBUS(false);
$bahn->TypeTRAM(false);
$bahn->TypeICE(false);
$bahn->TypeIC(false);
$bahn->TypeRE(false);
$bahn->TypeSBAHN(false);
$bahn->TypeUBAHN(false);
$bahn->TypeFAEHRE(false);
*/

// Hier werden Datum und Zeit gesetzt.
// Werden die nicht gesetzt wird die/das aktuelle Zeit/Datum genommen
/*
$bahn->datum("17.5.2010");
$bahn->zeit("1:00");
*/

// Jetzt das Ergebniss holen!
$abfragestatus=$bahn->fetch();
if($abfragestatus){
        // Array mit den Informationen ausgeben:
	print_r($bahn->timetable);
}

Das oben genannte Beispiel setzt die CURL-Lib vorraus! Wenn man die nicht installiert hat (oder nicht will) gibt es einen zweiten Weg:


require_once("class.bahn.php"); // Klasse einbinden

$bahn=new bahn("München Hbf","abfahrt");

// Hier wird gesagt das KEIN Curl genutzt wird!
$bahn->fetchMethodCURL(false); 

// Jetzt wirds interessant:
// Nachdem alle Parameter wie gewünscht getzt sind
// holt man sich die Anfrageurl für bahn.de:
$url = $bahn->buildQueryURL();
// Diese Url kann man nun in den WWW_Reader füttern
// und die Daten per RegVar verarbeiten.


Dazu das mögliche Script für die Regvar:




$HTML="<kommt aus eurem WWW-Reader>";


require_once("class.bahn.php"); // Klasse einbinden

$bahn=new bahn();

// Hier werden die HTML-Daten nun direkt in den Parser geschoben:

$abfragestatus=$bahn->fetch($HTML); 

if($abfragestatus){
        // Array mit den Informationen ausgeben:
	print_r($bahn->timetable);
}


Wenn alles hingehauen hat dann bekommt ihr das
Array mit den Daten:

Array
(
    [0] => Array
        (
            [time] => 17:31
            [train] => IC2803
            [type] => EC
            [route_ziel] => Berlin Ostbahnhof
            [route] => Array
                (
                    [17:31] => Hannover Hbf
                    [18:54] => Berlin-Spandau
                    [19:08] => Berlin Hbf
                    [19:19] => Berlin Ostbahnhof
                )

            [platform] => 9
            [ris] => Ersatzzug für*IC  2861,ca.*60*Minuten*später,Grund: Folge aus Triebfahrzeugstörung an einem anderen Personenzug
            [route_start] => Hannover Hbf
        )
[1] => Array
        (...)

usw usw..

Hier die PHP Klasse:
Hinweis: Neues Script anlegen und den Dateinamen auf „class.bahn.php“ setzten.

<?
/*
Author: Frederik Granna (sysrun)
Version 0.1
*/


class bahn{
	var $_BASEURL="http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?";
	var $_PARAMS=array();
	var $timetable=array();
	var $bahnhof=false;
	var $_FETCHMETHOD;
	function bahn($bahnhof=null,$type="abfahrt"){
	   $type=strtolower($type);
	
	
	   if(!$bahnhof)
	      $bahnhof="Hannover HBF";
		$this->_init($bahnhof);
		$this->fetchMethodCURL(true);
		$this->boardType($type);
		
		//$this->_query();
	}

	function TypeBUS($state=true){$this->_PARAMS['GUIREQProduct_5'] = ($state) ? "on" : false;}
	function TypeICE($state=true){$this->_PARAMS['GUIREQProduct_0'] = ($state) ? "on" : false;}
	function TypeIC($state=true){$this->_PARAMS['GUIREQProduct_1'] = ($state) ? "on" : false;}
	function TypeRE ($state=true){$this->_PARAMS['GUIREQProduct_3'] = ($state) ? "on" : false;} // NV genannt
	function TypeSBAHN ($state=true){$this->_PARAMS['GUIREQProduct_4'] = ($state) ? "on" : false;} 
	function TypeFAEHRE ($state=true){$this->_PARAMS['GUIREQProduct_6'] = ($state) ? "on" : false;}   // UBAHN
	function TypeTRAM ($state=true){$this->_PARAMS['GUIREQProduct_8'] = ($state) ? "on" : false;}   // STrassenbahn
	function TypeUBAHN ($state=true){$this->_PARAMS['GUIREQProduct_7'] = ($state) ? "on" : false;}   // UBAHN



	function boardType($type){
		if($type=="ankunft")
			$this->_PARAMS['boardType']="arr";
		else
			$this->_PARAMS['boardType']="dep";

	}

	function datum($datum){
		$this->_PARAMS['date']=$datum;
	}
	
	function zeit($zeit){
		$this->_PARAMS['time']=$zeit;

	}

	/**
	 *
	 **/
	function fetch($html=null){
	   if($html){
	      return $this->_parse($html);
	   }else if($this->_FETCHMETHOD=="CURL"){
			return $this->_queryCurl();
		}
	}


	function _queryCurl(){
		$this->buildQueryURL();
		$result=$this->_call();
		return $this->_parse($result);
	}

	function buildQueryURL(){
	   $fields_string="";
		foreach($this->_PARAMS as $key=>$value){
		   if($value)
				$fields_string .= $key.'='.urlencode($value).'&';
		};
		rtrim($fields_string,'&');

		$this->_URL=$this->_BASEURL.$fields_string;
		return $this->_URL;
	}

	function _parse($data){
		$dom = new DOMDocument();
		@$dom->loadHTML($data);
		
		$select=$dom->getElementById("rplc0");
		if($select->tagName=="select"){
			$options=$select->getElementsByTagName("option");
			foreach($options AS $op){
				echo utf8_decode($op->getAttribute("value")."-".$op->nodeValue)."n";
			}
			return false;
		}else{
		   $this->bahnhof=utf8_decode($select->getAttribute("value"));
			$this->_process_dom($dom);
			return true;
		}
	}

	function _process_dom($dom){
			$test=$dom->getElementById("sqResult")->getElementsByTagName("tr");
			$data=array();
			foreach($test as $k=>$t){
				$tds=$t->getElementsByTagName("td");
				foreach($tds AS $td){
				   $dtype=$td->getAttribute("class");
					switch($dtype){
						case 'train':
							if($a=$td->getElementsByTagName("a")->item(0)){
								$data[$k]['train']=str_replace(" ","",$a->nodeValue);
								if($img=$a->getElementsByTagName("img")->item(0)){
									if (preg_match('%/([a-z]*)_%', $img->getAttribute("src"), $regs)) {
									   switch($regs[1]){
									      case 'EC':
									         $data[$k]['type']="IC";
									      break;
											default:
												$data[$k]['type']=strtoupper($regs[1]);
											break;
										}
									}
								}
							}
							
						break;
						case 'route':
						   if($span=@$td->getElementsByTagName("span")->item(0)){
						      $data[$k]['route_ziel']=$span->nodeValue;
							}

							preg_match_all('/(.*)s*([0-9:]{5})/', $td->nodeValue, $result, PREG_PATTERN_ORDER);
							$tmp=array();
							foreach($result[1] AS $rk=>$rv){
								$tmp[$result[2][$rk]]=utf8_decode(trim(html_entity_decode(str_replace("n","",$rv))));
							}
							$data[$k]['route']=$tmp;
							//print_r($tmp);
							/*

							$data[$k]['route']=explode("-",$td->nodeValue);
							foreach($data[$k]['route'] AS $dk=>$dv)
							   $data[$k]['route'][$dk]=utf8_decode(trim(html_entity_decode(str_replace("n","",$dv))));
							*/
						break;
						case 'time':
						case 'platform':
						case 'ris':
						   $data[$k][$dtype]=$td->nodeValue;
						break;


					}
					//echo "n";
				}
			}

			foreach($data AS $d){
				if(array_key_exists("train",$d)){
				   foreach($d AS $dk=>$dv)
				      if(!is_array($dv))
					      $d[$dk]=ltrim(str_replace("n","",utf8_decode(trim(html_entity_decode($dv)))),"-");
					$d['route_start']=$this->bahnhof;
					$this->timetable[]=$d;
	         }
			}
	}

	function fetchMethodCURL($state){
		if($state){
			$this->_FETCHMETHOD="CURL";
		}else{
			$this->_FETCHMETHOD="OTHER";
		}
	}


	function _call(){
		$this->_CH = curl_init();
		curl_setopt($this->_CH,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($this->_CH,CURLOPT_URL,$this->_URL);
		$result = curl_exec($this->_CH);
		curl_close($this->_CH);
		return $result;
	}

	function _init($bahnhof){
		$this->_PARAMS=array(
			'country'=>'DEU',
			'rt'=>1,
			'GUIREQProduct_0'=>'on',	// ICE
			'GUIREQProduct_1'=>'on',   // Intercity- und Eurocityzüge
			'GUIREQProduct_2'=>'on',   // Interregio- und Schnellzüge
			'GUIREQProduct_3'=>'on',   // Nahverkehr, sonstige Züge
			'GUIREQProduct_4'=>'on',	// S-Bahn
			'GUIREQProduct_5'=>'on',	// BUS
			'GUIREQProduct_6'=>'on',	// Schiffe
			'GUIREQProduct_7'=>'on', // U-Bahn
			'GUIREQProduct_8'=>'on', // Strassenbahn
			'REQ0JourneyStopsSID'=>'',
			'REQTrain_name'=>'',
			'REQTrain_name_filterSelf'=>'1',
			'advancedProductMode'=>'',
			'boardType'=>'dep', // dep oder arr
			'date'=>date("d.m.Y"),
			'input'=>$bahnhof,
			'start'=>'Suchen',
			'time'=>date("H:i")
		);


	}

}

?>

Hi, cooles script. Nur fehlte mir noch die Visualisierung im Webfront. Dazu hab ich mal schnell was zusammen kopiert. Folgt alles im Anhang.

Allerdings hab ich Probleme bei der Darstellung des Buchstaben „n“. Er wird verschluckt. Hast Du da Abhilfe?

Nun eine Webfront Anzeige, welche ein wenig angepasst werden muss. Die Icons gehören in den Ordner webfront/user:

<?
require_once("class.bahn.php"); // Klasse einbinden

	//Ab hier nichts mehr ändern
	$object = IPS_GetObject($IPS_SELF);
	$parentID = $object['ParentID'];


// Neue Instanz
//Parameter 1 ist der Bahnhof oder die Haltestelle
//(es muss kein Bahnhof sein, Bushaltestelle gehen auch)
// Parameter 2 ist die Art der Tafel: "Abfahrt" oder "Ankunft"
$bahn=new bahn("Lehrte","abfahrt");


// Hier werden Verkehrsmittel ausgeschlossen
/*
$bahn->TypeBUS(false);
$bahn->TypeTRAM(false);
$bahn->TypeICE(false);
$bahn->TypeIC(false);
$bahn->TypeRE(false);
$bahn->TypeSBAHN(false);
$bahn->TypeUBAHN(false);
$bahn->TypeFAEHRE(false);
*/

// Hier werden Datum und Zeit gesetzt.
// Werden die nicht gesetzt wird die/das aktuelle Zeit/Datum genommen
/*
$bahn->datum("17.5.2010");
$bahn->zeit("1:00");
*/

// Jetzt das Ergebniss holen!
$abfragestatus=$bahn->fetch();
if($abfragestatus){
        // Array mit den Informationen ausgeben:
    print_r($bahn->timetable);
    AnzeigeAufbereiten($bahn,"Abfahrt Lehrte",$parentID);
}

// zweite Anzeigentafel
$bahn=new bahn("Lehrte","ankunft");
$abfragestatus=$bahn->fetch();
if($abfragestatus){
        // Array mit den Informationen ausgeben:
    print_r($bahn->timetable);
    AnzeigeAufbereiten($bahn,"Ankunft Lehrte",$parentID);
}

// anzeige aufbereiten in eine html box
function AnzeigeAufbereiten($bahn, $name,$parentID)
{
	$VARIABLEN_TEXT=$name;

	// Anzeige aufbereiten
	$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
	$str .= "<tr><td></td><td><b>Zug</b></td><td><b>Zeit</b></td><td><b>Richtung</b></td><td><b>Gleis</b></td><td><b>Aktuelles</b></td></tr>";

	$pos = 0;
	for($i=3; $i<=sizeof($bahn->timetable); $i++)
	{
	    //$eintrag = explode(";", $bahn->timetable[$i]);
	    $caller = $bahn->timetable[$i]["type"];
	    switch($caller) {
	       case "SBAHN":
	          $eintrag[0] = "<img src=/user/bahn/sbahn_24x24.gif>";
	          break;
	       case "BUS":
	          $eintrag[0] = "<img src=/user/bahn/bus_24x24.gif>";
	          break;
	       case "RE":
	          $eintrag[0] = "<img src=/user/bahn/re_24x24.gif>";
	          break;
	       case "ICE":
	          $eintrag[0] = "<img src=/user/bahn/ice_24x24.gif>";
	          break;
	       case "TRAM":
	          $eintrag[0] = "<img src=/user/bahn/tram_24x24.gif>";
	          break;
	        default:
	           $eintrag[0] = "";
	           break;
	    }
	    $eintrag[1] = $bahn->timetable[$i]["train"];
	    $eintrag[2] = $bahn->timetable[$i]["time"];
	    $eintrag[3] = $bahn->timetable[$i]["route_ziel"];
	    $eintrag[4] = $bahn->timetable[$i]["platform"];
	    $eintrag[5] = $bahn->timetable[$i]["ris"];

	        $str .= "<tr>";
	        foreach($eintrag as $data)
	            $str .= '<td>'.$data.'</td>';
	        $str .= "</tr>";

	        $pos++;

	    if($pos >= 4)
	        break;
	}
	$str .= "</table>";

	$vid = CreateVariableByName($parentID, $VARIABLEN_TEXT, 3);
	IPS_SetIcon($vid, "Distance");
	IPS_SetVariableCustomProfile($vid, "~HTMLBox");
	SetValue($vid, $str);
}

function CreateVariableByName($id, $name, $type)
{
    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");
    }
    return $vid;
}

?>

bahn.zip (2.7 KB)

Die gelöschten „n“ Buchstaben konnte ich lösen.

Die Zeile mit:

$d[$dk]=ltrim(str_replace("n","",utf8_decode(trim(html_entity_decode($dv)))),"-"); 

Dort habe ich das str_replace entfernt. Wofür war das denn?

Ah!

Das war nicht „n“ sondern "
" (Zeilenumbruch)! Der wird dadurch gelöscht damit einige längere Haltestellennamen nicht umgebrochen werden!

Hi, jetzt gefällts mir immer besser
Ich hab nur ein Problem mit meinem Bahnhof :wink:
Iirgendwas stört Ihn an Pfaffenhofen Ilm
Im Script steht „PAF“ das wird auch von der Bahnseite richtig interpretiert.

Als Ergebnis bekomm ich allerdings
Undefined offset: 3

Hat jemand eine Erklärung?

  Array

(
[0] => Array
(
[time] => 13:29
[train] => RE4012
[type] => RE
[route_ziel] => Nürnberg Hbf
[route] => Array
(
[13:29] =>
[13:35] =>
[13:48] =>
[14:08] =>
[14:20] =>
[14:34] =>
[14:48] =>
)

        [platform] =&gt; 3
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

[1] =&gt; Array
    (
        [time] =&gt; 13:56
        [train] =&gt; RE35931
        [type] =&gt; RE
        [route_ziel] =&gt; München Hbf
        [route] =&gt; Array
            (
                [13:56] =&gt; 
                [14:00] =&gt; 
                [14:04] =&gt; 
                [14:09] =&gt; 
                [14:21] =&gt; 
                [14:35] =&gt; 
            )

        [platform] =&gt; 1
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

[2] =&gt; Array
    (
        [time] =&gt; 14:05
        [train] =&gt; RE35934
        [type] =&gt; RE
        [route_ziel] =&gt; Nürnberg Hbf
        [route] =&gt; Array
            (
                [14:05] =&gt; 
                [14:12] =&gt; 
                [14:20] =&gt; 
                [14:27] =&gt; 
                [15:20] =&gt; 
                [15:56] =&gt; 
                [16:04] =&gt; 
                [16:17] =&gt; 
            )

        [platform] =&gt; 3
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

)

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 65

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 86

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 87

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 88

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 89

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 90
Array
(
[0] => Array
(
[time] => 13:28
[train] => RE4012
[type] => RE
[route_ziel] => München Hbf
[route] => Array
(
[13:04] =>
[13:20] =>
[13:28] =>
)

        [platform] =&gt; 3
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

[1] =&gt; Array
    (
        [time] =&gt; 13:55
        [train] =&gt; RE35931
        [type] =&gt; RE
        [route_ziel] =&gt; Nürnberg Hbf
        [route] =&gt; Array
            (
                [11:38] =&gt; 
                [11:48] =&gt; 
                [11:56] =&gt; 
                [12:40] =&gt; 
                [13:34] =&gt; 
                [13:40] =&gt; 
                [13:48] =&gt; 
                [13:55] =&gt; 
            )

        [platform] =&gt; 1
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

[2] =&gt; Array
    (
        [time] =&gt; 14:04
        [train] =&gt; RE35934
        [type] =&gt; RE
        [route_ziel] =&gt; München Hbf
        [route] =&gt; Array
            (
                [13:29] =&gt; 
                [13:41] =&gt; 
                [13:52] =&gt; 
                [13:56] =&gt; 
                [14:00] =&gt; 
                [14:04] =&gt; 
            )

        [platform] =&gt; 3
        [ris] =&gt; pünktlich
        [route_start] =&gt; Pfaffenhofen(Ilm)
    )

)

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 65

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 86

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 87

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 88

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 89

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\28273.ips.php on line 90

Hmmm, das ist komisch.

Bei mir kommt alles richtig raus:

Array
(
    [0] => Array
        (
            [time] => 16:04
            [train] => RE35938
            [type] => RE
            [route_ziel] => München Hbf
            [route] => Array
                (
                    [15:28] => München Hbf
                    [15:40] => Dachau Bahnhof
                    [15:52] => Petershausen(Obb)
                    [15:56] => Paindorf
                    [16:00] => Reichertshausen(Ilm)
                    [16:04] => Pfaffenhofen(Ilm)
                )

            [platform] => 3
            [ris] => pünktlich
            [route_start] => Pfaffenhofen(Ilm)
        )

    [1] => Array
        (

Hi sysrun,
Ich habs grad nochmal nachgestellt, dein Array klappt auch!
Nur schwierigkeiten gibts bei mäc’s variante!
Ich glaub die Klammern bei Pfaffenhofen(Ilm) sind schuld!
Mit anderen Orten hab ich auch kein Problem. hannover sieht fein aus :wink:
Stefan

Hi,
hab es auch gerade probiert, also die bahn class liefert ein ergebnis. da meine visualisierung vom code noch ein wenig weiter bin, versuche ich mal deinen bahnhof darzustellen. liegt sicher an der anzeige.

Hi mäc,
Ich konnte es ein wenig eingenzen.
Dein script kommt scheinbar nicht mit der Rückgabe von Klammern aus der class.bahn.php zur4cht.

Ich habe folgendes in der class.bahn.php gemacht, jetz klappts schon mal!

   $data[$k]['route']=explode("-",$td->nodeValue);
                            foreach($data[$k]['route'] AS $dk=>$dv)
                               $data[$k]['route'][$dk]=utf8_decode(trim(html_entity_decode(str_replace("("," ",str_replace(")"," ",str_replace("
","",$dv))))));

sowie

 foreach($data AS $d){
                if(array_key_exists("train",$d)){
                   foreach($d AS $dk=>$dv)
                      if(!is_array($dv))
                          $d[$dk]=ltrim(str_replace("
","",utf8_decode(trim(html_entity_decode($dv)))),"-");
                          #$d['route_start']=$this->bahnhof;
                          $d['route_start']="Pfaffenhofen";

–> Das muss natürlich noch generisch werden :wink:

also ich tippe auf nen falschen array zugriff. In der Zeile mit

    for($i=3; $i<=sizeof($bahn->timetable); $i++)

Sollte aus <= das = raus dann läuft es bei mir durch.

    for($i=3; $i<sizeof($bahn->timetable); $i++)

Ohne mir die Syntax vom PHP angeschaut zu haben wird es sicher so ein das arrays von 0 ab gezählt genutzt werden. allerdings die size eine 1 liefert.

hier mein aktuelles script für die Anzeige. Notwendige stellen sind mit einem „// TODO: Anpassen“ markiert.

Das ganze einfach so wie im Objektbaum angezeigt anlegen. Dabei ist das Dummy Object das was angezeigt wird.

Neues: Es kann eine Wegezeit mitgegeben werden. Also ich brauch 20 Min. zum Bahnhof. Alle Züge die ich nicht mehr erreichen kann sind rot mit einer Zeit --:-- bzw. gelb.

<?
require_once("class.bahn.php"); // Klasse einbinden

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

// abfragenamen verändern
//IPS_SetName($parentID, "Bahnverbindung von ".date("H:i",time()));

// Neue Instanz
//Parameter 1 ist der Bahnhof oder die Haltestelle
//(es muss kein Bahnhof sein, Bushaltestelle gehen auch)
// Parameter 2 ist die Art der Tafel: "Abfahrt" oder "Ankunft"
// TODO: Anpassen
$bahn=new bahn("Lehrte","abfahrt");


// Hier werden Verkehrsmittel ausgeschlossen
/*
$bahn->TypeBUS(false);
$bahn->TypeTRAM(false);
$bahn->TypeICE(false);
$bahn->TypeIC(false);
$bahn->TypeRE(false);
$bahn->TypeSBAHN(false);
$bahn->TypeUBAHN(false);
$bahn->TypeFAEHRE(false);
*/

// Hier werden Datum und Zeit gesetzt.
// Werden die nicht gesetzt wird die/das aktuelle Zeit/Datum genommen
/*
$bahn->datum("17.5.2010");
$bahn->zeit("1:00");
*/

// Jetzt das Ergebniss holen!
$abfragestatus=$bahn->fetch();
if($abfragestatus){
    // Array mit den Informationen ausgeben:
    //print_r($bahn->timetable);
    // TODO: Anpassen
    AnzeigeAufbereiten($bahn,"Abfahrt Lehrte",$parentID,20);
}

// zweite Anzeigentafel
// TODO: Anpassen
$bahn=new bahn("Lehrte","ankunft");
$abfragestatus=$bahn->fetch();
if($abfragestatus){
    // Array mit den Informationen ausgeben:
    //print_r($bahn->timetable);
    // TODO: Anpassen
    AnzeigeAufbereiten($bahn,"Ankunft Lehrte",$parentID,0);
}

// anzeige aufbereiten in eine html box
// $bahn - ergebnis der class.bahn.php
// $name - Variablen Bezeichnung. Muss für ein Object identisch sein
// $parentID - oberklasse oder dummy object id
// $wegezeit - eine wegezeit in minuten zum bahnhof. oder =0
function AnzeigeAufbereiten($bahn, $name,$parentID, $wegezeit)
{
	$VARIABLEN_TEXT=$name;
	$WEGEZEIT = $wegezeit; //in minuten, wenn 0 dann nicht farblich markieren

	// Anzeige aufbereiten
	$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
	$str .= "<tr><td></td><td><b>Zug</b></td><td><b>Zeit</b></td><td><b>Diff.</b></td><td><b>Richtung</b></td><td><b>Gleis</b></td><td><b>Aktuelles</b></td></tr>";

	$pos = 0;
	for($i=0; $i<sizeof($bahn->timetable); $i++)
	{
	    //$eintrag = explode(";", $bahn->timetable[$i]);
	    $caller = $bahn->timetable[$i]["type"];
	    switch($caller) {
	       case "SBAHN":
	          $eintrag[0] = "<img src=/user/bahn/sbahn_24x24.gif>";
	          break;
	       case "BUS":
	          $eintrag[0] = "<img src=/user/bahn/bus_24x24.gif>";
	          break;
	       case "RE":
	          $eintrag[0] = "<img src=/user/bahn/re_24x24.gif>";
	          break;
	       case "ICE":
	          $eintrag[0] = "<img src=/user/bahn/ice_24x24.gif>";
	          break;
	       case "TRAM":
	          $eintrag[0] = "<img src=/user/bahn/tram_24x24.gif>";
	          break;
	        default:
	           $eintrag[0] = "";
	           break;
	    }
	    $colour="white"; // yellow or red, white ist der normalfall
	    $eintrag[1] = $bahn->timetable[$i]["train"];
	    $eintrag[2] = $bahn->timetable[$i]["time"];
	    
	    // differenz zur aktuellen zeit ausrechnen.
	    $timestampField = strtotime($bahn->timetable[$i]["time"]);
	    $timestampNow = time();//+1*60*60;
	    //echo date("H:i",$timestampNow)."-";
	    //echo date("H:i",$timestampField)."/";
	    
	    $diff = $timestampField - $timestampNow;
	    //echo $diff." * ";
	    if ($diff >0)
	    {
	    	$eintrag[3] = $uhrzeit = date("H:i",$diff-1*60*60);
	    	if ($diff > $WEGEZEIT*60)
	    	{
	    	   $colour="white";
	    	   // einfach keine farbe definieren
	    	}
	    	else
	    	{
	    	   $colour="yellow";
	    	   $eintrag[3]="<font color='#FFFF00'>".$eintrag[3];
	    	}
	    }
	    else
	    {
	      // nicht mehr zu schaffen da zeit abgelaufen
	      $eintrag[3] = "--:--";
	      if ($WEGEZEIT <>0)
	      	$eintrag[3]="<font color='#FF0000'>".$eintrag[3];
	    }
	    $eintrag[4] = $bahn->timetable[$i]["route_ziel"];
	    $eintrag[5] = $bahn->timetable[$i]["platform"];
	    $eintrag[6] = $bahn->timetable[$i]["ris"];

	        $str .= "<tr>";
	        foreach($eintrag as $data)
	            $str .= '<td>'.$data.'</td>';
	        $str .= "</tr>";

	        $pos++;

	    if($pos >= 6)
	        break;
	}
	$str .= "</table>";

	$vid = CreateVariableByName($parentID, $VARIABLEN_TEXT, 3);
	IPS_SetIcon($vid, "Distance");
	IPS_SetVariableCustomProfile($vid, "~HTMLBox");
	SetValue($vid, $str);
}

function CreateVariableByName($id, $name, $type)
{
    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");
    }
    return $vid;
}

?>

Hallo mäc,
dein script von gestern tut auch mit Pfaffenhofen(Ilm)!
Vielen Dank!

Hallo,

ich finde leider den Fehler in der class.bahn.php. Bei mir werden in der Ausgabe alle „n“ weggelassen.

Ich habe bereits an den Stellen versucht das „n“ durch ein "
" zu ersetzen, das klappt aber nicht.

Könnte mir jemand seine class.bahn.php zur Verfügung stellen?

Gruß
Christian

Hi zusammen,

kann es sein, dass das Script nicht mehr funktioniert und die Bahn was umgestellt hat? Ich bekomme eine Fehlermeldung in Zeile 90?

Also bei mir geht es noch, kein Fehler.

Hallo zusammen,

vielleicht hat jemand von euch ein gutes Herz :wink:

Ich hab mich ein wenig in PHP und MySQL eingearbeitet und kann ein paar kleine Dinge schreiben aber hiermit komm ich nicht ganz klar.

Curl verwende ich nicht, Mäc’s erster Beitrag ist ganz gut aber ich habs mir mal so hier rausgeholt doch bei mir im Browser steht nur der gesamte Quelltext.

Vielleicht kann mir jemand als zip das so beipacken, das es ohne Curl läuft und ausgegeben wird. Dann kann ich mich besser reindenken…

Danke im voraus

Dennis

Hi zusammen,

ich habe mir den Dummy so eingerichtet wie von Mac beschrieben.

2 Stringvariablen
und 2 scripte class.bahn.php koiert aus dem Post vorher und nix geändert
beim Abfragescript habe ich beim Orginal den gleichen fehler wie bei meinem Bahnhof.
„Riederwald Schäfflestraße, Frankfurt am Main“

die Fehlermeldung:
Notice: Trying to get property of non-object in D:\IP-Symcon\scripts\class.bahn.php on line 90

Fatal error: Call to a member function getAttribute() on a non-object in D:\IP-Symcon\scripts\class.bahn.php on line 97

kann da jemand helfen? zur Info dort halten nur UBahnen

gruß
Michael

Bezüglich der Fehlermeldung, welche ich selbst auch schon hatte, scheint der Bahn Service zu zicken und anders zu Antworten.

Denn ohne Veränderung ging es den nächsten Tag wieder. Hatte bisher zweimal so einen „Ausfall“

Hm, wenn ich mal Zeit habe baue ich mal ein paar Errorhanlder ein

Ok dann werde ich mal bis morgen warten…

werden die beiden Variablen eigentlich automatisch angelegt? oder müssen die wie ich das gemacht habe von hand erstellt werden?