Retorno de la integración de Dreame: widgets en modo oscuro, mapa de la aspiradora, pequeños errores del corazón

Hola @pierre-gilles,

Como el tema de los widgets de integración (Permettre aux intégrations de déclarer leurs propres widgets de dashboard (schéma JSON)) está cerrado, aquí agrupo un informe de campo y algunos puntos del núcleo encontrados al desarrollar la integración externa Dreame (robots aspiradores y lavadores). Se está probando en la práctica por @Chris75 en un dreame.vacuum.r2449a (Demande d'intégration externe pour robot aspirateur/laveur DREAME).

Publica 4 widgets (el robot con el mapa de la vivienda, una limpieza express, un ajuste en botones, el mantenimiento) y la capacidad funciona muy bien, gracias :folded_hands:. Tres temas:

1. Error: en modo oscuro, un botón de widget destacado ya no se distingue

  • Observación: en modo oscuro, un botón style: "primary" se pinta como los demás, su icono desaparece, y la opción destacada se vuelve invisible (capturas de Chris75: Demande d'intégration externe pour robot aspirateur/laveur DREAME - #32 par Chris75).
  • Causa, en front/src/components/boxs/external-widget/style.css: la regla :global(.dark-mode) .button (dos clases) prevalece sobre .buttonPrimary, y no existe ninguna regla oscura para este estilo, aunque el tema Horizon tiene las suyas (:global(.glass-theme) .buttonPrimary…). Por la misma lógica, el estado activo de los botones device_feature (.buttonActive) y .buttonDanger también deberían verse afectados (deducido del CSS, no observado).
  • Corrección propuesta: reglas :global(.dark-mode) .buttonPrimary, .buttonActive y .buttonDanger (y su .buttonIcon), colocadas después de la de .button. Puedo hacer la PR.

2. Las configuraciones, y la idea de una tarjeta « aspiradora » en el núcleo

  • He tomado nota de que las listas y los controles deslizantes están excluidos de los widgets, por elección (« Fuera del alcance » de dashboard-widgets.md). Para ver, he hecho un widget que expone una configuración en fila de botones. El veredicto de Chris75 es claro: la caja Dispositivos, con sus listas y controles deslizantes, es más completa y compacta. Esto confirma la elección de la especificación.
  • Sin embargo, él reclama lo que realmente falta: una tarjeta completa por robot, « útil para todos los robots ». Hoy necesita el widget de la integración (mapa, estado) más una caja de Dispositivos de 8 a 19 líneas (modo, aspiración, ruta, humedad, frecuencia de lavado, selección de habitaciones…).
  • Propuesta, en el espíritu de la agrupación de las luces (buildDeviceRows, device-features/light/): en la caja de Dispositivos, agrupar las funcionalidades vacuum-cleaner de un mismo dispositivo en una sola línea. Tendríamos un icono teñido según el estado, el nombre, el estado en tiempo real, los botones de inicio/pausa y base, y un panel que abre las otras funcionalidades elegidas del dispositivo con sus controles nativos. Sería genérico: la categoría ya sirve a Matter (#2516) y las integraciones externas Roborock y Dreame.
  • Otra pista, si la prefieres: un componente de widget que muestra las líneas nativas del núcleo (DeviceRow) de las funcionalidades de la integración en sí. El widget del robot llevaría entonces sus configuraciones, siempre dibujadas por Gladys.
  • ¿Cuál te parece la buena dirección? Prepararé la PR una vez validada la dirección.

3. Pequeños errores del núcleo encontrados en el camino (verificados en master el 02/10)

  • Campo secret en una acción: imposible de ingresar. ActionsCard.jsx pasa touchedSecrets={{}} a ConfigField, que muestra touchedSecrets[clave] ? valor : '': el ingreso se borra con cada tecla. Tuve que pasar la contraseña como string.
  • El default de los campos de acción nunca se aplica, ni en la visualización, ni en runAction del lado del servidor, aunque required se controla: se obtiene un 422 en un select que parece estar lleno.
  • Listas fijas de los aspiradores: VacuumCleanerCleanModeDeviceFeature siempre propone los 7 modos de limpieza, sin tener en cuenta los supported_options. Un robot con 4 niveles de aspiración muestra entonces opciones que no tiene, y tuve que publicar un text/select en su lugar. Lo mismo ocurre con el modo de funcionamiento, que siempre propone « Mapear ».
  • Etiqueta genérica: cuando una funcionalidad es la única de su tipo, getDeviceFeatureName muestra la etiqueta del tipo (« Doudou (Texto) », « Modo de funcionamiento ») en lugar del nombre publicado, excepto para MQTT (DISPLAY_FEATURE_NAME_FOR_THOSE_SERVICES). Las integraciones externas eligen sus nombres: ¿deberían añadirse a esta regla?

Puedo proponer rápidamente las PR del punto 1 y de los dos primeros errores del punto 3 si estás de acuerdo.

¡Gracias!

Gracias por el tema @guim31 :slight_smile:

Me estoy informando sobre todo esto.

¡Gracias @guim31 por este retorno tan preciso! He verificado cada punto en el código y tus diagnósticos son todos correctos :+1:

He abierto un issue por cada error confirmado:

- Issues · GladysAssistant/Gladys · GitHub botones de widget en modo oscuro.

- Issues · GladysAssistant/Gladys · GitHub campo `secret` en una acción

- Issues · GladysAssistant/Gladys · GitHub `default` de los campos de acción nunca aplicado

- Issues · GladysAssistant/Gladys · GitHub listas de aspiradoras que ignoran las `supported_options`

Claude va a proponer un fix automáticamente esta noche para cada ticket, así que no es necesario hacer PRs :wink:

¡Muy buena idea! Me encantaría que crearas una solicitud de funcionalidad específica :slight_smile: Y con gusto si quieres hacer una PR :wink:

Gracias @pierre-gilles por la rapidez y los informes :folded_hands: Creo la solicitud de funcionalidad para la tarjeta de la aspiradora y me pongo con la PR.

Una pregunta sobre el último punto, que no tuvo informe: cuando una funcionalidad es la única de su tipo, el panel de control muestra la etiqueta del tipo (« Doudou (Texto) ») en lugar del nombre publicado (« Doudou (Error) »). ¿Es intencionado? Para las integraciones externas, que eligen sus propios nombres, el nombre publicado sería más claro.

retomo el tema, está bien crear un widget especial para robots, pero ¿no podríamos dar acceso a las integraciones externas para crear widgets con más posibilidades como listas desplegables, selectores, controles deslizantes, más imágenes, más texto, más botones, etc.?

¡Hola a todos!

Este tema ahora está en desarrollo.

Se ha abierto una PR para mantener los estilos de los botones primary, active y danger de los widgets en modo oscuro:

No dudes en seguir la PR, probar (opcional, especialmente para pequeñas solicitudes) y dar tus comentarios aquí si es necesario.

¡Hola a todos!

Este tema ahora está en desarrollo.

Se ha abierto una PR para que las listas de modos de la aspiradora (limpieza y carrera) respeten las opciones realmente soportadas por el dispositivo:

No duden en seguir la PR, probar (opcional, especialmente para las pequeñas solicitudes) y dar sus comentarios aquí si es necesario.