Nueva tabla para almacenar las „opciones_soportadas“ de una característica

Hola a los @contributors :waving_hand:

Estoy añadiendo una nueva tabla al modelo de datos y me gustaría tener su opinión para asegurarme de que se ajuste bien a las necesidades antes de seguir adelante.

:light_bulb: Contexto

En algunas integraciones, necesitamos almacenar los valores soportados por una característica dada.

Ejemplo simple: un aire acondicionado con un “modo de funcionamiento”.

  • Algunos modelos soportan: Calor / Frío / Automático
  • Otros: solo Frío

Actualmente, no modelamos realmente esta noción de “capacidad por dispositivo”, lo cual empieza a ser un problema.

Ya lo vemos en escenas / Zigbee2MQTT: para los botones, mostramos una lista de acciones posibles bastante amplia (varias decenas), cuando un dispositivo dado solo soporta una pequeña parte. Resultado: UX menos clara y riesgo de errores por parte del usuario.

:brick: Propuesta

Propongo añadir una tabla:

t_device_feature_supported_option:

- `id` UUID PK
- `device_feature_id` UUID FK → `t_device_feature`
- `value` INTEGER NOT NULL 
- `label` STRING NOT NULL
- `sort_order` INTEGER NOT NULL DEFAULT 0

Esto permitiría almacenar, para una característica de un dispositivo dado, la lista de opciones realmente soportadas.

El label será un valor en inglés que luego será traducido en las traducciones.

Si el label no existe, el fallback será mostrar el label en inglés.

En la API, algo así:

:red_question_mark: ¿Por qué ahora?

Veo que esta necesidad aparece cada vez más, especialmente:

  • con Matter, donde algunos dispositivos (aspiradoras robóticas, aires acondicionados) exponen clusters con una lista dinámica de opciones posibles
  • con Zigbee2MQTT, donde algunas características (especialmente los botones / acciones) explotan en número de opciones posibles

Nos dirigimos claramente hacia un modelo en el que ya no podemos conformarnos con una lista global de opciones por característica.


¿Qué opinan? ¿Ven algún caso en el que este modelo no funcione?

Gracias por su feedback :slight_smile:

Totalmente de acuerdo, aún no he visto el impacto a mi nivel en materia, pero está claro que la lista de acciones para los botones se vuelve enorme.
Hacer escenas con esto es totalmente perturbador para quienes no saben cómo recuperar los valores

La PR:

Me parece bien.

  • ¿Todas las valores siempre tienen que estar mapeadas en algún lugar de Gladys (como hoy)?
  • ¿Cómo se va a manejar con los dispositivos existentes?
  • ¿Y cómo se rellenan las supported_options de una función?

¡Sí! Nada cambia en eso.

Podremos añadir una actualización de dispositivos, como hacemos cuando una funcionalidad evoluciona :slight_smile:

¡La integración lo rellena si está disponible/posible!

En Matter, por ejemplo, hay una tabla proporcionada por el protocolo con todos los valores que el dispositivo soporta.

Hola @pierre-gilles,

¿En qué punto estás con la reflexión sobre este tema? ¿Es algo cercano a publicarse?
Tengo el « problema » con la integración de los termostatos y climatizaciones de fil piloto en Tuya que estoy preparando, por lo que he codificado una guard para no enviar los modos que no son soportados por los dispositivos en cuestión, pero con este desarrollo, ya no lo necesitaremos :wink:

¡Sí, ya está terminado! :smiley:

¡Acabo de hacer el merge! Puedes usarlo en tu PR :slight_smile:

¡Aaaah qué bien!! Muchas gracias ^^ :joy: :smiling_face_with_three_hearts:

¡Funciona genial! Espero que « uno » lo haya implementado correctamente, tuve que retocarlo, estaba enredado en algo ultra complejo con repeticiones.

Dispositivo con 4 modos:

Dispositivo con todos los modos:

¡Excelente !!