Integraciones externas en Gladys Assistant

Nueva versión del SDK, v0.8.0 con un nuevo campo « section », y enlace obligatorio a la documentación en la página de integración

Edición: Plantilla actualizada para la v0.8.0

Atención, la tienda se ha actualizado y es más estricta, ahora se requiere documentación obligatoria en las integraciones :warning:

Asegúrate de ejecutar :

npx github:GladysAssistant/integration-store

Para ver si tu integración pasa la validación y corregir tu repositorio si es necesario

(pasa este mensaje a Claude)

¡Nueva versión del SDK: v0.9.0!

En el programa:

  • Gestión de integraciones de tipo « comunicación » unidireccional (FreeMobile, Callmebot, ntfy.sh, etc…)
  • Gestión de webhooks Gladys Plus para integraciones de tipo Netatmo que necesitan un webhook en la nube

Ok, he actualizado la PR de Gladys con 3 cambios:

1. Banner « ¿Su dispositivo no está en la lista? » — ahora destaca Matter y las integraciones externas de la comunidad: « cualquiera puede crear una e publicarla en la tienda, y luego aparece en esta lista »,

2. Deprecación anunciada de Tuya, MELCloud, Telegram y Netatmo — lo hice de las dos maneras para que no haya ambigüedad:

  • una insignia roja « Próximamente obsoleta » en su tarjeta del catálogo (bandera deprecated en los JSON de integraciones, renderizada en IntegrationTags);
  • una alerta en la parte superior de la página de cada una de las cuatro integraciones (componente compartido DeprecationWarning): « pronto será obsoleta en favor de una integración externa equivalente… ambas versiones coexistirán en el catálogo durante la transición — puede seguir usando esta por ahora ».

3. Errores de autenticación al reiniciar (código de cierre 4000) — diagnóstico confirmado, y era aún peor: sin la variable de entorno JWT_SECRET, el secreto se regenera en cada arranque de Gladys, y como start() reiniciaba el contenedor existente con el token JWT congelado en su entorno (firmado con el secreto antiguo), la integración entraba en bucle de rechazo sin nunca repararse. Dos correcciones:

  • el supervisor ahora firma los JWT de integración con su propio secreto, generado una vez y persistido como variable (EXTERNAL_INTEGRATION_JWT_SECRET) — sobrevive a los reinicios y a las restauraciones de copia de seguridad, en coherencia con los contenedores que valida;
  • auto-reparación en start(): antes de reiniciar un contenedor existente, verifyContainerToken inspecciona el token de su entorno (firma con el secreto actual + buen servicio + buena token_version); si está caducado, el contenedor se recrea con un token fresco en lugar de reiniciarse en vano. Esto también repara, en el próximo arranque, los contenedores creados antes de este parche.

Así de sencillo es crear una integración :joy:

Para información @cicoub13 @Terdious @Lokkye :

[
  {
    "store_slug": "callemand/gladys-airzone-cloud",
    "level": "error",
    "reason": "docker_image: image is not publicly pullable (registry auth denied, HTTP 403)",
    "checked_at": "2026-07-23T15:30:08.198Z"
  },
  {
    "store_slug": "cicoub13/gladys-tp-link",
    "level": "error",
    "reason": "docs/en.md: file not found — user documentation is mandatory",
    "checked_at": "2026-07-23T15:30:08.198Z"
  },
  {
    "store_slug": "Terdious/gladys-netatmo",
    "level": "error",
    "reason": "docs/en.md: file not found — user documentation is mandatory",
    "checked_at": "2026-07-23T15:30:08.198Z"
  },
  {
    "store_slug": "Terdious/gladys-tuya",
    "level": "error",
    "reason": "docs/en.md: file not found — user documentation is mandatory",
    "checked_at": "2026-07-23T15:30:08.198Z"
  }
]

Fuente: https://integration-store-storage.gladysassistant.com/rejected.json

La documentación ahora se muestra en la interfaz:

Si hago clic en « Documentación »:

Debo decir que estoy impresionado por la velocidad de implementación de este nuevo sistema, el número de integraciones ya disponibles y la simplicidad a todos los niveles:

  • Desarrollo,
  • Implementación,
  • Actualización,
  • Integración de dispositivos.

Por supuesto, esto no habría sido posible a este ritmo sin la IA. Pero los decisores (@pierre-gilles) y los prompters han contribuido mucho.

Los próximos meses son muy prometedores en este sentido ^^

@pierre-gilles ¿cómo va la copia de seguridad de las integraciones externas si queremos migrar de PC, por ejemplo?

¿Cómo gestionar los casos anteriores cuando no hay datos para guardar, por lo que el botón « Guardar configuración » no sirve de nada?

También añadiré recomendaciones sobre la elección de las imágenes Docker para evitar el uso de imágenes grandes. Preferencia por Alpine, que es ultraligero y muy utilizado en nuestro caso.

Esto me lleva a otra pregunta. ¿No debería Gladys también verificar si la imagen utilizada no es demasiado antigua o susceptible a vulnerabilidades de seguridad? Solo una información antes de instalar la integración.
Se puede añadir también el tamaño de la imagen.

Gracias @Terdious por todos tus desarrollos, efectivamente yo también estoy muy impresionado por la velocidad de desarrollo que podemos tener, es increíble, esto va a revolucionar el proyecto :slight_smile:

Este fin de semana, estaba en la montaña sin red, y sin embargo 13 integraciones pudieron ser publicadas en la tienda, impensable en el antiguo sistema de integraciones ^^

Es genial, ¡vamos a empezar con una tienda ya llena!

Las instalaciones se volverán a instalar automáticamente, ya que todos los datos se almacenan solo en la base de datos :slight_smile:

Aquí está el proceso exacto explicado por Claude:

Qué está en la copia de seguridad. La copia de seguridad de Gladys Plus es un archivo tar.gz que contiene la base de datos SQLite (+ la carpeta DuckDB) — y todo lo que define una integración externa está en la base de datos: la línea t_service (imagen Docker, manifiesto, store_slug, versión, token_version, estado), la configuración (variables de alcance del servicio, incluidos los secretos y tokens OAuth), los dispositivos, las clases de material asignadas, los perfiles de contacto y el secreto JWT del supervisor (EXTERNAL_INTEGRATION_JWT_SECRET, persistido en una variable precisamente para sobrevivir a las restauraciones).

Qué sucede al iniciar en la nueva máquina.

  1. init() reconcilia los contenedores por etiqueta Docker — el comentario del código cita precisamente el caso de restauración: los container_id en la base de datos están obsoletos; como no hay contenedores en el nuevo PC, se establecen en null (externalIntegration.init.js:70-84).
  2. Las integraciones luego inician por el ciclo de vida estándar de los servicios. En start(), no hay container_id → createIntegrationContainer: la imagen Docker se vuelve a descargar desde el registro, se crea un nuevo contenedor con un JWT recién firmado (válido, ya que el secreto y el token_version provienen de la base de datos restaurada), la red privada y los subcontenedores se recrean, y la configuración se envía de nuevo a la integración al conectarse.
  3. La regla « DETENIDO = ignorado al arrancar » se aplica como para los servicios internos: una integración detenida antes de la copia de seguridad sigue detenida, sin ser desinstalada.

Los dos límites a conocer.

  • Obviamente, se necesita Docker y red en la nueva máquina: las imágenes no están en la copia de seguridad, se vuelven a descargar (una integración pasaría a ERROR si el registro es inaccesible, y luego se puede reiniciar).
  • La carpeta /data no se copia de seguridad. Cada integración tiene un enlace <base>/external-integrations/<selector> → /data (y los volúmenes de los subcontenedores viven debajo). La doctrina es que las integraciones sean sin estado (los estados viven en Gladys), por lo que en la práctica no debería romper nada — pero una integración que almacene un estado local (o un subcontenedor tipo broker con persistencia) comienza de nuevo. Si queremos cubrir esto algún día, tendríamos que incluir esta carpeta en la copia de seguridad, con la pregunta del tamaño a decidir.

¡Bien visto! Lo corregiré.

Es el caso de la plantilla por defecto, recomiendo la imagen Node-Alpine que es súper ligera :slight_smile:

Creo que, para una V1, la propuesta actual es suficiente.

Si un usuario es lo suficientemente técnico como para buscar este tipo de información, la encontrará ya en el repositorio GitHub de la integración, que está referenciado.

También creo que hay que evitar entrar en detalles demasiado técnicos. El objetivo de Gladys es ofrecer un producto limpio, accesible al gran público, con el menos jergón posible.

Las integraciones externas han sido diseñadas precisamente para ser transparentes: el usuario apenas es consciente de que un contenedor externo está en ejecución. La experiencia es deliberadamente muy cercana a la de las integraciones nativas de Gladys hoy :slight_smile:

¡Hoy voy muy rápido! :tada:

Ya he fusionado en la rama master del repositorio Gladys:

  • La especificación técnica del desarrollo.
  • Toda la implementación.

Luego, publiqué una nueva imagen de desarrollo:

gladysassistant/gladys:dev

La desplegué en mi instancia de producción. Ya he migrado mi integración MelCloud al nuevo sistema y estoy haciendo lo mismo con Telegram.

El objetivo es validar todo esto en condiciones reales durante unos días. Si todo va bien, la funcionalidad se publicará esta semana.

Estoy bastante confiado, por ahora todo va muy bien.

Voy muy retrasado, hace 15 días que no estaba muy disponible… Me llevará un tiempo ponerme al día con todo esto (incluso este hilo), sois unos locos (en el buen sentido de la palabra).

:joy::joy: voy a compartir esta imagen en X

¡Vaya, estoy super contento con las integraciones externas en mi casa!!

Creo que voy a lanzar una versión el jueves por la noche! :fire:

¡La documentación está adaptada para mostrar el catálogo en el sitio web!

En esta página:

¡Ya 20 integraciones externas! :exploding_head:

Cuando se sabe que solo hemos tenido 36 integraciones internas en 6 años de Gladys v4, ya es un ritmo increíble. Y creo que solo se acelerará a medida que convenzamos a más desarrolladores de contribuir.

¡Creo que realmente tenemos algo! :grinning_face_with_smiling_eyes:

¡Lanzamiento MAÑANA POR LA NOCHE:fire:

:star_struck: bueno, no he podido evitar leer las notas de la versión 4.84.0 en el blog y es increíble :grimacing:

Pregunta pequeña para las integraciones internas, que ahora existen también de forma externa, y que continúan en paralelo: ¿habrá/ha habido una herramienta de « conmutación automática » de interno a externo?
Por ejemplo, con Telegram, mis datos están en el interno, hago clic en un botón y todo pasa al externo y se desactiva el interno? (¡oh, sí que soy vago!! :rofl:)

¡Hola @mutmut! ¡Gracias por tu mensaje! :grinning_face_with_smiling_eyes:

No, no hay un cambio automático. Pero tranquilo, es realmente muy sencillo:

Vas a la integración actual de Telegram, copias tu token, desactivas la integración, luego instalas la nueva integración externa, pegas tu token y sigues el proceso de emparejamiento. :blush:

Reconozco que prefiero que vosotros (los usuarios avanzados de Gladys) paséis por el proceso de instalación “clásico” que luego seguirán todos los usuarios. Así podremos tener verdaderas experiencias de instalación de las integraciones externas y mejorar el proceso si es necesario. :grinning_face_with_smiling_eyes: