# Ayuda de notificaciones

> Todo lo necesario para poner el Notifier a funcionar junto a tu TeslaMate, y qué revisar cuando un evento no llega.

## Antes de empezar

Tres cosas, y la mayoría de instalaciones de TeslaMate ya tienen las dos primeras.

- TeslaMate con un broker MQTT. Mosquitto viene en el archivo Compose por defecto de TeslaMate.
- Docker en la misma máquina que TeslaMate, o en cualquier host que alcance el broker.
- Acceso saliente a internet. Sin puerto entrante, y tu TeslaMate no tiene que ser público.

## Instalar el Notifier

Tu TeslaMate no puede llegar a tu teléfono por sí solo, y una notificación de iOS solo puede llegar a través de Apple. El Notifier es el contenedor pequeño que vigila MQTT y entrega los eventos. Se ejecuta junto a TeslaMate y nunca abre un puerto.

### 1. Consigue tu token en la app

Abre HedgieMate, ve a Ajustes y luego a Notificaciones push y actívalas. La app muestra un token de vinculación que empieza por hm_ y el ID del servidor TeslaMate al que estás conectado. Copia ambos.

_El token vincula la app con el contenedor. Trátalo como una contraseña._

### 2. Añade el contenedor a tu archivo Compose

Abre el docker-compose.yml desde el que ejecutas TeslaMate y añade el servicio de abajo. Al quedarse en el mismo archivo comparte red con tu broker, así que MQTT_HOST es simplemente el nombre del servicio del broker.

```yaml
# add under services: in the docker-compose.yml you run TeslaMate from
  hedgiemate-notifier:
    image: hedgiemate/notifier:latest
    restart: unless-stopped
    depends_on:
      - mosquitto
    environment:
      HEDGIEMATE_USER_TOKEN: "hm_your_token_here"
      SERVER_ID: "your-server-uuid"
      MQTT_HOST: "mosquitto"
      MQTT_PORT: "1883"
      CAR_IDS: "1"
      LOG_LEVEL: "info"
    volumes:
      - hedgiemate-notifier-data:/data

# and under the top-level volumes: key, adding it if the file has none
  hedgiemate-notifier-data:
```

_El volumen es opcional. Conserva los nombres de los coches entre reinicios; sin él, el relay los rellena igualmente. Usa un volumen con nombre en vez de un bind mount: el contenedor se ejecuta con un usuario sin privilegios y no puede escribir en un directorio del host creado por Docker como root._

### 3. Arráncalo

Levanta el nuevo servicio. El resto de tu stack no necesita reiniciarse.

```bash
docker compose up -d hedgiemate-notifier
```

Después lee el registro. Un arranque correcto muestra la conexión al broker y los IDs de coche que vigila.

```bash
docker compose logs -f hedgiemate-notifier
```

### 4. Confírmalo en la app

La app marca el servidor como conectado en unos segundos. A partir de ahí puedes activar o desactivar cada evento, coche por coche.

_No llega nada hasta que el coche cambia de estado de verdad. Enchufarlo es la forma más rápida de ver el primer evento._

### Sin Compose

Si TeslaMate no se gestiona con Compose, docker run hace lo mismo. Apunta MQTT_HOST a un host que el contenedor pueda alcanzar.

```bash
docker run -d \
  --name hedgiemate-notifier \
  --restart unless-stopped \
  -e HEDGIEMATE_USER_TOKEN="hm_your_token_here" \
  -e SERVER_ID="your-server-uuid" \
  -e MQTT_HOST="your-mqtt-host" \
  -e CAR_IDS="1" \
  hedgiemate/notifier:latest
```

### Más de un TeslaMate

Ejecuta un Notifier junto a cada servidor. El mismo token de vinculación sirve en todos. Lo que los distingue en la app es el ID de servidor.

## Configuración

Todo se define con variables de entorno. Tres son obligatorias, el resto tiene valores por defecto que funcionan.

| Variable | Por defecto | Descripción |
| --- | --- | --- |
| `HEDGIEMATE_USER_TOKEN` (obligatoria) | ninguno | Token de vinculación de la app. Empieza por hm_. |
| `MQTT_HOST` (obligatoria) | ninguno | Nombre de host de tu broker MQTT. Dentro de Compose es el nombre del servicio, normalmente mosquitto. |
| `SERVER_ID` (obligatoria) | ninguno | UUID del servidor que da la app. El contenedor arranca sin él, pero entonces se ignoran los ajustes por servidor y por coche hechos en la app. |
| `MQTT_PORT` | `1883` | Puerto del broker. |
| `MQTT_USERNAME` | ninguno | Usuario del broker, si el tuyo requiere autenticación. |
| `MQTT_PASSWORD` | ninguno | Contraseña del broker. |
| `MQTT_CLIENT_ID` | `hedgiemate-notifier` | ID de cliente usado en el broker. Cámbialo si algo más ya se conecta con este. |
| `MQTT_TLS` | `false` | Ponlo en true para un broker con TLS. El puerto por defecto pasa entonces a 8883. |
| `MQTT_NAMESPACE` | ninguno | Debe coincidir con el MQTT_NAMESPACE de tu TeslaMate, si lo has configurado. Los topics pasan a ser teslamate/cars/#. |
| `CAR_IDS` | `1` | IDs de coche a vigilar, separados por comas, por ejemplo 1,2. Cada coche tiene su propia máquina de estados. |
| `LOG_LEVEL` | `info` | debug, info, warn o error. |
| `RELAY_URL` | `https://push.hedgiemate.com` | Dirección del relay. No hay motivo para cambiarla. |

## Todos los eventos

Cada fila es un interruptor independiente por coche en la app. Las actualizaciones de Live Activities no son notificaciones y no aparecen aquí.

| Notificación | Se envía cuando |
| --- | --- |
| Trayecto iniciado | `state → driving` |
| Trayecto finalizado | `state leaves driving` |
| Carga iniciada | `charging_state → Charging` |
| Carga completada | `charging_state → Complete` |
| Carga interrumpida | `charging_state leaves Charging without Complete` |
| Cargador conectado | `plugged_in → true` |
| Cargador desconectado | `plugged_in → false` |
| Batería baja | `battery_level ≤ BATTERY_LOW_THRESHOLD` |
| Nivel de batería alcanzado | `battery_level ≥ BATTERY_HIGH_THRESHOLD` |
| Grabación Sentry | `center_display_state = 7` |
| Actualización de software | `update_available → true` |
| Entrada en geocerca | `geofence set` |
| Salida de geocerca | `geofence cleared or changed` |
| Entrando en reposo | `state → asleep pending` |
| En reposo | `state → asleep` |
| Vehículo despierto | `state leaves asleep` |

## No llega nada

Recorre la lista de arriba abajo. La mayoría de casos son uno de los tres primeros.

### La app sigue diciendo que el servidor no está conectado

Comprueba con docker compose ps que el contenedor está en marcha y lee su registro. La causa habitual es un MQTT_HOST incorrecto: dentro de Compose es el nombre del servicio del broker, mosquitto, no localhost.

### El contenedor funciona, pero nunca se dispara un evento

CAR_IDS tiene que coincidir con el ID de coche que usa TeslaMate. TeslaMate numera los coches desde 1, y con varios se listan: CAR_IDS=1,2.

### MQTT conecta y el registro se queda en silencio

Si configuraste MQTT_NAMESPACE en TeslaMate, ponle el mismo valor al Notifier. Sin él los nombres de los topics no coinciden y el contenedor no tiene nada que leer.

### Llegan algunos eventos y otros nunca

Cada evento es un interruptor por coche en la app. Abre el servidor en Ajustes y revisa la lista de eventos de ese coche.

### Las notificaciones de batería nunca se disparan

BATTERY_LOW_THRESHOLD y BATTERY_HIGH_THRESHOLD valen 20 y 90 por defecto. Se envían una vez por sesión de carga, así que un coche que no ha cruzado el límite desde que empezó a cargar no manda ninguna.

### Las notificaciones dejan de llegar a los pocos días

Asegúrate de que el servicio tiene restart: unless-stopped para volver con el host. Después revisa iOS: un modo de concentración o los ajustes de notificaciones de la app pueden estar tragándoselas.

### Las Live Activities no aparecen

Las Live Activities deben estar permitidas para HedgieMate en Ajustes de iOS y tiene que haber una sesión activa. La Dynamic Island necesita un iPhone 14 Pro o posterior.

### El broker pide usuario o TLS

Define MQTT_USERNAME y MQTT_PASSWORD. Para TLS pon MQTT_TLS en true, con lo que el puerto por defecto pasa a 8883.

### Necesitas ver qué está haciendo

Pon LOG_LEVEL en debug, reproduce el caso y vuelve a dejarlo como estaba. Debug registra cada mensaje MQTT y cada decisión tomada a partir de él.

## Preguntas

### ¿Por qué necesito el Notifier?

Tu TeslaMate está en tu propio servidor y no puede llegar a tu teléfono, y una notificación de iOS solo la puede entregar Apple. El Notifier cubre ese hueco: vigila tus topics MQTT, detecta el cambio de estado y envía el evento para que se entregue.

### ¿Mi TeslaMate tiene que ser accesible desde internet?

No. El Notifier solo abre conexiones salientes, así que no hace falta exponer nada ni redirigir ningún puerto para que funcionen las notificaciones.

### ¿Qué sale realmente de mi servidor?

El tipo de evento, el nivel de batería, el estado de carga y el nombre del geofence si usas geofences. Las coordenadas y las rutas se quedan en tu TeslaMate, y la dirección de tu servidor no se envía nunca. Los datos de eventos se borran a las pocas horas.

### ¿Puede ejecutarse en una máquina distinta de TeslaMate?

Sí, siempre que alcance tu broker MQTT. Pon MQTT_HOST apuntando a ese host y comprueba que el puerto del broker es accesible desde ahí.

### ¿Funciona con varios coches?

Sí. Lista los IDs en CAR_IDS y cada coche tendrá su propio seguimiento de estado y sus propios interruptores en la app.

### ¿Qué pasa si el relay no está disponible?

El contenedor reintenta unas cuantas veces con una espera creciente y luego descarta ese evento. Sigue funcionando y procesa el siguiente cambio de estado con normalidad.

### ¿Guarda algo?

Solo una caché de los nombres de los coches, y únicamente si montas el volumen opcional. Todo lo demás vive en memoria mientras el contenedor esté en marcha.

### ¿Cómo lo actualizo?

Vuelve a descargar la imagen y recrea el servicio. Las notas de versión están en la página de releases de GitHub.

### ¿Cómo desactivo las notificaciones?

Desactívalas en la app o para el contenedor. Cada opción funciona por su cuenta y nada más en tu stack de TeslaMate depende de él.

## Código fuente

El Notifier es Go con licencia MIT. Revisa el código o abre una incidencia si algo falla.

- [Repositorio](https://github.com/LukStankovic/hedgiemate-notifier)
- [Versiones y changelog](https://github.com/LukStankovic/hedgiemate-notifier/releases)

Imagen: hedgiemate/notifier:latest
