Online Abfrage von Benzin Preisen

Nein, eigentlich sollte das passen. Hab das selbst gerade mal getestet mit dem einfache WebClient Beispiel der Ethernet-Lib.
Klappt recht gut. Allerdings wird das Parsen der HTML-Daten spannend, da die Webseite 58.000 Bytes groß ist.
Mit dem Textfinder klappt das aber recht gut:
Ausgabe auf dem Serial Monitor:

connecting…
connected
Tankstelle 1
Wilms-Wickrath, Dieselstr. 14-20, 1.449 Euro
Tankstelle 2
OIL!, Karlstrasse 59, 1.479 Euro
Tankstelle 3
Shell, HARDTER STR. 133, 1.489 Euro
Tankstelle 4
Shell, MARIE-BERNAYS RING, 1.489 Euro
Tankstelle 5
Shell, DUVENSTRASSE. 339, 1.499 Euro
Tankstelle 6
TOTAL, DAHLENER STR. 520, 1.519 Euro

Hier der Code dazu:

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.clever-tanken.de";    // name address for Google (using DNS)
EthernetClient client;

TextFinder finder( client);

char preis1[10];
char preis2[5];
char tankstelle[100];
char adresse[100];

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon= HTTP/1.1");
    client.println("Host: www.clever-tanken.de");
    client.println("Connection: close");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  int counter=1;
  if (client.connected()) {
    while(finder.find("addPoi")) {
       finder.getString("class=\"price\">","<",preis1,10);
       finder.getString("<sup>","</sup>",preis2,5);
       finder.getString("location_name\">","</div>",tankstelle,100);
       finder.getString("street_number\">","</div>",adresse,100);
       Serial.print("Tankstelle ");
       Serial.println(counter++);
       Serial.print(tankstelle);
       Serial.print(", ");
       Serial.print(adresse);
       Serial.print(", ");
       Serial.print(preis1);
       Serial.print(preis2);
       Serial.println(" Euro");
       
    }
  client.stop();
  }
  while(1) {};
}

Nach einem halben Jahr habe ich das Thema nochmal aufgegriffen und an dem Thema weitergearbeitet. @mkl0815: Das Ergebnis hat mich auf den ersten Blick schon beeindruckt, Aber die Antwort auf die Abfrage beginnt nicht mit dem ersten sondern mit der 2. Tankstelle. Danach folgt die vierte usw. Zuerst dachte ich, das wäre ein Problem der Laufzeiten. Aber egal was ich gemacht habe => Null Erfolg.

Kann mir jemand sagen wo der Hase begraben ist?

Gruß Eberhard

Nach langem Suchen habe ich den Schwachpunkt gefunden.

Die Zeile:
finder.getString("<sup>","</sup>",preis2,5); macht Ärger.

Wenn sie geändert wird in :
finder.getString(">","<",preis2,5);
werden alle Tankstellen angezeigt, beginnend mit der Peiswertesten. Ist wohl innerhalb der Suchfunktion ein Zeitproblem. Je kürzer der Suchstring ist, um so schneller das Ganze. Wurden vorher max 5 Tankstellen angezeigt, werden nun deutlich mehr angezeigt. Die Anzahl hängt von der Geschwindigkeit des Servers ab. Ist aber m.E. unkritisch, da mich ohnehin nur die 3 preiswertesten Tankstellen interessieren.

Wenn jemand da drauße anderer Meinung ist, würde ich gerne wissen warum.

Gruß
Eberhard

Hallo Eberduino,

vielleicht kannst Du das Endergebnis hier einmal veröffentlichen. Das wäre toll.

Hallo Zusammen,

da das Forum zu diesem Projekt Wesentliches beigetragen hat, besteht auch ein Anrecht zu wissen, was daraus geworden ist:

Ich lasse mir die preiswerteste Tanke in meinem Bereich (Eingabe der PLZ) im Umkreis von 5km für meine Spritsorte auf meiner Squeezebox-Touch anzeigen. Ich könnte mir auch ein bestimmtes Musikstück zusätzlich einspielen lassen (Muss ich aber nicht haben). Desweiteren gibt es in den Sketch auch einen einstellbaren Schwellwert, der die Anzeige nur dann aktiviert wenn sie den eingestellten Wert (Spritpreis) unterschreitet

Hier mal ein Musterbild meiner Anzeige:

Die Darstellungen sind zu den echten Squeezeboxen identisch. Hier wurden nur die Softwarevarianten (Freeware) dargestellt.

Ein Hinweis: Dies ist nur eine Machbarkeitsstudie und nicht für den alltäglichen Gebrauch vorgesehen!

Es ist schon skuril: Die Markttransparenzstelle für Kraftstoffpreise (MTS-K) stellt ausgewählten Firmen die Rohdaten zur Verfügung, die sie auf ihrer WEbsite veröffentlichen. Eine XML-Datei stellt die MTS-K nicht zur Verfügung. Eine Weiterverarbeitung der MTK-Daten ist offensichtlich nicht gewollt. Deshalb ist dieses nur eine Machbarkeitsstudie, deren Ergebnis ich euch nicht vorenthalten möchte.

Gruß Eberhard

V105_Spritpreis_dspl_Squeezebox.ino (11.6 KB)