Integraciones externas en Gladys Assistant

Estado: borrador, abierto al debate
Discusión: este tema del foro


Hola a todos,

Os propongo una nueva funcionalidad que cambiará la forma en que se desarrollan las integraciones en Gladys.

Es un proyecto largamente madurado, y me encantaría tener vuestros comentarios, ideas y sugerencias para seguir mejorándolo :slight_smile:

¿Por qué ahora?

Desde el inicio del proyecto, todas las integraciones de Gladys viven en el núcleo. Cualquiera puede desarrollar una o mejorarla mediante una solicitud de extracción, pero cada línea pasa por mi revisión antes de ser fusionada. Esta elección tiene una enorme ventaja: cuando instalas Gladys, todo está listo. No hay tienda, no hay dependencias que gestionar, no hay plugins rotos después de una actualización. Es una de las razones por las que Gladys es más fácil de usar que otras soluciones.

Pero este modelo tiene un límite, y estoy a punto de alcanzarlo. Existen miles de marcas, protocolos, servicios, y cualquier modificación de una integración, incluso un simple cambio de traducción, debe pasar por mí: revisión, fusión, lanzamiento. No es escalable, y me convierte en el cuello de botella del proyecto.

Podríamos pensar que Matter resolverá este problema. Matter llega, y a mi parecer se convertirá en el protocolo de referencia que controlará todos los dispositivos conectados en el futuro: un solo estándar, todos los dispositivos compatibles nativamente, sin necesidad de una integración por marca. Excepto que no sabemos cuándo este futuro será una realidad, y el proyecto no puede permitirse esperar indefinidamente a que el parque instalado cambie.

Y sobre todo, Matter solo cubre el control de los dispositivos conectados. Queda todo un aspecto de integraciones que no tiene nada que ver con dispositivos: la comunicación (Telegram, etc.), el clima (OpenWeather, Météo France), los calendarios (CalDAV, Google Calendar)… Todo esto nunca pasará por Matter. Si queremos que Gladys se convierta en un proyecto con la misma ambición que Home Assistant, debemos permitir la instalación de integraciones externas.

Esta RFC propone, por lo tanto, abrir Gladys a las integraciones externas: integraciones desarrolladas y publicadas por cualquiera, sin validación previa de mi parte, instalables con un clic desde la interfaz.

El desafío es hacerlo sin sacrificar lo que hace a Gladys. Concretamente, cuatro exigencias no negociables han guiado esta propuesta:

  1. Una integración que falle nunca debe hacer fallar a Gladys.
  2. No hay estados incomprensibles: si una integración deja de responder, el usuario debe verlo y poder actuar.
  3. Las interfaces deben seguir siendo limpias y coherentes entre sí.
  4. Cero manipulación técnica para el usuario. Sin terminal, sin YAML, sin reinicio manual.

Lo que esta RFC no propone

  • No se reemplazan las integraciones nativas. Las integraciones de protocolos universales (Matter, Zigbee, Z-Wave…) seguirán siempre en el núcleo, preinstaladas, mantenidas como hasta ahora. El nuevo sistema se añade al lado, y se dirige a todas las integraciones de protocolos o servicios que no son universales: ahora, cualquiera podrá crear una integración separada.
  • No se busca la compatibilidad con las integraciones de Home Assistant / HACS. Están profundamente acopladas a la arquitectura de HA; ejecutarlas en Gladys es irrealista. Sin embargo, me inspiro en su modelo de distribución (depósito Git + manifiesto + tienda).
  • No se permite a las integraciones inyectar código en la interfaz. Es una elección asumida, detallada más abajo.

Arquitectura propuesta

Un contenedor Docker por integración

Gladys ya funciona exclusivamente en Docker, con el socket Docker montado. Nos apoyamos en esto: cada integración externa funciona en su propio contenedor, creado y supervisado por el núcleo de Gladys.

Este contenedor está bloqueado al máximo:

  • sin modo privilegiado, sin acceso al socket Docker
  • sin acceso a la base de datos ni a los archivos de Gladys
  • sistema de archivos de solo lectura, excepto un pequeño directorio de datos que le es propio
  • límites estrictos de memoria, CPU y número de procesos
  • red restringida a los hosts que la integración ha declarado en su manifiesto.

Una integración que se bloquea, que pierde memoria o que entra en un bucle infinito queda confinada en su caja. Y una integración malintencionada o mal escrita no puede «ir a modificar la base de datos en directo»: el archivo SQLite simplemente no existe en su sistema de archivos.

Esta elección aporta un importante beneficio adicional: las integraciones ya no están limitadas a Node.js. Una imagen Docker puede contener Python, Go, Rust. Cada autor incluye sus dependencias en su imagen, y todo el proceso de construcción se realiza previamente, en el momento de la publicación, nunca en tiempo de ejecución en el usuario.

A largo plazo, esta elección también aporta algo interesante: ¡será posible ejecutar integraciones remotas!

Toda la comunicación pasa por la API-hoste

Una integración nunca toca los internos de Gladys. Su única puerta de entrada es una API-hoste: la integración dialoga con el núcleo a través de una API REST HTTP JSON muy simple, en el mismo espíritu de lo que ya existe en Gladys hoy.

Las primitivas previstas para la v1:

  • declarar dispositivos y sus funcionalidades, en el modelo dispositivo/función existente de Gladys;
  • publicar estados y recibir comandos
  • almacenar su configuración y sus secretos (almacenados en la base de datos del núcleo)
  • escribir registros estructurados
  • solicitar una descubierta de red mediada: es el núcleo, que tiene acceso a la red del host, el que realiza los escaneos mDNS y el passthrough de los dispositivos USB, y luego transmite los resultados. La integración nunca necesita el modo host ni acceso directo al hardware.

Este contrato a nivel de protocolo es el verdadero fundamento de la propuesta. El contenedor es «solo» el mecanismo que hace que este contrato sea imposible de eludir. También permite hacer evolucionar el esquema interno de Gladys sin romper el ecosistema: siempre que la API-hoste sea estable, las integraciones siguen funcionando.

Supervisión: sin estados zombis

El núcleo incluye un supervisor que gestiona el ciclo de vida completo de cada integración, con una máquina de estados siempre visible en la interfaz:

Instalada → Inicio → En funcionamiento → Degradada → En fallo → Detenida

El supervisor envía un latido regular a cada integración. ¿Sin respuesta? La integración pasa a «Degradada» y se reinicia automáticamente, con un retraso creciente entre los intentos. Si se bloquea en bucle, dejamos de insistir: pasa a «En fallo», y el usuario ve un mensaje claro con los registros de la integración y las acciones posibles (reiniciar, desactivar, informar al desarrollador).

Todas las llamadas entre el núcleo y la integración tienen un tiempo de espera. Una integración que se bloquea nunca bloquea a Gladys.

El objetivo: que no exista ningún estado no observable o no recuperable. Cuando algo no va bien, lo vemos, lo entendemos, actuamos, desde la interfaz.

Interfaz: declarativa, sin código arbitrario

Probablemente, esta es la elección más discutible de esta RFC, así que tanto mejor asumirla claramente.

Las integraciones no proporcionan componentes de interfaz. Describen sus necesidades, y es Gladys quien renderiza la interfaz con su propio sistema de diseño:

  • la configuración se describe mediante un esquema (tipo JSON Schema): Gladys genera el formulario, la validación, los mensajes de error, de manera idéntica para todas las integraciones;
  • los dispositivos se declaran en el modelo dispositivo/función existente: se muestran automáticamente con las mismas tarjetas y los mismos controles que las integraciones nativas;
  • para necesidades más específicas, se definirá y enriquecerá progresivamente un vocabulario de widgets declarativos, en función de las necesidades reales que surjan de los desarrolladores.

Lo que cuesta: un desarrollador no podrá crear una pantalla totalmente personalizada. Lo que garantiza: una interfaz coherente en todas partes, ninguna vulnerabilidad XSS proveniente de un plugin, ningún conflicto de versiones front-end y una experiencia idéntica para el usuario, independientemente del origen de la integración. Dadas las prioridades del proyecto, creo que es el buen compromiso. Pero es exactamente el tipo de punto sobre el que espero sus comentarios.

Distribución: una tienda en Gladys

El usuario descubre e instala las integraciones desde una tienda integrada en la interfaz. Instalar = un clic. El núcleo descarga la imagen, la verifica, lanza el contenedor y muestra el formulario de configuración si la integración necesita credenciales. Sin terminal, sin archivos para editar.

Cada integración se publica con un manifiesto: nombre, versión, versiones de Gladys compatibles, permisos solicitados (hosts de red, dispositivos), esquema de configuración. Los permisos se muestran al usuario antes de la instalación, como en una tienda móvil.

Todas las integraciones externas son «basadas en la comunidad»: no pretendo revisarlas una por una, eso sería volver al cuello de botella que esta RFC busca eliminar. Se muestra una advertencia clara durante la instalación para recordar que se trata de código de terceros no auditado. Es el papel de los permisos declarados y del aislamiento por contenedor lo que hace que esta apertura sea aceptable.

Desarrollar una integración en la era de la IA

Un punto que lo cambia todo en comparación con hace unos años: desarrollar una integración se ha vuelto muy fácil gracias a la IA. Mi intención es proporcionar una plantilla de integración oficial, limpia y documentada. A partir de esta plantilla, con Claude Code/Cursor, crear una integración para un servicio o protocolo dado se convierte en un asunto de unas pocas horas en lugar de unos pocos días.

Es lo que hace que esta propuesta sea realmente poderosa: en lugar de esperar a que yo desarrolle o revise cada integración, la comunidad podrá producir muchas más, mucho más rápido.

El ritmo de aparición de nuevas integraciones ya no estará limitado por mi disponibilidad.

Hoja de ruta propuesta

  1. Definir la API-huésped y el SDK, y luego proponer a algunos desarrolladores que creen las primeras integraciones externas sobre ella.
  2. Especificar el manifiesto y el esquema de interfaz declarativa.
  3. Implementar el supervisor y el lanzamiento de contenedores bloqueados, como prueba de concepto en una sola integración.
  4. Construir la tienda y el proceso de instalación, con la plantilla de integración oficial.
  5. Abrir la publicación a todos.

Mi objetivo es sacar este nuevo sistema lo más rápido posible: con las IA, es posible ir muy rápido.

Planeo comenzar el trabajo esta misma semana con Fable 5, mientras esté disponible.

Preguntas abiertas a la comunidad

  • ¿Les parece aceptable el compromiso de «solo interfaz declarativa»? ¿Qué casos de uso reales no entrarían en esto?
  • ¿Qué primitivas faltan en la API-huésped para sus integraciones soñadas?
  • ¿Debemos limitar la v1 a las integraciones en Node.js (con un SDK oficial) para simplificar, o abrir todos los lenguajes desde el principio?

Esta propuesta es un punto de partida, no una decisión grabada en piedra: sus críticas, objeciones e ideas son exactamente lo que espero para mejorarla :slight_smile:

Hola @pierre-gilles,

No soy experto en domótica, pero, por supuesto, me alegra mucho saber que existe la posibilidad de una integración personalizada según las necesidades.

Supongo que si una extensión es muy relevante y muy solicitada, finalmente se integrará en el núcleo de Gladys, ¿verdad?

¿No habrá problemas de rendimiento si hay alrededor de cien contenedores Docker que pasan por un solo canal a través de la API Host?

Llevo menos de dos meses con Gladys, pero estoy asombrado por la reactividad y la velocidad de desarrollo de esta herramienta.

¡Muchas gracias!

Es cierto que es un gran cambio, pero también creo que es necesario. Tú solo no puedes desarrollar, revisar y mantener todas las integraciones, incluso con IA. Incluso con excelentes contribuyentes, la revisión de las contribuciones te llevará mucho tiempo.

Además, aunque es preferible, también hay que reconocer que la integración MatterBridge puede tener sus límites cuando el protocolo Matter no soporta ciertas funcionalidades.

Estoy de acuerdo con tu enfoque de separar bien el núcleo y las integraciones. No permitir que las integraciones accedan al sistema también es un muy buen punto. También señalaré que las integraciones deben ser gratuitas y de código abierto para ser aceptadas.

En cuanto a una versión v1, añadiría el lenguaje Python, que es muy utilizado en la domótica y fácil de aprender. Además, los agentes de IA funcionan muy bien para generar código Python.

¡Buena pregunta! Pero tranquilo: la API no es una cola única donde las solicitudes pasan una por una. Es un servidor HTTP, exactamente como el que Gladys ya expone hoy para el frontend.

Al ser asíncrono, Node, mientras una solicitud espera la base de datos, el bucle de eventos procesa muchas otras en paralelo. 100 contenedores golpeando sobre él es una carga ridícula.

El verdadero punto de atención no es la API, es la RAM. Un contenedor en sí mismo no pesa casi nada (no es una VM), pero cada proceso Node lleva el runtime V8, por lo que hay que contar con 50-80 MB de RAM utilizados por integración según lo que haga. Con una decena de integraciones, no hay problema en un mini-PC. Con cientos funcionando simultáneamente, ahí depende de la RAM disponible que tengas :smiley:

En la práctica, la mayoría de las instalaciones tendrán entre 5 y 20 integraciones externas, lo cual es totalmente cómodo en la mayoría de los mini-PC.

¡Gracias!!

De todos modos, la API será totalmente abierta y documentada, por lo que cada desarrollador podrá usarla como desee :wink:

El verdadero tema es ver qué ejemplos proporcionamos y en qué lenguajes. Personalmente, no tengo experiencia en Python, por lo que podría generar un ejemplo con IA, pero no estaría en condiciones de revisarlo, validarlo o ayudar eficazmente a los usuarios.

Pero esa es la fuerza de estas integraciones externas: cada uno será libre y no seré el cuello de botella :smiley:

Para la futura tienda de integraciones, me gustaría optar por una arquitectura 100 % descentralizada, sin validación manual, sin revisión y sin necesidad de pedir autorización para publicar.

En concreto, cada desarrollador publicará simplemente su integración en su propio repositorio de GitHub, añadiendo un tema específico. Este repositorio seguirá siendo la fuente de verdad: cada uno mantiene el control de su código y de sus actualizaciones.

Por su parte, un indexador completamente automático (una GitHub Action pública) recorrerá regularmente todos los repositorios que lleven este tema. Verificará únicamente criterios objetivos: presencia de un manifiesto válido, cumplimiento del esquema, accesibilidad de las imágenes, coherencia de las versiones, etc. Si todo es conforme, la integración se añadirá automáticamente a un index.json estático, que luego se distribuirá a través de GitHub Pages y un CDN.

Las instancias de Gladys descargarán únicamente este índice estático, lo que garantiza un alto rendimiento, evita las limitaciones de la API de GitHub y permite poner fácilmente el contenido en caché. Y aunque el indexador llegara a estar indisponible, el último índice publicado seguiría funcionando.

El objetivo es simple: nadie necesita mi aprobación para publicar una integración. Las únicas reglas son las verificadas automáticamente por el script, cuyo código también será público. Así, cada uno podrá entender inmediatamente por qué su integración está indexada… o por qué no lo está.

Bueno, no lo he entendido todo :face_with_head_bandage:, pero me parece una idea excelente porque permitirá dar un gran salto en cuanto a las posibilidades de Gladys para competir con HA. Y esto permitirá que cada uno pueda contribuir « fácilmente » a la mejora de Gladys, que mantendrá un núcleo intacto.

Sería bueno, en una segunda fase, dejar la opción de usar otra plataforma de repositorios Git como GitLab y Codeberg.

¡Hola @contributors :waving_hand:

¡He avanzado mucho en este tema hoy! He pasado el día redactando la especificación técnica con Fable 5.

La especificación de la implementación está disponible aquí:

https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md

Mi objetivo es avanzar rápidamente en este desarrollo, manteniendo un alto nivel de calidad.

Como siempre, todos vuestros comentarios son bienvenidos. :slightly_smiling_face:

3 nuevos repositorios creados:

Implementación en curso por 3 agentes Fable 5:

Voy por delante porque Fable 5 no está garantizado que se quede después del 19 de julio.

Si tenéis comentarios, por supuesto todo sigue siendo modificable, ¡me encantaría recibir vuestros comentarios!

Creo que es una buena idea que las integraciones puedan gestionarse de esta manera.

Menos barreras de idioma y tiempo ahorrado por tu parte, ya que validar cada PR te lleva mucho tiempo, especialmente en este momento con la IA.

Por otro lado, concretamente, si tomamos el ejemplo de la integración de Meteo France, hay la parte de la API que gestionar con la integración, pero también la parte del widget y el disparador de escena y la acción de escena.
¿Deberíamos dividirlo en varias partes para separar la parte de integración de la parte de widgets y escena? Habría entonces un PR para el núcleo con los widgets/escena y la parte de integración de Meteo France para el store de Gladys?

¿Y las integraciones ya existentes? ¿Deberían pasar al store o las vas a dejar como están?

A largo plazo creo que muchas integraciones pueden salir del núcleo, pero es importante dejar claro qué pertenece al núcleo y qué es externo. Como los externos no pueden acceder al hardware, ya podemos decir que es el núcleo el que gestiona los « protocoles » como Zigbee, Zwave y Matter, ya que necesitamos acceder a los dongles USB. La IHM y el supervisor también son parte del núcleo. Sería bienvenida una lista con explicaciones.

Para agregar un nuevo idioma más fácilmente propongo dos cosas:

  • Proponer un « JSON Schema » para validar la estructura de los mensajes JSON
  • Un servidor bajo Docker que permita validar un SDK. La idea sería la siguiente:
    • Desarrollo un SDK en lenguaje X a partir de la versión JS oficial con las mismas pruebas de validación
    • Una vez finalizado el desarrollo, lanzo el servidor de validación de SDK
    • Lanzo las pruebas de validación conectándome al servidor
    • Mi SDK está validado cuando el 100% de las pruebas son válidas
      Además, este método permite automatizar el desarrollo y la validación mediante un agente de IA.

Otro punto es hasta qué punto hay que limitar los recursos de las integraciones externas para evitar tener monstruos y romper la experiencia Gladys. Dependiendo del lenguaje, puede variar desde lo simple hasta el triple en memoria y carga de CPU. Si somos demasiado estrictos, nos cerramos la puerta a muchos lenguajes interpretados (Python, Ruby e incluso JS con NodeJS), y si es demasiado flexible, entonces necesitaremos una máquina con mucha RAM. Por lo tanto, adiós a las máquinas como las Raspberry Pi, los NAS, la Freebox, etc. Además, la RAM ahora es muy cara.
Bueno, siendo desarrollador de C/C++, estoy más del lado estricto :slight_smile:

Punto de situación: Fable 5 ha trabajado bien aquí y ha generado PR en todos los repositorios afectados, siguiendo casi al pie de la letra la especificación que redacté el lunes. :rocket:

Por mi parte, pasaré a la fase de revisión y pruebas antes de que termine la semana.

Es bastante impresionante, porque es un proyecto que, hace unos años, probablemente habría requerido varios meses de desarrollo. Si todo va según lo previsto, deberíamos poder sacar algo muy rápidamente.

¡Os mantendré informados! :slightly_smiling_face:


La idea es realmente desacoplar completamente las integraciones del núcleo y tener una superficie de API clara y estable entre ambos.

Por el momento, la especificación y la implementación solo cubren la parte de dispositivos. No he tratado aún el clima, las comunicaciones o los otros dominios, pero se añadirán naturalmente siguiendo el mismo modelo.

Para dar una idea, una integración se verá así:

Fuente: GitHub - GladysAssistant/integration-sdk-js: Gladys Assistant SDK for JS external integration · GitHub

En cambio, si una integración requiere una nueva capacidad del núcleo (por ejemplo, un nuevo tipo de dispositivo), habrá que:

  1. Hacer una PR en el núcleo para añadir esta funcionalidad.
  2. Una vez disponible esta funcionalidad, se expondrá automáticamente a través de la API y podrá ser utilizada en las integraciones externas.

Dependerá de la integración.

Todas las integraciones universales (Matter, Zigbee, etc.) están destinadas a permanecer en el núcleo. Mi filosofía no ha cambiado: el objetivo es, ante todo, ofrecer la mejor experiencia de usuario posible, y estos componentes deben ser nativos, sin instalación adicional.

En cambio, las integraciones muy específicas de ciertos fabricantes o servicios (por ejemplo, Mitsubishi) migrarán progresivamente al store.


Las integraciones externas podrán acceder al hardware, pero a través de APIs proporcionadas por el núcleo.

De hecho, está previsto en la especificación:

solicitar un descubrimiento de red mediado: es el núcleo, que tiene acceso a la red del host, el que realiza los escaneos mDNS y el passthrough de los dispositivos USB, y luego transmite los resultados. La integración nunca necesita el modo host ni un acceso directo al hardware.

El objetivo es ofrecer todas las capacidades necesarias sin comprometer la seguridad.

Y si una integración realmente necesita permisos especiales, no estoy en contra de un sistema de permisos explícitos, un poco al estilo de iOS o Android, donde el usuario valida los accesos solicitados.


Sí, ya está previsto en la especificación: https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md

Por el momento, cada integración está limitada a:

  • 0,5 vCPU
  • 256 MB de RAM
  • 100 PID máximo (protección contra fork bombs)

Estos valores son un punto de partida y podrán ajustarse en función de las necesidades reales de las integraciones y los comentarios de la comunidad.

Hola Pierre-Gilles,

Tema que llega en el momento oportuno: en este momento estoy trabajando en dos integraciones que son los dos casos extremos de tu modelo — Zendure (cloud + token + polling, que mencionas de hecho como ejemplo :grinning_face_with_smiling_eyes:) y un sistema de videovigilancia local Frigate/go2rtc (ver mi publicación) que orquesta contenedores Docker compañeros, GPU y flujos de video. Mis comentarios surgen de estas dos experiencias.

Dispuesto a servir como banco de pruebas cuando prototipes la API-huésped — Frigate del lado de « supervisión de sistema externo », Zendure del lado de « cloud simple ». En este caso, preferiría Zendure ^^

Para probar los límites de cada integración que has decidido, Frigate sería el candidato ideal … Porque, en este caso, estoy seguro de que no será suficiente, por ejemplo, 256 Mo de RAM es lo recomendado de base para una cámara, y para 2 tuve que subir a 384 Mo.

¡Gracias @Terdious, es genial, podremos integrar todo esto en integraciones externas!

Estoy probando, y es bastante increíble, la experiencia de usuario es realmente la misma que en nativo, pero es mucho más simple de desarrollar, ya que solo hay que desarrollar el backend, y sobre todo ninguna revisión de PR :slight_smile: Puedes soltarte :joy:

He trasladado la integración nativa de Melcloud a una integración externa (GitHub - GladysAssistant/gladys-melcloud: Gladys Assistant external integration for Mitsubishi AC · GitHub), one-shotté por Fable 5, por supuesto.

Ejemplo de visualización de una integración « comunitaria » vs « nativa »:

La lista de integraciones mezcla tanto las integraciones nativas como las integraciones comunitarias, provenientes del store.

También es posible lanzar una integración desde Github:

O desde una imagen Docker para pruebas:

Luego, no hay muchas diferencias con una integración clásica:

En resumen, ¡realmente funciona muy bien!

Creo que si quieres empezar con un desarrollo de Zendure, puedes comenzar ahora mismo para probar y darme feedback sobre la experiencia global.

La plantilla de integración externa que puedes dar a Claude como fuente: GitHub - GladysAssistant/integration-template-js: Gladys Assistant Integration template for a JS external integration · GitHub

El SDK JS: GitHub - GladysAssistant/integration-sdk-js: Gladys Assistant SDK for JS external integration · GitHub

Para probar en Gladys, puedes lanzar Gladys en local en tu máquina en esta rama: External integrations (RFC phase 1): Docker supervisor, host API, integration WebSocket, decentralized store and generic frontend by Pierre-Gilles · Pull Request #2665 · GladysAssistant/Gladys · GitHub

Y en la pestaña « Integraciones », encontrarás el botón « Instalar desde Github ».

Sí, Frigate es realmente un caso particular. El principal desafío concierne la arquitectura de los contenedores.

Hoy en día, una integración externa corresponde a un contenedor dedicado. Con Frigate, hay dos enfoques posibles:

  • lanzar tres contenedores distintos (Frigate + Mosquitto + la integración externa Gladys Frigate);
  • o crear una imagen Docker basada en Frigate que incluya directamente el código de la integración Gladys.

Cada enfoque tiene sus ventajas y desventajas. Es un caso que simplemente no está gestionado hoy en la arquitectura actual, por lo que habrá que evolucionar en este punto. :slightly_smiling_face:

@Terdious He escrito toda una especificación con Fable 5 para la gestión de subcontenedores.

La idea general es que una integración externa pueda declarar en JSON los « subcontenedores » que necesita. En nuestro caso, esto permitiría, por ejemplo, declarar Frigate + Mosquitto directamente desde la integración.

La especificación está disponible aquí:
https://github.com/GladysAssistant/Gladys/blob/claude/focused-turing-q9vf41/PLAN_INTEGRATIONS_EXTERNES.md
(ver la sección Subcontenedores)

Luego, es Gladys quien se encarga de todo el ciclo de vida de estos contenedores: creación, inicio, parada, eliminación… Y si la integración se elimina, todo se limpia automáticamente (contenedores + volúmenes).

Para el caso particular de Mosquitto, hay una restricción interesante: necesita archivos presentes en el disco antes de poder iniciar (especialmente para las contraseñas). Por lo tanto, los contenedores declarados pueden ser creados pero detenidos por defecto, y luego iniciados explícitamente por la integración cuando haya terminado su configuración. Una API /start está prevista para esto.

¿Qué opinas?

He lanzado Fable 5 en 2 proyectos:

  • Integración tipo Frigate con subcontainers
  • Integración tipo « comunicación » (ej: Telegram)

¡¡Primera integración en la tienda!! :partying_face:

Si queremos instalarlo:

Luego:

Seguramente trabajaré en ello y descubriré todo esto esta noche y mañana por la noche, te haré un informe después ^^

Y eso es genial ^^ Me lanzo con eso, además tenemos la referencia HA, ideal para la IA :wink:
Esta semana he pasado a Max+ para el desarrollo profesional, y me han reiniciado mis créditos ayer… supongo que como regalo ^^ así que tengo margen hasta el lunes :

¡Increíble, aprovecha mientras Fable 5 está aquí :smiley:

Si quieres crear docenas de integraciones, ¡adelante! Asegúrate de dar las referencias del template y del SDK, y la IA debería manejarlo sin muchos problemas.

Luego, para probar una integración, tienes 2 opciones, y no hay nada que configurar, todo está listo en el template, es llave en mano :slight_smile:

Opción 1: prueba vía GitHub

Crea un lanzamiento en un clic, y esto genera automáticamente un tag de Git + un push de la imagen al GitHub Container Registry. ¡Muy simple:

Luego, en Gladys, pegas el enlace del repositorio:

Opción 2: prueba vía imagen Docker

Más práctico para probar un PR antes de publicarlo en producción para todos los usuarios de la integración.

Empiezas eligiendo la rama a construir:

Esto publicará luego una imagen Docker etiquetada con el nombre de la rama.

En el lanzamiento, encuentras toda la información para copiar en Gladys:

Para copiar en la interfaz:

Si tienes algún error o comentario, ¡avísame! Y no dudes en publicar un post en el foro para cada integración, lo revisaré tan pronto como pueda este fin de semana :muscle: