Frigate + Mosquitto + Home Assistant: cómo encajan

Frigate + Mosquitto + Home Assistant: cómo encajan

1. Los tres componentes y sus roles

Componente Rol Qué hace
Frigate NVR (Network Video Recorder) Se conecta a las cámaras por RTSP, detecta objetos, graba y publica eventos en MQTT. También sirve vídeo en vivo y clips por API REST (puerto 5000).
Mosquitto Broker MQTT Es el cartero: recibe mensajes de quien publica y los reparte a quien está suscrito. No analiza ni transforma nada.
Home Assistant Centro de control Se suscribe al broker, recibe los eventos de Frigate y crea entidades (sensores, cámaras, etc.). También se conecta a la API de Frigate para vídeo en vivo y clips.

2. Cómo fluye la información

┌─────────────┐     publica      ┌──────────────┐     entrega      ┌──────────────────┐
│  FRIGATE    │ ───────────────► │  MOSQUITTO   │ ───────────────► │ HOME ASSISTANT   │
│ (NVR)       │   topics MQTT    │  (broker)    │   topics MQTT    │ (centro control) │
└─────────────┘                  └──────────────┘                  └──────────────────┘
       ▲                                                                      │
       │                                                                      │
       └──────────────── API REST (HTTP:5000) ────────────────────────────────┘
                        (para cámaras en vivo, clips, etc.)

Hay dos canales de comunicación entre Frigate y HA:

  1. MQTT (a través de Mosquitto) → para eventos y estados (detecciones, movimiento, sensores).
  2. API REST (HTTP en el puerto 5000) → para vídeo en vivo, clips, snapshots, configuración.

Por eso en HA ves dos integraciones distintas:

  • MQTT → recibe los eventos de Frigate.
  • Frigate (vía HACS) → se conecta a la API para el vídeo y los medios.

3. El papel de Mosquitto

Mosquitto no analiza ni transforma los mensajes. Solo hace de intermediario.

Topics típicos que publica Frigate

  • frigate/available → "estoy vivo"
  • frigate/icsee3/person → "hay 2 personas en la cámara icsee3"
  • frigate/ipcam0/motion → "hay movimiento en ipcam0"
  • frigate/events → "evento nuevo detectado"

Home Assistant se suscribe a

  • frigate/# (todo lo que empiece por frigate/)

Cuando Frigate publica un mensaje, Mosquitto lo reenvía inmediatamente a todos los suscritos (HA en este caso). Así HA sabe en tiempo real qué está pasando en las cámaras sin tener que preguntar a Frigate constantemente.

Ventajas de MQTT frente a preguntar por API

  • Es push (Frigate avisa), no pull (HA pregunta cada X segundos).
  • Es instantáneo y muy ligero.
  • HA no sobrecarga a Frigate con peticiones.

4. El lío del localhost / 127.0.0.1

Aquí está la clave de la confusión. localhost significa "esta misma máquina", pero depende de desde dónde se ejecute el comando.

Desde el HOST (tu ordenador físico)

localhost = tu ordenador (192.168.1.28).

Desde dentro de un CONTENEDOR Docker

localhost = el propio contenedor, no el host.

Cada contenedor tiene su propia interfaz de red localhost que apunta a sí mismo.

5. Por eso cada componente usa una dirección distinta

Componente Dónde corre ¿Qué es localhost para él? Dirección correcta al broker
Home Assistant Contenedor con --network=host El host (comparte red) 127.0.0.1 ✅
Frigate Contenedor con red propia (frigate-net) El propio Frigate mosquitto ✅
Cliente en el host El host físico El host localhost ✅

Por qué:

  • HA usa 127.0.0.1 → porque con --network=host comparte la red del host, así que 127.0.0.1 es el host donde Mosquitto expone el puerto 1883.
  • Frigate usa mosquitto → porque está en la red frigate-net con Mosquitto. Docker tiene un DNS interno que resuelve el nombre del servicio al contenedor correspondiente. localhost dentro de Frigate apuntaría a Frigate mismo (donde no hay broker).
  • El comando mosquitto_pub en el host usa localhost → porque se ejecuta en el host físico, donde Mosquitto escucha en 0.0.0.0:1883.

6. Mapa visual de las redes

┌────────────────────────────────────────────────────────────────┐
│                      HOST (192.168.1.28)                       │
│                                                                │
│   ┌──────────────────────────────┐                             │
│   │  Home Assistant              │                             │
│   │  --network=host              │                             │
│   │  localhost = 192.168.1.28    │                             │
│   └──────────────┬───────────────┘                             │
│                  │ 127.0.0.1:1883                              │
│                  ▼                                             │
│   ┌──────────────────────────────┐                             │
│   │  Puerto 1883 expuesto        │                             │
│   └──────────────▲───────────────┘                             │
│                  │                                             │
│   ┌──────────────┴───────────────┐    ┌──────────────────────┐ │
│   │  Red Docker: frigate-net     │    │  Contenedor          │ │
│   │  ┌─────────────┐  ┌────────┐ │    │  Windows (WinBoat)   │ │
│   │  │  Mosquitto  │  │Frigate │ │    │  Red propia          │ │
│   │  │  mosquitto  │◄─┤        │ │    └──────────────────────┘ │
│   │  └─────────────┘  └────────┘ │                             │
│   └──────────────────────────────┘                             │
│                                                                │
│   Comando en el host:  mosquitto_pub -h localhost ...          │
│                        (apunta a 192.168.1.28)                 │
└────────────────────────────────────────────────────────────────┘

Dentro de frigate-net:

  • Frigate y Mosquitto se ven por nombre de servicio (mosquitto).
  • Docker tiene su propio DNS que resuelve estos nombres automáticamente.

7. Resumen de direcciones correctas

Desde...Hacia Mosquitto usa...
Home Assistant (--network=host)127.0.0.1:1883
Frigate (en frigate-net)mosquitto:1883
Cliente en el hostlocalhost:1883
Otro dispositivo de la LAN192.168.1.28:1883

Cada uno usa la dirección que corresponde a "dónde está" respecto al broker.

8. Por qué 127.0.0.1 en HA y no otra cosa

Porque HA corre con --network=host, lo que significa que HA no tiene su propia red aislada: usa directamente la del host. Así que 127.0.0.1 dentro de HA es el host. Y Mosquitto expone el 1883 al host (0.0.0.0:1883), así que HA lo alcanza.

Si HA corriera sin --network=host (con bridge), tendrías que usar 172.18.0.1 o el nombre del contenedor Mosquitto (si estuvieran en la misma red).

9. Resumen conceptual

  1. Frigate → NVR que detecta y graba.
  2. Mosquitto → mensajería entre Frigate y HA (eventos en tiempo real).
  3. HA → recibe eventos vía MQTT y vídeo vía API.
  4. localhost → significa "esta máquina", y cambia según desde dónde lo llames.
  5. La red Docker → es lo que permite que contenedores se vean por nombre.

Tu setup actual es correcto

  • Frigate ↔ Mosquitto: misma red Docker, por nombre mosquitto ✅
  • HA ↔ Mosquitto: HA con red host, por 127.0.0.1 ✅
  • HA ↔ Frigate (API): HA con red host, por localhost:5000 ✅

10. Comandos útiles de verificación

Ver versión de Frigate

curl -s http://localhost:5000/api/version

Ver logs de Frigate

docker logs frigate -f

Ver logs del broker

sudo tail -20 /home/martinez/.winboat/mosquitto/log/mosquitto.log

Probar MQTT desde el host

mosquitto_pub -h localhost -p 1883 -u frigate -P altisidora112 -t test -m "hola"

Suscribirse a los topics de Frigate

timeout 15 mosquitto_sub -h localhost -p 1883 -u frigate -P altisidora112 -t 'frigate/#' -v

Ver config MQTT de Frigate

grep -A 8 "^mqtt:" /webdata/http/frigate/config/config.yml

11. Notas de mantenimiento

  • Cada vez que cambies el config.yml de Frigate, reinicia con:
    cd ~/.winboat
    docker compose down frigate
    docker compose up -d frigate
    No basta con docker compose restart ni con el botón "Restart" de la web.
  • Si algo falla, revisa el log del broker: es la mejor fuente de verdad sobre si Frigate está conectado.
  • Verifica siempre con mqtt.dump en HA si los mensajes llegan.