Seit Anfang des Jahres kennen die Benzinpreise fast nur eine Richtung, nach oben. Umso erschreckender ist die Tatsache, dass in ein paar Tagen der von der deutschen Bundesregierung ausgegebene Tankrabatt endet. Aus diesem Grund habe ich mir überlegt, wie unser Smart Home dabei helfen kann, an der Zapfsäule den ein oder anderen Cent zu sparen. Gibts da nicht was im ioBroker? Bevor der ein oder andere jetzt denkt, ist klar Adapter installiert und fertig. Nein, der Adapter bildet nur die Grundlage für weitaus mehr Funktionen.
Die Basisfunktionalität bildet die Anzeige der einzelnen Benzinpreise an den Tankstellen in der Umgebung im ioBroker. Dabei sollen diese in regelmäßigen Abständen aktualisiert und obendrein soll der günstigste Preis in der Umgebung inkl. Tankstellenname angezeigt werden. Ebenso möchte ich ein Gefühl bekommen in welchen Dimensionen sich die täglichen Veränderungen der Benzinpreise befinden. Aus diesem Grund muss jeweils der Tageshöchstwert, sowie der niedrigste Preis ermittelt und festgehalten werden. Obendrein muss das Ganze noch durch ein Preisalarm unterstützt werden, da ich keine Lust habe den ganzen Tag auf ein Dashboard zu schauen. Klingt spannend, dann ab an die Arbeit.
Tankerkönig
Zum Abdecken der Basisfunktionalität greife ich auf den Adapter Tankerkönig zurück. Mithilfe des Adapters habt ihr die Möglichkeit die Benzinpreise von bis zu 10 unterschiedlichen Tankstellen in eurer Umgebung abzufragen. Dabei stehen euch die Preise für Diesel, Super und E10 zu Verfügung. Insofern ihr die besonderen Treibstoffarten wie Super Plus etc. benötigt, müsst ihr auf einen anderen Adapter und Anbieter ausweichen.
Zu Beginn müsst ihr euch auf der Website von Tankerkönig registrieren und einen API-Key beantragen. Dazu einfach die Website öffnen und im Menü am oberen Rand auf API-Key navigieren. Dort einfach eure Mailadresse eingeben und als Verwendungszweck ioBroker. Mit dem Klick auf Senden erhaltet ihr eine Mail mit eurem API-Key und einem Link zum Freischalten. Erst mit dem Bestätigen über den Link ist der API-Key freigeschaltet und brauchbar.
Einrichtung im ioBroker
Im nächsten Schritt müssen wir den Adapter Tankerkönig Spritpreise im ioBroker installieren, um die Benzinpreise zu erhalten. Dazu einfach im Menü auf Adapter navigieren und im Suchfeld nach Tanker filtern. Jetzt sollte nur noch ein Adapter angezeigt werden. Diesen installiert ihr über die drei Punkte im blauen Kreis und anschließend über das Plussymbol. Die Installation ist nach wenigen Sekunden bis Minuten abgeschlossen und ihr werdet automatisch zu den Einstellungen des Adapters geleitet.
Die erste und wichtigste Einstellung des Adapters besteht darin, denn zuvor angeforderte API-Schlüssel in das angezeigte Feld zu kopieren. Insofern der Schlüssel nicht funktionieren sollte, überprüft zuerst, ob ihr nicht ein Zeichen vergessen habt, da der Key aus 36 Ziffern bestehen muss. Im Anschluss wechseln wir im Adaptermenü auf den Reiter Intervall. Dort bestimmt ihr, in welchem zeitlichen Abstand die Benzinpreise vom ioBroker abgefragt werden. Wie der Hinweistext bereits aussagt, beträgt der geringste Intervall fünf Minuten. An dieser Stelle müsst ihr entscheiden, ob euch die Abfrage auch alle x Minuten ausreicht.
Die letzten Einstellungen folgen unter Einstellungen im Adaptermenü. Dort könnt ihr festlegen, ob die Benzinpreise vor jeder Aktualisierung zuerst gelöscht und anschließend neu geschrieben werden. Hier die klare Empfehlung dies zu aktivieren, da es ansonsten vorkommen kann, dass noch alte Werte vorhanden sind. Wie ihr sicherlich bemerkt habt, habe ich den Reiter Tankstellen bewusst ausgelassen, da wir darauf im folgenden Abschnitt näher eingehen.
Tankstelle finden
Insgesamt könnt ihr unter dem Menüpunkt Tankstellen im Adapter bis zu 10 Tankstellen abfragen. Dabei besitzt jede Tankstelle ihre eigene Stations-ID, welche ihr auf der Webseite von Tankerkönig abfragen müsst. Dazu am besten auf den Link klicken. Daraufhin erscheint eine Kartenansicht, auf der ihr entweder über die Freigabe eurer Geoposition euren Standort bestimmen könnt oder händisch durch einen doppelklickt auf die Karten. Sobald ihr euren Standort markiert habt, erscheinen auch schon die Tankstellen im Umkreis.
Mit einem einfachen Klick auf den Namen der Tankstelle, wählt ihr diese aus und seht die ausgewählten Tankstellen im rechten Kasten unter ausgewählt. Nachdem ihr alle wichtigen Tankstellen ausgewählt habt, müsst ihr auf Tankstellen übernehmen klicken und IDs erscheinen. Wichtig an dieser Stelle, wenn ihr eine Tankstelle wählen möchtet, die sich nicht in direkter Nähe zu eurem ausgewählten Ort befindet, einfach eine neue Position auf der Karte wählen.
Die Stations-IDs könnt ihr euch jetzt einfach aus der Seite kopieren und in den ioBroker einfügen. Zur einfachen Zuordnung könnt ihr jeder Tankstelle einen eigenen Namen geben, jedoch ist das Namensfeld auf 36 Zeichen begrenzt. Mit dem Klick auf den Button „Speichern“ ist die Konfiguration des Adapters abgeschlossen und die Benzinpreise können unter den Objekten im ioBroker eingesehen werden.
Skripte
Kommen wir zum spannenden Teil, die weitere Verarbeitung der Benzinpreise im ioBroker. Wie am Anfang bereits angekündigt, möchte ich neben den aktuellen Werten auch die Werte im Tagesverlauf festhalten. Speziell den höchsten und niedrigsten Preis pro Liter Treibstoff. Obendrein möchten ich nicht dauerhaft auf das Dashboard schauen, sondern beim Erreichen meines Wunschpreises benachrichtig werden. Dazu benötigen wir einigen Datenpunkte, sowie ein Blockly Skript.
Datenpunkte
Die Datenpunkte legen wir direkt im Blockly Skript an. Dazu einfach im Menü auf Skripte und ein neues Blockly Skript erstellen. Danach können wir bereits mit der Erstellung beginnen. Dadurch, dass ich im vorherigen Beitrag ausführlich auf die Erstellung von Datenpunkten über das Blockly eingegangen bin, gehe ich jetzt nur rudimentär darauf ein.
Mithilfe des Blocks Datenpunkt erzeugen, welcher sich unter System befindet, erstelle ich Datenpunkte direkt im Skript, womit der Export und Import in ein anderes System deutlich einfacher ist. Alle benötigten Datenpunkte sind vom Typ number und haben als Unit das Eurozeichen mitgegeben. Der initialwert ist abhängig vom Datenpunkt mit 0 oder 10 zu versehen.
Insgesamt werden pro Tankstelle sechs Datenpunkte benötigt, jeweils drei für das mitschrieben des höchsten oder niedrigsten Preises pro Liter. Ich habe meine Datenpunkte nach einem festen Schema benannt. Zuerst habe ich die Stations-ID aus dem Tankerkönig Adapter vorangestellt, danach die Treibstoffsorte und abschließend, ob es sich um einen Höchst- oder Tiefpreis handelt. Beispielsweise wie folgt: 9_E10_h. Natürlich könnt ihr hier auch losgelöst von meiner Namensgebung arbeiten. Insgesamt müsst ihr jetzt sechs Datenpunkte erzeugen:
- Name: 0_E10_h / Typ: number / Init-Wert: 0
- Name: 0_Diesel_h / Typ: number / Init-Wert: 0
- Name: 0_Super_h / Typ: number / Init-Wert: 0
- Name: 0_E10_t / Typ: number / Init-Wert: 10
- Name: 0_Diesel_t / Typ: number / Init-Wert: 10
- Name: 0_Super_t / Typ: number / Init-Wert: 10
Auf die unterschiedlichen Init-Werte komme ich später zu sprechen. Neben den Datenpunkte für die Tankstelle benötigen wir noch drei weitere Datenpunkte zum Setzen des Wunschpreises. Alle drei Datenpunkte sind vom Typ number und erhalten den Init-Wert 0. Bei der Namensgebung seid ihr komplett frei, ich habe die Datenpunkte wie folgt benannt:
- Name: Wunschpreis_E10 / Typ: number / Init-Wert: 0
- Name: Wunschpreis_Diesel / Typ: number / Init-Wert: 0
- Name: Wunschpreis_Super / Typ: number / Init-Wert: 0
Damit wir problemlos weiterarbeiten können müssen wir das Skript nun starten, dadurch werden alle Datenpunkte erzeugt.
Höchst- & Tiefpreise
Trigger
Nachdem alle Datenpunkte erstellt sind, können wir mit der Logik beginnen. Als Trigger nutze ich eine einfache Zeitsteuerung, welche alle fünf Minuten, identisch zum Abfragen der Preise an den Tankstellen ausgeführt wird. Erweiternd dazu habe ich festgestellt, dass die von mir ausgewählten Tankstellen spätestens um 23 Uhr geschlossen sind und erst ab 5 Uhr wieder öffnen. Aus diesem Grund arbeite ich mit einem Intervall zwischen. Dazu einfach im Skript auf Trigger und den Zeitplan Block ins Blockly ziehen und entsprechend einstellen. Natürlich kann es sein, dass eure Tankstellen länger als die bei mir in der Umgebung geöffnet haben, wodurch ihr entweder nur mit einem Intervall arbeiten könnt oder die Zeiträume anders definieren müsstet.
Prüfen der Preise
Im nächsten Schritt benötigen wir einen einfachen, „falls“ Block, welcher sich unter Logik befindet. Zuerst möchte ich den Höchstpreis in den Datenpunkt füllen. Entsprechend setzt sich die erste Bedingung des „falls“ Blocks wie folgt zusammen: Wenn Datenpunkt Diesel_h kleiner als der aktuelle Diesel Preis vom Tankerkönig ist, soll eine Aktualisierung durchgeführt werden. Hierfür nutze ich die Short anzeige im Tankerkönig, da ich keine drei Stellen hinter dem Komma verwenden möchte. Leider handelt es sich bei dem Short Datenpunkt um einen String-Wert, aus diesem Grund muss dieser für unseren Datenpunkte vom Typ number in eine Zahl konvertiert werden.
Anschließend muss der „falls“ Block über das blaue Zahnradsymbol angepasst werden, da wir noch ein sonst falls benötigen. Die Bedingung für den „sonst falls“ Abschnitt fängt die Veränderung der Tiefpreise ab. Entsprechend wird geprüft, ob der Datenpunkt Diesel_t größer als der aktuelle Diese Preis ist. Abschließen muss der gerade erstelle Block noch zweimal kopiert werden, damit die Werte für E10 und Super identisch geprüft und ggf. der Datenpunkt aktualisiert wird. Entsprechend solltet ihr nun drei identische Blöcke wie auf dem Bild im Skript haben.
Nur prüfen, wenn
Kommen wir zur umschließenden Falls Bedingung. Diese Prüft im ersten Schritt, ob die Tankstelle überhaupt geöffnet hat, denn bei einem geschlossenen Zustand brauch ich keine Preisprüfung. Entsprechend lautet die erste Abfrage, wenn der Wert des Tankstellen Status gleich open ist, sollen die zuvor erstellen Blöcke ausgeführt werden. Identisch wie zuvor brauchen wir hier ebenfalls eine Veränderung in ein „sonst falls“, da ich im geschlossenen Zustand alle Datenpunkte zurücksetze. Der Hintergrund liegt darin begründet, dass ich immer die Tagesveränderungen haben möchte und Benzinpreise von vor ein paar Tagen nicht mehr relevant sind.
Jetzt folgt auch die Auflösung der Init-Werte. Die Höchstpreise setze ich auf eins, da es äußerst unwahrscheinlich ist, dass wir jemals erleben, dass ein Liter Diesel, E10 oder Super unter einen Euro fällt. Entsprechend wird direkt nach der Öffnung der Tankstelle der erste Preis als Höchstwert in die Datenpunkte geschrieben. Bei den Tiefpreisen ist es ähnlich, jedoch setze ich hier den Wert auf 10 Euro, da die Preise glücklicherweise nicht in dieser Region sind.
Dementsprechend wird bei der nächsten Aktualisierung der Tiefpreis gesetzt, insofern die Preise nicht gestiegen sind. An dieser Stelle hat das Skript einen kleinen Logikfehler, jedoch ist mir nicht bekannt, dass sich die Benzinpreise nach Öffnung der Tankstelle innerhalb von fünf Minuten ändern. Damit im geschlossenen Zustand nicht alle fünf Minuten der Datenpunkt überschrieben wird, lautet die Bedingung, wenn der Diesel_h Wert größer 1 ist. Entsprechend wird nur einmal am Tag ein Resett der in den ioBroker Datenpunkten geschriebenen Benzinpreise durchgeführt. Nun sollte euer Skript wie folgt aussehen:
Abhängig von der Anzahl der von euch abgefragten Tankstellen, muss der gesamte Block mehrfach kopiert werden.
Wunschpreis
Variable
Für den Wunschpreis brauchen wir neben den zu Beginn angelegten Datenpunkte zusätzliche Variablen, welche wir direkt im Blockly erstellen. Dazu im Menü auf Variablen und „Variable erstellen“ klicken. Die Variable heißt in meinem Fall Wunschpreis_Super und dient der Überprüfung, ob ein Wunschpreis eingetragen ist. Standardmäßig wird die Variable beim Starten des Skripts immer auf „falsch“ gesetzt. Diese wird nur verändert, wenn ein Wunschpreis gesetzt wird, der größer als 0 ist. Aus diesem Grund wird über ein falls Baustein geprüft, der den Datenpunkt Wunschpreis_Super prüft, ob dieser geändert wurde. Sobald dies Eintritt, muss der Wert in einem, „falls“ Block größer 0 sein, damit die Variable auf „wahr“ gesetzt wird. Das Ganze wird dafür benötigt, da bei einem nicht gesetzten Wunschpreis bei jeder Änderung der Benzinpreise im ioBroker immer die Nachricht sendet, dass der Wunschpreis erreicht ist.
Logik & Nachricht
Glücklicherweise bietet der Tankerkönig Adapter einen Datenpunkt mit dem günstigsten Preis je Treibstoff an. Diesen nutzen wir direkt in einem „falls“ Objekt unter Trigger und prüfen, ob der geändert wurde. Direkt danach brauchen wir eine Pause, denn in der Konfiguration des Adapters haben wir ja angegeben immer die alten Werte zu löschen. Dementsprechend erhalten wir immer die falschen Werte, wodurch eine Pause von 1 Sekunde nötig ist.
Nach der Pause folgt ein „falls“ Block, der auf zwei mit und verknüpfte Bedingungen hört. Zuerst wird geprüft, ob die Variabel Wunschpreis_Super wahr und anschließend, ob der aktuelle Wert für Super kleiner gleich dem von uns definierten Wunschpreis ist. Insofern beides zutrifft, wird der Code unter mache ausgeführt.
Im Abschnitt mache, folgt jetzt die Benachrichtigung. Ich habe mich an dieser Stelle dazu entschieden, dass mir eine Nachricht im Telegram Bot ausreicht. Dementsprechend müsst ihr zuvor den Telegram Adapter installiert und konfiguriert haben, ansonsten könnt ihr den Telegram Block im Menü unter Sendto nicht finden. Für alle die noch nie einen Telegram Bot eingerichtet haben, habe ich vor geraumer Zeit, dass ganze einmal ausführlich erklärt, siehe Link. Die Nachricht müsst ihr euch ähnlich wie auf dem Bild zu erkennen aus Textbausteinen in Kombination mit den Werten zusammenbauen. In meinem Fall lautet die Nachricht beispielsweise:
SUPER HAT DEN WUNSCHPREIS ERREICHT!
Der Wunschpreis von 1.95 € wurde an der Tankstelle Jet Mainz Barcelona Allee erreicht.
Am Ende setzen wir mithilfe eines aktualisiere Blocks den Wunschpreis wieder auf 0 zurück. Ebenso setzen wir die Variable Wunschpreis wieder auf „falsch“. Hierbei muss die Reihenfolge, wie auf dem Bild gut zu erkennen, strikt eingehalten werden, da ansonsten die Variable immer wieder auf „wahr“ gesetzt wird.
Optional Alexa Benachrichtigung
Zusätzlich besteht die Möglichkeit sich auch eine Benachrichtigung der ioBroker Benzinpreise auf eurem Amazon Alexa Geräten ausgeben zu lassen. Dazu benötigt ihr den Adapter alexa2, sowie die Verifizierung des Adapters mit eurem Amazon Konto. Insofern dies vorhanden ist, könnt ihr Problemlos über einen steure Block auf eine Sprachausgabe beim Erreichen des Wunschpreises durchführen. Die Konfiguration könnt ihr auf dem folgenden Bild entnehmen. Wichtig, der Block muss direkt unter dem Telegram Block eingefügt werden.
Visualisierung
Der einfachheitshalber findet ihr die Visualisierung der ioBroker Benzinpreise auf meinem Youtube-Kanal. Dort zeige ich euch Schritt für Schritt die Umsetzung und ihr müsst keinen Roman lesen 🙂
Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen
Hallo,
ich habe ein Problem bei mir seht in allen Datenpunkten 0 bzw. 10 tankerkoenig ist auf 5 min gestellt trotzdem bekomme ich keine Wert???
Hallo Ronny,
initial sollte in den Datenpunkte 0 und 10 drin stehen das ist soweit richtig. Der Tankerkönig Adapter aktualisiert alle fünf Minuten, sind in den Datenpunkten der Stationen den die Werte der Benzinpreise angezeigt? Wenn nicht stimmen entweder die StationIDs nicht oder dein API-Key ist nicht freigeschaltet.
Ansonsten werden immer zur vollen Minute, also 5,10,15 etc. die Werte in die Datenpunkte übertragen.
Hallo Patrick,
habe heute mal nach deiner Anleitung soweit alles umgesetzt. Herzlichen Dank für die super Umsetzung und Beschreibung.
Nachdem ich alles soweit fertig hatte, habe ich natürlich die Benachrichtigung getestet und mich gewundert, warum ich, egal welchen Wunschpreis ich eingegeben habe, ich immer eine Meldung bekomme.
Beim näheren Hinsehen, ist mir aufgefallen, dass der Datenpunkt beim tankerkoenig.X.cheapest.XXX.short ein String ist (zumindest bei mir, habe den Adapter aber schon länger im Einsatz). Da nun ein „String“ mit einem „Number“ Datenpunkt verglichen wird, klappt das natürlich nicht.
Habe dann mit der Konvertierung in eine Zahl für den Datenpunkt gearbeitet und nun funktioniert es wie es soll.
Grüße
Heiko
Hi Heiko,
danke für dein Lob. Bei mir ist der Datenpunkt auch ein String und diesen musst du definitiv in eine Zahl konvertieren. Ich hatte auf meiner Prod den Feed Datenpunkt verwendet, da dieser eine Zahl ist war es mir nicht aufgefallen.
Hallo Heiko,
ich habe das gleiche Problem! Könntest du vielleicht genauer beschreiben, wie du das Script angepasst hast?
Gruß Rainer
Update!
Ich habe wie Patrick geschrieben, den Feed Datenpunkt genommen.
Hallo Heiko,
ich habe unten zwar geschrieben, dass ich es nach Patric’s Vorschlag lösen konnte, das ist aber nicht der Fall. Könntest Du genauer beschreiben, was Du gemacht hast? Wäre sehr hilfreich, da ich nach 2 Tagen nicht weiter komme.
Gruß Rainer
Hi,
erstmal ein großes Kompliment für deine Anleitungen und Videos. Ich bin gerade mit IO Broker gestartet und versuche nun die Benzinpreise mit Tankerkönig, wie du beschreibst, umzusetzen. Grundsätzlich habe ich verstanden was du schreibst bzw. zeigst. Aktuell bin ich bei Minute 17.30 und freue mich auch das alles so klappt wie es soll. Was ich aber noch nicht gemacht habe sind die Höchst- und Tiefstpreise auf alle 10 Tankstellen umzusetzen. Ich habe den Eindruck das ist schlimmer als damals 10x die Schulordnung abzuschreiben. Das Editieren in Blockly hat bei mir schon eine Sehnenscheidenentzündung hervorgerufen. Gibt es da einen Trick? Ich finde es schon störend das das Blockly Fenster nicht ausreichend skalierbar ist. Wenn man die Ansicht verkleinert sind die Felder nur noch sehr schlecht zu lesen. Davon ab ist das teilweise nicht zu erkennen welche Variablen schon geändert sind und welche nicht z.B. bei dem Feld „short“ weil keine Tankstellen ID mit angezeigt wird. Gibt es einen Trick?
HI Konstantin,
Du könntest das ganze für eine Tankstelle umsetzen und anschließend in die Skriptansicht wechseln. Dort hast du dann den reinen Text, welcher etwas übersichtlicher ist und einfach per Copy&Paste zusammengesetzt bzw. editiert wird.
Hi Patrick,
habe noch eine Frage zu deinem Skript für die Tankpreise.
Dort prüfst du ja, ob eine Tankstelle geöffnet ist und wenn nicht, dann setze die Tagespreise zurück.
Aber was ist, wenn das eine Tankstelle ist , welche 24/7 offen hat? Dann wird die zweite Bedingung ja niemals ausgeführt. Hast du da ne schlaue Idee zu ?
Viele Dank
Heiko
HI Heiko,
ich würde hier einen einfachen zeitlichen Trigger verwenden, welcher beispielsweise um 0:01 alle Preise zurücksetzt. Natürlich vorher die Logik mit der Überprüfung entfernen.