Status: In Arbeit · Schwierigkeit: Einsteiger · Werkzeuge: n8n, Open Charge Map API, Telegram Bot API

Die Idee

↑ Zur Kapitelübersicht

Seit ich den Opel Corsa-e fahre, ist eine Frage morgens regelmäßig relevant: Ist die Ladestation in der Nähe frei?

Das manuelle Öffnen einer Lade-App, Warten auf den Ladescreen, Zoomen auf die Karte – das kostet täglich ein paar Minuten und fühlt sich unnötig an. Die Information, die ich brauche, ist einfach: Ist Ladestation X gerade frei, und welchen Ladestrom liefert sie?

Die Idee: Ein n8n-Workflow fragt jeden Morgen automatisch die nächstgelegenen Ladestationen ab und schickt mir eine Telegram-Nachricht mit den relevanten Ergebnissen – bevor ich das Haus verlasse.

Beispiel-Nachricht die ankommt:

Ladestationen Hamburg-Winterhude – 07:30 Uhr

✅ Winterhuder Marktplatz · AC 22 kW · frei
✅ Barmbeker Straße · DC 50 kW · frei
❌ Hofweg · AC 11 kW · belegt

2 von 3 Stationen frei.

Was das Projekt können soll

↑ Zur Kapitelübersicht

Klare Anforderungen vor dem Start – damit der Scope kontrollierbar bleibt.

Muss-Anforderungen

✓ Täglich automatisch zur gewünschten Uhrzeit starten.
✓ Ladestationen im definierten Umkreis abfragen.
✓ Nur freie Stationen melden.
✓ Ladetyp (AC/DC) und Leistung (kW) anzeigen.
✓ Ergebnis per Telegram senden.

Bewusst nicht enthalten

✗ Keine Echtzeit-Überwachung (kein Webhook auf Statusänderungen).
✗ Keine Kartenansicht oder grafische Darstellung.
✗ Keine Routenplanung oder Entfernungsberechnung.
✗ Keine Reservierung von Ladepunkten.

Die Lösung im Überblick

↑ Zur Kapitelübersicht

Fünf Nodes, ein Workflow, eine tägliche Nachricht.

Workflow-Ablauf:

[Schedule Trigger] täglich 07:30
  ↓
[HTTP Request] Open Charge Map API abfragen
  ↓ Liste aller Stationen im Umkreis
[IF Node] Status = Available?
  ↓ true: freie Stationen
[Code Node] Nachricht formatieren
  ↓
[Telegram Node] Nachricht senden

Verwendete Dienste

Open Charge Map API: Kostenlose, öffentliche Datenbank aller registrierten Ladestationen weltweit. Liefert Status, Ladetyp, Leistung und Standort. Kostenloser API-Key nach Registrierung.

Telegram Bot API: Nachrichten an einen persönlichen Telegram-Chat senden. Kostenlos, zuverlässig, kein eigener Server nötig. Bot wird in zwei Minuten über @BotFather eingerichtet.

Voraussetzungen

↑ Zur Kapitelübersicht

Was vor dem ersten Node vorhanden sein muss.

n8n-Instanz

Desktop-App oder Docker – beide funktionieren. Für den automatischen Tagesstart empfiehlt sich Docker, da die Desktop-App nur läuft, wenn der PC eingeschaltet ist.
n8n installieren

Open Charge Map API-Key

Kostenlos nach Registrierung unter
openchargemap.org/site/develop
Nach der Registrierung erscheint der Key im Benutzerprofil unter „API Key".

Telegram Bot Token & Chat-ID

Bot erstellen: In Telegram @BotFather öffnen → /newbot → Namen vergeben → Token notieren (Format: 123456:ABC-DEF...).

Chat-ID ermitteln: Dem eigenen Bot eine Nachricht schicken, dann im Browser:
https://api.telegram.org/botTOKEN/getUpdates
In der JSON-Antwort unter message → chat → id steht die eigene Chat-ID (eine Zahl).

Eigene Koordinaten

Breitengrad und Längengrad des Ausgangspunkts – z.B. der eigene Wohnort oder Stellplatz.
Hamburg-Winterhude als Beispiel: lat=53.5872, lng=10.0082
Google Maps: Rechtsklick auf den Kartenort → die Koordinaten werden direkt angezeigt.

Schritt 1: Trigger – täglich um 7:30 Uhr

↑ Zur Kapitelübersicht

Der Schedule Trigger startet den Workflow jeden Morgen zur gleichen Zeit.

Konfiguration

Node: Schedule Trigger
Name: „Täglich 07:30"

Trigger interval: Days
Hour: 7
Minute: 30

Während der Entwicklung: Den Schedule Trigger durch einen Manual Trigger ersetzen – so kann der Workflow jederzeit per Knopfdruck getestet werden, ohne auf 7:30 Uhr zu warten. Erst wenn alles funktioniert, auf Schedule Trigger umstellen.

Schritt 2: API abfragen – Open Charge Map

↑ Zur Kapitelübersicht

Der HTTP Request Node holt die aktuellen Ladestations-Daten aus der Open Charge Map API.

Node-Konfiguration

Node: HTTP Request
Name: „OCM API abfragen"
Method: GET

URL:
https://api.openchargemap.io/v3/poi/

Query Parameters:
latitude53.5872 (eigene Koordinate eintragen)
longitude10.0082
distance2 (Umkreis in km)
distanceunitKM
maxresults20
compacttrue
verbosefalse
countrycodeDE

Authentication: Header Auth → Credential mit Name X-API-Key und dem Open Charge Map API-Key als Value.

Antwort-Struktur (vereinfacht)

Die API gibt ein Array von Stationen zurück. Jede Station enthält u.a.:

AddressInfo.Title – Name der Station
AddressInfo.Distance – Entfernung in km
StatusType.IsOperational – in Betrieb?
Connections[0].PowerKW – Ladeleistung
Connections[0].CurrentType.Title – AC oder DC

Schritt 3: Filtern – nur freie Stationen

↑ Zur Kapitelübersicht

Der IF Node filtert die Liste auf Stationen, die gerade in Betrieb sind.

Node-Konfiguration

Node: IF
Name: „Nur verfügbare Stationen"

Condition:
Value 1 (Expression): {{ $json.StatusType.IsOperational }}
Operation: Equal
Value 2: true

Hinweis zur OCM-API: Open Charge Map liefert Echtzeit-Status nur für Stationen, die mit einem Live-Status-System verbunden sind. Viele Stationen haben keinen Echtzeit-Status – IsOperational ist dann null oder fehlt ganz. In diesem Fall zeigt der Workflow alle betriebsbereiten Stationen als potenziell frei an. Das ist eine bekannte Einschränkung der kostenlosen API-Stufe.

Schritt 4: Nachricht formatieren

↑ Zur Kapitelübersicht

Ein Code Node baut aus den gefilterten Stationen eine lesbare Telegram-Nachricht zusammen.

Node-Konfiguration

Node: Code
Name: „Nachricht bauen"
Language: JavaScript

Code
const items = $input.all();
const now = new Date().toLocaleTimeString('de-DE',
  { hour: '2-digit', minute: '2-digit', timeZone: 'Europe/Berlin' });

let lines = [`⚡ *Ladestationen Hamburg* – ${now} Uhr\n`];

for (const item of items) {
  const s = item.json;
  const name = s.AddressInfo?.Title ?? 'Unbekannt';
  const dist = s.AddressInfo?.Distance
    ? `${s.AddressInfo.Distance.toFixed(1)} km`
    : '';
  const conn = s.Connections?.[0];
  const kw   = conn?.PowerKW ? `${conn.PowerKW} kW` : '';
  const type = conn?.CurrentType?.Title ?? '';

  lines.push(`✅ ${name} · ${type} ${kw} · ${dist}`);
}

if (items.length === 0) {
  lines.push('ℹ️ Keine verfügbaren Stationen im Umkreis gefunden.');
}

return [{ json: { message: lines.join('\n') } }];

Schritt 5: Telegram-Nachricht senden

↑ Zur Kapitelübersicht

Der Telegram Node sendet die fertige Nachricht direkt in den eigenen Chat.

Node-Konfiguration

Node: Telegram
Name: „Telegram senden"

Credential: Telegram-Bot-Token als n8n-Credential hinterlegen.

Operation: Send Message

Chat ID: Die eigene Chat-ID eintragen (Zahl, z.B. 123456789).

Text (Expression):
{{ $json.message }}

Parse Mode: Markdown (damit der fette Text und Emojis korrekt dargestellt werden).

Workflow exportieren und importieren

↑ Zur Kapitelübersicht

Der vollständige Workflow steht als JSON-Datei zum Download bereit und kann direkt in n8n importiert werden.

Importieren in n8n

1. n8n öffnen → Workflows → oben rechts das Drei-Punkte-Menü → „Import from File".
2. Die heruntergeladene workflow.json auswählen.
3. Der Workflow erscheint sofort auf dem Canvas.
4. Koordinaten in Schritt 2 auf den eigenen Standort anpassen.
5. Credentials für OCM API und Telegram hinterlegen.
6. Chat-ID in Schritt 5 eintragen.
7. Einmal manuell testen, dann auf Schedule Trigger umstellen und aktivieren.

Workflow-JSON

Alternativ zum Download: Inhalt kopieren und in n8n über Workflows → Import from clipboard einfügen.


                    

Sicherheit & Credentials

↑ Zur Kapitelübersicht

Zwei API-Keys im Einsatz – beide sicher als n8n-Credentials gespeichert.

Open Charge Map API-Key

Credential-Typ: Header Auth
Name: X-API-Key
Value: eigener OCM-Key

Berechtigungen: nur Lesezugriff (GET). Kein Schreibzugriff möglich mit diesem Key-Typ. Risiko bei Leak: gering – keine Kosten, nur Datenlesen.

Telegram Bot Token

Credential-Typ: Telegram API (n8n built-in)
Value: Bot-Token aus @BotFather

Der Token erlaubt ausschließlich Aktionen über diesen spezifischen Bot – kein Zugriff auf den eigenen Telegram-Account. Bei Leak: Token in @BotFather mit /revoke sofort sperren, neuen Token generieren.

Was ich gelernt habe

↑ Zur Kapitelübersicht

Ein ehrliches Fazit – was lief, was nicht, was länger gedauert hat als gedacht.

✅ Hat gut funktioniert

Die Open Charge Map API ist gut dokumentiert und antwortet zuverlässig. Der Telegram Node in n8n ist erstaunlich einfach – Bot-Token rein, Chat-ID rein, fertig. Der Code Node zum Formatieren der Nachricht war die beste Entscheidung: Mehr Kontrolle über das Ausgabeformat als mit einem Set-Node.

⚠️ Hat länger gedauert als gedacht

Die Datenstruktur der OCM-API ist verschachtelt – Connections[0].PowerKW statt einem einfachen power-Feld. Das Verständnis der Expressions in n8n ($json, $input.all(), Unterschied zwischen Item und Array) hat etwas Einarbeitung gebraucht.

❌ Sackgasse

Echtzeit-Verfügbarkeit ist mit der kostenlosen OCM-API nicht zuverlässig. Viele Stationen haben keinen Live-Status. Eine Alternative wäre die Ladesäulenkarte der Bundesnetzagentur oder der ChargePrice API – für eine spätere Version des Projekts.

Troubleshooting

↑ Zur Kapitelübersicht

Die häufigsten Probleme und ihre Lösung.

Problem: API antwortet mit 401 Unauthorized

Ursache: Der API-Key fehlt oder ist falsch gesetzt.
Lösung: Im HTTP Request Node prüfen ob das Credential ausgewählt ist. Header-Name muss exakt X-API-Key heißen (Groß-/Kleinschreibung!).

Problem: Leere Ergebnisliste trotz vorhandener Stationen

Ursache: Koordinaten falsch eingetragen, oder Radius zu klein gewählt.
Lösung: Koordinaten mit Google Maps prüfen. Radius testweise auf 5 erhöhen.

Problem: Telegram-Nachricht kommt nicht an

Ursache A: Dem Bot wurde noch keine Nachricht geschickt – Telegram erlaubt keine Erstinitiierung durch den Bot.
Lösung: Im Telegram-App dem eigenen Bot eine beliebige Nachricht schicken, dann nochmals testen.

Ursache B: Chat-ID falsch.
Lösung: getUpdates-URL im Browser aufrufen und Chat-ID ablesen (siehe Voraussetzungen).

Problem: Expression-Fehler im Code Node

Ursache: $input.all() gibt leeres Array zurück, weil der IF Node alle Items herausgefiltert hat.
Lösung: Den IF Node vorübergehend deaktivieren und direkt mit allen Stationen testen. So ist sichtbar, ob die API-Antwort die erwartete Struktur hat.

Ideen für Weiterentwicklung

↑ Zur Kapitelübersicht

Was das Projekt in einer späteren Version können könnte.

Mehrere Standorte

Nicht nur den Heimatstandort, sondern auch häufig besuchte Orte (Arbeit, Einkauf) abfragen – als separater Workflow-Zweig oder über eine Konfigurationsliste.

Nur senden wenn nötig

Nachricht nur dann senden, wenn weniger als eine bestimmte Anzahl Stationen frei ist – statt täglich eine Meldung auch wenn ohnehin alles frei ist.

Echtzeit-Verfügbarkeit

Integration einer API mit echtem Live-Status – z.B. über OCPI-fähige Netzbetreiber oder den Bundesnetzagentur-Datensatz.

Abfrage auf Anfrage

Zusätzlich zum Tagesplan: Workflow auch per Telegram-Nachricht abrufbar machen – „/laden" → sofortige Statusabfrage. Das erfordert einen Webhook-Trigger statt eines Schedule Triggers.