Files
smartphone-n8n-tracking/README.md
Joachim Hummel 1e229582d4 Update README.md to reflect current feature set
- Document all three workflows (tracker.json, tracker-db.json, tracker-mqtt.json)
- Add detailed descriptions of both web interfaces (index.html, index_owntrack.html)
- Include comprehensive installation guide with all credential types
- Add complete data schema documentation (Telegram vs MQTT differentiation)
- Expand workflow architecture diagrams for all three variants
- Add 7 customization options with code examples
- Include security warnings (GDPR, CORS, API authentication)
- Add extensive troubleshooting section (6 common issues)
- Document MQTT/OwnTracks integration details
- Add repository contents table and roadmap

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 17:23:27 +00:00

807 lines
24 KiB
Markdown

# Location Tracker für n8n
Ein umfassendes n8n-Workflow-System zur Standort-Verfolgung mit mehreren Datenquellen und erweiterten Visualisierungsmöglichkeiten.
## Überblick
Dieses Repository enthält **drei n8n-Workflows** für Location Tracking mit verschiedenen Speicher- und Datenquellen-Optionen:
1. **tracker.json** - Telegram-basiert mit Datei-Speicherung (einfach, keine Datenbank)
2. **tracker-db.json** - Telegram-basiert mit NocoDB-Speicherung (produktionsreif, persistent)
3. **tracker-mqtt.json** - MQTT-basiert mit NocoDB-Speicherung (für OwnTracks/IoT-Geräte)
Zusätzlich bietet das Repository **zwei Web-Oberflächen** zur Visualisierung:
- **index.html** - Erweiterte Oberfläche mit Filterung, mehreren Kartenebenen und Multi-Source-Support
- **index_owntrack.html** - Vereinfachte Oberfläche mit MQTT-spezifischen Features (Batterie, Geschwindigkeit)
## Funktionen
### Workflow-Features
- **Multi-Source-Erfassung**: Standorte über Telegram-Bot oder MQTT/OwnTracks
- **Flexible Speicherung**: Wahl zwischen Datei-basiert (einfach) oder NocoDB (persistent, skalierbar)
- **Historien-Verwaltung**:
- tracker.json: Letzte 100 Standorte (konfigurierbar)
- tracker-db.json / tracker-mqtt.json: Unbegrenzt (Datenbank-basiert)
- **REST-API**: Einheitlicher `/location` Endpunkt für alle Workflows
- **Telegram-Benachrichtigungen**: Automatische Bestätigung mit Koordinaten und Kartenlink
- **Echtzeit-Updates**: 5-Sekunden Auto-Refresh für Live-Tracking
### Web-Oberflächen-Features
- **📍 Interaktive Karten** mit Leaflet.js
- **🗺️ Mehrere Kartenebenen**: Standard, Satellit, Gelände, Dunkel-Modus
- **📡 Datenquellen-Filter**: Telegram, MQTT oder kombiniert
- **👤 Benutzer/Geräte-Filter**: Separate Ansicht pro Person/Gerät
- **⏱️ Zeitfilter**: 1h, 6h, 24h, 7 Tage, 30 Tage
- **🔄 Toggle Auto-Refresh**: An/Aus-Schaltung für Live-Updates
- **📊 Standort-Historie**: Polyline-Darstellung des Bewegungspfads
- **🔋 MQTT-Telemetrie**: Batterie, Geschwindigkeit, Genauigkeit (index_owntrack.html)
## Voraussetzungen
### Basis-Anforderungen (alle Workflows)
- Eine laufende n8n-Instanz (Version 1.0+)
- Zugriff auf n8n-Credentials-Management
### Workflow-spezifische Anforderungen
**tracker.json (Datei-basiert)**:
- Schreibrechte für `/tmp/n8n-locations.json` auf dem n8n-Server
- Telegram-Bot mit gültigem API-Token
**tracker-db.json (NocoDB)**:
- NocoDB-Instanz mit API-Zugriff
- NocoDB-Token mit Schreibrechten
- Telegram-Bot mit gültigem API-Token
**tracker-mqtt.json (MQTT)**:
- MQTT-Broker (z.B. Mosquitto)
- MQTT-Credentials mit Subscribe-Rechten auf `owntracks/#`
- NocoDB-Instanz (siehe tracker-db.json)
- OwnTracks-App oder kompatibles MQTT-Gerät
## Installation
### Schritt 1: Workflow wählen und importieren
Wähle den passenden Workflow für deinen Anwendungsfall:
| Workflow | Empfohlen für | Vorteile | Nachteile |
|----------|---------------|----------|-----------|
| **tracker.json** | Testen, Prototyping | Einfach, keine DB nötig | Begrenzte Historie, /tmp-Speicher |
| **tracker-db.json** | Produktion (Telegram) | Persistent, unbegrenzt | NocoDB erforderlich |
| **tracker-mqtt.json** | IoT-Geräte, OwnTracks | Multi-Gerät-Support | MQTT-Broker + NocoDB |
**Import-Schritte**:
1. Öffne deine n8n-Instanz
2. Navigiere zu "Workflows" → "Import from File"
3. Wähle die gewünschte `.json` Datei aus
### Schritt 2: Credentials konfigurieren
#### Telegram-Bot (tracker.json & tracker-db.json)
1. Erstelle einen Bot über [@BotFather](https://t.me/botfather):
```
/newbot
Wähle Name: "My Location Tracker"
Wähle Username: "my_location_tracker_bot"
```
2. Kopiere das API-Token (Format: `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`)
3. In n8n:
- Gehe zu "Credentials" → "Create New"
- Wähle "Telegram API"
- Gib das Access Token ein
- Speichere als "Telegram account n8n-munich-bot" (oder passe Workflow-Nodes an)
#### NocoDB (tracker-db.json & tracker-mqtt.json)
1. Erstelle in NocoDB:
- Ein neues Project
- Eine Tabelle mit dem Schema (siehe unten)
2. Generiere einen API-Token:
- NocoDB: Account Settings → Tokens → Create Token
3. In n8n:
- Gehe zu "Credentials" → "Create New"
- Wähle "NocoDB API Token"
- Gib Token und Base-URL ein
- Notiere die Credential-ID für den Workflow
**NocoDB Tabellen-Schema**:
```
Tabelle: Locations
- latitude (Decimal)
- longitude (Decimal)
- timestamp (DateTime)
- user_id (Number)
- first_name (Text)
- last_name (Text)
- username (Text)
- marker_label (Text)
- display_time (Text)
- chat_id (Number)
```
#### MQTT-Broker (tracker-mqtt.json)
1. Installiere einen MQTT-Broker (z.B. Mosquitto):
```bash
# Ubuntu/Debian
sudo apt install mosquitto mosquitto-clients
```
2. In n8n:
- Gehe zu "Credentials" → "Create New"
- Wähle "MQTT"
- Gib Broker-URL, Port, Username, Passwort ein
3. Passe im Workflow die Credential-ID an (aktuell Platzhalter: `MQTT_CREDENTIAL_ID`)
### Schritt 3: Workflow-IDs anpassen (nur bei NocoDB)
Öffne den importierten Workflow und passe an:
- **Project ID**: Deine NocoDB-Projekt-ID
- **Table ID**: Deine NocoDB-Tabellen-ID
Diese findest du in der NocoDB-URL:
```
https://nocodb.example.com/nc/PROJECT_ID/TABLE_ID
```
### Schritt 4: Workflow aktivieren
1. Öffne den importierten Workflow
2. Prüfe alle Credentials (rote Nodes = fehlende/falsche Credentials)
3. Klicke auf "Active" um den Workflow zu aktivieren
### Schritt 5: Testen
**Telegram-Workflows**:
1. Öffne deinen Telegram-Bot
2. Sende einen Standort (📎 → Standort)
3. Du solltest eine Bestätigungsnachricht erhalten
**MQTT-Workflow**:
1. Konfiguriere OwnTracks-App mit deinem MQTT-Broker
2. Sende einen Location-Update
3. Prüfe in n8n die Workflow-Execution-Historie
## Verwendung
### Standort senden (Telegram)
1. Öffne den Chat mit deinem Telegram-Bot
2. Klicke auf das Büroklammer-Symbol (📎)
3. Wähle "Standort"
4. Sende deinen aktuellen Standort oder wähle einen auf der Karte
5. Der Bot bestätigt mit Details und einem Link zur Web-Ansicht
### Standort senden (MQTT/OwnTracks)
1. **OwnTracks-App konfigurieren**:
- Mode: MQTT
- Host: Dein MQTT-Broker
- Port: 1883 (oder dein Port)
- Username/Password: Deine MQTT-Credentials
- Device ID: z.B. "le" (wird als Marker-Label verwendet)
2. **Tracking starten**:
- OwnTracks sendet automatisch Location-Updates
- Konfiguriere Intervall und Genauigkeit in der App
### REST-API abrufen
Alle Workflows stellen den gleichen API-Endpunkt zur Verfügung:
```bash
GET https://deine-n8n-instanz.de/webhook/location
```
**Beispiel-Antwort**:
```json
{
"success": true,
"current": {
"latitude": 48.1351,
"longitude": 11.5820,
"timestamp": "2025-11-14T10:30:00.000Z",
"user_id": 123456789,
"first_name": "Max",
"last_name": "Mustermann",
"username": "maxmuster",
"marker_label": "Max Mustermann",
"display_time": "14.11.2025, 11:30:00",
"chat_id": 123456789
},
"history": [...],
"total_points": 42,
"last_updated": "2025-11-14T10:30:00.000Z"
}
```
**MQTT-spezifische Felder** (nur in index_owntrack.html angezeigt):
```json
{
"battery": 85,
"speed": 5.2,
"accuracy": 10,
"altitude": 520
}
```
### Web-Oberflächen
Das Repository enthält zwei Web-Interfaces mit unterschiedlichen Features:
#### index.html - Erweiterte Multi-Source-Oberfläche
**Empfohlen für**: Produktionsumgebungen mit mehreren Datenquellen
**Features**:
- 🗺️ **4 Kartenebenen**: Standard (OSM), Satellit (Esri), Gelände (OpenTopoMap), Dunkel (CartoDB)
- 📡 **Datenquellen-Filter**: Telegram, MQTT oder alle
- 👤 **Benutzer/Gerät-Filter**: Dynamische Liste aller aktiven Quellen
- ⏱️ **Zeitfilter**: 1h, 6h, 24h, 7d, 30d oder alle
- 📊 **Erweiterte Visualisierung**: Farbcodierte Marker (rot=neuester, blau=Historie)
- 🔄 **Auto-Refresh**: Toggle-fähig, 5-Sekunden-Intervall
**Verwendung**:
1. Öffne `index.html` im Browser
2. Nutze die Filter-Dropdowns zur Datenauswahl:
- **Kartenebene**: Wähle zwischen Standard, Satellit, Gelände, Dunkel
- **Datenquelle**: Telegram, MQTT oder beide
- **Benutzer/Gerät**: Filter nach spezifischem User/Device
- **Zeitraum**: Begrenze Historie auf gewünschten Zeitraum
3. Klicke Marker für Details
4. Toggle Auto-Refresh nach Bedarf
#### index_owntrack.html - MQTT/OwnTracks-fokussierte Oberfläche
**Empfohlen für**: OwnTracks-Nutzer, die Telemetrie-Daten benötigen
**Features**:
- 🔋 **Batteriestatus**: Anzeige des Gerätebatteriestands
- 🚗 **Geschwindigkeitsanzeige**: km/h-Anzeige aus MQTT-Daten
- 📍 **Vereinfachte Ansicht**: Fokus auf aktuellen Standort
- 🔄 **Auto-Refresh**: Gleicher Toggle wie index.html
**Verwendung**:
1. Öffne `index_owntrack.html` im Browser
2. Die Karte zeigt automatisch den neuesten OwnTracks-Standort
3. Popups enthalten MQTT-spezifische Daten (Batterie, Speed)
### Konfiguration der Web-Oberflächen
**API-Endpunkt anpassen**:
In beiden HTML-Dateien die API-URL ändern:
```javascript
// Für index.html (Zeile 175)
// Für index_owntrack.html (Zeile 85)
const API_URL = 'https://deine-n8n-instanz.de/webhook/location';
```
**Deployment-Optionen**:
1. **Webserver-Hosting** (empfohlen für Produktion):
```bash
# Apache
cp index.html /var/www/html/tracker/
# nginx
cp index.html /usr/share/nginx/html/tracker/
```
2. **Lokaler Test**:
- Öffne die `.html` Datei direkt im Browser
- Funktioniert nur, wenn CORS korrekt konfiguriert ist
3. **GitHub Pages / Static Hosting**:
- Pushe die HTML-Dateien zu GitHub
- Aktiviere GitHub Pages
- Oder nutze Netlify, Vercel, etc.
**CORS-Konfiguration**:
Die n8n-Workflows haben CORS bereits aktiviert (`Access-Control-Allow-Origin: *`). Für Produktion sollte dies eingeschränkt werden (siehe Sicherheitshinweise)
## Workflow-Architektur
### tracker.json (Datei-basiert)
**Standort-Erfassung**:
```
Telegram Trigger
Hat Location? (Filter)
Location verarbeiten (JS: Daten extrahieren & formatieren)
Lade existierende Daten (Shell: cat /tmp/n8n-locations.json)
Merge mit History (JS: Array merge + 100-Entry-Limit)
Speichere in File (Shell: echo > /tmp/n8n-locations.json)
Telegram Bestätigung (Nachricht mit Koordinaten & Kartenlink)
```
**API-Endpunkt**:
```
Webhook - Location API (GET /webhook/location)
Lade Daten für API (Shell: cat /tmp/n8n-locations.json)
Format API Response (JS: JSON strukturieren)
JSON Response (CORS + JSON zurückgeben)
```
### tracker-db.json (NocoDB)
**Standort-Erfassung**:
```
Telegram Trigger
Hat Location? (Filter)
Location verarbeiten (JS: Daten extrahieren & formatieren)
Speichere in NocoDB (NocoDB: Create Record)
[Parallel]
Hole letzten Eintrag (NocoDB: List Records, Limit 1, Sort desc)
Zähle Einträge (NocoDB: Count)
Merge (JS: Combine Results)
Bereite Bestätigung vor (JS: Format Message)
Telegram Bestätigung (Nachricht mit Stats & Link)
```
**API-Endpunkt**:
```
Webhook - Location API (GET /webhook/location)
Lade Daten aus NocoDB (NocoDB: List Records, Sort by timestamp desc)
Format API Response (JS: JSON strukturieren)
JSON Response (CORS + JSON zurückgeben)
```
### tracker-mqtt.json (MQTT/OwnTracks)
**Standort-Erfassung** (vereinfachter Single-Path):
```
MQTT Trigger (Topic: owntracks/#)
Ist Location? (Filter: _type === "location")
MQTT Location verarbeiten (JS: OwnTracks → NocoDB Schema Mapping)
Speichere in NocoDB (NocoDB: Create Record)
```
**Keine separate Bestätigung** (MQTT ist unidirektional)
**API-Endpunkt**: Shared mit tracker-db.json (gleiche NocoDB-Tabelle)
## Datenspeicherung & Schema
### tracker.json (Datei-basiert)
**Speicherung**:
- **Speicherort**: `/tmp/n8n-locations.json`
- **Format**: JSON-Array mit Location-Objekten
- **Maximale Einträge**: 100 (älteste werden automatisch entfernt)
- **Persistenz**: Überlebt n8n-Neustarts, aber nicht System-Neustarts (da `/tmp`)
**Empfehlung für Produktion**:
Ändere den Speicherort zu einem persistenten Pfad:
In den Nodes **"Lade existierende Daten"** und **"Lade Daten für API"**:
```bash
cat /var/lib/n8n/locations.json 2>/dev/null || echo '[]'
```
In Node **"Speichere in File"**:
```bash
echo '...' > /var/lib/n8n/locations.json
```
### tracker-db.json & tracker-mqtt.json (NocoDB)
**Speicherung**:
- **Backend**: NocoDB Datenbank
- **Project ID**: `pdxl4cx4dbu9nxi` (Beispiel - muss angepasst werden)
- **Table ID**: `m8pqj5ixgnnrzkg` (Beispiel - muss angepasst werden)
- **Maximale Einträge**: Unbegrenzt (Datenbank-basiert)
- **Persistenz**: Vollständig persistent
- **Shared Database**: Beide Workflows nutzen die gleiche Tabelle
### Location-Objekt Schema
**Alle Workflows** nutzen das gleiche Schema für Konsistenz:
```json
{
"latitude": 48.1351, // Decimal (Breitengrad)
"longitude": 11.5820, // Decimal (Längengrad)
"timestamp": "2025-11-14T10:30:00.000Z", // ISO 8601 DateTime
"user_id": 123456789, // Number (Telegram ID oder 0 für MQTT)
"first_name": "Max", // Text (Telegram: Vorname, MQTT: tracker ID)
"last_name": "Mustermann", // Text (Telegram: Nachname, MQTT: source)
"username": "maxmuster", // Text (Telegram: @username, MQTT: tracker ID)
"marker_label": "Max Mustermann", // Text (Anzeigename für Karte)
"display_time": "14.11.2025, 11:30:00", // Text (de-DE formatiert)
"chat_id": 123456789 // Number (Telegram Chat ID oder 0 für MQTT)
}
```
### Unterscheidung Telegram vs. MQTT
In der Datenbank/API können Einträge anhand folgender Felder unterschieden werden:
| Feld | Telegram | MQTT/OwnTracks |
|------|----------|----------------|
| `user_id` | Echte Telegram-User-ID (z.B. 123456789) | `0` |
| `chat_id` | Echte Telegram-Chat-ID (z.B. 123456789) | `0` |
| `first_name` | Telegram-Vorname (z.B. "Max") | Tracker-ID (z.B. "le") |
| `last_name` | Telegram-Nachname (z.B. "Mustermann") | Source (z.B. "fused") |
| `marker_label` | "Vorname Nachname" | "TID @ SSID" (z.B. "le @ HomeWifi") |
### MQTT-spezifische Daten
OwnTracks sendet zusätzliche Telemetrie-Daten, die **nicht** in der Datenbank gespeichert werden, aber im Node "MQTT Location verarbeiten" verfügbar sind:
```json
{
"acc": 10, // Genauigkeit in Metern
"alt": 520, // Höhe über Meeresspiegel
"batt": 85, // Batteriestatus (0-100%)
"vel": 5, // Geschwindigkeit (m/s)
"conn": "w", // Verbindungstyp (w=WiFi, m=Mobile)
"t": "u" // Trigger (u=User, t=Timer, etc.)
}
```
Diese Daten können bei Bedarf zum Schema hinzugefügt werden (erfordert Anpassung der NocoDB-Tabelle und Workflows)
## Anpassungen & Customization
### Anzahl gespeicherter Standorte ändern (nur tracker.json)
Im Node **"Merge mit History"** die Limit-Logik anpassen:
```javascript
// Aktuell: 100 Einträge
if (locations.length > 100) {
locations = locations.slice(0, 100);
}
// Ändern zu z.B. 500 Einträge:
if (locations.length > 500) {
locations = locations.slice(0, 500);
}
```
**Hinweis**: NocoDB-Workflows haben kein Client-Side-Limit.
### Datumsformat ändern
Im Node **"Location verarbeiten"** (Telegram) oder **"MQTT Location verarbeiten"** (MQTT) das Locale anpassen:
```javascript
// Aktuell: Deutsch (de-DE)
const displayTime = new Date(messageDate * 1000).toLocaleString('de-DE');
// Ändern zu z.B. Englisch (en-US):
const displayTime = new Date(messageDate * 1000).toLocaleString('en-US');
// Oder eigenes Format:
const displayTime = new Date(messageDate * 1000).toLocaleString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
```
### CORS-Beschränkung (Sicherheit)
Im Node **"Webhook - Location API"** unter **Options → Response Headers**:
```javascript
// Aktuell (unsicher für Produktion): Alle Origins erlaubt
"Access-Control-Allow-Origin": "*"
// Besser für Produktion: Spezifische Domain
"Access-Control-Allow-Origin": "https://deine-domain.de"
// Oder mehrere Domains (erfordert Logik im Node):
// const allowedOrigins = ['https://domain1.de', 'https://domain2.de'];
// const origin = request.headers.origin;
// return allowedOrigins.includes(origin) ? origin : allowedOrigins[0];
```
### Auto-Refresh Intervall anpassen
In **index.html** oder **index_owntrack.html**:
```javascript
// Aktuell: 5 Sekunden (5000ms)
refreshInterval = setInterval(loadLocations, 5000);
// Ändern zu z.B. 10 Sekunden:
refreshInterval = setInterval(loadLocations, 10000);
// Oder 30 Sekunden:
refreshInterval = setInterval(loadLocations, 30000);
```
### MQTT Topic ändern
Im Node **"MQTT Trigger"** (tracker-mqtt.json):
```javascript
// Aktuell: Alle OwnTracks-Topics
Topic: owntracks/#
// Ändern zu spezifischem User/Device:
Topic: owntracks/joachim/phone
// Oder eigene Topic-Struktur:
Topic: location/+/+ // location/user/device
```
Passe auch den Filter-Node **"Ist Location?"** entsprechend an.
### NocoDB Tabellen-Felder erweitern
Um MQTT-Telemetrie-Daten zu speichern:
1. **In NocoDB**: Füge neue Spalten hinzu:
- `battery` (Number)
- `speed` (Decimal)
- `accuracy` (Number)
- `altitude` (Number)
2. **Im Workflow** (Node "MQTT Location verarbeiten"):
```javascript
// Füge zu locationData hinzu:
battery: json.batt || null,
speed: json.vel || null,
accuracy: json.acc || null,
altitude: json.alt || null
```
3. **In index_owntrack.html**: Daten sind bereits ausgelesen (Zeilen 137-145)
### Kartenebene Standardauswahl ändern
In **index.html**:
```javascript
// Aktuell: Standard (OSM)
let currentLayer = mapLayers.standard;
// Ändern zu z.B. Satellit:
let currentLayer = mapLayers.satellite;
// Und Dropdown synchronisieren:
document.getElementById('mapLayerSelect').value = 'satellite';
```
## Sicherheitshinweise
### Kritisch (vor Produktionseinsatz beheben!)
1. **API-Authentifizierung fehlt**:
- Der `/location` Endpunkt ist **öffentlich ohne Authentifizierung** zugänglich
- Jeder kann Standortdaten abrufen, wenn er die URL kennt
- **Empfehlung**: Implementiere API-Key-Authentifizierung in n8n oder nutze einen Reverse-Proxy mit Auth
2. **CORS für alle Origins offen**:
- `Access-Control-Allow-Origin: *` erlaubt Zugriff von jeder Domain
- **Risiko**: Cross-Site-Scripting (XSS), Datenabfluss
- **Empfehlung**: Beschränke auf deine spezifische Domain (siehe Anpassungen)
3. **Standortdaten sind hochsensibel (DSGVO)**:
- Personenbezogene Daten (Name, User-ID, exakte Koordinaten)
- **Pflichten**: Informationspflicht, Einwilligung, Löschkonzept
- **Empfehlung**:
- Hole explizite Einwilligung von Nutzern ein
- Implementiere automatische Löschung alter Daten (z.B. >30 Tage)
- Dokumentiere Datenschutzmaßnahmen
### Wichtig (empfohlene Sicherheitsmaßnahmen)
4. **Credentials-Sicherheit**:
- **Telegram-Bot-Token**: Niemals in Code oder Logs speichern
- **NocoDB-Token**: Nutze Read-Only-Token für API-Endpunkt (wenn möglich)
- **MQTT-Credentials**: Nutze TLS-Verschlüsselung (Port 8883)
5. **File-basierte Speicherung** (tracker.json):
- `/tmp` Verzeichnis ist evtl. für andere Benutzer lesbar
- **Empfehlung**: Setze Dateiberechtigungen (`chmod 600`)
- Besser: Nutze NocoDB-Variante für Produktion
6. **Rate Limiting fehlt**:
- API kann beliebig oft abgerufen werden
- **Risiko**: DoS-Angriff, Server-Überlastung
- **Empfehlung**: Implementiere Rate Limiting (z.B. via nginx)
### Best Practices
- **HTTPS erzwingen**: Stelle sicher, dass n8n-Webhooks nur über HTTPS erreichbar sind
- **Monitoring**: Überwache ungewöhnliche API-Zugriffe
- **Backup**: Sichere NocoDB-Datenbank regelmäßig
- **Updates**: Halte n8n, NocoDB und alle Dependencies aktuell
## Fehlerbehebung
### Telegram-Bot antwortet nicht
**Symptome**: Standort wird gesendet, aber keine Bestätigung
**Lösungen**:
1. Prüfe, ob Workflow aktiv ist (grüner "Active"-Toggle in n8n)
2. Prüfe Telegram-Credentials:
```bash
# In n8n: Credentials → Telegram → Test Connection
```
3. Prüfe Workflow-Execution-Historie:
- n8n → Workflows → tracker → Executions
- Suche nach Fehlermeldungen (rot markiert)
4. Prüfe Telegram-Bot-Webhook:
```bash
curl https://api.telegram.org/bot<TOKEN>/getWebhookInfo
```
### API gibt leere/fehlerhafte Daten zurück
**Symptome**: API antwortet mit `[]`, `null` oder HTTP 500
**Lösungen**:
**Für tracker.json (Datei-basiert)**:
1. Prüfe, ob Datei existiert:
```bash
ls -la /tmp/n8n-locations.json
```
2. Prüfe Dateiinhalt:
```bash
cat /tmp/n8n-locations.json | jq .
```
3. Prüfe Berechtigungen:
```bash
# n8n-User muss lesen können
chmod 644 /tmp/n8n-locations.json
```
**Für tracker-db.json/tracker-mqtt.json (NocoDB)**:
1. Teste NocoDB-Verbindung in n8n (Credentials → Test)
2. Prüfe Project/Table IDs im Workflow
3. Prüfe NocoDB-API direkt:
```bash
curl -H "xc-token: YOUR_TOKEN" \
https://nocodb.example.com/api/v1/db/data/v1/PROJECT_ID/TABLE_ID
```
### MQTT-Daten kommen nicht an (tracker-mqtt.json)
**Symptome**: OwnTracks sendet, aber nichts in NocoDB gespeichert
**Lösungen**:
1. Teste MQTT-Broker-Verbindung:
```bash
mosquitto_sub -h broker.example.com -p 1883 -u user -P pass -t 'owntracks/#' -v
```
2. Prüfe OwnTracks-Konfiguration:
- Mode: MQTT (nicht HTTP!)
- Topic: `owntracks/USER/DEVICE`
- TLS: Nur wenn Broker TLS nutzt
3. Prüfe n8n MQTT-Node:
- Credentials korrekt
- Topic-Pattern passt (`owntracks/#`)
4. Prüfe Workflow-Filter:
- Node "Ist Location?" muss `_type: "location"` filtern
5. Debug mit Workflow-Execution:
- Trigger manuell mit Test-Payload
```json
{
"_type": "location",
"lat": 48.1351,
"lon": 11.5820,
"tid": "le",
"tst": 1731582600
}
```
### Web-Oberfläche zeigt keine Karte
**Symptome**: Weiße Seite, Karte lädt nicht, Marker fehlen
**Lösungen**:
1. Prüfe Browser-Console (F12 → Console):
- CORS-Fehler? → Siehe Sicherheitshinweise
- 404 auf Leaflet.js? → CDN-Problem, lokale Kopie nutzen
- API-Fehler? → Siehe "API gibt leere Daten zurück"
2. Prüfe API-URL in HTML:
```javascript
// index.html Zeile 175
// index_owntrack.html Zeile 85
const API_URL = 'https://...'; // Muss erreichbar sein!
```
3. Teste API direkt im Browser:
```
https://deine-n8n-instanz.de/webhook/location
```
Sollte JSON zurückgeben, nicht HTML/Fehlerseite
4. Prüfe Netzwerk-Tab (F12 → Network):
- Status 200 für API-Request?
- CORS-Header vorhanden?
### Koordinaten sind falsch/vertauscht
**Symptome**: Marker erscheinen im Meer, falsche Position
**Lösungen**:
1. Prüfe Reihenfolge: **Latitude (Breitengrad) kommt vor Longitude (Längengrad)**
- Richtig: `[48.1351, 11.5820]` (lat, lon)
- Falsch: `[11.5820, 48.1351]` (lon, lat)
2. Prüfe MQTT-Mapping (nur tracker-mqtt.json):
- Node "MQTT Location verarbeiten"
- `latitude: json.lat` (nicht `json.lon`!)
3. Prüfe String-Parsing:
```javascript
// Koordinaten müssen Numbers sein, nicht Strings!
const lat = parseFloat(loc.latitude); // Gut
const lat = loc.latitude; // Schlecht, wenn String
```
### Standorte verschwinden nach System-Neustart (tracker.json)
**Symptome**: Nach Neustart des Servers sind alle Standorte weg
**Ursache**: `/tmp` wird bei System-Neustart geleert
**Lösungen**:
1. **Kurzfristig**: Nutze persistenten Pfad (siehe "Datenspeicherung & Schema")
2. **Langfristig**: Wechsele zu tracker-db.json (NocoDB)
## Repository-Inhalte
| Datei | Beschreibung | Typ |
|-------|--------------|-----|
| `tracker.json` | Telegram + Datei-Speicherung | n8n Workflow |
| `tracker-db.json` | Telegram + NocoDB | n8n Workflow |
| `tracker-mqtt.json` | MQTT/OwnTracks + NocoDB | n8n Workflow |
| `index.html` | Erweiterte Multi-Source Web-UI | HTML/JavaScript |
| `index_owntrack.html` | MQTT-fokussierte Web-UI | HTML/JavaScript |
| `locations-example.csv` | Beispieldaten für Tests | CSV |
| `README.md` | Diese Dokumentation | Markdown |
| `CLAUDE.md` | Technische Architektur-Doku | Markdown |
## Lizenz
Dieses Projekt steht unter der **MIT-Lizenz** zur freien Verfügung.
## Support & Contributing
- **Issues**: Melde Bugs oder Feature-Requests via GitHub Issues
- **Pull Requests**: Beiträge sind willkommen!
- **Fragen**: Öffne eine Discussion auf GitHub
## Roadmap (Potenzielle Features)
- [ ] API-Authentifizierung (API-Key, JWT)
- [ ] Automatische Datenlöschung (DSGVO-Compliance)
- [ ] Geofencing / Location-Alerts
- [ ] Multi-Tenant-Support (mehrere Bots)
- [ ] Erweiterte Statistiken (Distanz, Durchschnittsgeschwindigkeit)
- [ ] Export-Funktion (GPX, KML)
- [ ] Push-Notifications bei Location-Updates
- [ ] Offline-Support für Web-UI (PWA)