Hola @Lokkye , te he hecho un PR para añadir un widget y acciones y desencadenadores.
main ← vincentBesseau:feat/vacuum-map
ouvert 11:53AM - 05 Oct 26 UTC
## Résumé
Deux ajouts pour l'intégration Roborock :
1. **Carte de l'aspirateur… en widget de dashboard** (SDK `0.14`, widgets Gladys `5.1`).
2. **Déclencheurs et actions de scène** (l'aspirateur dans l'éditeur de scènes).
## 1. Carte en widget
- **Récupération** : `get_map_v1` (frame protocole `301`, déchiffrement AES‑128‑CBC + gunzip), transport local-first avec repli cloud.
- **Parseur RRMap** : format binaire → objet structuré (segments, robot, base, trajet, zones interdites, murs virtuels…), réconcilié avec `get_room_mapping` pour les **noms de pièces**.
- **Rendu PNG maison** (via `node:zlib`, sans dépendance) proche de l'app : pièces colorées, murs fins, zones interdites, murs virtuels, base/robot, **fond transparent** (s'adapte au thème clair/sombre).
- **Widget « Aspirateur »** : tuiles batterie / surface, carte, bloc état (état, dernier nettoyage, durée, **% de chaque consommable**) et **4 boutons** — Démarrer + Retour base fixes, et **2 boutons configurables** via les réglages.
- **Timestamp de début du dernier nettoyage** (`get_clean_summary`, mis en cache).
## 2. Scènes
Déclaré dans le manifest (`scene_triggers` / `scene_actions`), branché sur les données déjà pollées et les commandes RPC existantes.
**Déclencheurs** (émis sur transition via `publishSceneEvent`) :
`cleaning_started`, `cleaning_finished` (durée, surface), `returned_to_dock`, `battery_low` (≤ 20 %), `charging_complete`, `robot_error` (code + libellé), `consumable_worn` (≤ 10 %, par consommable), `state_changed`.
**Actions** (`onSceneAction`, chacune avec un champ `vacuum`) :
`start_cleaning`, `pause_cleaning`, `stop_cleaning`, `return_to_dock`, `clean_rooms` (noms de pièces → `app_segment_clean`), `set_fan_power` (silencieux/équilibré/turbo/max), `run_routine` (nom de routine → `executeRoutine`).
Les transitions sont détectées via un instantané par robot mis en cache entre deux polls (le premier poll ne fait qu'amorcer le cache). Les seuils sont gérés côté intégration (les filtres de scène sont à égalité seulement) et le niveau/pourcentage est exposé en variable de scène.
## Points d'attention
- ⚠️ **`gladys_version` passe à `>=5.1.0`** : les widgets de dashboard nécessitent Gladys 5.1.0 (c'était `>=4.86.0` sur `main`).
- **Bump de version patch** : `2.3.0` → `2.3.1`.
- **Transport local QV35A** : silencieux en TCP local quand il est à la base (en charge) → repli automatique sur le cloud, documenté.
## Tests
- `114` tests passent (`node --test`), `eslint` et `prettier --check` clean.
## Suite possible
Demande de fonctionnalité pour une **carte interactive** (sélection de pièces au clic → nettoyage ciblé), qui nécessiterait un composant frontend côté cœur : https://community.gladysassistant.com/t/composant-carte-interactive-zones-cliquables-pour-les-widgets-dintegration-externe/10959
🤖 Generated with [Claude Code](https://claude.com/claude-code)
También he hecho una solicitud para poder seleccionar en el mapa las habitaciones a limpiar y así hacer evolucionar este widget
¡Hola!
Estoy desarrollando un widget para la integración externa de Roborock que muestra el mapa del aspirador (a través de onWidgetGetImage). La visualización funciona muy bien, pero me encuentro con un límite en el vocabulario de los widgets: no hay forma de hacer el mapa interactivo.
Actualmente, en un widget solo se dispone de componentes estáticos (image, value, gauge, status, chart, card-list) + button (limitado a 4). Los límites concretos son:
• el mapa es una imagen está…
No sé si has visto lo que se ha hecho para las integraciones externas del robot Dreame (Demande d'intégration externe pour robot aspirateur/laveur DREAME - #39 par Chris75 ) y la integración del robot Mammotion (Intégration externe - Mammotion - #41 par prohand ).
Tras probarlas durante mucho tiempo, estoy realmente muy satisfecho con el resultado, ya que ahora puedo prescindir de las aplicaciones oficiales de la marca para todas las funciones y ajustes esenciales.
Y todo esto fue desarrollado por @guim31 @prohand en 1 semana
guim31
5 Octubre, 2026 19:25
23
Sí, pero es porque somos demasiado fuertes
Jajaja (para provocar a Claude)
Lokkye
6 Octubre, 2026 12:20
24
Muchas gracias por tu PR, estoy revisándola y dándote algún feedback
has notado que hay problemas en el repositorio:
Lokkye
6 Octubre, 2026 14:00
28
No, no sé por qué no he recibido los correos , « yo » estoy haciendo las correcciones
Lokkye
6 Octubre, 2026 14:07
29
Versión 2.5.0 publicada con el código de @spenceur y 2 correcciones
guim31
6 Octubre, 2026 14:52
30
¡Qué chulo este nuevo widget!
@Lokkye
he hecho una corrección en el salto de la imagen que no era muy bonita y he añadido una condición para las escenas
main ← vincentBesseau:feat/map-live-rendering
ouvert 04:42PM - 06 Oct 26 UTC
## Résumé
Rend le **widget carte** stable au rafraîchissement et **quasi temps … réel pendant un nettoyage**, sans changer le vocabulaire du widget (toujours un PNG rendu côté serveur).
Avant : à chaque rafraîchissement la carte pouvait **« sauter »** (se redimensionner / clignoter), et elle n'avançait qu'au `ttl` du contenu.
## Ce que ça corrige
### A. Rendu à cadre fixe (`src/roborock/mapRender.js`)
La taille de sortie est désormais dérivée du **crop stable** (les pièces nommées) via une nouvelle option `targetLongestPx`, au lieu du poids en octets. Le même logement rend **toujours aux mêmes dimensions** → plus de reflow/rescale quand seuls le robot et le tracé bougent. Le garde-fou octets reste (réduction déterministe de la cible).
### B. Clé d'image = hash du rendu (`src/devices/mapWidget.js`, `index.js`)
La clé d'image est maintenant un **hash des octets PNG** (plus `mapSequence`). Le cœur ne **remplace l'`<img>` que si l'image a réellement changé** → plus de flash quand rien n'a bougé. `MAP_RENDER_VERSION` 7 → 8 pour invalider l'ancien cache. Le garde-fou 64 caractères de la clé est conservé.
### C. Quasi temps réel pendant le nettoyage (`index.js`)
- Suivi des robots ayant une **session de nettoyage active**.
- Pendant le nettoyage : cache carte **~8 s** (au lieu de 60 s) + **nudge `requestWidgetRefresh` toutes les ~15 s** (plafond cœur 1/10 s, no-op si aucun widget ouvert).
- Au repos : cache 60 s, pas de nudge.
→ La carte avance « par pas » de ~15 s pendant le ménage, puis se met en veille à la base.
## Limite connue
Le léger flash de chargement quand l'image change **vraiment** (pendant un nettoyage) reste géré par le frontend du cœur — une intégration externe ne peut pas faire de cross-fade. A + B le réduisent au strict minimum (même taille, swap uniquement sur vrai changement).
## D. Condition de scène « Nettoyé aujourd'hui »
Nouvelle feature **read-only `cleaned-today`** (0/1, 1 = l'aspirateur a tourné aujourd'hui), dérivée du dernier début de nettoyage. Elle permet une **condition de scène** « est-ce que l'aspirateur a tourné aujourd'hui ? » (ex. ne lancer un nettoyage que s'il n'a pas déjà tourné). Toujours publiée (même 0) pour que les deux branches de la condition fonctionnent. (`src/devices/lastClean.js`, `src/devices/convertDevice.js`, `index.js`.)
## Tests
- `128` tests passent (`node --test`), `eslint` OK.
- Nouveaux tests : dimensions de sortie stables quand seul le robot bouge (A) ; round-trip de la clé avec signature hash (B) ; `isCleanedToday` / état 0-1 (D).
Basé sur `main` (2.5.0) → **2.5.1** (patch).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Disculpa por el arreglo a esta hora
hola, no veo mi tarjeta. ¿debo hacer algo más?
Lokkye
7 Octubre, 2026 05:39
33
@spenceur Lamento la tardanza en responder, pero un « pequeño » dolor de cabeza me acompañó toda la noche. Hice una pequeña modificación en tu PR, pero hay que evitar modificar el número de versión en las PR, ya que es otro proceso el que lo hace al momento de construir la imagen de Docker.
Se publicó bajo la versión 2.5.1
Hola, sí, un widget genial para los aspiradores Roborock, se muestra perfectamente en mi Saros 10 R y S7 Max Ultra:
Incluso la última actividad aparece… ¡lo que guardan todo!
Al widget solo le falta ahora la selección de habitaciones…
Diversidad lingüística… ¡incluso estoy aprendiendo francés!