Kleines neues Wochenend-Projekt: Lokale Dieselpreise

Über Ostern hatte ich etwas Zeit, an einem kleinen Projekt zu basteln, das mir schon seid Längerem im Kopf herum spukt.

Hintergrund

Günstig Benzin oder Diesel tanken ist heute ein Glücksspiel. Die Preise wechseln stündlich und man muss zufällig zur richtigen Zeit an der richtigen Tankstelle sein. Einige Tankstellen sind meistens günstiger als andere, aber auch nicht immer.
In meiner Umgebung gibt es drei Tankstellen: Aral, eine Automatenzapfe (bft) und seit neuestem Oil (war vorher Shell). Der Vorteil der Automatentankstelle ist der sich selten ändernde Preis, der sich immer im erträglichen unteren Bereich des aktuellen Preisniveaus zu bewegen, i.A: günstiger als Shell und Aral. Seitdem die Shell-Tankstelle von der Firma Oil übernommen wurde, ist diese zeitweise günstiger, aber zeitweise auch teurer als die Automatenzapfe. Wann soll man nun tanken fahren, um nicht mehr Geld auszugeben als notwendig?

Lösungsansatz

Seit 1. Dezember 2013 müssen alle Tankstellen ihre Preise an die „Markttranzparenztstelle für Kraftstoffe“ melden. Wäre doch toll, wenn man dort einfach die aktuellen Preise beziehen und sich eine kleine Grafik basteln könnte.
Konjunktiv: Wäre! Leider ist das nicht so einfach, denn man kann als Normalsterblicher die Daten nicht direkt abrufen. Es gibt 13 „zugelassene Verbraucher-Informationsdienste“ die Deutschland mit Informationen versorgen dürfen. OpenData ist was anderes. Falls jemand weiß, wie man direkt an die Daten kommt, dann schicke er doch bitte eine Mail an mich.

Es bleibt also nur der Weg über einen dieser Anbieter. Natürlich kommt man hier ebenfalls nicht direkt an die Daten heran, denn die Anbieter wollen schließlich Geld damit verdienen.

Eingabe

Daten, die auf einer Webseite angezeigt werden, müssen irgendwo im Quelltext stehen. Die erste Aufgabe besteht also darin, in dem Gewusel von Tags die richtige Stelle zu finden. Den Dieselpreis findet man beim von mir ausgewählten Anbieter in folgenden Teilstück:

ng-init="init('1,329')">

Diesel

Um sicher zu gehen, dass das Tool auch noch arbeitet, wenn die Formatierung sich leicht ändern sollte, wird der Preis mit einem kleinen regulären Ausdruck ausgelesen:

$pattern = "/ng-init=\"init\('(.*)'\)\">\s*
Diesel/";

Verarbeitung

Die Verarbeitung besteht hauptsächlich in der Speicherung der Daten. Man könnte jetzt natürlich die Standard-Keule raus holen und die Werte in einer Datenbank speichern. Diese Ansatz empfand ich aber für dieses kleine Tool als zu totalen Overkill und deshalb speichere ich die Daten einfach als CSV-Datei.
Mein Webhoster bietet die Möglichkeit Cronjobs auszuführen, also rufe ich einfach jede Stunde ein Skript auf, das für drei Tankstellen die Daten speichert.

Ausgabe

Für die Ausgabe hatte ich nichts Bestimmtes geplant, und tatsächlich wollte ich zuerst Google Charts nutzen. Da ich an dem Abend allerdings keine Lust mehr hatte, etwas zu programmieren, habe ich ein wenig weiter gesucht. Für einen Job hatte ich einmal mit Highcharts gearbeitet und als ich auf der Webseite nach sah, sprang mir das Tool HighStock entgegen, das genau das macht, was ich brauche.
Das Programm lässt sich extrem einfach nutzen. Es enthält z.B. ein Import-Modul, mit dem man ganz einfach CSV-Dateien einlesen kann. Was will ich mehr?
Das Problem ist allerdings, dass HighStock *extrem* viele Einstellungsmöglichkeiten hat und die mussten erst einmal erforscht werden. Dafür ging der gesamte Ostermontag drauf (OK, vier Stunden des Tages). Das Ergebnis ist ist zwar noch immer nicht perfekt, aber schon ausreichend um es hier zu präsentieren:

HighStock ist ein ziemlich cooles Skript. Geschrieben in 100% Javascript bietet es im Frontend ein Unzahl an Möglichkeiten die Daten darzustellen. Um nur zwei Features zu nennen: man kann den Zeitraum über Tasten auf einen vorgegebenen Bereich oder im „Navigator“ fließend einstellen. Ist man an den Werten für einen bestimmten Zeitpunkt interessiert, kann man ganz einfach mit der Maus auf die entsprechende Linie gehen.
Man kann sich das Ergebnis hier live ansehen.

Aussicht

Ein solches Tool kann man natürlich immer noch schöner und besser machen. Meine Frau hat sich schon mehrere Verbesserungen gewünscht, so z.B. den Durchschnittspreis über einen Zeitraum oder dass „Aral“ standardmäßig zuerst ausgeblendet wird, weil es sowieso nur als Vergleichswert dient und niemals billiger als Oil oder bft ist.
Ich möchte das Skript auch gerne etws flexibler gestalten. Im Moment sind die drei Tankstellen direkt eingetragen; um andere einzutragen muss ich direkt im Code etwas ändern. Eine kleine Konfigurationsdatei wäre hier wesentlich besser.

Fazit

Das Tool hat mir die Einsichten in den lokalen Treibstoffmarkt gebracht, die mir erhofft hatte.
Man erkennt sehr gut, dass die Preise bei Oil und Aral am Tagesanfang immer sehr hoch anfangen und am Tagesende nach unten gehen. Das wird wahrscheinlich mit dem Verkehrsaufkommen und den daraus resultierenden potentiellen Kunden korrelieren. Den besten Preis bekommt man momentan, wenn man nach 20 Uhr tanken fährt. Hätte ich vorher nicht gedacht.
Sehr schön erkennt man auch, das die Automatentankstelle immer eine sichere Bank ist, falls die Preise kurzzeitig aus dem Ruder laufen sollten.

Wer dieses Tool gerne selber einsetzen möchte (Voraussetzungen sind PHP und Cron), kann mich gerne kontaktieren. Das Projekt befindet sich allerdings noch im Stadium „Läuft!“, mehr nicht.

(Foto: Christoph Boecken)