Changed rendering order to display oldest markers first and added zIndexOffset to ensure newest location markers are always visible on top when markers overlap. Also improved firstLocation logic to only use the latest marker for map centering. đ€ Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Location Tracker fĂŒr n8n
Ein MQTT-basiertes Location-Tracking-System mit n8n, NocoDB und interaktiver Web-Visualisierung fĂŒr OwnTracks-GerĂ€te.
Ăberblick
Dieses Repository enthÀlt ein MQTT-basiertes Location-Tracking-System mit folgenden Komponenten:
- n8n-tracker.json - n8n-Workflow zur MQTT-Datenerfassung und API-Bereitstellung
- index.html - Interaktive Web-OberflÀche mit Leaflet.js
Das System empfĂ€ngt Location-Updates von OwnTracks-kompatiblen GerĂ€ten ĂŒber MQTT, speichert diese in einer NocoDB-Datenbank und bietet sowohl eine REST-API als auch eine Web-Visualisierung mit Echtzeit-Updates.
Funktionen
Workflow-Features
- MQTT-Erfassung: Automatischer Empfang von OwnTracks-Standortdaten ĂŒber MQTT
- Persistente Speicherung: Unbegrenzte Historie in NocoDB-Datenbank
- Telemetrie-Daten: Batteriestatus und Geschwindigkeit werden mitgespeichert
- REST-API: JSON-Endpunkt fĂŒr externe Anwendungen
- Fehlerbehandlung: Validierung und Fehlertoleranz bei ungĂŒltigen MQTT-Nachrichten
Web-OberflÀchen-Features
- đ Interaktive Karte mit Leaflet.js
- đșïž 4 Kartenebenen: Standard (OpenStreetMap), Satellit (Esri), GelĂ€nde (OpenTopoMap), Dunkel-Modus (CartoDB)
- đ± GerĂ€te-Filter: Separate Ansicht pro GerĂ€t
- â±ïž Zeitfilter: 1h, 3h, 6h, 12h, 24h
- đ Auto-Refresh: Toggle-fĂ€hig, 5-Sekunden-Intervall
- đ Bewegungshistorie: Farbcodierte Polyline-Darstellung pro GerĂ€t
- đ Telemetrie-Anzeige: Batteriestatus und Geschwindigkeit in Popups
- đš GerĂ€te-spezifische Farben: Unterschiedliche Farben pro GerĂ€t
Voraussetzungen
Basis-Anforderungen
- Eine laufende n8n-Instanz (Version 1.0+)
- NocoDB-Instanz mit API-Zugriff
- MQTT-Broker (z.B. Mosquitto)
- OwnTracks-App oder kompatibles MQTT-GerÀt
MQTT-Broker
Wenn noch kein MQTT-Broker vorhanden ist:
# Ubuntu/Debian
sudo apt install mosquitto mosquitto-clients
# Mosquitto starten
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
# Test
mosquitto_sub -h localhost -p 1883 -t 'owntracks/#' -v
Installation
Schritt 1: n8n-Workflow importieren
- Ăffne deine n8n-Instanz
- Navigiere zu Workflows â Import from File
- WĂ€hle
n8n-tracker.jsonaus diesem Repository - Workflow wird als "Telegram Location Tracker - NocoDB" importiert (Name kann angepasst werden)
Schritt 2: NocoDB-Datenbank einrichten
NocoDB-Tabelle erstellen
- Erstelle ein neues Project in NocoDB
- Erstelle eine Tabelle mit folgendem Schema:
| Spaltenname | Datentyp | Beschreibung |
|---|---|---|
latitude |
Decimal | Breitengrad |
longitude |
Decimal | LĂ€ngengrad |
timestamp |
DateTime | Zeitstempel (ISO 8601) |
user_id |
Number | Immer 0 fĂŒr MQTT |
first_name |
Text | Tracker-ID (z.B. "10") |
last_name |
Text | Source-Typ (z.B. "fused") |
username |
Text | Tracker-ID (wie first_name) |
marker_label |
Text | Anzeigename fĂŒr Karte |
display_time |
Text | Formatierter Zeitstempel |
chat_id |
Number | Immer 0 fĂŒr MQTT |
battery |
Number | Batteriestatus (0-100) |
speed |
Decimal | Geschwindigkeit in m/s |
- Notiere Project ID und Table ID aus der NocoDB-URL:
https://nocodb.example.com/nc/PROJECT_ID/TABLE_ID
NocoDB API-Token generieren
- In NocoDB: Account Settings â Tokens â Create Token
- Kopiere den generierten Token
Schritt 3: Credentials in n8n konfigurieren
MQTT-Credentials
- In n8n: Credentials â Create New
- WĂ€hle "MQTT"
- Konfiguriere:
- Protocol: mqtt (oder mqtts fĂŒr TLS)
- Host: Dein MQTT-Broker (z.B.
localhostoderbroker.example.com) - Port: 1883 (Standard) oder 8883 (TLS)
- Username: MQTT-Benutzername
- Password: MQTT-Passwort
- Speichere als "MQTT account"
NocoDB-Credentials
- In n8n: Credentials â Create New
- WĂ€hle "NocoDB API Token"
- Konfiguriere:
- API Token: Token aus Schritt 2
- Base URL: NocoDB-URL (z.B.
https://nocodb.example.com)
- Speichere als "NocoDB Token account"
Schritt 4: Workflow-IDs anpassen
Ăffne den importierten Workflow in n8n und passe an:
In den Nodes "Lade Daten aus NocoDB" und "Speichere in NocoDB":
- Project ID: Deine NocoDB-Projekt-ID (ersetze
pdxl4cx4dbu9nxi) - Table ID: Deine NocoDB-Tabellen-ID (ersetze
m8pqj5ixgnnrzkg)
Credential-Zuordnung prĂŒfen:
- MQTT Trigger â WĂ€hle deine "MQTT account" Credentials
- NocoDB-Nodes â WĂ€hle deine "NocoDB Token account" Credentials
Schritt 5: OwnTracks-App konfigurieren
-
OwnTracks-App installieren (Android/iOS)
-
MQTT-Modus aktivieren:
- Ăffne OwnTracks â Preferences
- Mode: MQTT
- Host: Dein MQTT-Broker (z.B.
broker.example.com) - Port: 1883 (oder 8883 fĂŒr TLS)
- Username: MQTT-Benutzername
- Password: MQTT-Passwort
- Device ID (tid): z.B. "10" oder "11" (wichtig fĂŒr GerĂ€te-Identifikation!)
- Tracker ID (tid): Gleicher Wert wie Device ID
-
TLS/VerschlĂŒsselung (optional aber empfohlen):
- Port auf 8883 Àndern
- TLS aktivieren
-
Tracking-Einstellungen:
- Monitoring: Signifikante StandortÀnderungen
- Move Mode: 100m (oder nach Bedarf)
Schritt 6: Web-OberflÀche konfigurieren
API-Endpunkt anpassen
Ăffne index.html und passe die API-URL an (Zeile 178):
const API_URL = 'https://deine-n8n-instanz.de/webhook/location';
Webhook-URL finden:
- In n8n: Ăffne den Workflow
- Klicke auf den Node "Webhook - Location API"
- Die URL steht unter "Webhook URLs" (z.B.
https://n8n.example.com/webhook/location)
GerÀte-Namen konfigurieren
Passe die GerÀte-Zuordnung in index.html an (Zeilen 142-152):
const DEVICE_NAMES = {
'10': 'Joachim Pixel', // Device ID '10' â Anzeigename
'11': 'Huawei Smartphone' // Device ID '11' â Anzeigename
};
const DEVICE_COLORS = {
'10': '#e74c3c', // Rot
'11': '#3498db', // Blau
'default': '#95a5a6' // Grau fĂŒr unbekannte GerĂ€te
};
Wichtig: Die Keys ('10', '11') mĂŒssen mit der Tracker ID (tid) aus OwnTracks ĂŒbereinstimmen!
Web-OberflÀche hosten
Option 1: Webserver (empfohlen)
# Apache
sudo cp index.html /var/www/html/tracker/
# nginx
sudo cp index.html /usr/share/nginx/html/tracker/
Option 2: Lokaler Test
- Ăffne
index.htmldirekt im Browser - Funktioniert nur, wenn CORS korrekt konfiguriert ist
Option 3: Static Hosting
- GitHub Pages
- Netlify
- Vercel
Schritt 7: Workflow aktivieren und testen
-
Workflow aktivieren:
- In n8n: Ăffne den Workflow
- Klicke auf "Active" (Toggle oben rechts)
- PrĂŒfe, dass alle Nodes grĂŒn sind (keine roten Fehler)
-
Testen:
- Ăffne OwnTracks-App
- Sende einen Location-Update (App sendet automatisch oder manuell triggern)
- PrĂŒfe in n8n die Execution History
- Ăffne die Web-OberflĂ€che â Standort sollte erscheinen
-
API-Test:
curl https://deine-n8n-instanz.de/webhook/locationSollte JSON zurĂŒckgeben mit
success: trueund Location-Daten
Verwendung
Standort senden (OwnTracks)
Die OwnTracks-App sendet automatisch Location-Updates basierend auf deinen Einstellungen:
- Automatisch: Bei signifikanten StandortÀnderungen
- Manuell: In der App auf "Publish" klicken
- Intervall: Konfigurierbar in App-Einstellungen
MQTT-Topic-Format:
owntracks/user/device
Beispiel: owntracks/joachim/pixel
Nachrichtenformat (JSON):
{
"_type": "location",
"lat": 48.1351,
"lon": 11.5820,
"tst": 1700000000,
"tid": "10",
"batt": 85,
"vel": 5,
"acc": 10,
"alt": 520
}
Web-OberflÀche verwenden
Filter-Optionen
đșïž Kartenebene:
- Standard: OpenStreetMap (gut fĂŒr Navigation)
- Satellit: Esri World Imagery (Luftbild)
- GelÀnde: OpenTopoMap (Höhenlinien)
- Dunkel: CartoDB Dark (Nachtmodus)
đ± GerĂ€t-Filter:
- Alle GerÀte: Zeigt alle MQTT-GerÀte
- Einzelnes GerĂ€t: WĂ€hle aus Dropdown (wird dynamisch befĂŒllt)
â±ïž Zeitfilter:
- 1 Stunde: Nur letzte Stunde (Standard)
- 3/6/12/24 Stunden: Weitere ZeitrÀume
- Alle Àlteren Punkte werden ausgeblendet
đ Auto-Refresh:
- AN (grĂŒn): Aktualisiert alle 5 Sekunden
- AUS (rot): Keine automatische Aktualisierung
Karte verstehen
Marker:
- GröĂe: GröĂter Marker = neuester Standort (32x32px), kleinere = Historie (16x16px)
- Farbe: GerÀte-spezifisch (siehe
DEVICE_COLORSKonfiguration) - Icon: Kreisförmig mit dekorativem Zeiger (kein tatsÀchlicher Richtungsindikator)
Polylines:
- Verbinden Standorte chronologisch
- Farbe entspricht GerÀt
- Zeigen Bewegungspfad
Popups:
- Klicke auf Marker fĂŒr Details
- Zeigt: GerÀtename, Zeitstempel, Batterie %, Geschwindigkeit (km/h)
REST-API verwenden
Endpunkt:
GET https://deine-n8n-instanz.de/webhook/location
Beispiel-Antwort:
{
"success": true,
"current": {
"latitude": 48.1351,
"longitude": 11.5820,
"timestamp": "2025-11-14T10:30:00.000Z",
"user_id": 0,
"first_name": "10",
"last_name": "fused",
"username": "10",
"marker_label": "10",
"display_time": "14.11.2025, 11:30:00",
"chat_id": 0,
"battery": 85,
"speed": 5.2
},
"history": [
{ /* weitere Location-Objekte */ }
],
"total_points": 42,
"last_updated": "2025-11-14T10:30:00.000Z"
}
Integration in eigene Apps:
// JavaScript Beispiel
fetch('https://n8n.example.com/webhook/location')
.then(response => response.json())
.then(data => {
console.log('Aktueller Standort:', data.current);
console.log('Batterie:', data.current.battery + '%');
});
# Python Beispiel
import requests
response = requests.get('https://n8n.example.com/webhook/location')
data = response.json()
if data['success']:
current = data['current']
print(f"Position: {current['latitude']}, {current['longitude']}")
print(f"Batterie: {current['battery']}%")
Workflow-Architektur
Ăbersicht
Der n8n-tracker.json Workflow besteht aus zwei unabhÀngigen Flows:
Flow 1: MQTT Location Capture
ââââââââââââââââ
â MQTT Trigger â (owntracks/#)
ââââââââŹââââââââ
â
v
ââââââââââââââââââââââââââââ
â MQTT Location verarbeitenâ (JavaScript)
ââââââââŹââââââââââââââââââââ
â
v
ââââââââââââââââââââ
â Speichere in â (NocoDB Create)
â NocoDB â
ââââââââââââââââââââ
Flow 2: Location API
ââââââââââââââââââââââââ
â Webhook - Location â (GET /webhook/location)
â API â
ââââââââŹââââââââââââââââ
â
v
ââââââââââââââââââââââââ
â Lade Daten aus â (NocoDB Get All)
â NocoDB â
ââââââââŹââââââââââââââââ
â
v
ââââââââââââââââââââââââ
â Format API Response â (JavaScript)
ââââââââŹââââââââââââââââ
â
v
ââââââââââââââââââââââââ
â JSON Response â (CORS + JSON)
ââââââââââââââââââââââââ
Flow 1: MQTT Location Capture (Details)
MQTT Trigger:
- Subscribed auf Topic:
owntracks/# - EmpfÀngt alle OwnTracks-Messages
- Keine Filter auf Trigger-Ebene
MQTT Location verarbeiten (JavaScript):
// Wichtige Schritte:
1. Parse JSON aus message-Feld
2. Validiere lat, lon, tst (erforderlich)
3. Konvertiere Unix-Timestamp â ISO 8601
4. Extrahiere tid (Tracker ID) â username
5. Formatiere displayTime (de-DE, Europe/Berlin)
6. Packe Telemetrie in mqtt_data Objekt
7. Ăberspringe ungĂŒltige Nachrichten mit continue
Speichere in NocoDB:
- Erstellt neuen Datensatz pro Location
- Mappt 12 Felder (inkl. battery, speed)
- Keine DuplikatsprĂŒfung (alle Updates werden gespeichert)
Flow 2: Location API (Details)
Webhook - Location API:
- HTTP GET auf
/location - CORS:
Access-Control-Allow-Origin: * - Keine Authentifizierung (öffentlich!)
Lade Daten aus NocoDB:
- Holt ALLE DatensÀtze (
returnAll: true) - Keine Sortierung auf DB-Ebene
- Keine Pagination
Format API Response (JavaScript):
// Schritte:
1. Sammle alle Location-Objekte
2. Sortiere nach timestamp (neueste zuerst)
3. WĂ€hle neuste als "current"
4. Baue Response-Struktur
5. ZĂ€hle total_points
JSON Response:
- Content-Type: application/json
- CORS-Header gesetzt
- Keine Kompression
Datenspeicherung & Schema
NocoDB-Konfiguration
Aktuelle IDs im Workflow:
- Project ID:
pdxl4cx4dbu9nxi(muss angepasst werden!) - Table ID:
m8pqj5ixgnnrzkg(muss angepasst werden!) - Credential: "NocoDB Token account"
Datenbank-Schema
VollstÀndiges Schema mit Beispieldaten:
| Feld | Typ | Beispielwert | Beschreibung |
|---|---|---|---|
latitude |
Decimal | 48.1383784 |
Breitengrad (WGS84) |
longitude |
Decimal | 11.4276172 |
LĂ€ngengrad (WGS84) |
timestamp |
DateTime | 2025-11-14T18:00:37.000Z |
UTC-Zeitstempel (ISO 8601) |
user_id |
Number | 0 |
Immer 0 fĂŒr MQTT-GerĂ€te |
first_name |
Text | "11" |
Tracker-ID (tid) |
last_name |
Text | "fused" |
Location-Source |
username |
Text | "11" |
Tracker-ID (gleich wie first_name) |
marker_label |
Text | "11" |
Anzeigename fĂŒr Karte |
display_time |
Text | "14.11.2025, 19:00:37" |
Formatiert (de-DE) |
chat_id |
Number | 0 |
Immer 0 fĂŒr MQTT-GerĂ€te |
battery |
Number | 73 |
Batteriestatus (0-100%) |
speed |
Decimal | 0 |
Geschwindigkeit in m/s |
OwnTracks-Feld-Mapping
| NocoDB-Feld | OwnTracks-Feld | Transformation |
|---|---|---|
latitude |
lat |
Direkt |
longitude |
lon |
Direkt |
timestamp |
tst |
Unix â ISO 8601 |
user_id |
- | Konstant: 0 |
first_name |
tid |
Tracker-ID |
last_name |
source |
Location-Quelle |
username |
tid |
Tracker-ID |
marker_label |
tid |
Tracker-ID |
display_time |
tst |
Formatiert (de-DE, Berlin) |
chat_id |
- | Konstant: 0 |
battery |
batt |
Direkt |
speed |
vel |
m/s (nicht konvertiert!) |
Nicht gespeicherte OwnTracks-Felder:
acc- Genauigkeit (Meter)alt- Höhe (Meter)cog- Kurs ĂŒber Grundconn- Verbindungstyp (w/m)_id- Device Identifier
Anpassungen & Customization
Neues GerĂ€t hinzufĂŒgen
Schritt 1: OwnTracks-App konfigurieren
- Setze Tracker ID (tid) auf eindeutige ID, z.B. "12"
- Konfiguriere MQTT-Verbindung wie oben beschrieben
Schritt 2: index.html anpassen (Zeilen 142-152)
const DEVICE_NAMES = {
'10': 'Joachim Pixel',
'11': 'Huawei Smartphone',
'12': 'Neues GerĂ€t' // HINZUFĂGEN
};
const DEVICE_COLORS = {
'10': '#e74c3c',
'11': '#3498db',
'12': '#2ecc71', // HINZUFĂGEN (GrĂŒn)
'default': '#95a5a6'
};
Farb-VorschlÀge:
#e74c3c- Rot#3498db- Blau#2ecc71- GrĂŒn#f39c12- Orange#9b59b6- Lila#1abc9c- TĂŒrkis
Schritt 3: Testen
- Sende Location von neuem GerÀt
- PrĂŒfe Web-OberflĂ€che â GerĂ€t sollte im Dropdown erscheinen
- Marker sollte in konfigurierter Farbe erscheinen
Zeitzone Àndern
In n8n-Workflow, Node "MQTT Location verarbeiten" (Zeile 124):
// Aktuell: Berlin-Zeit
const displayTime = new Date(timestampMs).toLocaleString('de-DE', {
timeZone: 'Europe/Berlin'
});
// Ăndern zu New York:
const displayTime = new Date(timestampMs).toLocaleString('en-US', {
timeZone: 'America/New_York'
});
// Ăndern zu UTC:
const displayTime = new Date(timestampMs).toISOString();
// Eigenes Format:
const displayTime = new Date(timestampMs).toLocaleString('de-DE', {
timeZone: 'Europe/Berlin',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
Standard-Zeitfilter Àndern
In index.html (Zeile 125):
<!-- Aktuell: 1 Stunde (1h) -->
<option value="1h" selected>Letzte Stunde</option>
<!-- Ăndern zu 24 Stunden: -->
<option value="1h">Letzte Stunde</option>
<option value="24h" selected>Letzte 24 Stunden</option>
Auto-Refresh-Intervall anpassen
In index.html (Zeile 419):
// Aktuell: 5 Sekunden (5000ms)
refreshInterval = setInterval(loadLocations, 5000);
// Ăndern zu 10 Sekunden:
refreshInterval = setInterval(loadLocations, 10000);
// Ăndern zu 1 Minute:
refreshInterval = setInterval(loadLocations, 60000);
CORS einschrÀnken (Sicherheit!)
In n8n-Workflow, Node "JSON Response" (Zeile 67):
// Aktuell (unsicher):
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
// Ăndern zu spezifischer Domain:
{
"name": "Access-Control-Allow-Origin",
"value": "https://web.example.com"
}
Weitere NocoDB-Felder speichern
Beispiel: Genauigkeit (accuracy) und Höhe (altitude) hinzufĂŒgen
Schritt 1: NocoDB-Spalten erstellen
accuracy(Number)altitude(Number)
Schritt 2: Workflow-Node "MQTT Location verarbeiten" anpassen:
// In mqtt_data Objekt ergÀnzen:
mqtt_data: {
accuracy: mqttData.acc,
altitude: mqttData.alt,
battery: mqttData.batt,
velocity: mqttData.vel,
course: mqttData.cog,
connection: mqttData.conn,
device_id: mqttData._id
}
Schritt 3: Node "Speichere in NocoDB" anpassen:
FĂŒge in fieldsUi.fieldValues hinzu:
{
"fieldName": "accuracy",
"fieldValue": "={{ $json.mqtt_data.accuracy }}"
},
{
"fieldName": "altitude",
"fieldValue": "={{ $json.mqtt_data.altitude }}"
}
Schritt 4: index.html Popups erweitern (Zeile 320):
// Nach Speed-Anzeige hinzufĂŒgen:
if (loc.accuracy !== undefined && loc.accuracy !== null) {
popupContent += `<br>đ Genauigkeit: ${loc.accuracy}m`;
}
if (loc.altitude !== undefined && loc.altitude !== null) {
popupContent += `<br>â°ïž Höhe: ${loc.altitude}m`;
}
MQTT-Topic einschrÀnken
In n8n-Workflow, Node "MQTT Trigger" (Zeile 104):
// Aktuell: Alle OwnTracks-Topics
topics: "owntracks/#"
// Nur spezifischer Benutzer:
topics: "owntracks/joachim/#"
// Nur spezifisches GerÀt:
topics: "owntracks/joachim/pixel"
// Mehrere Topics:
topics: "owntracks/joachim/#,owntracks/lisa/#"
Sicherheitshinweise
Kritisch (sofort beheben!)
1. API ohne Authentifizierung
- â ïž Problem: Jeder kann Standortdaten abrufen, wenn er die URL kennt
- â ïž Risiko: DSGVO-VerstoĂ, PrivatsphĂ€re-Verletzung
- â
Lösung:
- Implementiere API-Key-Authentifizierung in n8n
- Oder nutze Reverse-Proxy mit Basic Auth
- Oder beschrÀnke Zugriff per IP-Whitelist
2. CORS offen fĂŒr alle Domains
- â ïž Problem:
Access-Control-Allow-Origin: * - â ïž Risiko: XSS-Angriffe, unautorisierten Zugriff
- â Lösung: BeschrĂ€nke auf deine Domain (siehe "CORS einschrĂ€nken")
3. DSGVO-Compliance
- â ïž Problem: Personenbezogene Standortdaten ohne Einwilligung/Löschkonzept
- â ïž Pflichten: Informationspflicht, Einwilligung, Auskunftsrecht, Löschung
- â
Lösung:
- Hole explizite Einwilligung von Nutzern ein
- Implementiere automatische Löschung alter Daten (z.B. >30 Tage)
- Dokumentiere DatenschutzmaĂnahmen
- Stelle Löschfunktion bereit
Wichtig (empfohlen)
4. MQTT ohne TLS
- â ïž Problem: UnverschlĂŒsselte Ăbertragung auf Port 1883
- â ïž Risiko: Standortdaten können abgefangen werden
- â
Lösung:
- Aktiviere TLS in Mosquitto (Port 8883)
- Konfiguriere OwnTracks mit TLS
5. Keine Rate-Limiting
- â ïž Problem: API kann unbegrenzt oft abgerufen werden
- â ïž Risiko: DoS-Angriff, Server-Ăberlastung
- â Lösung: Implementiere Rate-Limiting (z.B. via nginx)
6. NocoDB-Token zu weitreichend
- â ïž Problem: Token hat möglicherweise Schreibrechte fĂŒr API-Endpunkt
- â ïž Risiko: Datenmanipulation
- â Lösung: Nutze separaten Read-Only-Token fĂŒr API-Endpunkt (falls möglich)
Best Practices
- HTTPS erzwingen: n8n-Webhooks nur ĂŒber HTTPS erreichbar machen
- Monitoring: Ăberwache ungewöhnliche API-Zugriffe
- Backup: Sichere NocoDB-Datenbank regelmĂ€Ăig
- Updates: Halte n8n, NocoDB, Mosquitto und Dependencies aktuell
- Secrets: Speichere Credentials nur in n8n Credential Store, nicht im Code
- Logging: Aktiviere Audit-Logging fĂŒr Zugriffe
Fehlerbehebung
MQTT-Daten kommen nicht an
Symptome: OwnTracks sendet, aber nichts in NocoDB gespeichert
Lösungen:
-
MQTT-Broker testen:
mosquitto_sub -h broker.example.com -p 1883 -u user -P pass -t 'owntracks/#' -vSollte Nachrichten anzeigen, wenn OwnTracks sendet.
-
OwnTracks-Konfiguration prĂŒfen:
- Mode: MQTT (nicht HTTP!)
- Topic:
owntracks/USER/DEVICE - Verbindungsstatus in App prĂŒfen
- Test-Nachricht senden (Publish Button)
-
n8n MQTT-Node prĂŒfen:
- Credentials korrekt?
- Topic-Pattern passt? (
owntracks/#) - Workflow ist aktiviert?
-
n8n Execution History prĂŒfen:
- Workflows â n8n-tracker â Executions
- Gibt es Executions?
- Gibt es Fehler (rot markiert)?
-
Debug mit manuellem Test:
# Sende Test-Nachricht per mosquitto_pub mosquitto_pub -h broker.example.com -p 1883 -u user -P pass \ -t 'owntracks/test/device' \ -m '{"_type":"location","lat":48.1351,"lon":11.5820,"tid":"10","tst":1700000000,"batt":85,"vel":5}'
API gibt leere Daten zurĂŒck
Symptome: API antwortet mit {"history": []} oder "current": null
Lösungen:
-
NocoDB-Verbindung testen:
- In n8n: Credentials â NocoDB â Test Connection
- Sollte grĂŒner Haken erscheinen
-
NocoDB direkt testen:
curl -H "xc-token: YOUR_TOKEN" \ "https://nocodb.example.com/api/v1/db/data/v1/PROJECT_ID/TABLE_ID"Sollte JSON mit Daten zurĂŒckgeben.
-
Project/Table IDs prĂŒfen:
- Ăffne NocoDB-Tabelle im Browser
- URL enthÀlt die IDs:
/nc/PROJECT_ID/TABLE_ID - Vergleiche mit IDs in n8n-Workflow
-
Daten in NocoDB vorhanden?
- Ăffne Tabelle in NocoDB
- Sind EintrÀge vorhanden?
- Wenn nicht: Problem liegt bei MQTT-Erfassung (siehe oben)
Web-OberflÀche zeigt keine Karte
Symptome: WeiĂe Seite, Karte lĂ€dt nicht, Marker fehlen
Lösungen:
-
Browser-Console prĂŒfen (F12 â Console):
- CORS-Fehler? â API-CORS-Header prĂŒfen
- 404 auf Leaflet.js? â CDN-Problem (lokale Kopie nutzen)
- API-Fehler? â Siehe "API gibt leere Daten zurĂŒck"
- JavaScript-Fehler? â Code-Syntax prĂŒfen
-
API-URL prĂŒfen:
- In index.html Zeile 178:
const API_URL = '...' - URL muss erreichbar sein
- Test im Browser: URL direkt aufrufen â Sollte JSON zurĂŒckgeben
- In index.html Zeile 178:
-
Netzwerk-Tab prĂŒfen (F12 â Network):
- Request zu API wird gesendet?
- Status 200 OK?
- Response enthÀlt Daten?
- CORS-Header vorhanden?
-
Leaflet.js CDN erreichbar?
- PrĂŒfe ob
https://unpkg.com/leaflet@1.9.4/dist/leaflet.jsgeladen wird - Falls CDN-Problem: Nutze lokale Kopie
- PrĂŒfe ob
Koordinaten sind falsch/vertauscht
Symptome: Marker erscheinen im Meer, falsche Position
Lösungen:
-
Reihenfolge prĂŒfen:
- Leaflet erwartet:
[latitude, longitude] - NICHT:
[longitude, latitude] - OwnTracks sendet korrekt:
lat,lon
- Leaflet erwartet:
-
Daten in NocoDB prĂŒfen:
- Ăffne Tabelle
- Ist
latitudeder Breitengrad (z.B. 48.x)? - Ist
longitudeder LĂ€ngengrad (z.B. 11.x)? - FĂŒr MĂŒnchen: ca. 48°N, 11°O
-
JavaScript-Code prĂŒfen:
// RICHTIG: const lat = parseFloat(loc.latitude); const lon = parseFloat(loc.longitude); L.marker([lat, lon]) // FALSCH: L.marker([lon, lat]) // Vertauscht!
GerÀte-Filter zeigt nicht alle GerÀte
Symptome: Dropdown zeigt "Alle GerÀte" aber keine einzelnen GerÀte
Lösungen:
-
MQTT-Daten vorhanden?
- API aufrufen und prĂŒfen: Gibt es EintrĂ€ge mit
user_id: 0? - Wenn nicht: Keine MQTT-Daten in Datenbank
- API aufrufen und prĂŒfen: Gibt es EintrĂ€ge mit
-
username-Feld befĂŒllt?
- In NocoDB prĂŒfen: Ist
usernamegesetzt? - Sollte gleich wie
first_namesein (tid)
- In NocoDB prĂŒfen: Ist
-
JavaScript-Console prĂŒfen:
// In Browser-Console (F12): console.log(allData.history.filter(loc => loc.user_id == 0));Sollte MQTT-EintrÀge zeigen.
-
Filter-Code prĂŒfen (index.html Zeile 267):
let filteredData = allData.history.filter(loc => loc.user_id == 0);Muss MQTT-Daten filtern.
Geschwindigkeit wird nicht angezeigt
Symptome: Popup zeigt keine Geschwindigkeit, obwohl OwnTracks sendet
Lösungen:
-
OwnTracks sendet velocity?
- PrĂŒfe MQTT-Nachricht (mosquitto_sub)
- Sollte
velFeld enthalten
-
NocoDB-Feld
speedvorhanden?- Tabellen-Schema prĂŒfen
- Spalte
speed(Decimal) muss existieren
-
Workflow speichert speed?
- Node "Speichere in NocoDB" prĂŒfen
- Mapping:
fieldName: "speed",fieldValue: "={{ $json.mqtt_data.velocity }}"
-
Null-Werte prĂŒfen:
- Nicht alle OwnTracks-Messages enthalten
vel - Code prĂŒft auf
!== null(index.html Zeile 328)
- Nicht alle OwnTracks-Messages enthalten
Batteriestatus zeigt 0% oder fehlt
Symptome: Batterie wird als 0% angezeigt oder fehlt im Popup
Lösungen:
-
OwnTracks sendet battery?
- Android/iOS unterscheiden sich
- Manche GerÀte senden kein
battFeld - PrĂŒfe MQTT-Nachricht
-
Berechtigungen in OwnTracks:
- Android: Batterie-Optimierung deaktivieren
- iOS: Standortfreigabe "Immer" setzen
-
NocoDB-Wert prĂŒfen:
- Tabelle öffnen
- Ist
batterybefĂŒllt? - Typ Number (nicht Text!)
Repository-Inhalte
| Datei | Beschreibung |
|---|---|
n8n-tracker.json |
n8n-Workflow fĂŒr MQTT-Erfassung und API |
index.html |
Web-OberflÀche mit Leaflet.js |
database-example.csv |
Beispiel-Datenexport aus NocoDB |
README.md |
Diese Dokumentation |
CLAUDE.md |
Technische Architektur-Dokumentation |
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-User-Support mit Zugriffsrechten
- Erweiterte Statistiken (Distanz, Durchschnittsgeschwindigkeit)
- Export-Funktion (GPX, KML, CSV)
- Push-Notifications bei Location-Updates
- Offline-Support fĂŒr Web-UI (PWA)
- Mobile App (React Native / Flutter)