Featured image of post Argus: Dashcam y Sentry Mode de Tesla en una Raspberry Pi

Argus: Dashcam y Sentry Mode de Tesla en una Raspberry Pi

Un solo binario que convierte una Raspberry Pi Zero 2 W en el almacenamiento USB del Tesla, con interfaz web para ver y administrar los clips.

Argus convierte una Raspberry Pi en el disco USB que el Tesla usa para Dashcam, Sentry Mode, LightShow y música. Además levanta una interfaz web para revisar los clips desde el celular o el notebook, sin sacar el pendrive del auto.

De qué se trata

Es un solo binario de Go, con la interfaz web (Next.js, export estático) embebida adentro. No hay contenedores, ni base de datos, ni stack de servicios. Se instala, se configura un archivo config.yaml y queda corriendo como servicio de systemd.

Por qué existe

El flujo normal con un pendrive es: estacionar, sacar el pendrive, llevarlo al computador, buscar el clip entre carpetas con nombres de timestamp, copiar, volver a enchufarlo. Y si se corrompe el sistema de archivos, te enteras cuando ya perdiste la grabación que necesitabas.

Argus se queda en el auto y resuelve eso desde adentro. Está fuertemente basado en las ideas de TeslaUSB, pero empaquetado como un binario único en vez de un conjunto de scripts.

Los dos modos

Esta es la idea central, y conviene entenderla antes de todo lo demás:

  • Present mode: la Pi se presenta al auto como dispositivo USB de múltiples LUN (TeslaCam, y opcionalmente LightShow y música). Localmente los discos quedan montados en solo lectura, para poder mirar sin corromper nada mientras el auto escribe.
  • Edit mode: se corta la presentación USB y los mismos discos quedan montados en lectura/escritura, para administrarlos por web o por Samba.

El cambio entre modos está secuenciado (desmontar, loops, gadget) para no dejar el sistema de archivos a medias. Y hay recuperación del gadget USB para cuando queda colgado, que en este tipo de equipos pasa.

Qué necesitas

  • Raspberry Pi Zero 2 W (es el objetivo principal).
  • Raspberry Pi OS Lite.
  • Una microSD con espacio suficiente para el sistema más las imágenes de disco.
  • Un cable USB de datos. No de solo carga. Esto se equivoca más seguido de lo que uno cree.

El kernel necesita soporte de USB OTG gadget (dwc2, libcomposite, configfs), systemd, y permisos de root para la instalación.

Instalación

1
2
3
curl -fsSL https://raw.githubusercontent.com/ulm0/argus/main/scripts/install-argus.sh | sudo bash
argus generate
sudo argus setup

El script instala el binario del último release según la arquitectura de tu Pi (arm64, armv7 o armv6). argus generate crea el config.yaml y argus setup arma las imágenes de disco y el servicio.

Si prefieres no ejecutar algo directo desde la red, clona el repo y corre sudo bash scripts/install-argus.sh, o baja el archivo argus_*_linux_* desde la página de releases e instálalo con sudo install -m 0755.

Opciones de setup:

Flag Default Para qué
--dir ~/.argus/ Directorio de datos
--config <dir>/config.yaml Ruta del archivo de configuración
--show-size 10G (ARGUS_SHOW_SIZE) Tamaño de la imagen de LightShow
--music-size 32G (ARGUS_MUSIC_SIZE) Tamaño de la imagen de música

Primer acceso

Después del setup, abres el navegador apuntando a la IP de la Pi en el puerto configurado (por defecto el 80), conectado a tu WiFi o al AP que levanta el equipo.

La UI pide login. Las credenciales por defecto son admin / argus, y hay que cambiarlas de inmediato desde Settings o editando auth_username y auth_password en la sección web: del config.yaml. La pantalla de login te lo recuerda mientras sigan puestas las de fábrica.

Qué trae adentro

Video y eventos
  • Navegación de SavedClips, SentryClips y RecentClips agrupados por evento.
  • Reproducción con cambio entre cámaras y soporte de HTTP range, así que puedes saltar dentro del clip sin bajarlo entero.
  • Telemetría extraída del SEI del video: GPS, velocidad, batería, marcha y más. Se muestra como overlay o se entrega como JSON.
  • Overlay HUD y mapa interactivo, ambos con escala configurable.
  • Descarga de un archivo suelto, o del evento completo en ZIP con todas las cámaras y su metadata.
  • Thumbnails por evento, generadas automáticamente desde la primera cámara disponible.
  • Agrupación por sesión para RecentClips.
  • Detección de clips encriptados: los archivos que el auto dejó bloqueados se marcan distinto en vez de fallar en silencio.
  • Ruta de archivo secundaria opcional, para tener a mano material histórico de TeslaCam.
Chimes
  • Subir, renombrar, borrar y escuchar chimes de bloqueo antes de aplicarlos.
  • Elegir el chime activo.
  • Programación: semanal, en una fecha específica, por feriado, o recurrente.
  • Grupos de chimes, para organizarlos y sortear dentro de un grupo.
  • Modo aleatorio: elige uno del grupo en cada evento, o uno nuevo en cada arranque.
  • Se validan las restricciones de duración que exige Tesla, así que no subes algo que el auto va a ignorar.
Lightshows, wraps y música
  • Lightshows: subir, descargar y borrar (par FSEQ + audio).
  • Wraps: subir, previsualizar con thumbnail, descargar y borrar.
  • Música: navegación jerárquica de directorios, subida simple o por chunks para archivos grandes, streaming, mover, renombrar, borrar, y crear o eliminar carpetas.
Limpieza y retención
  • Políticas por carpeta: cuántos eventos conservar en SavedClips, SentryClips y RecentClips.
  • Dry-run para ver qué se va a borrar antes de borrarlo.
  • Limpieza opcional en cada arranque, para que la tarjeta no se llene sola.
Red: WiFi, AP y Bluetooth
  • Access Point offline como fallback: SSID, passphrase, canal y DHCP configurables; modos force-on, automático y force-off; umbral de activación por RSSI; período de gracia y ciclos de reintento antes de levantarlo.
  • Compartir internet desde el AP: NAT para los clientes del AP a través del enlace de subida de la Pi (WiFi o Bluetooth).
  • Cliente WiFi: escanear redes, conectarse, ver las guardadas, olvidarlas y fijar prioridad de autoconexión.
  • Reconexión confiable: monitoreo de intensidad de señal, períodos de gracia y reintentos antes de que entre el AP. La idea es no quedar aislado por una caída momentánea de señal.
  • Tethering por Bluetooth (PAN): administrar el adaptador (encendido, modo visible), escanear, emparejar, conectar y desconectar dispositivos, para usar el teléfono como enlace de subida.
  • Detección de portal cautivo: responde a las sondas estándar de Apple, Android y Windows, así el teléfono no se queja de que la red “no tiene internet”.
Samba
  • Habilitar y deshabilitar el servicio desde la UI.
  • Fijar la contraseña de Samba y regenerar la configuración.
  • Reiniciar el servicio desde la página de Settings.

Es la vía cómoda cuando quieres mover muchos archivos de una: montas el share y trabajas con el explorador de archivos de tu sistema.

Notificaciones
  • Telegram: manda los clips de eventos de Sentry por bot. Calidad configurable (HD o SD) y cola offline con tamaño máximo, para que los eventos que ocurrieron sin conexión salgan cuando vuelva la red.
  • Webhook: HTTP POST a la URL que definas, con firma HMAC-SHA256 opcional para que el receptor pueda verificar que el mensaje viene de tu equipo.
Métricas y salud
  • Score de salud del almacenamiento, con alertas y recomendaciones.
  • Uso de cada partición por LUN.
  • Estadísticas de video y estimación de tiempo de grabación disponible por carpeta.
  • Métricas del sistema: uso de CPU, temperatura, frecuencia de reloj, RAM y consumo eléctrico.
Tiempo real
  • Server-Sent Events para streaming de logs en vivo y notificaciones de eventos de Sentry.
  • Dashboard de métricas del sistema con actualización periódica.
Arranque y confiabilidad

Esto es lo que hace que el equipo sobreviva sin supervisión adentro de un auto. Todo se configura desde la sección Startup & Reliability en Settings:

  • Presentar al auto automáticamente al arrancar.
  • Bloquear el arranque hasta que termine el pipeline de boot.
  • Limpieza al arrancar.
  • Chime aleatorio al arrancar.
  • Chequeos de fsck al arrancar.
  • Watchdog de hardware vía el watchdog.service de Debian (/etc/watchdog.conf), con timeout configurable (60 s por defecto).
  • Reaplicar el perfil de sysctl en cada arranque.

Algunos de estos cambios toman efecto en el siguiente reinicio del servicio o del equipo.

Los defaults que genera argus setup ya vienen pensados para operación desatendida: presentar al arrancar, bloquear hasta estar listo, limpieza al arrancar, fsck al arrancar, watchdog activo y sysctl reaplicado.

Actualizaciones
  • Chequeo de actualizaciones al arrancar.
  • Actualización automática del binario, opcional.
  • Canales: stable, beta y dev.

En el equipo, a mano: sudo argus upgrade.

Energía y preferencias
  • Reiniciar y apagar el equipo desde la UI.
  • Preferencias de visualización persistidas en el servidor, no en el navegador: unidad de velocidad (km/h o mph), escala del HUD y escala del mapa. Las configuras una vez y valen desde cualquier dispositivo.

Configuración

Todo vive en ~/.argus/config.yaml, que es la única fuente de verdad.

Sección Qué controla
installation comportamiento de arranque, usuario objetivo, directorio de montaje, ruta de archivo
disk_images nombres de las imágenes, particiones activas, fsck al arrancar
network puerto web, contraseña de Samba
web login (auth_enabled, auth_username, auth_password), allowed_hosts, límites de subida, carpetas de chimes y lightshows, secret_key de firma
offline_ap comportamiento del AP, modo forzado, compartir internet
system watchdog y sysctl al arrancar
telegram alertas, calidad de video, cola offline
webhook URL de callback y secreto de firma HMAC-SHA256
update estrategia y canal de actualización
viewer_prefs unidad de velocidad, escala del HUD, escala del mapa

CLI

1
2
3
4
5
6
7
argus run [--config ruta]
argus generate [--output ruta] [--force]
argus setup [--dir ruta] [--show-size 10G] [--music-size 32G]
argus upgrade [--yes]
argus remove [--yes] [--keep-images]
argus refresh-service
argus version

argus remove --keep-images desinstala pero deja las imágenes de disco, por si quieres reinstalar sin perder lo grabado.

Un par de notas de seguridad

La API rechaza requests cuyo Host no sea una identidad local (una IP, localhost, un nombre simple, *.local o *.lan), como defensa contra DNS rebinding. Si lo pones detrás de un reverse proxy con dominio real, agrega ese hostname a web.allowed_hosts.

Las sesiones son cookies firmadas con web.secret_key (se genera sola en el primer arranque), HttpOnly y SameSite=Strict, y se marcan Secure automáticamente si llegas por HTTPS.

Se puede desactivar el login con auth_enabled: false, pero solo tiene sentido en una red aislada y de confianza.

Dónde descargarlo

El código y los releases están en GitHub: github.com/ulm0/argus.

Los binarios de cada versión están en la página de releases, uno por arquitectura, sin comprimir.

Beep boop
Creado con Hugo
Tema Stack diseñado por Jimmy