OwnTracks es una app de ubicación de código abierto para Android e iOS que puede publicar la posición de tu móvil directamente en un broker MQTT. Con tu propio broker decides quién ve los datos, cuánto tiempo se guardan y qué otros sistemas (Home Assistant, Node-RED, una base de datos) los consumen. La configuración requiere cuatro valores en la app (host, puerto, usuario, contraseña), más TLS y una ACL en el broker.
Esta guía cubre los ajustes de la app, los topics y payloads que usa OwnTracks, las ACLs del broker para compartir con amigos, el OwnTracks Recorder y cómo verificar cada paso desde una terminal.
Qué necesitas
| Elemento | Por qué | Notas |
|---|---|---|
| Un broker MQTT accesible desde internet | Los móviles publican desde redes móviles | Autoalojado o gestionado, MQTT 3.1.1 es suficiente |
| TLS en el puerto 8883 | Las ubicaciones son datos personales | Un certificado de confianza pública es lo más sencillo |
| Un usuario por persona | El topic y las ACLs se derivan de él | Nunca compartas un login entre miembros de la familia |
| App OwnTracks | Publica la ubicación | Android (Google Play / F-Droid) o iOS |
| Opcional: OwnTracks Recorder | Guarda el histórico y sirve un mapa web | Imagen Docker owntracks/recorder |
Un broker público de pruebas vale para comprobar que la app conecta, pero no dejes un flujo de ubicación real en un endpoint compartido: cualquiera que se suscriba allí a owntracks/# lo vería.
Configura la app
En la app, abre Preferences → Connection (Android) o Settings (iOS) y cambia el modo de HTTP a MQTT. Los nombres de los campos varían un poco según la plataforma y la versión, pero los valores son los mismos:
| Ajuste | Valor |
|---|---|
| Mode | MQTT |
| Host | broker.connectmq.com (el hostname de tu broker) |
| Port | 8883 |
| TLS | Activado |
| Username / Password | Las credenciales de esta persona en tu broker |
| Device ID | Nombre corto del móvil, p. ej. pixel o iphone |
| Tracker ID | Dos caracteres que se muestran en el mapa, p. ej. AL |
| Client ID | Deja el valor por defecto; debe ser único por dispositivo |
Guarda y desliza hacia abajo en el mapa o pulsa el botón de subida para publicar una ubicación manualmente. La pantalla de estado debería mostrar la conexión como conectada. Si no tienes claro que el broker acepte las credenciales, pruébalas antes desde tu portátil con el cliente MQTT online: así separas los problemas del broker de los de la app.
Topics y payloads
Con el usuario alice y el device ID pixel, la app usa:
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)Un mensaje de ubicación tiene este aspecto (campos abreviados; los campos exactos dependen de la plataforma y la versión):
{
"_type": "location",
"tid": "AL",
"lat": 48.856613,
"lon": 2.352222,
"acc": 12,
"alt": 35,
"batt": 78,
"conn": "m",
"t": "u",
"tst": 1792236000
}tst es la hora UTC de la posición, acc la precisión en metros, batt el nivel de batería, conn el tipo de conexión (w Wi-Fi, m móvil) y t el disparador (u usuario, p ping, c región, entre otros). La app también registra un mensaje Last Will (_type: lwt) en el topic base, de modo que un suscriptor sabe cuándo el móvil se desconecta de forma abrupta.
El modo de monitorización controla cada cuánto informa el móvil: Significant (el predeterminado, cuida la batería y se basa en cambios de ubicación significativos), Move (actualizaciones frecuentes en movimiento, gasta más batería), Manual y Quiet. Empieza con Significant.
Si construyes tu propio rastreador por hardware, publica el mismo JSON con la misma estructura de topics y aparecerá junto a los móviles. El tutorial del rastreador GPS construye uno con un ESP32.
Verifica desde una terminal
Suscríbete con las credenciales de un usuario que pueda leer los topics de Alice:
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-u "$MQTT_USER" -P "$MQTT_PASS" -t 'owntracks/#' -vPulsa publish en la app; el JSON aparece en uno o dos segundos. Para probar la dirección contraria, pide una ubicación al móvil con un comando remoto. Los comandos remotos deben activarse en los ajustes avanzados de la app, y en iOS la entrega en segundo plano no está garantizada:
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"}'También puedes hacerte pasar por un móvil para probar el Recorder o un dashboard sin salir a caminar:
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: quién ve a quién
La app se suscribe a owntracks/+/+ por defecto y dibuja como amigo cada ubicación que recibe. Eso convierte la ACL del broker en el control de privacidad: un usuario ve exactamente los topics que tiene permiso para leer. En sintaxis de 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/#En un broker gestionado expresas las mismas reglas como permisos por topic para cada usuario. Dos detalles a recordar:
- El usuario de la app debe coincidir con el segundo nivel del topic; si no, se deniega cada publicación. Muchos brokers descartan una publicación denegada sin desconectar al cliente, así que el móvil parece conectado pero no llega nada. Consulta ACL denegada en silencio.
- Prueba las reglas desde fuera: inicia sesión como Bob e intenta leer a alguien que no ha compartido con él. Tienes un script corto para esto en probar permisos ACL de MQTT.
Guarda el histórico con el Recorder
El OwnTracks Recorder se suscribe al broker, guarda cada ubicación en disco y sirve un mapa web y una API HTTP. La imagen Docker se configura con variables de entorno:
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/recorderAbre http://localhost:8083 para la interfaz web propia del Recorder. Dale al Recorder su propio usuario de solo lectura, como en la ACL anterior, y decide cuánto tiempo guardas el histórico. El puerto 8083 es aquí el puerto HTTP del Recorder en tu máquina, sin relación con el puerto WebSocket del broker.
Cifrado de extremo a extremo (opcional)
OwnTracks puede cifrar los payloads con una clave secreta compartida (libsodium). El broker entonces solo ve {"_type":"encrypted","data":"…"} y todo lector, incluido el Recorder, necesita la clave. Protege los datos frente al operador del broker, pero pierdes la posibilidad de inspeccionar los mensajes con las herramientas habituales. TLS más ACLs estrictas basta para la mayoría de instalaciones; consulta cifrado del payload MQTT para ver los pros y contras.
Solución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
| La app muestra un error justo al conectar | Usuario o contraseña incorrectos, o CONNACK "Not authorized" | Prueba las mismas credenciales en el cliente online; busca el código con la herramienta de reason codes |
| Error de TLS o de certificado | Certificado autofirmado o cadena incompleta | Usa un certificado de confianza pública o instala tu CA en la app |
Conectado, pero nada en mosquitto_sub | La ACL deniega la publicación, o username ≠ usuario del topic | Revisa los logs del broker y el patrón de la ACL |
| Faltan amigos en el mapa | Sin permiso de lectura sobre sus topics | Añade reglas read y vuelve a conectar la app |
| Las actualizaciones se detienen al rato en Android | La optimización de batería mata el servicio en segundo plano | Excluye OwnTracks de la optimización de batería; consulta desconexiones en segundo plano en Android |
OwnTracks en tu propio broker es uno de los despliegues MQTT útiles más sencillos: un móvil, un topic por dispositivo y unas pocas reglas de ACL. Asegura primero TLS y los permisos por usuario, verifica cada dirección con mosquitto_sub y mosquitto_pub, y solo después añade el Recorder o las integraciones de domótica.
Preguntas frecuentes
¿En qué topic publica OwnTracks?
Por defecto la app publica las ubicaciones en owntracks/<username>/<deviceID>, donde el username es el usuario MQTT y el device ID se define en la app. Los eventos, las tarjetas de información y los comandos usan subtopics como /event, /info y /cmd.
¿Puede OwnTracks usar un certificado autofirmado?
Sí, pero el móvil debe confiar en él: instala tu certificado de CA en los ajustes TLS de la app (Android) o en el dispositivo (iOS). Un certificado de una CA pública como Let's Encrypt evita este paso y funciona directamente en el puerto 8883.
¿Cómo se ven los amigos entre sí en OwnTracks?
La app se suscribe a owntracks/+/+ por defecto y muestra todas las ubicaciones que recibe. Qué amigos aparecen lo deciden por tanto las ACLs del broker: da a cada usuario permiso de lectura solo sobre las personas que deben verse.


