Benzin-Preis-Apps mit Daten der Meldebehörde für Preisvergleich

Jo,
auch meine Diagramme füllen sich jetzt wieder mit Leben.

Danke euch,
Doc

Hallo,

ich bekomme seit ein paar Tagen immer die folgenden Fehlermeldungen:

Notice:  Undefined index: location_name in C:\IP-Symcon\scripts\46476.ips.php on line 101

Notice:  Undefined index: location_name in C:\IP-Symcon\scripts\46476.ips.php on line 101

Notice:  Undefined index: location_name in C:\IP-Symcon\scripts\46476.ips.php on line 101

Notice:  Undefined index: location_name in C:\IP-Symcon\scripts\46476.ips.php on line 101

Ich habe aber am Script nichts geändert und auf „Clever Tanken“ werden auch aktuelle Daten angezeigt.

Wo ist der Fehler ???

Gruß Proxima

Abend!

Hab das grad mal geprüft…cle*ertanken hat die Webseite geändert. Also muss das Skript angepasst werden. Es hat sich aber nicht so viel geändert, also kein so großer Aufwand.

Grüße,
Chris

Ich darf mal etwas Werbung machen :smiley:
>> Tankerkoenig.de (Spritpreise mit Umkreissuche oder Detailabfrage)

Grüße,
Chris

Also mein cle*ertanken-script läuft ohne Änderungen u. hat aktuelle Daten.
Eben noch mal ne Plausikontrolle gemacht.
Das mit der API von Tankenkönig schau ich mir trotzdem mal an. Klingt interessant.
Ich logge die Daten auch alle in eine MySQL. Da kann man dann mit HighCharts dann interessante Kurven machen lassen. Besonders wenn man dann noch die Rohölpreise dazu einblendet kommt man sich zeitweise verXrscht vor.

Hi Wolfgang!

Magst du mir mal dein Skript zukommen lassen? Würde rein aus Interesse gern mal sehen, was du anders hast, dass das bei dir noch funktioniert.

Grüße,
Chris

Hallo,

das würde mich auch interessieren.

Gruß Proxima

Hallo,
die Anpassung würde mich auch interessieren.

Gruss

PMs sind verschickt.

Guten Morgen!

Danke! Habs mir mal kurz angeschaut. Also doch geändert das Skript. Die sind wohl dann schon eine Zeit auf beiden Wegen „abfragbar“ gewesen. Klang so, als hättest du das Skript was alle haben und da hab ich mich leicht gewundert, warum das bei dir noch funktioniert :smiley:

Hab es noch nicht getestet, aber wird schon funktionieren :slight_smile:

Danke und Grüße,
Chris

Vielen Dank an Wolfgang.
Falls es noch eine Möglichkeit gibt die alte Lösung zu modifizieren bitte posten

Gruß

Also doch geändert das Skript.

ja, vor einem Jahr.

Hier eine funktionierende Version des Scripts:


<?
// Version 1.2 (mit integriertem Webfront und automatischer Aktivierung des Loggings)
// by crypto(Jo)
// umgestellt auf MTS by bumaas
// 05-08.2015 fixed by Disaster123

$Tankstelle = array();

///////////////	Hier die Tankstellen eintragen welche man auslesen möchte     ///////////////////
//
//   "Name" 						= 	Name der Tankstelle wie er im WebFront angezeigt werden soll
//   "Ort" 						   = 	PLZ oder Ort über den bei clever-tanken.de gesucht wird
//
//                Die folgenden Informationen sind nach der Auswahl des gewünschten Ortes unter http://www.clever-tanken.de
//						der Ergebnisseite zu entnehmen:
//
//   "location_name" 			=  angezeigter Name der Tankstelle
//   "location_street_number" =  angezeigte Adresse der Tankstelle (Straße und Hausnummer). Bitte auf Sonderzeichen achten.
//
//    Beispiel: array( "Name" => 'SB Zentralmarkt', "ort" => '33100', "location_name" => 'Tankstelle SB-Zentralmarkt',  "location_street_number" => 'Im Dörener Feld 4');
//
////////////////////////////////////////////////////////////////////////////////////////////////////

$Tankstelle[] = array( "Name" => 'Aral Messeschnellweg Ost', 		"ort" => '30539',		"location_name" => 'ARAL',  	"location_street_number" => 'Messeschnellweg Ost');
$Tankstelle[] = array( "Name" => 'Aral Messeschnellweg-West', 		"ort" => '30521',		"location_name" => 'ARAL',  	"location_street_number" => 'Messeschnellweg-West');


////////////////  Hier die Sorten eingeben, die ausgelesen werden sollen. ///////////////////////////
//
//    Beispiel: 	$Sorten = array(3, 7);
//
// 1 = Autogas
// 2 = LKW-Diesel
// 3 = Diesel
// 4 = Bioethanol
// 5 = Super E10
// 6 = Super Plus
// 7 = Super E5
// 8 = Erdgas
// 9 = Bio Diesel
// 10 = Pflanzenöl
// 11 = Zweitakt
// 12 = Premium Diesel
// 13 = AdBlue
////////////////////////////////////////////////////////////////////////////////////////////////////

$Sorten = array(5,6);

/////////////////////////////////  Verschiedene Einstellungen  /////////////////////////////////////

$RefreshTime = 10;         // Zeit in Minuten für Aktualisierung ( Mind. 10 sonst sperrt die Homepage die Anfragen), "0" stoppt den Trigger
$ActivateLog = true;       // Startet beim Neuanlegen der Variablen gleich das Logging der Preise
$BuildWebfront = true;	   // Erstellt in unten angegebener ID DummyModule und Links der Daten für das Webfront.
$WebfrontParentID = 58162 /*[Benzin\Webfront]*/ ;  // ID der Kategorie in der das "Webfront" erstellt werden soll


/**************************************************************************************************/
//////////////////////////////// Ab hier nicht mehr ändern /////////////////////////////////////////
/**************************************************************************************************/

$DefSorten = array();
$DefSorten [1] = "Autogas";
$DefSorten [2] = "LKW-Diesel";
$DefSorten [3] = "Diesel";
$DefSorten [4] = "Bioethanol";
$DefSorten [5] = "Super E10";
$DefSorten [6] = "Super Plus";
$DefSorten [7] = "Super E5";
$DefSorten [8] = "Erdgas";
$DefSorten [9] = "Bio Diesel";
$DefSorten[10] = "Pflanzenöl";
$DefSorten[11] = "Zweitakt";
$DefSorten[12] = "Premium Diesel";
$DefSorten[13] = "AdBlue";

IPS_SetScriptTimer($_IPS['SELF'], $RefreshTime*60);

foreach ($Sorten as $Sorte) {

	foreach ($Tankstelle as $Info) {
	   $arr_ts = getTankstellenInfos ($Info['ort'], $Sorte);
		//print_r($arr_ts);

		$ts = seekTankstelle($arr_ts, $Info['location_name'], $Info['location_street_number']);
		//print_r($ts);

		if($ts['datetime'] > 0)	{
			SetValue(getVarID("Meldezeit", $Info['Name']), $ts['datetime']);
			SetValue(getVarID($DefSorten[$Sorte], $Info['Name']), $ts['price']);
		} else {
			//echo $Info['location_name'].", ". $Info['location_street_number'].": keine Daten erhalten
";
		}
	}
}

if($BuildWebfront)buildWebfront();

function seekTankstelle($arr, $name, $address){
	foreach ($arr as $elem){
		if ((strcasecmp($elem['location_name'], $name) == 0 )
			and (strcasecmp($elem['location_street_number'], $address) == 0)){
			return $elem;
		}
	}
}

function getTankstellenInfos ($ort, $spritsorte){
	$url = "http://www.clever-tanken.de/tankstelle_liste?ort=$ort&spritsorte=$spritsorte";

	# Use the Curl extension to query clever tanken and get back a page of results
	$ch = curl_init();
	$timeout = 5;
	set_time_limit(10); //PHP Zeitlimit neu aufziehen, da die Methode in einer Schleife aufgreufen wird

	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$html = @curl_exec($ch);
	curl_close($ch);

	# Create a DOM parser object
	$dom = new DOMDocument();

	# Parse the HTML from clever tanken.
	# The @ before the method call suppresses any warnings that
	# loadHTML might throw because of invalid HTML in the page.
	@$dom->loadHTML($html);

	$finder = new DomXPath($dom);

	$ts = array();

	$classname="fuel-station-location-name";
	$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
	
	$i=1;
	foreach ($nodes as $node){
		$ts[$i]['location_name'] = clearHTML($node->nodeValue);
		$i++;
	}

	$classname="fuel-station-location-street";
	$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@id), ' '), ' $classname ')]");
	$i=1;
	foreach ($nodes as $node){
		$ts[$i]['location_street_number'] = clearHTML($node->nodeValue);
		$i++;
	}

	$classname="fuel-station-location-city";
	$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@id), ' '), ' $classname ')]");
	$i=1;
	foreach ($nodes as $node){
		$ts[$i]['petrol-station-ort'] = clearHTML($node->nodeValue);
		$i++;
	}

	$classname="price";
	$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
	$i=1;
	foreach ($nodes as $node){
		$ts[$i]['price'] = (float) clearHTML(utf8_decode($node->nodeValue));
		$i++;
	}

	$classname="price_date";
	$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
	$i=1;
	foreach ($nodes as $node){
		$value = clearHTML(utf8_decode($node->nodeValue));
		$ts[$i]['datetime_org'] = $value;
      if (substr_count($value, "geändert ")){
            $suchen   = array('geändert', 'Heute', 'vor', 'Min.', 'Sek.', 'Std.');
            $ersetzen = array('', '', '', 'minutes', 'seconds', 'hours');
            $value    = trim( str_replace ($suchen, $ersetzen, $value) );
            // invisible special char
            $value    = trim( $value, '*');
            $value    = strtotime("-".$value);
      } else $value=0;
		  $ts[$i]['datetime'] = $value;
		$i++;
	}

	return $ts;
}

function clearHTML($string){
	$suchen = array('Ü', 'Ä', 'Ö', 'ü', 'ä', 'ö', 'ß');
	$suchen = array('Ü', 'Ä', 'Ö', 'ü', 'ä', 'ö', 'ß');
	$ersetzen = array('Ü', 'Ä', 'Ö', 'ü', 'ä', 'ö', 'ß');
	$string = str_replace ($suchen, $ersetzen, $string);
	return trim(preg_replace("/\s+/", " ", $string));
}


function getCatID($Name)
	{
	$CatID = @IPS_GetCategoryIDByName($Name, $_IPS['SELF']);
	if(!$CatID)
		{
		$CatID = IPS_CreateCategory();
		IPS_SetName($CatID, $Name);
		IPS_SetParent($CatID, $_IPS['SELF']);
		}
	return $CatID;
	}

function getVarID($Name, $CatName)
	{
	global $ActivateLog;
	$CatID = getCatID($CatName);
	$VarID = @IPS_GetVariableIDByName($Name, $CatID);
	if(!$VarID)
		{
		if($Name == "Meldezeit")
			{
			$VarID = IPS_CreateVariable(1);
         IPS_SetVariableCustomProfile($VarID, "~UnixTimestamp");
			IPS_SetPosition($VarID, 10);
			}
		else
			{
			$VarID = IPS_CreateVariable(2);
			IPS_SetPosition($VarID, 20);
			$ProfilName = "Euro_Tankstelle";
			if(!IPS_VariableProfileExists($ProfilName))
				{
			   IPS_CreateVariableProfile($ProfilName, 2);
            IPS_SetVariableProfileText($ProfilName, "", "€");
            IPS_SetVariableProfileDigits($ProfilName, 3);
            IPS_SetVariableProfileIcon($ProfilName,  "Euro");
				}
			IPS_SetVariableCustomProfile($VarID, $ProfilName);
         if($ActivateLog)
				{
				$ArchiveHandlerID = IPS_GetObjectIDByName ( "Archive Handler" , 0 );
				AC_SetLoggingStatus($ArchiveHandlerID, $VarID, true);
				IPS_ApplyChanges($ArchiveHandlerID);
				}
			}
		IPS_SetName($VarID, $Name);
		IPS_SetParent($VarID, $CatID);

		}
	return $VarID;
	}

function buildWebfront()
	{
	global $WebfrontParentID;
	$Liste = IPS_GetChildrenIDs($_IPS['SELF']);

	foreach ( $Liste as $Object )
		{
		$Info = IPS_GetObject($Object);
		if($Info['ObjectType']== 0)
			{
			$CatName = $Info['ObjectName'];
			if(!@IPS_GetObjectIDByName($CatName,$WebfrontParentID))
				{
				$DummyID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
	      	IPS_SetParent ( $DummyID ,$WebfrontParentID );
				IPS_SetName ($DummyID,$CatName);
				}
			else $DummyID = IPS_GetObjectIDByName($CatName,$WebfrontParentID);
			foreach($Info['ChildrenIDs'] as $ChildID)
     	   	{
         	$LinkInfo = IPS_GetObject($ChildID);
				if($LinkInfo['ObjectName'] == "Meldezeit") $LinkName = "Gemeldet am:";
				else $LinkName = $LinkInfo['ObjectName'];
         	if(!@IPS_GetObjectIDByName($LinkName,$DummyID))
					{
					$LinkID = IPS_CreateLink();
					if($LinkInfo['ObjectName'] == "Meldezeit")
						{
						IPS_SetName ($LinkID, "Gemeldet am:");
         			IPS_SetPosition($LinkID, 100);
      				}
					else IPS_SetName($LinkID, IPS_GetName($ChildID));
					IPS_SetLinkTargetID($LinkID, $ChildID);
					IPS_SetParent ( $LinkID ,$DummyID );
					}
				}
			}
		}
	}
?>


Hi!

Bei mir funktioniert das Skript leider nicht. Wird als fehlerhaft markiert, zeigt aber keine Fehlermeldung. Variablen werden auch keine erstellt :confused:

Grüße,
Chris

Einiges an Handarbeit
Zitat aus PM = Antwort auf
Variablen werden auch keine erstellt

Warums bei Dir nicht läuft, keine Ahnung. Habs 1:1 aus dem laufenden Betrieb kopiert. Läuft bei mir alle 15 Minuten. Ab und zu bekomm ich auch Fehler wg TimeOut (nicht erreichbar) u nicht abgefangene Folgen, aber recht selten.

Ich habe #133 mal probiert. Bis auf die SciptTimererstellung geschied nix.

PS: Nur $WebfrontParentID angepasst

Hallo,

weiss zufällig jemand (und will es auch sagen :wink: ), was bei Tankentanken oder Symcon (V5.0) geändert wurde? Die Reihenfolge der Tankstellen stimmt, bekomme aber nur noch Nullen als Preis angezeigt. Leider stimmen die mit der Realität nicht überein. :cool:

Skript von hier
Benzin-Preis-Apps mit Daten der Meldebehörde für Preisvergleich - Seite 8

Danke

Gruß
Bruno

Die Frage ist ja schon einen Weile her ;), habe mir aber auch mal tanken tanken angeschaut.

Du must im Skript


$string = trim($contentSuper[$i - 17]);

auf


$string = trim($contentSuper[$i - 11]);

abändern, dann bekommst Du auch wieder Preise angezeigt.

Hi Fonzo,

trotzdem noch aktuell … :smiley:

… im Skript … abändern, dann bekommst Du auch wieder Preise angezeigt.

4x getauscht und fein, es geht wieder.

Danke

Allerdings stehen jetzt noch zwei geschlossene Tankstellen an oberster Position (Preis 0.00). Die zum Vergleich geöffnete TankenTanken-Website zeigt drei geschlossene Tankstellen, im Script wird die nächstliegende der drei ausgeblendet.
Ergänzung: Hat wohl nix mit der Entfernung zu tun, habe jetzt eine ganze Latte geschlossener Tankstellen, alle mit Preis 0.00. Aber nach Entfernung sortiert. Früher wurden die geschlossenen TS m.W. nicht angezeigt.

Hast Du hier eine Idee ??