Activar escenas de ambiente Gladys con tarjetas NFC

Hola,

Estoy pensando en un pequeño proyecto interactivo que utilice tarjetas físicas equipadas con etiquetas NFC para activar diferentes ambientes en Gladys.

La idea sería colocar una etiqueta NFC muy fina en la funda de cada tarjeta. Cuando la tarjeta se escanea con un teléfono, este envía un identificador a Gladys mediante HTTP o MQTT.

Gladys podría entonces:

  • cambiar el color y el brillo de las lámparas

  • reproducir una música o ambiente de sonido local

  • activar una escena durante un tiempo determinado

  • registrar la última tarjeta escaneada

  • mostrar su nombre en el panel de control

  • volver automáticamente al ambiente normal después de unos minutos

El proyecto contendría 78 tarjetas diferentes. Aquí está la lista que utilizaría para asociar cada identificador NFC con un nombre y un ambiente:

Aclaro que participo en el mantenimiento del sitio relacionado. Comparto esta página únicamente para mostrar el conjunto de datos y las 78 entradas que la automatización debería manejar.

Ahora busco la mejor arquitectura en Gladys.

1. ¿HTTP o MQTT para transmitir el identificador?

Para un uso principalmente local, ¿es preferible que el teléfono publique directamente el identificador de la tarjeta en un tema MQTT?

Por ejemplo:

gladys/nfc/card

Con un valor como:

the-world

¿O sería más sencillo utilizar NFC Tools o Tasker para enviar una solicitud HTTP a la API de Gladys?

2. Un dispositivo virtual para almacenar la tarjeta

Pensé en crear un dispositivo virtual MQTT con una funcionalidad de texto o numérica que represente la última tarjeta escaneada.

¿Es un buen método para permitir que las escenas reaccionen al valor, o debería activarse directamente una escena diferente desde el teléfono?

3. Evitar crear 78 escenas

Preferiría no crear una escena separada para cada tarjeta.

¿Existe una manera limpia de crear una sola escena que:

  1. Recupere el identificador recibido

  2. Busque este identificador en una tabla de correspondencia

  3. Recupere el color, el brillo, el sonido y la duración asociados

  4. Ejecute las acciones correspondientes

La tabla podría parecerse a esto:

{
  "the-world": {
    "color": "#D4AF37",
    "brightness": 45,
    "duration": 900
  },
  "the-hermit": {
    "color": "#6B7280",
    "brightness": 20,
    "duration": 1200
  }
}

¿Este tipo de lógica puede ser gestionado directamente en Gladys, o sería preferible pasar por Node-RED o una pequeña integración externa?

4. Detectar la tarjeta derecha o invertida

Una tarjeta puede colocarse normalmente o girada 180 grados.

Podría registrar dos acciones NFC diferentes en el teléfono, por ejemplo:

the-world:upright
the-world:reversed

Pero esto requeriría probablemente dos etiquetas por tarjeta.

¿Ven un método más sencillo para transmitir también la orientación de la tarjeta?

5. Temporización y restauración del estado anterior

Después de 10 o 15 minutos, me gustaría restaurar las lámparas y los dispositivos a su estado anterior.

¿Permite Gladys memorizar los estados antes de lanzar la escena y luego restaurarlos automáticamente al final?

De lo contrario, podría simplemente lanzar una escena de ambiente normal después de un retraso fijo.

6. Visualización en el panel de control

Finalmente, ¿sería posible mostrar en el panel de control:

  • el nombre de la última tarjeta

  • la hora del escaneo

  • su orientación

  • el ambiente actualmente activo

Quiero empezar con un prototipo con solo tres tarjetas antes de preparar las 78.

Para este tipo de proyecto, ¿utilizarían más bien MQTT, la API abierta, Node-RED o el futuro sistema de integraciones externas de Gladys?

Hola @selamibaba, y bienvenido a Gladys :slight_smile:

¡Excelente proyecto, me encanta la idea :slightly_smiling_face:

¡Buena noticia! Casi todo lo que describes es posible con Gladys hoy en día, sin necesidad de código. Respondo a tus preguntas en orden:

1. ¿MQTT o HTTP? Te recomiendo MQTT. Gladys puede instalar su propio broker (integración MQTT, en 1 clic), y sobre todo las escenas tienen un disparador « Mensaje MQTT recibido »: eliges un tema (por ejemplo, tarot/scan), y el contenido del mensaje está luego accesible en las acciones de la escena a través de la variable {{triggerEvent.message}}. En HTTP, solo puedes iniciar una escena a través de la API (POST /api/v1/scene/:selector/start), pero sin pasarle parámetros — por lo que es menos flexible para tu caso.

2. Recordar la última tarjeta escaneada. Crea un dispositivo virtual en la integración MQTT con una característica de tipo texto. Tu lector (o tu escena) publica en gladys/master/device/[id_device]/feature/[id_feature]/text y Gladys guarda el valor, con historial. Luego puedes mostrarlo en el panel de control con el widget « Dispositivos ».

3. Evitar 78 escenas. Aquí, honestamente, no pondría la tabla de correspondencia en Gladys: no hay (todavía) una noción de tabla de búsqueda en las escenas, y 78 ramas « si/entonces » serían inmanejables. Lo más limpio es poner la correspondencia tarjeta → parámetros (color, luminosidad, duración) lo más cerca posible del lector: ya sea en el firmware del ESP que lee las etiquetas, o en Node-RED (hay una integración oficial de Node-RED en Gladys que lo instala en un clic). El lector/Node-RED publica entonces un mensaje ya « resuelto » (por ejemplo, el color en un tema, la luminosidad en otro, el nombre de la tarjeta en un tercero), y en Gladys una sola escena genérica aplica estos valores con {{triggerEvent.message}}. Una entrada a modificar = una línea en tu tabla, no una escena a retocar.

4. Tarjeta boca arriba / boca abajo. Esto no es algo que una etiqueta NFC pueda indicar: la etiqueta devuelve el mismo identificador independientemente de su orientación. La solución clásica es material: dos etiquetas por tarjeta (una arriba, una abajo) con un lector de antena corta que solo lee la etiqueta más cercana. Así obtienes dos identificadores por tarjeta, y es tu tabla de correspondencia la que traduce « ID n°2 de la Luna = Luna invertida ». En Gladys, es transparente.

5. Restaurar el estado de las lámparas después de 15 min. En lugar de poner un retraso en la escena de escaneo, usa el disparador « Cambio de estado del dispositivo » con la opción « Ejecutar la escena después de que la condición haya sido válida durante X minutos »: crea una característica virtual « ambiente activo », que tu escena de escaneo pone a 0 y luego a 1 con cada tarjeta (el 0→1 rearma el contador, así un nuevo escaneo retrasa la restauración de 15 min). Una segunda escena, disparada por « ambiente activo = 1 durante 15 minutos », devuelve la iluminación a su estado normal y vuelve a poner la característica a 0. Si quieres restaurar el estado exacto antes del escaneo (y no un estado por defecto), haz que la escena de escaneo copie el estado de las lámparas en características virtuales de respaldo, que la escena de restauración reaplicará.

6. Panel de control. El widget « Dispositivos » mostrará tus características de texto (nombre de la tarjeta, ambiente activo), y existe un widget de reloj para la hora.

¡No dudes en compartir fotos del montaje cuando funcione, sería un tema genial para compartir con la comunidad! :crystal_ball: