Articulo

De TeslaMate a mi propia app: como acabe entendiendo mejor mi Tesla

Una cronica tecnica sobre self-hosting, datos reales, IA como copiloto de desarrollo y la diferencia entre tener metricas y tener una herramienta util.

Hay proyectos que empiezan con una frase aparentemente sencilla: voy a reinstalar esto que ya tuve montado. Y luego, unas horas despues, estas peleandote con DNS, Docker, Cloudflare, rutas absolutas, Grafana, tokens de Tesla, una app en Next.js, una base de datos PostgreSQL y una IA ayudandote a convertir un panel tecnico en una experiencia movil bastante mas decente.

La idea inicial era recuperar TeslaMate para mi Tesla Model 3 y dejarlo corriendo 24/7 en un servidor Oracle. Nada especialmente exotico: TeslaMate es una de las herramientas mas conocidas para registrar datos de un Tesla de forma privada.

Pero la historia no termino en instalar TeslaMate. Termino en una app propia, mobile-first, servida desde `misubdominio`, que lee los datos de TeslaMate y los presenta como una herramienta pensada para usar desde el movil, no como un panel de administracion disfrazado.

1) Datos propios, servidor propio

La motivacion era bastante simple: queria volver a tener historico real del coche sin depender de una app externa de pago y sin entregar todos los datos a un tercero. TeslaMate encaja muy bien en esa filosofia porque funciona con Docker, PostgreSQL, MQTT y Grafana.

Conviene decirlo desde el principio: la base de este proyecto no es mia. Se apoya en TeslaMate, un registrador de datos self-hosted para Tesla mantenido como software libre, y en TeslaMateApi, una API REST creada por Tobias Ehlert para exponer en JSON los datos que TeslaMate recoge. Mi parte fue montar, adaptar, proteger y construir una experiencia propia encima de ese trabajo previo.

La arquitectura base quedo apoyada en un servidor Oracle con Ubuntu, Docker Compose, Nginx, un subdominio dedicado y HTTPS con Certbot.

  • TeslaMate para registrar viajes, cargas, posiciones, autonomia, firmware y costes.
  • PostgreSQL como fuente historica.
  • Grafana como herramienta avanzada de analisis.
  • Mosquitto como pieza MQTT.
  • Nginx como reverse proxy.

2) DNS: el dominio no manda donde crees

El primer bloqueo no fue Tesla, ni Docker, ni PostgreSQL. Fue DNS.

El dominio tenia parte de su vida pasando por Cloudflare. Yo podia crear registros en DonDominio, pero eso no significaba que Internet los estuviera usando. Los nameservers autoritativos eran los de Cloudflare, asi que el subdominio creado en DonDominio no resolvia donde tocaba.

La solucion fue crear `misubdominio` en Cloudflare, no solo en DonDominio. A partir de ahi el dominio empezo a resolver, Certbot pudo emitir el certificado y Nginx pudo servir el sitio con HTTPS.

  • Antes de tocar configuracion, confirma quien tiene autoridad real sobre el dominio.
  • Crear registros en una zona que no es autoritativa solo da una falsa sensacion de control.
  • Cloudflare puede estar en medio aunque parte de la gestion siga pareciendo estar en el registrador.

3) Docker tambien tiene dias torcidos

El segundo problema fue mas clasico: PostgreSQL.

El stack arranco mal porque la imagen `postgres:18` introducia un comportamiento de layout que chocaba con el volumen esperado. Resultado: la base de datos quedaba `unhealthy` y TeslaMate no podia levantar.

La solucion fue pragmatica: bajar a `postgres:17`, recrear los volumenes del stack y relanzar. No siempre merece la pena pelearse con la version mas nueva si lo que necesitas es estabilidad y compatibilidad con una aplicacion concreta.

4) Grafana es potente, pero no siempre es una app

TeslaMate trae dashboards de Grafana muy completos. Son fantasticos para explorar datos, validar que todo funciona y hacer analisis tecnico. Pero en el movil la experiencia no siempre se siente como una app diaria.

Yo no queria abrir Grafana para responder preguntas sencillas: cuanta bateria tiene ahora mismo el coche, cuanto me ha costado cargar este mes, que cargas estan sin precio configurado, que viajes han sido mas eficientes o donde pasa mas tiempo parado.

Asi nacio la segunda fase: mantener TeslaMate como motor de datos, pero construir una capa propia encima.

5) Una app encima de TeslaMate

La raiz del subdominio dejo de apuntar directamente a TeslaMate y paso a servir una app Next.js.

La idea no era reemplazar TeslaMate. Era darle una interfaz mas cercana a una app movil moderna, manteniendo el backend fiable que ya existia.

La app se construyo con Next.js, TypeScript, Recharts para graficos, Leaflet para mapas, lectura server-side de TeslaMateApi y lectura directa de PostgreSQL para analisis mas avanzados.

  • `https://misubdominio/` sirve la app propia.
  • `https://misubdominio/tm/` mantiene TeslaMate clasico.
  • `https://misubdominio/tm/grafana/` mantiene Grafana.

6) Seguridad: la ruta fea se queda donde toca

Una decision importante fue separar bien la app nueva del acceso clasico. No queria que TeslaMate o Grafana quedaran expuestos sin proteccion, pero tampoco queria que toda la raiz del subdominio lanzara el popup de basic auth del navegador.

La solucion fue dejar la app Next en `/` con su propio login, y proteger con basic auth solo el legado: `/tm/`, `/tm/grafana/` y las rutas absolutas necesarias que TeslaMate genera internamente.

Aparecio una trampa curiosa: en movil salia el popup de basic auth aunque no se entrara en `/tm/`. La causa era el prefetch de Next sobre enlaces protegidos. Safari intentaba precargar rutas como `/tm` y `/tm/grafana`, y eso disparaba el login del navegador. La solucion fue desactivar el prefetch en esos enlaces.

7) La IA como copiloto de producto

La parte mas interesante del proyecto fue trabajar con IA como compañera de desarrollo.

No se trato solo de pedir instala TeslaMate o hazme una app bonita. La IA fue util para documentar cada paso, diagnosticar problemas de Docker, Nginx, DNS y rutas, leer documentacion, proponer una arquitectura segura, construir pantallas en Next.js y convertir paneles tecnicos en informacion accionable.

Lo importante no fue que la IA generase codigo. Lo importante fue que sostuvo el contexto durante una sesion larga y fue encadenando decisiones: primero levantar el stack, luego protegerlo, luego exponerlo bien, luego crear una app y luego detectar que algunos datos eran engañosos.

8) Cuando el dato bonito miente

Uno de los momentos mas utiles llego cuando la home de la app mostraba un 71% de bateria. Yo sabia que era imposible: el coche estaba bastante mas bajo.

El endpoint live de TeslaMateApi no siempre devuelve estado fresco del coche, especialmente si no hay feed live en ese momento. La app caia entonces a la ultima carga registrada. Pero la ultima carga podia ser mas antigua que el ultimo viaje.

La solucion fue cambiar la jerarquia de confianza: si hay estado live, usar estado live; si no, leer la telemetria mas reciente desde la tabla `positions`; si no, usar el ultimo viaje; y como ultimo recurso, usar la ultima carga.

  • Una UI bonita puede esconder un dato incorrecto.
  • Una herramienta de datos tiene que saber de donde sale cada numero.
  • La frescura del dato importa tanto como su formato visual.

9) De coste de carga a Charging Intelligence

Otra parte que crecio bastante fue la seccion de carga.

TeslaMate permite asociar geovallas y tarifas. Eso sirve para calcular cuanto cuestan las sesiones de carga en casa, en Superchargers o en otros sitios. Pero hay una limitacion practica: si cambias una tarifa despues de que una sesion ya tenga coste calculado, TeslaMate no recalcula automaticamente el historico.

Eso explica un error muy humano: poner `0,7 €/kWh` en lugar de `0,07 €/kWh` y ver costes absurdos en cargas pasadas.

  • Resumen por Casa, Supercharger y Terceros.
  • Coste por mes, ubicacion y franja horaria.
  • Eficiencia de carga, comparando energia usada frente a energia anadida.
  • Alertas de cargas con energia real pero coste cero.
  • Recalculo historico masivo usando las tarifas actuales.
  • Deteccion de anomalias de coste o eficiencia.

10) Viajes: no basta con distancia y consumo

La seccion de viajes tambien evoluciono. Al principio era una lista con distancia, duracion, consumo y ruta. Despues llego el drill-down: una ficha por viaje con mapa, perfil de velocidad, elevacion, temperatura, potencia, coste energetico estimado y un score de eficiencia.

El score no intenta ser una verdad universal. Es una heuristica util: compara un trayecto con otros viajes similares, teniendo en cuenta velocidad media, distancia, temperatura, velocidad maxima y desnivel.

Tambien añadí etiquetas automaticas como `casa`, `trabajo`, `ocio` y `roadtrip`. Para detectar trabajo, por ejemplo, no basta con mirar una direccion: se cruzan patrones de salidas desde casa por la mañana entre semana y vueltas por la tarde.

11) Reposo: el dato necesitaba contexto

Otra mejora curiosa fue la pantalla de reposo. Mostrar 160 horas en reposo no dice gran cosa si no sabes sobre que total se calcula. No es lo mismo 160 horas en un año que 160 horas en una semana.

La pantalla paso a mostrar algo mas explicito: `160.8 / 168 h` y `96% del tiempo visible`.

De golpe, el dato se entiende. En los ultimos 7 dias, el coche ha pasado casi todo el tiempo parado. Eso sirve para razonar sobre ventanas de carga, uso real, disponibilidad y habitos.

160.8 / 168 h
96% del tiempo visible

12) Que aprendi montando todo esto

La primera leccion es que self-hosting no significa gratis. Significa que pagas con atencion. DNS, TLS, Docker, logs, rutas, versiones de imagenes, seguridad y backups siguen siendo tu responsabilidad.

La segunda es que TeslaMate es una base excelente, pero no necesariamente la interfaz final para todo el mundo. Como motor de datos es muy potente. Como experiencia movil diaria, se puede mejorar bastante con una capa propia.

La tercera es que una app de datos tiene que ser honesta con sus fuentes. En cuanto hay datos live, historicos, caches, viajes y cargas, la pregunta importante deja de ser que numero muestro y pasa a ser que numero es el mas fresco y fiable para esta pantalla.

Y la cuarta es que los errores reales son el mejor material para escribir: el DNS que no resolvia, el Postgres que no arrancaba, Grafana redirigiendo mal, el popup de basic auth apareciendo en movil y el SOC imposible del 71%.

13) Referencias y creditos

Este proyecto se apoya en software libre y herramientas de terceros. Las piezas mas importantes son TeslaMate, su documentacion oficial, TeslaMateApi y la lista de proyectos relacionados con TeslaMate.

TeslaMate esta licenciado bajo AGPLv3. TeslaMateApi esta licenciado bajo MIT. Sin esos proyectos, esta app propia habria sido un proyecto muchisimo mas grande.

Lo interesante aqui no fue sustituir ese trabajo, sino usarlo como cimiento para construir una capa mas comoda, personal y orientada al movil.

El resultado final es una instalacion privada con dos capas: TeslaMate sigue siendo el registrador fiable, con Grafana como herramienta avanzada, y la app propia es la capa diaria, pensada para consultar desde el movil sin pelearse con dashboards.

No es un producto comercial. Es una herramienta personal. Pero precisamente por eso tiene algo interesante: esta hecha alrededor de preguntas reales, no alrededor de una lista generica de features.

Una buena app de datos no empieza cuando pintas el primer grafico. Empieza cuando el primer numero que no cuadra te obliga a preguntarte de donde sale.

Anterior

Chatterbox en Mac M4 sin humo: lo que funciona, lo que falla y como sacar audio util en español

Siguiente

Mi hijo encontró los bugs: cómo montamos con IA un mapa de España para estudiar jugando

Relacionados

Seguir leyendo

2026-04-27/11 min

Mi hijo encontró los bugs: cómo montamos con IA un mapa de España para estudiar jugando

Una crónica divulgativa sobre aprendizaje, IA y producto: de una necesidad doméstica a una web interactiva donde mi hijo Héctor ayudó a detectar errores, explicar fallos y guiar a Codex hasta dejar el juego como tocaba.

Leer articulo
2026-02-14/14 min

Controlar tu PC sin exponerlo: modelo pull con agent + cola (patron seguro y pragmatico)

En vez de abrir puertos en tu PC, montas un control plane en tu servidor y haces que el PC sea quien llame: poll a una cola, lease de trabajos y autenticacion por scopes.

Leer articulo