Online Abfrage von Benzin Preisen

Hallo,

ich habe ein Arduino Uno mit einem Ethernetshield.
Mit diesem möchte ich per GET Befehl den Benzinpreis von genau einer Tankstelle bei mir in der Stadt abfragen.
Und zwar gibt es ja die Seiten clever-tanken.de bzw mehr-tanken.de
Von einer der beiden möchte ich den Preis abfragen.

Ich komme hier aber nicht weiter. Was muß ich genau per GET schicken um die richtige Antwort zu erhalten.
Vielleicht kann mir jemand helfen.

Hoi,
Du musst die Seite in einen String einlesen und in diesem String ab einer bestimmten Anzahl Zeichen (bzw. nach einem Such-Index) die Anzahl Zeichen einlesen, die den Preis darstellen.

Hi,
erst einmal Danke für den Hinweis.
Aber mein Problem besteht darin das ich erst gar nicht so weit komme.
Die links sind ja die, die im Browser angezeigt werden wenn ich die Suche über die Maske der Homepage gestartet habe.
Ich müßte eher wissen was ich in den Get-Befehl schreibe, damit ich die Preise bekomme um sie dann rauszufiltern.
Wenn ich es so wie in den links eingebe kommt bei dem einen gar nichts raus und bei dem Anderen alles mögliche außer dem Preis.

Dann empfehle ich erstmal ein par Grundlagen zum Thema GET / POST:
http://www.php-dummies.de/script/Tutorials/Erste_Schritte/Formulare/Post_oder_Get_%3F.html
(Beispiel) bzw. hilft Tante Gugel.
Kenne mich mit dem GET Befehl nicht so aus, aber bei 1,499 würde ich wie gesagt den Quelltext als String einlesen, suchte dann nach z.B. dem ersten KOMMA-Zeichen und würde dann von der Position minus 1 (hoffe ja nicht, dass da mal 2 Stellen erscheinen :~ ) 5 Zeichen einlesen und Voilá - da ist der Preis :smiley:

Am Beispiel einer Tankstelle im Bereich meines Wohnortes würde es wie folgt aussehen:

client.println("GET /detail?id=14734438&t=WILMS%2C Dieselstr. 14-20%2C Mönchengladbach HTTP/1.1");
client.println("Host: http://mehr-tanken.de")

Damit hättest Du zwar die Seite abgerufen, aber leider liegen die Preise fast immer als Bild-Datei (*.png) vor und somit nicht im Datenstrom auswertbar. Dafür müsste man ein XML-Dokument abrufen können.

Frage in die Runde: Kennt jemand einen Anbieter, der eine API-Schnittstelle mit XML_Dokument für die Benzinpreise bereithält?

benzinpreis.de will einen Domainnamen haben, benzinpreis-aktuell.de stellt zwar eine API zur Verfügung aber nur als PHP-Script. Habe versucht eine ID zu generieren und habe nach 15 Versuchen frustiert aufgegeben.

ARAL bietet auf seiner Web-Site auswertbare Preiszahlen an, allerdings auch keine XML-Dokumente.

Sieht also zur Zeit m.E. nicht so gut aus. Da ist die Wetterseite deutlich weiter; hier sind XML-Daten leicht zu beschaffen.

Gruß Eberhard

Oder müsstest (wie ich) ein eigenes Proggi auf einem PC o.ä. laufen haben, der diese Arbeiten für Dich übernimmt und (wie bei mir) eine ASCII.txt erstellt mit nur den Daten, die Du brauchst.

Ist zwar von hinten durch's Knie in's Auge :grin: - aber der Zweck heiligt die Mittel XD

@ Arty
Bedeutet dass, dass der PC in regelmäßigen Abständen die .txt-Datei zur Verfügung stellt? Und was machst du mit den Preisen, die in PNG-Dateien "versteckt" sind?

Gruß Eberhard

Bedeutet dass, dass der PC in regelmäßigen Abständen die .txt-Datei zur Verfügung stellt?

Jepp

Und was machst du mit den Preisen, die in PNG-Dateien "versteckt" sind?

Nüscht

Ich glaube ich sollte man erklären was ich damit machen möchte.
Ich möchte praktisch von meiner Tankstelle in der Stadt morgens automatisch den Preis abrufen und dann per Prowl an mein Handy schicken. Somit weis ich ob es sich lohnt den Umweg durch die Stadt zum Tanken zu nehmen. Auf dem direkten Arbeitsweg komme ich da nicht vorbei. Das senden von Daten mit Prowl funktioniert schon super. Alternativ funktioniert auch isticky.

Ich kenn mich nicht mit Homepage Programmierung aus.
Vielleicht könnte man auch das Bild irgendwie schicken?
Oder A.R.Ty stellt den einen Preis zur Verfügung XD

Was machst Du eigentlich damit?

Kannst du da nicht gleiche eine App auf dem Handy schreiben, die das für dich erledigt?

Ne leider nicht.
Wenn ich das könnte wäre ich reich und berühmt 8)

Oder A.R.Ty stellt den einen Preis zur Verfügung smiley-lol
Was machst Du eigentlich damit?

Den Preis meiner Tankstelle hier kannste haben :wink:

Um das Thema noch einmal aufzugreifen:

Inzwischen gibt es die URL www.clever-tanken.de in deren Quelltext die Bezinpreise enthalten sind. Mein Ansinnen ist nun, diese Preise mit der library Textfinder.h zu extrahieren.

Wie weit bin ich? Die Webseite wird als Quelltext - wenn kein finder.find() aktiviert ist - einwandfrei im SerialMonitor angezeigt. Aktiviere ich den Finder und lass ihn nach einem bestimmten string suchen, wird der Quelltext nicht mehr angezeigt nur noch ein "H", Scheint ein zeitliches Problem zu sein ist aber sekundär.

Ärgerlicher ist, dass die Suchfunktion nur im oberen Bereich funktioniert. Der Bereich, in dem die Ergebnisse stehen, wird offensichtlich nicht ausgewertet. Um die Pprogrammierunng zu ändern, muss ich wissen, warum nichts ausgewertet wird.

Ich habe mal den kompletten Sketch beigefügt. Der Bereich "Finder ist markiert. Als Suche habe ich eine Tankstellennummer meines Bereiches ausgewählt (Die aber nicht gefunden wird)

/*
   Web client sketch for IDE v1.0.1 and w5100/w5200
   Uses GET method.
   Posted October 2012 by SurferTim
   Last modified September 15, 2013
*/

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

// this must be unique
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// change to your network settings
IPAddress ip(192,168,2,44);
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(212,11,226,1); // clever-tanken

//Change to your domain name for virtual servers
char serverName[] = "www.clever-tanken.de";
// If no domain name, use the ip address above
// char serverName[] = "74.125.227.16";

// change to your server's port
int serverPort = 80;

EthernetClient client;
TextFinder finder( client);
int totalCount = 0;
char pageAdd[64] = "/tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon=";
char preis2[15]="5"; // Default-Zahl ist nur für Testzwecke
char preis3[15]="7";

#define delayMillis 60000UL

unsigned long thisMillis = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  // Start ethernet
  Serial.println(F("Starting ethernet..."));
  Ethernet.begin(mac, ip, gateway);

  // If using dhcp, comment out the line above 
  // and uncomment the next 2 lines

  // if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  // else Serial.println(F("ok"));
  digitalWrite(10,HIGH);

  Serial.println(Ethernet.localIP());

  delay(2000);
  Serial.println(F("Ready"));
}

void loop()
{
  thisMillis = millis();

  if(thisMillis - lastMillis > delayMillis)
  {
    lastMillis = thisMillis;

    // Modify next line to load different page
    // or pass values to server
    sprintf(pageAdd,"/",totalCount);

    // sprintf(pageAdd,"/arduino.php?test=%u",totalCount);

    if(!getPage(server,serverPort,pageAdd)) Serial.print(F("Fail "));
    else Serial.print(F("Pass "));
    totalCount++;
    Serial.println(totalCount,DEC);
  }    
}

byte getPage(IPAddress ipBuf,int thisPort, char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  if(client.connect(ipBuf,thisPort))
  {
    Serial.println(F("connected"));

    sprintf(outBuf,"GET %s HTTP/1.1",page);
    client.println(outBuf);
    sprintf(outBuf,"Host: %s",serverName);
    client.println(outBuf);
    client.println(F("Connection: close\r\n"));
  } 
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      int a=0;
      inChar = client.read();
      Serial.write(inChar);

// -----  Ende Start --------        
     if (finder.find("10564"))
     {
       a = 1;
       Serial.println(a);
     }
// -----  Ende Finder --------     
     
      // set connectLoop to zero if a packet arrives
      connectLoop = 0;
    }

    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println(F("Timeout"));
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}

Die Anlage Quell.txt enthält den Quelltext der Ergebnisseite. In dieser ist der Bereich, ab dem der Finder nicht mehr funktioniert deutlich markiert.

Kann sich jemand vorstellen, warum er nichts mehr findet?

Gruß Eberhard
Die Diskussion über die Sinnhaftigkeit, wo es doch Apps gibt, ist ja schon geführt worden. 8)

Quell.txt (58.6 KB)

Hoi Eberhard,

kanne es was damit zu tun haben dass es "zu viele" Zeichen sind, will sagen dass ein Buffer überläuft oder voll ist ?

Wie Du schreibst, scheint es im "oberen" Bereich zu funktionieren - daher mag es sein dass ab 32xxx Zeichen nichts mehr eingelesen/ verarbeitet wird ?
Kenne diese Problematik nicht vom ARDUINO sondern von anderen ProgSprachen her - nur mal so als Denkanstoss.

Genau so kann es aber auch ein Timing-Problem sein - zu schnell (zu viel) einlesen ?

Doei
Franz

Die Frage mit dem Speicher habe ich mir auch schon gestellt, aber noch nicht beantwortet (bekommen). Es fragt sich, ob der Arduino für den find-Prozess die ganze Seite speichert. Dass es dann zu Speicherproblemen kommt, wäre verständlich.

Ohne Finder läuft ja der gesamte Text durch. Das bedeutet, dass hierbei der Speicher nicht befüllt wird.

Gruß Eberhard

Schnelle Möglichkeit zum Testen wäre, die Seite mal zu teilen und den unteren Bereich durchsuchen lassen - nur zum checken ob es werkelt 8)

Das heißt:

  1. Abgespeckter Quelltext im 192-er Netz als Quelle.hmtl speichern.
  2. client.print("Host: 192.168.2.5"); // Speicherort in meinem Netz
  3. client.print("GET /Quelle.html HTTP/1.1");

Eventuell müsste ich noch Pfade angeben.

Wäre das so machbar?

Gruß Eberhard

Joa, sollte....

eberduino:
Am Beispiel einer Tankstelle im Bereich meines Wohnortes würde es wie folgt aussehen:

client.println("GET /detail?id=14734438&t=WILMS%2C Dieselstr. 14-20%2C Mönchengladbach HTTP/1.1");

client.println("Host: http://mehr-tanken.de")

Kurze Anmerkung hierzu, das "http://" vor dem Eintrag "Host: http://mehr-tanken.de" muss weg.
Der HTTP Parameter "Host" bekommt nur den Servernamen.
Mario.

@mkl0815
Du hast Recht. Mein Fehler, wirkt sich nicht auf den momentanen Fehler aus. Ist ja einen Monat her.

Ich habe mir den Datenstrom auf der SerialMonitor nochmal genau angesehen und merke gerade, dass ein

- Container gar nicht gelesen wird. Fiddler2 zeigt mir aber alles komplett - mit fehlendem
-Container. Also wertet der Arduino diesen Container nicht aus. Fehlen mir im Header einige Einstellungen?
Mein Request:
GET /tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon= HTTP/1.1
Antwort vom Server(Fiddler2):
Host: www.clever-tanken.de
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: de,de-de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Muss ich Einstellungen ändern?

Gruß
Eberhard