Zum Inhalt springen
Alles Automatisch

Automation

Tankerkönig in Home Assistant: Spritpreise als Sensor

Für alle ab
Für Mitglieder freigeschaltet

Früher Zugang für Kanalmitglieder

Das Video läuft schon, nur noch nicht für alle.

Kanalmitglieder sehen es jetzt. Für alle erscheint es am Sonntag, 11. Oktober, um 9 Uhr. Die komplette Anleitung kannst du heute schon lesen, sie steht direkt darunter.

Mitglieder seit 23. Sep.Für alle am So., 11. Okt.
noch 15 Tage

Die E10-Preise der Tankstellen um die Ecke direkt in Home Assistant, sortiert nach Preis, mit einem Verlauf der letzten sieben Tage und einer Meldung aufs Handy, sobald es günstig wird. Das klingt nach einem Scraping-Projekt, ist es aber nicht. Die Tankerkönig-Integration steckt schon in Home Assistant drin, braucht keinen HACS-Umweg und liefert die Preise aus der amtlichen Quelle der Markttransparenzstelle für Kraftstoffe. Ich erkläre hier Schritt für Schritt, wie ich das bei mir eingerichtet habe, vom API-Key bis zum fertigen Dashboard.

Alle Beispiele nutzen E10. Wer Diesel oder E5 tankt, tauscht nur die Endung der Entity-IDs aus, alles andere bleibt gleich.

Warum der alte Scrape-Sensor schweigt

Wenn eine Entität meldet „Diese Entität wird nicht mehr von der scrape-Integration bereitgestellt", ist das kein Fehler der Tankstelle. Home Assistant zeigt diese Meldung immer dann, wenn eine Entität noch im Register steht, die zugehörige Integration sie beim Start aber nicht mehr anlegt.

Bei scrape gibt es dafür zwei Ursachen. Erstens: Seit Home Assistant 2026.6 legt sensor: mit - platform: scrape keine Entitäten mehr an. Unterstützt ist nur noch die Form mit scrape: als eigenem Schlüssel oder die Einrichtung über die Oberfläche. Zweitens: Ein CSS-Selektor, der nichts mehr findet, liefert keinen Wert, und Tankstellenseiten werden regelmäßig umgebaut.

Genau das ist das grundsätzliche Problem mit Scraping für Preise: Es funktioniert, bis jemand anderes sein HTML anfasst. Tankerkönig liefert dieselben Daten aus der amtlichen Quelle, an die über 14.000 Tankstellen melden müssen. Das ist deutlich stabiler.

Schritt 1: API-Key beantragen

Der Key ist kostenlos, kommt aber nicht sofort. Ich würde diesen Schritt deshalb als erstes angehen.

  1. onboarding.tankerkoenig.de öffnen
  2. Vorname, Nachname und Mailadresse eintragen, echte Namen, keine Abkürzungen
  3. Unter Kategorie das passende System auswählen
  4. Beide Häkchen setzen und abschicken

Der Key wird von Hand geprüft. Bei mir hat das ungefähr 10 bis 12 Stunden gedauert, bis er im Postfach war. Plan das also ein paar Tage vor dem Rest ein.

Behandle den Key wie ein Passwort. Tankerkönig schreibt ausdrücklich, dass API-Keys nicht in Foren, auf GitHub oder anderswo veröffentlicht werden dürfen. Wer seine Konfiguration teilt oder einen Screenshot postet, schwärzt ihn vorher.

Schritt 2: Integration einrichten

Einstellungen › Geräte & Dienste › Integration hinzufügen, nach Tankerkoenig suchen. Sie steckt bereits in Home Assistant drin, HACS wird nicht gebraucht. Der Dialog hat zwei Seiten.

Die erste Seite fragt vier Dinge:

FeldWas hineingehört
Name der RegionEin kurzer Name, etwa der Ort oder Arbeit
API-SchlüsselDer Schlüssel aus der Mail
StandortDer Punkt, um den gesucht wird, voreingestellt ist dein Zuhause
SuchradiusKilometer um den Standort, voreingestellt 2

Der Radius darf höchstens 25 km betragen, das ist eine Grenze der freien API. Weniger ist praktisch meist besser, der Grund steht im nächsten Schritt.

Schritt 3: Tankstellen auswählen

Die zweite Seite heißt „Wähle Tankstellen zum Hinzufügen aus" und nennt oben, wie viele Tankstellen im Umkreis gefunden wurden. Setz die Haken nur bei denen, an denen du wirklich tankst.

Nimm höchstens zehn. Ab der elften schreibt Home Assistant eine Warnung ins Log, weil die freie API je Preisabfrage nur zehn Stationen beantwortet und Tankerkönig einen Key sperren kann, der dauerhaft zu viel fragt. Die Integration schneidet die Abfrage zwar in Zehnerblöcke, macht daraus aber auch entsprechend viele Anfragen.

Findet der Dialog nichts, steht unter dem Radius „Keine Tankstelle im Umkreis gefunden." Dann ist der Radius schlicht zu klein.

Schritt 4: Welche Sensoren dabei entstehen

Pro Tankstelle legt die Integration ein Gerät an, benannt nach Marke, Straße und Hausnummer, zum Beispiel ARAL Detmolder Str. 12. Daran hängen bis zu vier Entitäten:

EntitätBedeutung
DieselPreis in Euro
SuperPreis für E5, im UI ohne die 5
Super E10Preis für E10
StatusBinärsensor, offen oder geschlossen

Ein paar Dinge, die regelmäßig für Verwirrung sorgen:

  • Super ist E5. Wer nach super_e5 sucht, findet nichts.
  • Fehlt ein Preissensor, führt die Station den Kraftstoff nicht. Die Integration legt einen Sensor nur an, wenn die Tankstelle diesen Kraftstoff meldet.
  • Mehr als diese drei gibt es nicht. Super Plus, V-Power, LPG oder HVO100 meldet die Markttransparenzstelle nicht, also kann auch Home Assistant sie nicht zeigen.
  • Eine geschlossene Tankstelle hat keinen Preis. Der Preissensor verliert dann seinen Wert, der letzte Preis bleibt nicht stehen. Ob sie offen hat, sagt der Status.

Die Preise werden alle 30 Minuten geholt. Die Entity-IDs entstehen aus dem Gerätenamen und sehen etwa so aus:

yaml
sensor.aral_detmolder_str_12_super_e10
sensor.aral_detmolder_str_12_super
sensor.aral_detmolder_str_12_diesel
binary_sensor.aral_detmolder_str_12_status

Deine eigenen IDs stehen unter Einstellungen › Werkzeuge › Zustände, Suchbegriff super_e10. Wer Diesel tankt, sucht nach _diesel und ersetzt in allen folgenden Beispielen _super_e10 durch _diesel.

Jeder Preissensor trägt die Adresse als Attribute: brand, station_name, street, house_number, postcode, city und fuel_type, dazu latitude und longitude. Die Adressdaten kommen so, wie die Tankstelle sie meldet, mal in Großbuchstaben, mal mit einem Leerzeichen am Ende der Straße. Die Templates unten glätten das mit | trim | title.

Schritt 5: Schlichte Preisliste aufs Dashboard

Für den Anfang reicht die Entitäten-Karte:

yaml
1type: entities
2title: E10 in der Nähe
3entities:
4  - entity: sensor.aral_detmolder_str_12_super_e10
5    name: ARAL Detmolder Straße
6  - entity: sensor.shell_mindener_str_84_super_e10
7    name: Shell Mindener Straße
8  - entity: sensor.jet_bahnhofstr_3_super_e10
9    name: JET Bahnhofstraße

Das fertige Dashboard mit Rangliste, Verlauf und Karte kommt in Schritt 10. Die Bausteine dafür entstehen in den Schritten 6 bis 9.

Schritt 6: Nach Preis sortieren

Interessant ist nicht die Liste, sondern wer gerade am günstigsten ist. Das geht mit der eingebauten Markdown-Karte, ohne zusätzliche Karte aus HACS:

yaml
1type: markdown
2content: |-
3  {% set sensors = [
4    'sensor.aral_detmolder_str_12_super_e10',
5    'sensor.shell_mindener_str_84_super_e10',
6    'sensor.jet_bahnhofstr_3_super_e10'
7  ] %}
8  {%- set valid = sensors | select('has_value') | list %}
9  {%- set ranked = zip(valid | map('states') | map('float') | list, valid) | list | sort %}
10  {% for price, s in ranked %}
11  {%- set brand = state_attr(s, 'brand') %}
12  {%- set street = state_attr(s, 'street') | trim | title %}
13  {{ loop.index }}. **{{ '%.3f' | format(price) | replace('.', ',') }} €** {{ brand }}, {{ street }}
14  {% endfor %}

Die Karte sortiert bei jedem Neuzeichnen und zeigt den günstigsten Preis oben. select('has_value') hält geschlossene Stationen draußen, die gerade keinen Preis haben, sonst bricht float die Sortierung ab. zip ist in Home Assistant eine Funktion, kein Filter, deshalb steht es vorn und nicht hinter einem Strich. replace('.', ',') macht aus 2.239 ein deutsches 2,239. Und der Inhalt steht hinter |-, nicht hinter >-: >- faltet die Zeilen zu einer zusammen, dann steht die ganze Rangliste in einer einzigen Zeile.

Den günstigsten Preis als eigenen Sensor. Für die Meldung in Schritt 8 brauche ich den günstigsten Preis als eigene Entität. Einstellungen › Geräte & Dienste › Helfer › Helfer erstellen › Template › Sensor:

FeldWert
NameE10 günstigster Preis, daraus wird sensor.e10_gunstigster_preis
Zustanddas Template unten
Maßeinheit€
Geräteklasseleer lassen
ZustandsklasseMesswert
jinja
1{%- set sensors = [
2  'sensor.aral_detmolder_str_12_super_e10',
3  'sensor.shell_mindener_str_84_super_e10',
4  'sensor.jet_bahnhofstr_3_super_e10'
5] %}
6{%- set prices = sensors | select('has_value') | map('states')
7   | select('is_number') | map('float') | list %}
8{{ prices | min if prices else none }}

Geschlossene Stationen fallen dabei heraus. Haben alle zu, steht der Sensor auf unbekannt statt auf einer erfundenen Zahl.

Die Geräteklasse bleibt leer, obwohl Geldsaldo naheliegt: Home Assistant erlaubt Geldsaldo nur mit der Zustandsklasse Gesamt, und ein Preis ist kein Kontostand, der sich aufsummiert. Messwert ist richtig, damit führt Home Assistant Langzeitstatistiken für den Sensor.

Tipp für viele Stationen: Statt die Entity-IDs aufzuzählen, gib allen E10-Sensoren unter Einstellungen › Geräte & Dienste › Entitäten das Label E10. Dann ersetzt {%- set sensors = label_entities('E10') | select('match', 'sensor\.') | list %} die Liste, und eine neue Tankstelle braucht nur noch das Label.

Mit HACS geht es auch fertig: Die Tankerkoenig Card von Tim Maurice sortiert nach Preis (sort_by), zeigt nur die günstigsten (show_only_cheapest), blendet geschlossene Stationen aus (hide_unavailable_stations) und öffnet die Adresse in Google Maps, Apple Maps oder Waze (clickable_addresses, map_provider). Sie steht im HACS-Standardverzeichnis. Wer ohne HACS bleiben will, fährt mit der Markdown-Karte oben genauso gut.

Schritt 7: Meldung bei günstigem Preis

Zuerst die Schwelle als Helfer anlegen, damit sie sich ohne Eingriff in die Automation ändern lässt: Einstellungen › Geräte & Dienste › Helfer › Helfer erstellen › Zahlenwert-Eingabe.

FeldWert
NameE10 Preisschwelle
Minimalwert1
Maximalwert3
AnzeigemodusEingabefeld
Schrittweite0.01
Maßeinheit€

Danach den Wert auf deine Schmerzgrenze stellen, etwa 2.20. Die Automation:

yaml
1alias: E10 ist günstig
2triggers:
3  - trigger: numeric_state
4    entity_id:
5      - sensor.aral_detmolder_str_12_super_e10
6      - sensor.shell_mindener_str_84_super_e10
7      - sensor.jet_bahnhofstr_3_super_e10
8    below: input_number.e10_preisschwelle
9conditions:
10  - condition: time
11    after: "06:00:00"
12    before: "22:00:00"
13actions:
14  - action: notify.mobile_app_dein_handy
15    data:
16      title: E10 ist günstig
17      message: >-
18        {{ state_attr(trigger.entity_id, 'brand') }} in der
19        {{ state_attr(trigger.entity_id, 'street') | trim | title }} kostet jetzt
20        {{ '%.3f' | format(states(trigger.entity_id) | float) | replace('.', ',') }} Euro.
21      data:
22        tag: spritpreis
23        url: /dashboard-tanken/e10
24        actions:
25          - action: URI
26            title: Navigation
27            uri: >-
28              https://maps.apple.com/?daddr={{ ((state_attr(trigger.entity_id, 'street') | trim)
29              ~ ' ' ~ state_attr(trigger.entity_id, 'house_number')
30              ~ ', ' ~ state_attr(trigger.entity_id, 'postcode')
31              ~ ' ' ~ (state_attr(trigger.entity_id, 'city') | title)) | urlencode }}
32mode: single
33max_exceeded: silent

notify.mobile_app_dein_handy heißt bei dir nach deinem Handy. Den richtigen Namen findest du unter Einstellungen › Werkzeuge › Aktionen, Suchbegriff mobile_app.

Was die einzelnen Teile tun:

Der numeric_state-Trigger feuert nur beim Übertreten der Schwelle, nicht bei jedem Messwert darunter. Solange der Preis unten bleibt, ist Ruhe. Die Zeitbedingung verhindert Meldungen um drei Uhr nachts. mode: single mit max_exceeded: silent hält das Log sauber, wenn zwei Stationen gleichzeitig fallen. tag sorgt dafür, dass eine neue Meldung die alte ersetzt, statt sich darunter zu stapeln. url öffnet beim Antippen der Meldung das Dashboard aus Schritt 10. Und der Knopf Navigation startet Apple Maps mit der Adresse der Tankstelle. Auf Android nimmst du https://www.google.com/maps/dir/?api=1&destination= statt https://maps.apple.com/?daddr=.

Wer statt aufs Handy an eine andere Benachrichtigungs-Entität schicken will, nimmt notify.send_message mit target: entity_id:. Die kennt allerdings nur Titel und Text, tag, url und der Knopf fallen dann weg.

Schritt 8: Das 7-Tage-Tief als Vergleich

Eine feste Zahl altert. 2,20 € ist in der einen Woche ein Schnäppchen und zwei Monate später teuer. Die bessere Frage lautet: Liegt der Preis gerade nahe am günstigsten Preis der letzten sieben Tage? Das kann Home Assistant selbst beantworten, weil der Recorder jeden Preis ohnehin mitschreibt.

Den Statistik-Helfer anlegen. Einstellungen › Geräte & Dienste › Helfer › Helfer erstellen › Statistik. Der Dialog hat drei Seiten:

FeldWert
NameE10 7-Tage-Tief
Entitätsensor.e10_gunstigster_preis aus Schritt 6
StatistikmerkmalMinimalwert
Stichprobengrößeleer lassen
Maximalalter168 Stunden, das Feld kennt keine Tage
Letzten Messwert behaltenan
Genauigkeit3

Zwei Felder sind Fallen: Die Genauigkeit steht voreingestellt auf 2. Dann wird aus 2,239 € ein 2,24 €, und der Vergleich liegt um bis zu einen halben Cent daneben. Spritpreise haben drei Nachkommastellen, also unbedingt 3 eintragen. Und Maximalalter kennt keine Tage, sieben Tage sind 168:00:00.

Letzten Messwert behalten ist eine Versicherung: Bleibt der günstigste Preis länger als sieben Tage exakt gleich, wäre der Helfer sonst leer. Nach einem Neustart liest er die letzten sieben Tage aus dem Recorder nach, fängt also nicht bei null an. Das setzt voraus, dass der Recorder mindestens sieben Tage behält, voreingestellt sind zehn.

Direkt nach dem Anlegen steht der Helfer auf nicht verfügbar. Das ist normal. Er wartet auf den nächsten Messwert, der kommt spätestens mit der nächsten Abfrage nach 30 Minuten.

Bleibt er dauerhaft nicht verfügbar, schreibt der Recorder nicht mit. Wer in der configuration.yaml unter recorder: einen include:-Filter pflegt, zeichnet nur auf, was dort steht, und dann fehlen die neuen Sensoren. So sieht die Ergänzung aus:

yaml
1recorder:
2  include:
3    entity_globs:
4      - sensor.*_super_e10
5    entities:
6      - sensor.e10_gunstigster_preis
7      - sensor.e10_7_tage_tief

Danach Home Assistant neu starten, der Recorder liest seine Filter nur beim Start. Ohne eigenen recorder:-Block zeichnet Home Assistant ohnehin alles auf, dann ist nichts zu tun.

Die erste Woche ist Anlauf. Bis sieben Tage Daten da sind, ist das „Tief" nur das Tief seit dem Einrichten, und die Automation meldet sich entsprechend oft.

Den Abstand als Helfer. Noch eine Zahlenwert-Eingabe: Name E10 Abstand zum Tief, Minimalwert 0, Maximalwert 0.1, Schrittweite 0.005, Anzeigemodus Eingabefeld, Maßeinheit €, danach auf 0.02 stellen. Zwei Cent über dem Wochentief gilt dann als günstig.

yaml
1alias: E10 nahe am 7-Tage-Tief
2triggers:
3  - trigger: template
4    value_template: |-
5      {%- set current = states('sensor.e10_gunstigster_preis') %}
6      {%- set low = states('sensor.e10_7_tage_tief') %}
7      {{ is_number(current) and is_number(low)
8         and current | float <= (low | float
9           + states('input_number.e10_abstand_zum_tief') | float(0.02)) | round(3) }}
10conditions:
11  - condition: time
12    after: "06:00:00"
13    before: "22:00:00"
14actions:
15  - variables:
16      cheapest: |-
17        {%- set sensors = [
18          'sensor.aral_detmolder_str_12_super_e10',
19          'sensor.shell_mindener_str_84_super_e10',
20          'sensor.jet_bahnhofstr_3_super_e10'
21        ] %}
22        {%- set ns = namespace(entity=none, price=99) %}
23        {%- for s in sensors if is_number(states(s)) and states(s) | float < ns.price %}
24        {%- set ns.entity = s %}{%- set ns.price = states(s) | float %}
25        {%- endfor %}
26        {{ ns.entity }}
27  - action: notify.mobile_app_dein_handy
28    data:
29      title: E10 nahe am Wochentief
30      message: >-
31        {{ state_attr(cheapest, 'brand') }} in der
32        {{ state_attr(cheapest, 'street') | trim | title }} kostet jetzt
33        {{ '%.3f' | format(states(cheapest) | float) | replace('.', ',') }} Euro.
34        Das Tief der letzten sieben Tage lag bei
35        {{ '%.3f' | format(states('sensor.e10_7_tage_tief') | float) | replace('.', ',') }} Euro.
36      data:
37        tag: spritpreis
38        url: /dashboard-tanken/e10
39        actions:
40          - action: URI
41            title: Navigation
42            uri: >-
43              https://maps.apple.com/?daddr={{ ((state_attr(cheapest, 'street') | trim)
44              ~ ' ' ~ state_attr(cheapest, 'house_number')
45              ~ ', ' ~ state_attr(cheapest, 'postcode')
46              ~ ' ' ~ (state_attr(cheapest, 'city') | title)) | urlencode }}
47mode: single
48max_exceeded: silent

Der Template-Trigger feuert, wenn die Bedingung von falsch auf wahr springt, genau wie numeric_state in Schritt 7. Solange der Preis nahe am Tief bleibt, ist Ruhe. Deshalb kommt direkt nach dem Einrichten auch keine Meldung, wenn der Preis in dem Moment schon am Tief liegt: Die erste gibt es, nachdem er einmal gestiegen und wieder gefallen ist.

Die Variable cheapest sucht die Station, die den günstigsten Preis gerade liefert, damit die Meldung einen Ort nennt. Kosten mehrere Stationen gleich viel, gewinnt die, die in der Liste weiter oben steht. Setz deine Lieblingstankstelle also an den Anfang.

Fällt der Preis nachts, holt die Automation die Meldung morgens nicht nach. Wer das will, ergänzt einen Zeit-Trigger um 6 Uhr und dieselbe Prüfung als Template-Bedingung.

Wer zusätzlich wissen will, ob der Preis über dem Wochenschnitt liegt, legt einen zweiten Statistik-Helfer mit dem Merkmal Durchschnitt (Arithmetisch) an, sonst gleiche Werte.

Schritt 9: Das Dashboard „Tanken"

Alles aus den Schritten 6 bis 8 auf einer Seite: oben die Antwort auf „jetzt tanken?", darunter die Rangliste und die Einstellungen, daneben der Wochenverlauf und die Karte.

  1. Einstellungen › Dashboards › Dashboard hinzufügen › Neues Dashboard von Grund auf
  2. Titel Tanken, Seitenleistensymbol mdi:gas-station, Erstellen
  3. Das neue Dashboard in der Seitenleiste öffnen, oben rechts auf den Stift
  4. Dashboard-Menü öffnen (die drei Punkte) › Raw-Konfigurationseditor
  5. Alles ersetzen durch den Block unten, Speichern, Fertig

Home Assistant vergibt als Adresse /dashboard-tanken. Die Ansicht heißt e10, deshalb zeigen url in den Automationen auf /dashboard-tanken/e10.

yaml
1title: Tanken
2views:
3  - title: E10
4    path: e10
5    icon: mdi:gas-station
6    type: sections
7    max_columns: 2
8    sections:
9      - type: grid
10        cards:
11          - type: heading
12            heading: Jetzt tanken?
13            heading_style: title
14            icon: mdi:gas-station
15          - type: markdown
16            grid_options:
17              columns: full
18            content: |-
19              {%- set current = states('sensor.e10_gunstigster_preis') %}
20              {%- set low = states('sensor.e10_7_tage_tief') %}
21              {%- if is_number(current) and is_number(low) %}
22              {%- set gap = (current | float - low | float) * 100 %}
23              ## {{ '%.3f' | format(current | float) | replace('.', ',') }} €
24              {% if gap < 0.05 %}Das ist das 7-Tage-Tief.{% else %}{{ '%.1f' | format(gap) | replace('.', ',') }} ct über dem 7-Tage-Tief von {{ '%.3f' | format(low | float) | replace('.', ',') }} €{% endif %}
25              {%- else %}Noch keine Preise{% endif %}
26          - type: heading
27            heading: E10 heute
28            heading_style: subtitle
29          - type: markdown
30            grid_options:
31              columns: full
32            content: |-
33              {% set sensors = [
34                'sensor.aral_detmolder_str_12_super_e10',
35                'sensor.shell_mindener_str_84_super_e10',
36                'sensor.jet_bahnhofstr_3_super_e10'
37              ] %}
38              {%- set valid = sensors | select('has_value') | list %}
39              {%- set ranked = zip(valid | map('states') | map('float') | list, valid) | list | sort %}
40              {% for price, s in ranked %}
41              {%- set brand = state_attr(s, 'brand') %}
42              {%- set street = state_attr(s, 'street') | trim | title %}
43              {{ loop.index }}. **{{ '%.3f' | format(price) | replace('.', ',') }} €** {{ brand }}, {{ street }}
44              {% endfor %}
45          - type: heading
46            heading: Einstellungen
47            heading_style: subtitle
48          - type: entities
49            grid_options:
50              columns: full
51            entities:
52              - entity: input_number.e10_preisschwelle
53                name: Feste Schwelle
54              - entity: input_number.e10_abstand_zum_tief
55                name: Abstand zum Tief
56              - entity: automation.e10_ist_gunstig
57                name: Meldung unter Schwelle
58              - entity: automation.e10_nahe_am_7_tage_tief
59                name: Meldung nahe am Tief
60      - type: grid
61        cards:
62          - type: heading
63            heading: Die letzten sieben Tage
64            heading_style: title
65            icon: mdi:chart-line
66          - type: history-graph
67            hours_to_show: 168
68            grid_options:
69              columns: full
70            entities:
71              - entity: sensor.e10_gunstigster_preis
72                name: Günstigster Preis
73              - entity: sensor.e10_7_tage_tief
74                name: 7-Tage-Tief
75          - type: heading
76            heading: Wo
77            heading_style: subtitle
78          - type: map
79            cluster: false
80            default_zoom: 14
81            grid_options:
82              columns: full
83              rows: 8
84            entities:
85              - entity: sensor.aral_detmolder_str_12_super_e10
86                label_mode: attribute
87                attribute: brand
88              - entity: sensor.shell_mindener_str_84_super_e10
89                label_mode: attribute
90                attribute: brand
91              - entity: sensor.jet_bahnhofstr_3_super_e10
92                label_mode: attribute
93                attribute: brand

Drei Stellen, an denen man leicht hängen bleibt:

Die Karte zeigt die Marke, nicht den Preis. label_mode steht bei jeder Entität einzeln, nicht an der Karte. label_mode: state ginge auch, aber „2,239 €" passt nicht in den runden Marker und bricht um. Die Preise stehen ohnehin in der Rangliste daneben. cluster: false verhindert, dass nah beieinander liegende Tankstellen zu einem Kreis mit einer Zahl verschmelzen. Und die Größe steuert rows, nicht aspect_ratio: In einer Sections-Ansicht legt das Raster die Höhe fest. Acht Reihen machen die Karte etwa so hoch wie die linke Spalte.

Die Verlaufskurve ist am ersten Tag nur ein Strich am rechten Rand, sie füllt sich mit jeder Abfrage.

Schritt 10: Den alten Scrape-Sensor aufräumen

Der verwaiste Scrape-Sensor verschwindet nicht von selbst.

  1. Die alte Konfiguration aus der configuration.yaml entfernen, also den Block mit platform: scrape oder den ganzen scrape:-Abschnitt
  2. Einstellungen › Werkzeuge › YAML › YAML-Konfiguration neu laden, oder Home Assistant neu starten
  3. Einstellungen › Geräte & Dienste › Entitäten, nach dem alten Sensor suchen und ihn löschen
  4. Unter Einstellungen die Reparaturmeldung abhaken, falls sie noch steht

Danach prüfen, ob irgendeine Automation oder Karte noch auf die alte Entity-ID zeigt. Einstellungen › Werkzeuge › Template eignet sich gut zum Gegenprüfen.

Tipps und häufige Probleme

„Ungültige Authentifizierung" tritt beim Einrichten auf, wenn beim Kopieren des Keys aus der Mail ein Leerzeichen am Anfang oder Ende mitgekommen ist. Ist der Key tatsächlich gesperrt, bietet Home Assistant eine erneute Authentifizierung an.

„Authentifizierung abgelaufen", obwohl nichts geändert wurde. Nicht sofort einen neuen Key beantragen. Anfang 2026 ist genau diese Meldung bei vielen aufgetaucht, obwohl der Key gültig war: Tankerkönig hatte einen Ausfall, und Home Assistant hat die Fehlermeldung des Servers als Key-Problem gelesen. Tankerkönig hat das im März auf seiner Projektseite behoben. Erst abwarten, dann dort nach einer Störung schauen. Tankerkönig bittet ausdrücklich darum, nie einen weiteren Key zu beantragen, ohne vorher Kontakt aufzunehmen.

„Rate limit erreicht" kommt, wenn mehrere Regionen mit je zehn Stationen angelegt sind. Weniger Stationen oder weniger Regionen lösen es. Das Abfrageintervall der Integration liegt fest bei 30 Minuten.

Preise stehen still. 30 Minuten sind der Normalfall, das ist kein Fehler. Die Preise an der Zapfsäule wechseln mehrmals täglich, aber selten im Minutentakt.

Keine Tankstelle gefunden. Radius erhöhen, höchstens auf 25. Wer auf dem Land wohnt, fängt besser bei 10 an.

Eine zweite Region anlegen geht, indem die Integration einfach ein weiteres Mal hinzugefügt wird, etwa für den Arbeitsweg. Jede Region bekommt einen eigenen Namen und zählt eigene Anfragen, also sparsam bleiben.

Namensnennung: Tankerkönig verlangt für die freie API einen Hinweis auf die Quelle. Die Integration setzt ihn selbst als Attribution an jeden Sensor, da ist nichts weiter zu tun.

Nutzt du Tankerkönig schon in Home Assistant, oder hast du bisher auf Scraping gesetzt? Was für Automationen hast du daraus gebaut?

Diskussion im Forum

Hast du Fragen oder Ideen zu diesem Thema?

Diskutiere im Forum

Video teilen

Community

Unterstütze den Kanal

Hat dir der Beitrag geholfen? Es gibt zwei Wege, etwas zurückzugeben.