Tutorials

OwnTracks mit eigenem MQTT-Broker: Einrichtung, TLS und ACLs

Verbinde die OwnTracks-App mit deinem eigenen MQTT-Broker: Verbindungseinstellungen, TLS auf Port 8883, Topics, ACLs pro User, der Recorder und wie du alles testest.

Aktualisiert · 9 Min. Lesezeit

OwnTracks mit eigenem MQTT-Broker: Einrichtung, TLS und ACLs

OwnTracks ist eine Open-Source-Standort-App für Android und iOS, die die Position deines Smartphones direkt an einen MQTT-Broker publishen kann. Mit deinem eigenen Broker entscheidest du, wer die Daten sieht, wie lange sie gespeichert werden und welche anderen Systeme (Home Assistant, Node-RED, eine Datenbank) sie verarbeiten. Die Einrichtung braucht vier Werte in der App (Host, Port, Benutzername, Passwort), dazu TLS und eine ACL auf dem Broker.

Diese Anleitung behandelt die App-Einstellungen, die Topics und Payloads von OwnTracks, Broker-ACLs zum Teilen mit Freunden, den OwnTracks Recorder und wie du jeden Schritt im Terminal prüfst.

Was du brauchst

ElementWarumHinweise
Ein aus dem Internet erreichbarer MQTT-BrokerSmartphones publishen aus MobilfunknetzenSelf-hosted oder managed, MQTT 3.1.1 reicht
TLS auf Port 8883Standorte sind personenbezogene DatenEin öffentlich vertrauenswürdiges Zertifikat ist am einfachsten
Ein Benutzername pro PersonTopic und ACLs leiten sich davon abTeile nie einen Login zwischen Familienmitgliedern
OwnTracks-AppPublisht den StandortAndroid (Google Play / F-Droid) oder iOS
Optional: OwnTracks RecorderSpeichert die Historie, liefert eine WebkarteDocker-Image owntracks/recorder

Ein öffentlicher Test-Broker reicht, um zu prüfen, ob die App sich verbindet. Lass aber keinen echten Standortstrom auf einem geteilten Endpoint laufen: Jeder, der dort owntracks/# subscribt, würde ihn sehen.

App konfigurieren

Öffne in der App Preferences → Connection (Android) bzw. Settings (iOS) und stelle den Modus von HTTP auf MQTT um. Die Feldnamen unterscheiden sich je nach Plattform und Version leicht, die Werte sind dieselben:

EinstellungWert
ModeMQTT
Hostbroker.connectmq.com (Hostname deines Brokers)
Port8883
TLSAn
Username / PasswordDie Zugangsdaten dieser Person auf deinem Broker
Device IDKurzname des Geräts, z. B. pixel oder iphone
Tracker IDZwei Zeichen, die auf der Karte erscheinen, z. B. AL
Client IDStandard belassen, muss pro Gerät eindeutig sein

Speichern, dann auf der Karte nach unten ziehen oder den Upload-Button antippen, um manuell eine Position zu publishen. Der Statusbildschirm sollte die Verbindung als verbunden anzeigen. Wenn du nicht sicher bist, ob der Broker die Zugangsdaten akzeptiert, teste sie zuerst vom Laptop aus mit dem Online-MQTT-Client – so trennst du Broker-Probleme von App-Problemen.

Topics und Payloads

Mit Benutzername alice und Device-ID pixel verwendet die App:

OwnTracks-Topics
owntracks/alice/pixel          location messages (_type: location), retained by default
owntracks/alice/pixel/event    region enter/leave events (_type: transition)
owntracks/alice/pixel/info     card with name and avatar (_type: card)
owntracks/alice/pixel/cmd      commands TO the phone (_type: cmd)

Eine Location-Nachricht sieht so aus (Felder gekürzt; die genauen Felder hängen von Plattform und Version ab):

owntracks/alice/pixel
{
  "_type": "location",
  "tid": "AL",
  "lat": 48.856613,
  "lon": 2.352222,
  "acc": 12,
  "alt": 35,
  "batt": 78,
  "conn": "m",
  "t": "u",
  "tst": 1792236000
}

tst ist die UTC-Zeit des Fixes, acc die Genauigkeit in Metern, batt der Akkustand, conn der Verbindungstyp (w WLAN, m Mobilfunk) und t der Auslöser (u User, p Ping, c Region u. a.). Außerdem registriert die App eine Last-Will-Nachricht (_type: lwt) auf dem Basis-Topic, sodass ein Subscriber erfährt, wenn das Smartphone unsauber die Verbindung verliert.

Der Monitoring-Modus steuert, wie oft das Smartphone meldet: Significant (Standard, akkuschonend, basierend auf signifikanten Standortänderungen), Move (häufige Updates in Bewegung, braucht mehr Akku), Manual und Quiet. Starte mit Significant.

Wenn du einen eigenen Hardware-Tracker baust, publishe dasselbe JSON in derselben Topic-Struktur, und er erscheint neben den Smartphones. Das GPS-Tracker-Tutorial baut einen mit einem ESP32.

Im Terminal prüfen

Subscribe mit den Zugangsdaten eines Users, der Alices Topics lesen darf:

OwnTracks-Traffic beobachten
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" -t 'owntracks/#' -v

Tippe in der App auf publish; das JSON erscheint nach ein bis zwei Sekunden. Um die Gegenrichtung zu testen, fordere per Remote-Befehl eine Position vom Smartphone an. Remote-Befehle müssen in den erweiterten Einstellungen der App aktiviert sein, und unter iOS ist die Zustellung im Hintergrund nicht garantiert:

Smartphone zum Melden auffordern
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" \
  -t 'owntracks/alice/pixel/cmd' -q 1 \
  -m '{"_type":"cmd","action":"reportLocation"}'

Du kannst dich auch als Smartphone ausgeben, um den Recorder oder ein Dashboard zu testen, ohne herumzulaufen:

Position per Kommandozeile simulieren
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" -t 'owntracks/alice/pixel' -q 1 -r \
  -m "{\"_type\":\"location\",\"tid\":\"AL\",\"lat\":48.8584,\"lon\":2.2945,\"acc\":10,\"tst\":$(date +%s)}"

ACLs: Wer sieht wen

Die App subscribt standardmäßig auf owntracks/+/+ und zeichnet jede empfangene Position als Freund ein. Damit wird die ACL des Brokers zur Datenschutz-Steuerung: Ein User sieht genau die Topics, die er lesen darf. In Mosquitto-Syntax:

acl_file (Mosquitto)
# every user may publish and read under its own username
pattern readwrite owntracks/%u/#

# alice and bob share locations with each other
user alice
topic read owntracks/bob/#

user bob
topic read owntracks/alice/#

# the recorder reads everyone, publishes nothing
user recorder
topic read owntracks/#

Auf einem Managed Broker drückst du dieselben Regeln als Topic-Berechtigungen pro User aus. Zwei Details solltest du dir merken:

  • Der Benutzername in der App muss der zweiten Topic-Ebene entsprechen, sonst wird jeder Publish abgelehnt. Viele Broker verwerfen einen abgelehnten Publish, ohne den Client zu trennen – das Smartphone wirkt verbunden, aber nichts kommt an. Siehe ACL lehnt still ab.
  • Teste die Regeln von außen: Melde dich als Bob an und versuche, jemanden zu lesen, der nicht mit ihm teilt. Ein kurzes Skript dafür findest du unter MQTT-ACL-Berechtigungen testen.

Historie mit dem Recorder speichern

Der OwnTracks Recorder subscribt auf den Broker, speichert jede Position auf der Festplatte und liefert eine Webkarte und eine HTTP-API. Das Docker-Image wird über Umgebungsvariablen konfiguriert:

OwnTracks Recorder starten
docker run -d --name ot-recorder -p 8083:8083 \
  -e OTR_HOST=broker.connectmq.com \
  -e OTR_PORT=8883 \
  -e OTR_USER=recorder \
  -e OTR_PASS="$MQTT_PASS" \
  -e OTR_CAFILE=/etc/ssl/certs/ca-certificates.crt \
  -v ot-store:/store \
  owntracks/recorder

Öffne http://localhost:8083 für die Weboberfläche des Recorders. Gib dem Recorder einen eigenen Read-only-User wie in der ACL oben und lege fest, wie lange du die Historie aufbewahrst. Port 8083 ist hier der HTTP-Port des Recorders auf deinem Rechner und hat nichts mit dem WebSocket-Port des Brokers zu tun.

Ende-zu-Ende-Verschlüsselung (optional)

OwnTracks kann Payloads mit einem gemeinsamen geheimen Schlüssel (libsodium) verschlüsseln. Der Broker sieht dann nur {"_type":"encrypted","data":"…"}, und jeder Leser, auch der Recorder, braucht den Schlüssel. Das schützt die Daten vor dem Broker-Betreiber, aber du kannst Nachrichten nicht mehr mit den üblichen Tools inspizieren. TLS plus strikte ACLs reicht für die meisten Setups; die Abwägungen findest du unter MQTT-Payload-Verschlüsselung.

Fehlersuche

SymptomWahrscheinliche UrsacheLösung
App zeigt direkt nach dem Verbinden einen FehlerFalscher Benutzername oder falsches Passwort, oder CONNACK "Not authorized"Dieselben Zugangsdaten im Online-Client testen; den Code mit dem Reason-Code-Tool nachschlagen
TLS- oder ZertifikatsfehlerSelbstsigniertes Zertifikat oder unvollständige KetteÖffentlich vertrauenswürdiges Zertifikat nutzen oder deine CA in der App installieren
Verbunden, aber nichts in mosquitto_subACL lehnt Publish ab, oder Username ≠ Topic-UserBroker-Logs und ACL-Pattern prüfen
Freunde fehlen auf der KarteKeine Leserechte auf ihre Topicsread-Regeln ergänzen, App neu verbinden
Updates hören unter Android nach einer Weile aufAkku-Optimierung beendet den HintergrunddienstOwnTracks von der Akku-Optimierung ausnehmen; siehe Android-Hintergrund-Disconnects

OwnTracks auf dem eigenen Broker ist eines der einfachsten sinnvollen MQTT-Deployments: ein Smartphone, ein Topic pro Gerät und eine Handvoll ACL-Regeln. Bring zuerst TLS und die Berechtigungen pro User in Ordnung, prüfe jede Richtung mit mosquitto_sub und mosquitto_pub und setze erst danach den Recorder oder Smart-Home-Integrationen obendrauf.

Häufig gestellte Fragen

Auf welches Topic publisht OwnTracks?

Standardmäßig publisht die App Positionen auf owntracks/<username>/<deviceID>. Der Username ist der MQTT-Benutzername, die Device-ID legst du in der App fest. Events, Info-Karten und Befehle nutzen Subtopics wie /event, /info und /cmd.

Kann OwnTracks ein selbstsigniertes Zertifikat verwenden?

Ja, aber das Smartphone muss ihm vertrauen: Installiere dein CA-Zertifikat in den TLS-Einstellungen der App (Android) bzw. auf dem Gerät (iOS). Ein Zertifikat einer öffentlichen CA wie Let's Encrypt erspart diesen Schritt und funktioniert auf Port 8883 sofort.

Wie sehen sich Freunde gegenseitig in OwnTracks?

Die App subscribt standardmäßig auf owntracks/+/+ und zeigt jede empfangene Position an. Welche Freunde erscheinen, entscheiden also die ACLs des Brokers: Gib jedem User nur Leserechte für die Personen, die ihn sehen sollen.