Hola a todos,
Con Gladys 5.1, una integración externa puede declarar sus propias acciones de escena y sus widgets, es genial. Falta una cosa para que sea realmente cómodo: listas desplegables cuyo contenido proporciona la integración.
El diagnóstico
Hoy en día, un campo select de un manifiesto solo puede tener dos formas:
optionsescritas en el manifiesto, idénticas para todos;"source": "devices", la lista de dispositivos de la integración.
El resto de lo que conoce la integración debe teclearse, y con la ortografía correcta. Algunos ejemplos:
- Aspiradora robot: las habitaciones y zonas memorizadas (« Cocina », « Salón + pasillo »…). Para mi integración Lubluelu (https://community.gladysassistant.com/t/integration-externe-robot-aspirateur-lubluelu-sl68-tuya-mode-local), la acción « Limpiar una zona » requiere escribir el nombre a mano;
- TV: las aplicaciones instaladas o las entradas HDMI;
- Cámaras: los presets PTZ;
- Sonos o equivalentes: las listas de reproducción o los favoritos.
La descripción de un campo también está fija. Ni siquiera se pueden mostrar las opciones posibles.
La propuesta
Añadir un segundo valor a la enumeración source, por ejemplo "integration", con una clave de lista:
{
"key": "zone",
"type": "select",
"source": "integration",
"list": "zones",
"depends_on": "vacuum",
"label": { "en": "Zone", "fr": "Zone" },
"required": true
}
En el SDK, la integración envía la lista cuando cambia (modelo push, como publishState):
await gladys.setFieldOptions('zones', [
{ value: 'cuisine', label: 'Cuisine', parent: 'ext:lubluelu:vacuum:eb111' },
{ value: 'salon', label: 'Salon', parent: 'ext:lubluelu:vacuum:eb111' },
]);
- Almacenamiento por el núcleo: la lista se conserva por el núcleo. El editor de escenas se muestra sin llamar a la integración, incluso si está detenida.
depends_on(opcional): filtra las opciones según otro campo del formulario, aquí las zonas de la aspiradora elegida (parent= external_id del dispositivo).- Valor almacenado: la
value, una cadena. El controlador la recibe como hoy, y las variables de escena siguen siendo posibles. - Opción desaparecida: un valor que ya no existe sigue mostrándose tal cual, con una advertencia. No queremos romper una escena porque una zona haya sido renombrada.
- Límites: como el resto del contrato, por ejemplo 200 opciones por lista, etiquetas de un máximo de 100 caracteres y llamadas limitadas en tasa.
Lo que aporta
- Sin faltas de ortografía ni nombres que recordar: es la misma experiencia que
source: "devices", sin crear dispositivos falsos para ello. - El mismo mecanismo sirve para los ajustes de los widgets y las acciones de configuración, ya que comparten el formato de campo.
- Es retrocompatible:
optionsysource: "devices"no cambian, y un manifiesto que no utilice"integration"no se ve afectado.
Soluciones actuales, y por qué no son suficientes
- Crear un dispositivo por zona, para aprovechar
source: "devices": estas zonas aparecen entonces en todas partes, incluido en el selector « Aspiradora » de los widgets. - Un botón por zona en el dispositivo, utilizado con la acción nativa « Controlar dispositivos »: funciona para una acción simple, pero no se pueden añadir parámetros (número de pasadas, aspiración…).
- Texto libre, hecho tolerante (mayúsculas, acentos, inicio del nombre): es lo que hace mi integración hoy, pero sigue siendo texto libre