Tuya: Integración de calefacción y aire acondicionado

Por diversión, Claude está contento, te pongo su resumen completo :joy: :

Resumen condensado de los posts #98/#99/#100 — incluso mejor que « no está mal » : doble bote :slot_machine::slot_machine:

:white_check_mark: Pulsar finalmente funciona en su casa

Casilla marcada, pulsar_connected en el diagnóstico, latencia < 2 s en la prueba de toma. La duda está resuelta — todo lo demás se deriva de esto.

:slot_machine: Bote n°1 — la foto del ring se ha obtenido (Prueba C)

Al sonar el timbre, Pulsar entrega doorbell_pic = una URL S3 presignada completa en base64 (https://ty-eu-storage30-pic.s3.eu-central-1.amazonaws.com/...jpeg?X-Amz-...&X-Amz-Expires=60). Nuestro código la rechaza (media_invalid_payload) porque solo espera el JSON bucket/files. La solución es trivial: aceptar este formato y descargarlo tal cual. Bono: esto explica nuestros 403 — el host correcto era nuestro candidato S3, pero solo la URL del mensaje Pulsar lleva la firma presignada de AWS; el ?param= del shadow no es descargable. (La foto de movimiento, por otro lado, llega cifrada con su clave AES pero sin URL descargable — para tratar más tarde, el ring es la prioridad.)

Otra lección: el DP 136 (doorbell_active) nunca emite ningún valor, en ningún canal → el evento « Timbre » deberá ser derivado de la llegada de una nueva doorbell_pic (nuestro event-gate existente ya hace esto para otros DP).

:slot_machine: Bote n°2 — el timbre habla en local, finalmente sabemos cómo (Prueba B)

Las lecturas 3.1 siguen fallando (el tercer método también timeout), PERO los nuevos push_frame_raw lo han revelado todo: el timbre envía tramas en formato 3.3 (prefijo "3.3" + payload cifrado) en nuestro socket 3.1 — tramas grandes de 1-2 Ko justo en los momentos de los timbres y movimientos. Conclusión: es un dispositivo 3.3 que envía sus estados; la conexión 3.3 directa solo fallaba porque nuestra solicitud inicial cifrada la hacía colgar. Próxima iteración: modo « escucha pura » — persistente en 3.3 sin ninguna solicitud en la conexión → tuyapi decodificará nativamente los push → timbre local instantáneo muy probable.

:warning: El punto del post #100 (comandos en local)

El SET local (persistente y dedicado) nunca obtiene un ACK (« Timeout waiting for status response ») → el fallback cloud toma el relevo y funciona. El « sent via persistent » aislado de 09:59 es un probable ACK falso (una trama cualquiera resolvió la promesa) — para endurecer. Para el timbre, los comandos siguen siendo cloud por el momento; su impresión de no propagación proviene de los retrasos de actualización + de este ACK falso.

Plan de la próxima iteración (en orden de valor)

  1. Medios: aceptar el payload URL-directa → descargar → foto del ring en el widget Cámara;
  2. Timbre: activar el CLICK Timbre en nueva doorbell_pic;
  3. Local: persistente « escucha pura » 3.3 para los device22;
  4. Endurecer el ACK falso del SET persistente.

Todo está consignado en el handoff (parte 21). Dime que sí y atacaré la iteración — los puntos 1 y 2 son cortos y desbloquean el entregable más visible (foto + evento de timbre en tiempo real).

Hola @GBoulvin,

Muchas gracias por estas nuevas pruebas. Y aquí tienes un nuevo intento para ti (no tan evidente este timbre ^^ Pero aparentemente nos estamos acercando al objetivo ^^). A continuación, el informe y la lista de nuevas pruebas que Claude debe realizar:

Tus tres publicaciones son una mina: **doble bote** :slot_machine::slot_machine: Encontramos la foto Y el canal local. Informe, luego la nueva ronda (quizás sea la última antes de la división en PRs limpios!).

Informe de tus pruebas

1. Pulsar: confirmado operativo en tu caso :white_check_mark: (`pulsar_connected`, reacción < 2 s). Él fue quien lo desbloqueó todo.

2. :slot_machine: Bote de la foto (Prueba C): en el ring, el mensaje Pulsar `doorbell_pic` contiene la URL de descarga completa y firmada de la foto (válida 60 s). Nuestro código la rechazaba tontamente (esperaba otro formato) — corregido: la foto de tu ring finalmente se mostrará en el widget de la Cámara. Bonus: esto explica todos nuestros 403 — el servidor S3 era el correcto desde el principio, pero solo la URL del mensaje Pulsar lleva la firma correcta.

3. :slot_machine: Bote local (Prueba B): las nuevas tarjetas `push_frame_raw` muestran que tu timbre envía frames en formato 3.3 (cifrados) en el socket persistente, justo en los momentos de tus rings y movimientos. ¡Habla en local! La conexión 3.3 directa fallaba únicamente porque nuestra solicitud inicial la hacía colgar. La nueva imagen abre por lo tanto para ella un socket 3.3 mudo (cero solicitudes, solo escuchamos) — sus push deberían ser decodificados nativamente.

4. Tu prueba « 100 % local » del post #100 — pequeña corrección :upside_down_face:: cortar Pulsar no es suficiente. En tus registros, los estados y la detección aún pasaban por la lectura periódica en la nube (sigue funcionando), y tus comandos se enviaban a través de la nube después de dos intentos locales fallidos (de ahí los ~10 s de latencia y la impresión de no propagación!). La verdadera prueba 100 % local es la Prueba C a continuación.

5. El evento « Timbre » (Clic del botón): entendimos por qué seguía vacío — tu timbre nunca emite un valor en su DP de timbre, en ningún canal. La nueva imagen dispara el evento al llegar una nueva foto de ring (con anti-duplicado): el historial y las escenas finalmente reaccionarán.

Nueva imagen (mismo tag, re-pull) — lo que cambia

1. Foto del ring descargada desde la URL del mensaje Pulsar → widget de la Cámara;

2. Evento « Timbre » disparado en cada nuevo ring (instantáneo a través de Pulsar, con anti-duplicado si la misma foto llega por varios canales);

3. Escucha puramente local para el timbre: socket persistente sin ninguna solicitud (esto es lo que lo hacía colgar);

4. Comandos del timbre directamente en la nube: fin de los ~10 s de latencia en tus toggles (los intentos locales condenados al fracaso se saltan).

Prueba A — El entregable: ring + foto + evento (5 min) :camera_with_flash::bell:

Timbre en modo nube (sustitución local desmarcada), Pulsar activo:

1. Re-pull la imagen, reinicia, abre la página de Diagnóstico del timbre + el dashboard con el widget de la Cámara.

2. Toca el timbre.

3. Esperado: el evento « Timbre » en el historial (instantáneo) + la foto en el widget de la Cámara.

4. → Para copiar: las tarjetas `doorbell_ring_event` / `media_download_ok` / `media_stored` (o sus variantes de fallo) — y tu veredicto visual sobre la foto!

Prueba B — Escucha puramente local (10 min)

1. Página del timbre: guarda en 3.3 + sustitución local (guardado forzado, como de costumbre). :information_source: Recomendamos 3.3 porque tus frames observados están en este formato — pero nada está bloqueado, y no tendrás que adivinar: ver el paso 4.

2. Espera `persistente: conectado` en la página de Diagnóstico. El socket ahora es mudo: ya no verás los « parse data error » cada 10 s, es normal (y por lo tanto « conectado » no es suficiente para probar que el protocolo es el correcto — solo un evento lo dirá).

3. Toca el timbre, luego pasa por delante (movimiento).

4. El Diagnóstico te responde inmediatamente, sin adivinar:

  • tarjetas push_dps\ con valores reales (DP 136, 154, 115…) → buen protocolo, canal local decodificado — champán :bottle_with_popping_cork:

  • tarjeta naranja push_frame_version_mismatch\ → el timbre habla otro protocolo y la tarjeta te dice cuál (« save the device with protocol 3.X ») → guarda con ese y toca el timbre de nuevo;

  • en 3.4/3.5, una mala elección falla directamente en la conexión (no hay `persistente: conectado`) — eliminación inmediata.

5. → Para copiar: las tarjetas `push_dps` / `push_frame_raw` / `push_frame_version_mismatch` alrededor de los eventos.

Prueba C — El VERDADERO 100 % local (5 min, si la Prueba B mostró push_dps)

1. Siempre en 3.3 + sustitución local: desmarca « Eventos en tiempo real (Pulsar) » Y haz clic en « Desconectar » en la página de Configuración → Gladys ya no tiene NINGÚN acceso a la nube Tuya.

2. Toca el timbre. Si el evento « Timbre » aparece en el historial: es 100 % local certificado. (La foto, sin embargo, no puede mostrarse en este modo: su URL de descarga solo existe en el mensaje Pulsar — limitación de Tuya, no de Gladys.)

3. Vuelve a conectarte (« Guardar ») y vuelve a marcar Pulsar al final.

Resumen :clipboard:

1. Prueba A: ring → foto widget + evento Timbre + tarjetas `media_*`/`doorbell_ring_event`;

2. Prueba B: escucha pura 3.3 → tarjetas `push_dps`/`push_frame_raw` en el ring/movimiento;

3. Prueba C (si B concluyente): ring Pulsar cortado + nube desconectada → ¿llega el evento?

4. Tu sensación sobre la latencia de los toggles (detección de movimiento) — debe ser mucho mejor.

¡Un enorme gracias — gracias a tus capturas deberíamos pasar de un timbre mudo a un timbre (casi) completamente integrado! :door::bell:

¡Buena noticia!

Bueno, mi respuesta se perdió tres veces en el foro y admito que reescribirla me aburre :wink:

¡PERO FUNCIONÓ!

No sé por qué, pero antes de obtener un resultado, tuve que reiniciar completamente el contenedor a pesar de la eliminación del contenedor, el pull y el inicio.

Olvidé hacer clic en « vaciar » entre las pruebas, por lo que el registro es largo.

Solo una precisión, la presión del timbre funciona, la detección de movimiento dice « ¡todavía no! »:

22:53:25.471warnVisiophone Wifi (bf0e59548489fcb4ea62of)local_poll_failedLocal poll failed, falling back to cloud: Local poll socket error: Error from socket: connect ECONNREFUSED 192.168.1.205:6668
22:53:15.472warnVisiophone Wifi (bf0e59548489fcb4ea62of)local_poll_failedLocal poll failed, falling back to cloud: Local poll socket error: Error from socket: connect ECONNREFUSED 192.168.1.205:6668
22:53:10.493warnVisiophone Wifi (bf0e59548489fcb4ea62of)local_poll_failedLocal poll failed, falling back to cloud: Local poll timeout ; DP_REFRESH fallback failed: Local poll socket error ; null-value SET query failed: Local poll socket error: Error from socket: connect ECONNREFUSED 192.168.1.205:6668
22:52:55.458warnVisiophone Wifi (bf0e59548489fcb4ea62of)degraded_skipLocal mode skipped: degraded backoff active, falling back to cloud
22:52:45.458warnVisiophone Wifi (bf0e59548489fcb4ea62of)degraded_skipLocal mode skipped: degraded backoff active, falling back to cloud
22:52:41.894debugVisiophone Wifi (bf0e59548489fcb4ea62of)pulsar_reportPulsar real-time report (movement_detect_pic)
{"movement_detect_pic":"eyJidWNrZXQiOiJ0eS1ldS1zdG9yYWdlMzAtcGljIiwiZmlsZXMiOltbIi8xNzYwNzMtMTYxODY5NDE2LXBwMDFiZjAwZWI2YTFhOTZjZDUwL2RldGVjdC8xNzg0NDA3OTYwLmpwZWc/cGFyYW09WjdpWGtiaGM5dEcrQXROUk5LNnJCYmUxU01mTG1SR0dvcWZIQ2g1cGoxWT0iLCIiXV0sInYiOiIzLjAifQ=="}
22:52:41.883warnVisiophone Wifi (bf0e59548489fcb4ea62of)media_encrypted_unsupportedEncrypted movement_detect_pic image not supported yet
22:52:41.883debugVisiophone Wifi (bf0e59548489fcb4ea62of)pulsar_reportPulsar real-time report (movement_detect_pic)
{"movement_detect_pic":"eyJ2IjoiMy4wIiwiYnVja2V0IjoidHktZXUtc3RvcmFnZTMwLXBpYyIsImZpbGVzIjpbWyIvMTc2MDczLTE2MTg2OTQxNi1wcDAxYmYwMGViNmExYTk2Y2Q1MC9kZXRlY3QvMTc4NDQwNzk2MC5qcGVnIiwiYzhiNGJmZmZhYWZhZTQ3YSJdXX0="}

El registro completo:

2026-07-18T20:22:47.158Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:47.147Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (sd_status) {"sd_status":5}
2026-07-18T20:22:45.547Z [debug] [Prise frigo (bf1d9d0b6ed2b5755fkt24)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":5,"cloud_changed":0,"cloud_missing":0,"fallback":"none"}
2026-07-18T20:22:45.480Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:22:45.473Z [debug] [Chauffage cabinet (bf2be3c32ea4d8f561ujmu)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"none"}
2026-07-18T20:22:45.361Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retroceso a la nube
2026-07-18T20:22:42.720Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:42.719Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:42.719Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (total_power) {"total_power":150}
2026-07-18T20:22:42.718Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:42.716Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:42.716Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_factor) {"power_factor":54}
2026-07-18T20:22:42.708Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:42.707Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:42.707Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_a) {"power_a":150}
2026-07-18T20:22:42.706Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:42.696Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:42.696Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (voltage_a) {"voltage_a":2312}
2026-07-18T20:22:42.578Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:42.566Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:42.566Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (current_a) {"current_a":118}
2026-07-18T20:22:35.470Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:22:35.360Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retroceso a la nube
2026-07-18T20:22:32.076Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:32.076Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:32.075Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_factor) {"power_factor":55}
2026-07-18T20:22:32.074Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:32.067Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:32.067Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_a) {"power_a":148}
2026-07-18T20:22:31.961Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:31.960Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:31.960Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (total_power) {"total_power":148}
2026-07-18T20:22:31.951Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:31.949Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:31.949Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (current_a) {"current_a":117}
2026-07-18T20:22:31.948Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:22:31.938Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:31.938Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (voltage_a) {"voltage_a":2309}
2026-07-18T20:22:25.586Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:22:25.360Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retroceso a la nube
2026-07-18T20:22:25.167Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_stored] Instantánea de doorbell_pic almacenada en la función de la cámara
2026-07-18T20:22:25.056Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_image_too_big] Instantánea de doorbell_pic excede el límite de 150KB de la cámara```, re-encoding with ffmpeg
2026-07-18T20:22:25.055Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_download_ok] Snapshot de doorbell_pic descargado desde ty-eu-storage30-pic.s3.eu-central-1.amazonaws.com
2026-07-18T20:22:24.871Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:24.863Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [doorbell_ring_event] Timbre de la puerta derivado de una nueva instantánea de timbre
2026-07-18T20:22:24.862Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (doorbell_pic) {"doorbell_pic":"aHR0cHM6Ly90eS1ldS1zdG9yYWdlMzAtcGljLnMzLmV1LWNlbnRyYWwtMS5hbWF6b25hd3MuY29tLzE3NjA3My0xNjE4Njk0MTYtcHAwMWJmMDBlYjZhMWE5NmNkNTAvZGV0ZWN0LzE3ODQ0MDYxNDIuanBlZz9YLUFtei1TZWN1cml0eS1Ub2tlbj1Gd29HWlhJdllYZHpFTHYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkZ3RWFETGh5ZjkzUEI0RWdOVGZ6SFNLREFpcjB0bGNjTTVQS3p0ZTBIYnNjaGFuMUdWREVVYlIwRCUyRk5CMlRnemxrMzhrbHhwMjN0WDcza1ZGN2E0TUpNJTJGdWl3aHJadFZsWWxiM281M0RFeWRHZEJyUXFoM2twQktaaUVJJTJCN2xmVUtlanRWa3JDVDU2RjV2bWxPOWU5STlFdlcxVlhrQTZEb1ZCV2dJdVNGaXElMkZNaWpHUUJqcU1lN3VFc2pSdHFxMDdlV05CV0ZWcTRZMm00Qkt1Q1JvbktOdTRUeWc2MXlrWW1yMWs3aVFWV09aRFNtWjQyTmh5MURyOWF1NjRzdTFQalBEJTJCRFBzeXZXeE5Kend4MUR6UWlFaUtUWGlpcmFvUDhOYkxUWlolMkZ6M3BvZGNwVzNGNjJuN0drSkNhVmR3UDFEMSUyQk9ZNUJZaDlxeUljJTJCTkNJNk1UdjRuYUFmVUxGT2FSTzYzJTJCSWRxOFpEUE1uNmk0b3pKVHQwZ1l5S2ZxZ3VRdEdBNndTVTJvb3I4UXY0RU5ZRFBFbHlyR00zMmMxRE9hdWdDNnRqMm1hZ09uNmVtTDUmWC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BU0lBVVRQTVVKSkpaSUwzVE9IWiUyRjIwMjYwNzE4JTJGZXUtY2VudHJhbC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQyMDIyMjRaJlgtQW16LUV4cGlyZXM9NjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmJ1Y2tldD10eS1ldS1zdG9yYWdlMzAtcGljJnY9MS4wJlgtQW16LVNpZ25hdHVyZT1hZjc0NjRlZGYyNjMxYzIzMWQyNTYyNzZjZTRiZmYwNDg0MzIzZjk4MGRiNWIwZWM3NDM4ZjBmY2FkYjQ2ZmQ3"}
2026-07-18T20:22:24.235Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (movement_detect_pic) {"movement_detect_pic":"eyJidWNrZXQiOiJ0eS1ldS1zdG9yYWdlMzAtcGljIiwiZmlsZXMiOltbIi8xNzYwNzMtMTYxODY5NDE2LXBwMDFiZjAwZWI2YTFhOTZjZDUwL2RldGVjdC8xNzg0NDA2MTQyLmpwZWc/cGFyYW09MTdpd0lORUFRc1dEaXZuV254aWFscmUxU01mTG1SR0dvcWZIQ2g1cGoxWT0iLCIiXV0sInYiOiIzLjAifQ=="}
2026-07-18T20:22:24.227Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_encrypted_unsupported] Imagen movement_detect_pic cifrada no soportada aún
2026-07-18T20:22:24.225Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (movement_detect_pic) {"movement_detect_pic":"eyJ2IjoiMy4wIiwiYnVja2V0IjoidHktZXUtc3RvcmFnZTMwLXBpYyIsImZpbGVzIjpbWyIvMTc2MDczLTE2MTg2OTQxNi1wcDAxYmYwMGViNmExYTk2Y2Q1MC9kZXRlY3QvMTc4NDQwNjE0Mi5qcGVnIiwiZjliZjQ2NDNhZjRhZDQ0YSJdXX0="}
2026-07-18T20:22:22.751Z [debug] [pulsar_other_protocol] Mensaje de Pulsar con protocolo 20 {"properties":{"em":"aes_gcm"},"payload":{"data":"1PZuGA+M5YyJcR9TVgY24C12u6+xanRKH9KzMxxYTec311LESxvH5gNq7f7yJjVttF05Zv0dVGyTLg1kDCBXmnYHlG69TG37ZEwt/OeKctKH3a7ay/m574yMTRDv+Aoaq8YXHW6+pKCiUpUaQBg1YqOYlGJh5eYIj82zSTNPg4Yp7+PpI4SD3clajTuZ/FBQPv+xO0TdZaLbUxzZQ8qwGlxOxcP25mX00DfhoyVgBK166jHzlRRxoOBc/4+CNCtDqD74q21GEnIc+BLbILUrx0MZys18EsryLZwFPIwjcxLEs576FqIvZaU7kICzQbpZTEijbUJcHNnqb4M9p4UTFz+77zIf","encryptVersion":"v2","protocol":20,"pv":"2.0","sign":"144b17cdcbc6e1eb1a1bf88978952895","t":1784406142741},"decrypted":{"bizCode":"event_notify","bizData":{"devId":"bf0e59548489fcb4ea62of","edata":"8ecb45c51784406142","etype":"doorbell"},"devId":"bf0e59548489fcb4ea62of","productKey":"i5e3a4qxcsthszin","ts":1784406142738,"uuid":"pp01bf00eb6a1a96cd50"}}
2026-07-18T20:22:21.244Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:21.241Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:21.241Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (total_power) {"total_power":149}
2026-07-18T20:22:21.232Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:21.231Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:21.231Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_a) {"power_a":149}
2026-07-18T20:22:21.229Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:21.219Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:21.218Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (voltage_a) {"voltage_a":2310}
2026-07-18T20:22:15.913Z [debug] [Prise frigo (bf1d9d0b6ed2b5755fkt24)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":5,"cloud_changed":0,"cloud_missing":0,"fallback":"none"}
2026-07-18T20:22:15.812Z [debug] [Chauffage cabinet (bf2be3c32ea4d8f561ujmu)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"none"}
2026-07-18T20:22:15.809Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:22:15.360Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retrocediendo a la nube
2026-07-18T20:22:10.569Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:10.568Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:10.568Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (total_power) {"total_power":150}
2026-07-18T20:22:10.565Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:10.562Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:10.562Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (freq) {"freq":4934}
2026-07-18T20:22:10.561Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:10.560Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:10.560Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_a) {"power_a":150}
2026-07-18T20:22:10.556Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:10.546Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no en Gladys
2026-07-18T20:22:10.546Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (voltage_a) {"voltage_a":2313}
2026-07-18T20:22:05.466Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:22:05.361Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retrocediendo a la nube
2026-07-18T20:22:02.509Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.504Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (basic_device_volume) {"basic_device_volume":10}
2026-07-18T20:22:02.503Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.502Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (record_mode) {"record_mode":"2"}
2026-07-18T20:22:02.500Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.494Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (record_switch) {"record_switch":true}
2026-07-18T20:22:02.493Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.492Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (sd_storge) {"sd_storge":"100|0|100"}
2026-07-18T20:22:02.491Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.481Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (sd_status) {"sd_status":5}
2026-07-18T20:22:02.460Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.453Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (motion_sensitivity) {"motion_sensitivity":"1"}
2026-07-18T20:22:02.452Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.450Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (motion_switch) {"motion_switch":true}
2026-07-18T20:22:02.440Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.427Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (basic_nightvision) {"basic_nightvision":"0"}
2026-07-18T20:22:02.258Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.256Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (basic_osd) {"basic_osd":true}
2026-07-18T20:22:02.246Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.236Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (basic_flip) {"basic_flip":false}
2026-07-18T20:22:02.187Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:22:02.178Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (basic_indicator) {"basic_indicator":true}
2026-07-18T20:21:59.904Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:21:59.903Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no presente en Gladys
2026-07-18T20:21:59.903Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (total_power) {"total_power":151}
2026-07-18T20:21:59.901Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:21:59.893Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no presente en Gladys
2026-07-18T20:21:59.893Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (freq) {"freq":4935}
2026-07-18T20:21:59.891Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:21:59.881Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no presente en Gladys
2026-07-18T20:21:59.881Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (power_a) {"power_a":151}
2026-07-18T20:21:59.767Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:21:59.766Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no presente en Gladys
2026-07-18T20:21:59.766Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (current_a) {"current_a":119}
2026-07-18T20:21:59.764Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_duplicate_skipped] Informe de Pulsar en formato gemelo ya enrutado
2026-07-18T20:21:59.754Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_unknown_device] Informe de Pulsar para un dispositivo no presente en Gladys
2026-07-18T20:21:59.754Z [debug] [bf8a5bf8acc4540a41rere] [pulsar_report] Informe en tiempo real de Pulsar (voltage_a) {"voltage_a":2309}
2026-07-18T20:21:57.802Z [debug] [pulsar_other_protocol] Mensaje de Pulsar con protocolo 1001 {"properties":{"em":"aes_gcm"},"payload":{"data":"Y4iGgw9uMixvT8AVKvy5LoXTYCDJo3QzKKM4LSN0cT+4f55j5xqiGBQnrnrBkpCc7/G9cfCzw4a4qthOypx8JCCiBXQWFYkJPBrNi2ptwU/84IfLp4kSThL02OvT8iDd6T9YGz8wiBmvxgYyjYT8sQjkoaCTJgNbCQ+Wt2j6SHXadkz6Brxy1Z1Mnt4ciY0PgY/zml+bNY3ixwHvX83wwxH6COtlTVJmgCIHQirmmNGe1qYirXj9SZv6kmCA0+3YR3HHeE0IRQ==","encryptVersion":"v2","protocol":1001,"pv":"2.0","sign":"43fccada19b420136f338e08748115ea","t":1784406117786},"decrypted":{"bizCode":"deviceOnline","bizData":{"devId":"bf0e59548489fcb4ea62of","uid":"eu1690232009037AjM7i","productId":"i5e3a4qxcsthszin","time":1784406117618},"ts":1784406117783}}
2026-07-18T20:21:57.792Z [debug] [pulsar_other_protocol] Mensaje de Pulsar con protocolo 20 {"properties":{"em":"aes_gcm"},"payload":{"data":"YMrZC9hnOgpak1nHqPVcGNj8WlWAbBcDqt/xRe+yjDiCXvtheMdNQt+ytJirRSigq1/vVlNMvT2SK7ebCPs/3UtzEXer3uCUt+ryWAsVT1f2fYu722mbfa+dClrrtFvWoe9O70PzfRQDV1Tl2Y1g5SFrwOSEI1kzgASSI5quhrMRPBBiA5zZ4nbAQ7/qfRGfP7ZEmSNOICd92r9xO1y1qZs7ciMSOzh1iP0HkpZ/W9CQbTkzfgmZmbvxpqiKAzvVJ0Y=","encryptVersion":"v2","protocol":20,"pv":"2.0","sign":"16c34982aebe096e81c96287ca375248","t":1784406117783},"decrypted":{"bizCode":"online","bizData":{"uid":"eu1690232009037AjM7i","time":1784406117618},"devId":"bf0e59548489fcb4ea62of","productKey":"i5e3a4qxcsthszin","ts":1784406117781}}
2026-07-18T20:21:55.503Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [poll_summary] Encuesta completada {"mode":"cloud","local_handled":0,"local_changed":0,"cloud_handled":6,"cloud_changed":0,"cloud_missing":0,"fallback":"device_degraded"}
2026-07-18T20:21:55.360Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retrocediendo a la nube

2026-07-18T20:25:45.371Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retrocediendo a la nube
2026-07-18T20:25:43.609Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_stored] Instantánea de doorbell_pic almacenada en la función de la cámara
2026-07-18T20:25:43.515Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_image_too_big] La instantánea de doorbell_pic supera el límite de 150KB de la cámara, re-encodificando con ffmpeg
2026-07-18T20:25:43.514Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_download_ok] Instantánea de doorbell_pic descargada desde ty-eu-storage30-pic.s3.eu-central-1.amazonaws.com
2026-07-18T20:25:43.303Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_duplicate_skipped] Informe de Pulsar en formato doble ya enrutado
2026-07-18T20:25:43.295Z [info] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [doorbell_ring_event] Timbre de la puerta derivado de una nueva instantánea de timbre
2026-07-18T20:25:43.294Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (doorbell_pic) {"doorbell_pic":"aHR0cHM6Ly90eS1ldS1zdG9yYWdlMzAtcGljLnMzLmV1LWNlbnRyYWwtMS5hbWF6b25hd3MuY29tLzE3NjA3My0xNjE4Njk0MTYtcHAwMWJmMDBlYjZhMWE5NmNkNTAvZGV0ZWN0LzE3ODQ0MDYzMzkuanBlZz9YLUFtei1TZWN1cml0eS1Ub2tlbj1Gd29HWlhJdllYZHpFTHYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkZ3RWFETGh5ZjkzUEI0RWdOVGZ6SFNLREFpcjB0bGNjTTVQS3p0ZTBIYnNjaGFuMUdWREVVYlIwRCUyRk5CMlRnemxrMzhrbHhwMjN0WDcza1ZGN2E0TUpNJTJGdWl3aHJadFZsWWxiM281M0RFeWRHZEJyUXFoM2twQktaaUVJJTJCN2xmVUtlanRWa3JDVDU2RjV2bWxPOWU5STlFdlcxVlhrQTZEb1ZCV2dJdVNGaXElMkZNaWpHUUJqcU1lN3VFc2pSdHFxMDdlV05CV0ZWcTRZMm00Qkt1Q1JvbktOdTRUeWc2MXlrWW1yMWs3aVFWV09aRFNtWjQyTmh5MURyOWF1NjRzdTFQalBEJTJCRFBzeXZXeE5Kend4MUR6UWlFaUtUWGlpcmFvUDhOYkxUWlolMkZ6M3BvZGNwVzNGNjJuN0drSkNhVmR3UDFEMSUyQk9ZNUJZaDlxeUljJTJCTkNJNk1UdjRuYUFmVUxGT2FSTzYzJTJCSWRxOFpEUE1uNmk0b3pKVHQwZ1l5S2ZxZ3VRdEdBNndTVTJvb3I4UXY0RU5ZRFBFbHlyR00zMmMxRE9hdWdDNnRqMm1hZ09uNmVtTDUmWC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BU0lBVVRQTVVKSkpaSUwzVE9IWiUyRjIwMjYwNzE4JTJGZXUtY2VudHJhbC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQyMDI1NDNaJlgtQW16LUV4cGlyZXM9NjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmJ1Y2tldD10eS1ldS1zdG9yYWdlMzAtcGljJnY9MS4wJlgtQW16LVNpZ25hdHVyZT0zN2Y4OWQxNGM2MzM0NGQ1ZmUwOWM3NjRlM2RkMWI2MGNmZjQ3MTAwYzRjYmZiOTcxNDQ2MjIzZWU2ZDg0ZmQ1"}
2026-07-18T20:25:42.273Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (movement_detect_pic) {"movement_detect_pic":"eyJidWNrZXQiOiJ0eS1ldS1zdG9yYWdlMzAtcGljIiwiZmlsZXMiOltbIi8xNzYwNzMtMTYxODY5NDE2LXBwMDFiZjAwZWI2YTFhOTZjZDUwL2RldGVjdC8xNzg0NDA2MzM5LmpwZWc/cGFyYW09R282R282R29JU3VGdURZaHpCcllkc1NQZXZRQkFoN0NMejI0eXZTL0tqdz0iLCIiXV0sInYiOiIzLjAifQ=="}
2026-07-18T20:25:42.261Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [media_encrypted_unsupported] Imagen movement_detect_pic cifrada no soportada aún
2026-07-18T20:25:42.261Z [debug] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [pulsar_report] Informe en tiempo real de Pulsar (movement_detect_pic) {"movement_detect_pic":"eyJ2IjoiMy4wIiwiYnVja2V0IjoidHktZXUtc3RvcmFnZTMwLXBpYyIsImZpbGVzIjpbWyIvMTc2MDczLTE2MTg2OTQxNi1wcDAxYmYwMGViNmExYTk2Y2Q1MC9kZXRlY3QvMTc4NDQwNjMzOS5qcGVnIiwiNTEwZDEyN2M4YzZkNjM1NSJdXX0="}
2026-07-18T20:25:35.371Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo, retrocediendo a la nube
2026-07-18T20:25:25.370Z [warn] [Visiophone Wifi (bf0e59548489fcb4ea62of)] [degraded_skip] Modo local omitido: retroceso degradado activo

Hola @GBoulvin,

Disculpa el tiempo de respuesta, y gracias de nuevo por tus últimos tests que, normalmente, nos siguen ayudando a avanzar. ^^

Me he permitido tomar una decisión: estoy trabajando a fondo en la transposición de la integración interna actual de Gladys para convertirla en una nueva integración externa, un tema en el que Pierre-Gilles está trabajando a fondo y con dedicación en este momento para poder iterar más rápido. Estoy convencido de que esto mejorará nuestras fases de prueba. Normalmente, solo tendrás que hacer clic para actualizar la imagen de prueba y ¡probarla! ^^ Estoy totalmente emocionado, entramos en otra dimensión.

Mi desarrollo actual funciona tanto en la nube como localmente. Sin embargo, presenta algunas limitaciones, pero las estamos superando.

Un gran retroceso, al menos por el momento, en el lado de Tuya: perdemos la creación automática de issues en GitHub. Pero estoy convencido de que encontraremos una solución. ^^

Espero que esto te convenza, pero ten en cuenta que todos los avances que hemos hecho y la experiencia adquirida son ultra útiles para el diseño de la integración externa. ^^

:heart_eyes: :heart_eyes:

¡Lo he visto! ¡Y adelante!

El desarrollo de esta forma de trabajar en Gladys me parece una excelente idea.

Era genial, pero debe poder sustituirse. Si proponemos copiar las características de los dispositivos que el usuario del servidor pegue en una plantilla base que se le crearía al hacer clic en un enlace, debería ser aceptable como funcionamiento. De todas formas, esto implica que el usuario tenga una cuenta de GitHub, lo cual no es muy común.

Por cierto, ¿el post debía hacerse en el GitHub de Gladys o de la integración?

¡Estoy, por supuesto, siempre disponible para hacer pruebas!

En el de la integración :wink:

Bueno, @GBoulvin, si estás listo para lanzar y probar la imagen de Pierre-Gilles para las integraciones externas, cuando quieras para una nueva ronda de pruebas ^^

Claude Fable y yo estamos trabajando en la integración de la PR7 (Tomas LSC) en la integración externa de Tuya!! Y solo tú puedes probarlo ^^

La PR9 (Aire acondicionado) ya está integrada. La PR8 (Termostatos) está en progreso. Luego llegamos al timbre ^^ ¡Ya!

EDITO: PR8 integrada, versión 1.3.0 lanzada => Package gladys-tuya · GitHub

:tada: ¡La integración externa gladys-tuya pasa a la versión 1.5.0! Package gladys-tuya · GitHub

Pequeño resumen de todo lo que contiene la integración hoy, para los que se nos unen :backhand_index_pointing_down:

Los dispositivos gestionados

:electric_plug: Enchufes inteligentes (incluido el enchufe LSC FR con medición de consumo)
:high_voltage: Medidores de energía (incluido trifásico)
:snowflake: Aire acondicionado (encendido/apagado, modo, consigna, temperatura)
:fire: Termostatos de cable piloto (incluido Konyks eCosy): modo, consigna, temperatura, bloqueo infantil, consumo…
:light_bulb: Y los básicos: interruptores, luces, persianas

Nube Y local, a elección

Cada dispositivo muestra una etiqueta Local o Nube para saber cómo se comunica. Un simple botón « Preferir conexión local » te deja decidir: lo local es más rápido y funciona incluso sin internet, con retroceso automático a la nube si es necesario.

Retorno de estado instantáneo :high_voltage: (el gran cambio)

Se acabó esperar el refresco: cuando enciendes un dispositivo (físicamente, desde la app Tuya o un mando a distancia), el estado se actualiza en Gladys casi inmediatamente, en los dos modos:

En local: se mantiene una conexión permanente con tus dispositivos de la red.
En nube: a través del servicio de tiempo real de Tuya, llamado Pulsar (activable como opción, ver más abajo).

Confort en el día a día

:magnifying_glass_tilted_right: Detección automática de dispositivos, con detección local manual (por IP) para los que la red no encuentra sola
:link: Estado de conexión a la nube mostrado claramente (con la razón en caso de problema)
:stop_sign: Botón para desconectarse/reconectarse a la nube a demanda
:counterclockwise_arrows_button: Actualizaciones de la integración en un clic, sin reinstalar nada

Sobre el Pulsar (retorno de nube en tiempo real)

Es una opción para activar si tienes dispositivos que no están en local. Dos pequeños pasos: activar « Message Service » en tu proyecto Tuya IoT, luego marcar la opción en la configuración de la integración. Una documentación detallada llegará para esto. Nota: algunos dispositivos envían todo en tiempo real, otros solo una parte — depende de lo que el dispositivo envíe al nube.

Todo es sólido y funciona continuamente en mi banco de pruebas (10 dispositivos). ¡Buena prueba para vosotros, y los comentarios son bienvenidos! :raising_hands:

ghcr.io/terdious/gladys-tuya:1.5.0

¡Primera prueba!

Al principio, pensé que había que esforzarse para buscar y recordar los enlaces de Docker para instalar una extensión, pero… ¡Ni siquiera eso es necesario porque ya está listado!

Instalación de un solo clic, ¡genial!

Entonces, en la página de inicio (Dispositivos Y Descubrimiento), de nuevo falta la invitación a ir a la página « configuración » la primera vez. ¿O la primera vez podríamos aterrizar directamente en esa página?

En la página de configuración, habrá que volver a poner la explicación sobre cómo crear una cuenta, etc.

Después de la configuración, el mensaje « configuración guardada » ya no implica que la conexión sea buena. ¿Es posible añadirlo?

En la página de escaneo, no vi ninguna señal de que se estuviera trabajando y pensé que no iba bien, pero unos segundos más tarde, ¡bingo! Las dos tomas y el Smart Meter funcionan!

Por otro lado, ¿no hay escaneo para pasar a local? Sin embargo, en la pestaña « Registros », se ve claramente:

[2026-07-22T18:35:11.469Z] [INFO] [tuya] [Tuya][localScan] Found device bf0e59548489fcb4ea62of ip=192.168.1.205 version=3.3
[2026-07-22T18:35:11.469Z] [INFO] [tuya] [Tuya][localScan] Found device bf1d9d0b6ed2b5755fkt24 ip=192.168.1.42 version=3.4
[2026-07-22T18:35:11.470Z] [INFO] [tuya] [Tuya][localScan] Found device bf85d2ce4746ff3ebeifas ip=192.168.1.203 version=3.3

De hecho, no lo entiendo muy bien. ¿El dispositivo pasa automáticamente a local y luego vuelve a la nube si el sondeo es demasiado lento? Vi uno pasar de uno a otro, pero está borroso… Y es imposible pasar manualmente al modo local fácilmente.

Pero en la nube, ¡funciona!

Edición: de los tres dispositivos listados, uno es un enchufe, otro una cámara y el tercero el timbre

Edición 2: Después de buscar, encontré que se puede poner el modo local manualmente, ¡y funciona!

Tienes razón, lo estoy tratando

Parte 1: enrutamiento post-instalación: después de la instalación, ahora se redirige a la pestaña Configuración tan pronto como el manifiesto declara un config_schema (las integraciones de comunicación ya lo hacían). Una integración sin configuración sigue llegando a Dispositivos.

Parte 2: estados vacíos: cuando la lista está vacía y el manifiesto tiene un config_schema, se muestra una invitación con un enlace clicable a la pestaña Configuración debajo del mensaje existente:

  • Dispositivos: «Si acaba de instalar esta integración, comience por completar la pestaña Configuración y luego inicie un descubrimiento.»
  • Descubrimiento: «¿No se encontró nada? Verifique que la integración esté correctamente configurada en la pestaña Configuración y luego reinicie un escaneo.»

Hola @GBoulvin,

Gracias a la adición de Pierre-Gilles, la mayoría de tus comentarios han sido tratados :rocket:



Por lo tanto:

  • ¿Puedes confirmarme que las indicaciones son ahora suficientes y que la documentación es clara?
  • ¿Me confirmas que todos tus dispositivos que deberían ser compatibles son reconocidos y tienen todas sus funcionalidades? Porque me parecía que tenías:
    • Un enchufe LSC Smart Power Plug que no era completamente compatible en la integración principal, pero que probamos en la integración principal de desarrollo y que debería ser completamente compatible ahora directamente en la integración de prueba… ¿Es así?
    • Un Smart Meter que funcionaba… Pero que no sería visto, según entiendo, ya que solo ves 3 dispositivos?
    • Una cámara LSC PTZ Camera => ¡Ah, eso es muy interesante! Tipo de equipo funcional en la integración Netatmo, por lo que deberíamos poder integrarlo ahora ^^ Puedes mostrarme lo que tienes (Descubrimiento en imagen + si es posible copiar el objeto correspondiente en las herramientas de desarrollo del navegador (Pestaña red / solicitud Discovered_device / Pestaña Vista previa y encontrar el dispositivo correcto :slight_smile: )
    • Timbre Wifi video doorbell => Por el momento no se ha inyectado ^^

¡Muchas gracias a ti!

¡Hola!

No sé si esto es útil, pero aquí está el registro completo de la integración:

[2026-08-01T05:46:16.640Z] [INFO] Iniciando la integración de Tuya...
[2026-08-01T05:46:16.841Z] [INFO] [gladys-sdk] conectado a Gladys (http://172.30.0.1:80)
[2026-08-01T05:46:16.841Z] [INFO] WebSocket conectado a Gladys
[2026-08-01T05:46:16.851Z] [WARN] Tuya no está configurado aún: complete la configuración de la integración en Gladys
[2026-08-01T05:46:16.854Z] [WARN] Descubrimiento de Tuya omitido (estado=not_initialized)
[2026-08-01T05:48:24.639Z] [INFO] onConfigUpdated -> nueva configuración recibida
[2026-08-01T05:48:24.640Z] [INFO] [tuya] Desconectando de Tuya... (manual=false)
[2026-08-01T05:48:24.641Z] [INFO] [tuya] Conectando a Tuya...
[2026-08-01T05:48:24.941Z] [INFO] [tuya] Conectado a Tuya
[2026-08-01T05:48:25.088Z] [INFO] [tuya] 6 dispositivos Tuya encontrados
[2026-08-01T05:48:25.363Z] [INFO] [tuya] [Tuya][localScan] Iniciando escaneo UDP-broadcast mediado por 10s
[2026-08-01T05:48:31.375Z] [INFO] onScanRequest -> descubriendo dispositivos Tuya
[2026-08-01T05:48:35.406Z] [INFO] [tuya] [Tuya][localScan] Dispositivo encontrado bf1d9d0b6ed2b5755fkt24 ip=192.168.1.42 versión=3.4
[2026-08-01T05:48:35.406Z] [INFO] [tuya] [Tuya][localScan] Dispositivo encontrado bf9313bc9aa50670d9wf7x ip=192.168.1.182 versión=3.3
[2026-08-01T05:48:35.406Z] [INFO] [tuya] [Tuya][localScan] Dispositivo encontrado bf0e59548489fcb4ea62of ip=192.168.1.205 versión=3.3
[2026-08-01T05:48:35.407Z] [INFO] [tuya] [Tuya][localScan] Dispositivo encontrado bf85d2ce4746ff3ebeifas ip=192.168.1.203 versión=3.3
[2026-08-01T05:48:35.408Z] [INFO] [tuya] [Tuya][localScan] Escaneo completo. Se encontraron 4 dispositivo(s).
[2026-08-01T05:48:35.412Z] [WARN] [tuya] La función Tuya con el código "basic_indicator" no está gestionada
[2026-08-01T05:48:35.412Z] [WARN] [tuya] La función Tuya con el código "doorbell_active" no está gestionada
[2026-08-01T05:48:35.412Z] [WARN] [tuya] La función Tuya con el código "doorbell_pic" no está gestionada
[2026-08-01T05:48:35.412Z] [WARN] [tuya] La función Tuya con el código "basic_device_volume" no está gestionada
[2026-08-01T05:48:35.413Z] [WARN] [tuya] La función Tuya con el código "fault" no está gestionada
[2026-08-01T05:48:35.415Z] [WARN] [tuya] La función Tuya con el código "basic_anti_flicker" no está gestionada
[2026-08-01T05:48:35.416Z] [WARN] [tuya] La función Tuya con el código "initiative_message" no está gestionada
[2026-08-01T05:49:05.706Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x
[2026-08-01T05:49:05.861Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T05:49:09.345Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf9313bc9aa50670d9wf7x solicitado=local has_local=true modo=cloud estrategia=legacy características=7 local_handled=0 local_changed=0 cloud_handled=6 cloud_changed=6 cloud_missing=0 fallback=local_poll_failed
[2026-08-01T05:49:11.605Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas
[2026-08-01T05:49:11.622Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T05:49:12.714Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T05:49:14.842Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya:device:bf0e59548489fcb4ea62of
[2026-08-01T05:49:14.909Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T05:49:15.201Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf85d2ce4746ff3ebeifas solicitado=local has_local=true modo=cloud estrategia=legacy características=7 local_handled=0 local_changed=0 cloud_handled=6 cloud_changed=6 cloud_missing=0 fallback=local_poll_failed
[2026-08-01T05:49:17.552Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T05:49:17.988Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf0e59548489fcb4ea62of solicitado=local has_local=true modo=cloud estrategia=legacy características=3 local_handled=0 local_changed=0 cloud_handled=3 cloud_changed=3 cloud_missing=0 fallback=local_poll_failed
[2026-08-01T05:49:20.715Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T05:49:21.851Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T05:49:23.718Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf9313bc9aa50670d9wf7x local estacionado 300s después de 3 fallos (Local poll timeout) -> cloud
[2026-08-01T05:49:27.558Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T05:49:30.560Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf0e59548489fcb4ea62of local estacionado 300s después de 3 fallos (Local poll timeout) -> cloud
[2026-08-01T05:49:30.714Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T05:49:33.717Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf85d2ce4746ff3ebeifas local estacionado 300s después de 3 fallos (Local poll timeout) -> cloud
[2026-08-01T05:54:27.822Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T05:54:37.620Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T05:54:40.753Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T05:59:37.793Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T05:59:47.614Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T05:59:50.776Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T06:04:48.177Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T06:04:57.613Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T06:05:00.752Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T06:09:57.634Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T06:10:07.422Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T06:10:10.647Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T06:13:35.436Z] [INFO] onAction detect_protocol <- dispositivo=cámara carport ip=192.168.1.203
[2026-08-01T06:13:35.437Z] [INFO] [tuya] [Tuya][detectProtocol] dispositivo=bf85d2ce4746ff3ebeifas intentando 3.3 en 192.168.1.203
[2026-08-01T06:13:40.438Z] [WARN] [tuya] [Tuya][localPoll] falló para dispositivo=bf85d2ce4746ff3ebeifas Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:13:40.439Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.4 at 192.168.1.203
[2026-08-01T06:13:40.548Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncado)
[2026-08-01T06:13:40.549Z] [INFO] [tuya] [Tuya][localPoll] last socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncado)
[2026-08-01T06:13:40.549Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncado)
    at TuyaDevice.errorListener (file:///app/src/tuya/local/tuya.localPoll.js:114:20)
    at Object.onceWrapper (node:events:631:26)
    at TuyaDevice.emit (node:events:521:24)
    at Socket.<anonymous> (/app/node_modules/@demirdeniz/tuyapi-newgen/index.js:707:14)
    at Socket.emit (node:events:509:28)
    at addChunk (node:internal/streams/readable:563:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:514:3)
[2026-08-01T06:13:40.551Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.5 at 192.168.1.203
    at Readable.push (node:internal/streams/readable:394:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
[2026-08-01T06:13:40.783Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error
[2026-08-01T06:13:55.556Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:13:55.557Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.1 at 192.168.1.203
[2026-08-01T06:13:55.618Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Invalid local poll response: parse data error
    at TuyaHandler.localPoll (file:///app/src/tuya/local/tuya.localPoll.js:151:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async TuyaHandler.detectProtocol (file:///app/src/tuya/local/tuya.detectProtocol.js:50:22)
    at async file:///app/index.js:221:23
    at async GladysIntegration._runCommand (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1141:22)
    at async GladysIntegration._handleMessage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1079:9)
[2026-08-01T06:14:21.630Z] [INFO] onAction detect_protocol <- device=caméra carport ip=192.168.1.203
[2026-08-01T06:14:21.631Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.3 at 192.168.1.203
[2026-08-01T06:14:26.636Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
[2026-08-01T06:14:26.637Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.4 at 192.168.1.203
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:14:26.693Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncated)
    at TuyaDevice.errorListener (file:///app/src/tuya/local/tuya.localPoll.js:114:20)
    at Object.onceWrapper (node:events:631:26)
    at TuyaDevice.emit (node:events:521:24)
    at Socket.<anonymous> (/app/node_modules/@demirdeniz/tuyapi-newgen/index.js:707:14)
    at Socket.emit (node:events:509:28)
    at addChunk (node:internal/streams/readable:563:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:514:3)
    at Readable.push (node:internal/streams/readable:394:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
[2026-08-01T06:14:26.691Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncated)
[2026-08-01T06:14:26.693Z] [INFO] [tuya] [Tuya][localPoll] last socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: HMAC mismatch: expected da3b7d1ae2d6dbc6bf1279657789828004b18ef7fa6f49ad91c8b2991c9960d0, was 29a73a8f5cd185beb14cb4f8f20f4c51fe86f8d64ccf43382625de380a81825c. ... (truncated)
[2026-08-01T06:14:26.693Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.5 at 192.168.1.203
[2026-08-01T06:14:26.754Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: Error from socket: read ECONNRESET
[2026-08-01T06:14:26.918Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error
[2026-08-01T06:14:36.758Z] [INFO] [tuya] [Tuya][localPoll] last socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: Error from socket: read ECONNRESET
[2026-08-01T06:14:36.758Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:14:36.759Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf85d2ce4746ff3ebeifas trying 3.1 at 192.168.1.203
[2026-08-01T06:14:36.818Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: Error from socket: read ECONNRESET
[2026-08-01T06:14:36.819Z] [INFO] [tuya] [Tuya][localPoll] last socket error for device=bf85d2ce4746ff3ebeifas: Local socket error: Error from socket: read ECONNRESET
[2026-08-01T06:14:36.819Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf85d2ce4746ff3ebeifas Error: Local socket error: Error from socket: read ECONNRESET
    at TuyaDevice.errorListener (file:///app/src/tuya/local/tuya.localPoll.js:114:20)
    at Object.onceWrapper (node:events:631:26)
    at TuyaDevice.emit (node:events:521:24)
    at Socket.<anonymous> (/app/node_modules/tuyapi/index.js:688:12)
    at Socket.emit (node:events:509:28)
    at emitErrorNT (node:internal/streams/destroy:170:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21)
[2026-08-01T06:15:17.464Z] [INFO] [tuya] [Tuya][localSession] device=bf0e59548489fcb4ea62of connected (192.168.1.205, 3.3)
[2026-08-01T06:15:20.606Z] [INFO] [tuya] [Tuya][localSession] device=bf85d2ce4746ff3ebeifas connected (192.168.1.203, 3.3)
[2026-08-01T06:16:28.156Z] [INFO] onAction detect_protocol <- device=Visiophone WiFi ip=192.168.1.205
[2026-08-01T06:16:28.156Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf0e59548489fcb4ea62of trying 3.3 at 192.168.1.205
[2026-08-01T06:16:33.158Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf0e59548489fcb4ea62of Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:16:33.159Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf0e59548489fcb4ea62of trying 3.4 at 192.168.1.205
[2026-08-01T06:16:33.171Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf0e59548489fcb4ea62of: Local socket error
[2026-08-01T06:16:33.192Z] [INFO] [tuya] [Tuya][localPoll] socket error for device=bf0e59548489fcb4ea62of: Local socket error: HMAC mismatch: expected 3edb24fc0923355ea5add79c0834f05124461cccbbd79c7be7fa5354097d58b0, was 6030b642613fcf3f6ed2000ee4ff55fd083c1338270573b621614548cef2dc73. ... (truncated)
[2026-08-01T06:16:33.193Z] [INFO] [tuya] [Tuya][localPoll] last socket error for device=bf0e59548489fcb4ea62of: Local socket error: HMAC mismatch: expected 3edb24fc0923355ea5add79c0834f05124461cccbbd79c7be7fa5354097d58b0, was 6030b642613fcf3f6ed2000ee4ff55fd083c1338270573b621614548cef2dc73. ... (truncated)
[2026-08-01T06:16:33.193Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf0e59548489fcb4ea62of Error: Local socket error: HMAC mismatch: expected 3edb24fc0923355ea5add79c0834f05124461cccbbd79c7be7fa5354097d58b0, was 6030b642613fcf3f6ed2000ee4ff55fd083c1338270573b621614548cef2dc73.. (truncado)
    at TuyaDevice.errorListener (file:///app/src/tuya/local/tuya.localPoll.js:114:20)
    at Object.onceWrapper (node:events:631:26)
    at TuyaDevice.emit (node:events:521:24)
    at Socket.<anonymous> (/app/node_modules/@demirdeniz/tuyapi-newgen/index.js:707:14)
    at Socket.emit (node:events:509:28)
    at addChunk (node:internal/streams/readable:563:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:514:3)
    at Readable.push (node:internal/streams/readable:394:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
[2026-08-01T06:16:33.194Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf0e59548489fcb4ea62of trying 3.5 at 192.168.1.205
[2026-08-01T06:16:48.196Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf0e59548489fcb4ea62of Error: Local poll timeout
    at Timeout.<anonymous> (file:///app/src/tuya/local/tuya.localPoll.js:110:47)
    at listOnTimeout (node:internal/timers:605:17)
    at process.processTimers (node:internal/timers:541:7)
[2026-08-01T06:16:48.197Z] [INFO] [tuya] [Tuya][detectProtocol] device=bf0e59548489fcb4ea62of trying 3.1 at 192.168.1.205
[2026-08-01T06:16:48.218Z] [WARN] [tuya] [Tuya][localPoll] failed for device=bf0e59548489fcb4ea62of Error: Invalid local poll response: parse data error
    at TuyaHandler.localPoll (file:///app/src/tuya/local/tuya.localPoll.js:151:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async TuyaHandler.detectProtocol (file:///app/src/tuya/local/tuya.detectProtocol.js:50:22)
    at async file:///app/index.js:221:23
    at async GladysIntegration._runCommand (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1141:22)
    at async GladysIntegration._handleMessage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1079:9)

Las funciones detectadas (una pasó a local sola, las otras dos, ver abajo) :

Y las funciones admitidas :

Los objetos de la cámara :

La PTZ DualBand

{
    "name": "Cámara carport",
    "selector": "camera-carport-bf85d2ce4746ff3ebeifas",
    "features": [
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:basic_flip",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-basic-flip",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Image flip",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:basic_private",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-basic-private",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Privacy mode",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:motion_switch",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-motion-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Motion detection",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:record_switch",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-record-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Recording",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:siren_switch",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-siren-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Siren",
            "category": "siren",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:motion_tracking",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-motion-tracking",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Motion tracking",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas:humanoid_filter",
            "selector": "camera-carport-bf85d2ce4746ff3ebeifas-humanoid-filter",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Human detection filter",
            "category": "switch",
            "type": "binary"
        }
    ],
    "device_type": "camera",
    "external_id": "ext:ext-dev-tuya:device:bf85d2ce4746ff3ebeifas",
    "model": "LSC PTZ Camera Dualband",
    "product_id": "rogprwflblumx2co",
    "product_key": "rogprwflblumx2co",
    "poll_frequency": 10000,
    "should_poll": true,
    "params": [
        {
            "name": "DEVICE_ID",
            "value": "bf85d2ce4746ff3ebeifas"
        },
        {
            "name": "LOCAL_KEY",
            "value": "{_)U4X/l{l=T$.u["
        },
        {
            "name": "IP_ADDRESS",
            "value": "192.168.1.203"
        },
        {
            "name": "CLOUD_IP",
            "value": "62.235.111.222"
        },
        {
            "name": "LOCAL_OVERRIDE",
            "value": true
        },
        {
            "name": "PROTOCOL_VERSION",
            "value": "3.3"
        },
        {
            "name": "PRODUCT_ID",
            "value": "rogprwflblumx2co"
        },
        {
            "name": "PRODUCT_KEY",
            "value": "rogprwflblumx2co"
        },
        {
            "name": "CLOUD_READ_STRATEGY",
            "value": "legacy"
        },
        {
            "name": "DEVICE_TYPE",
            "value": "camera"
        }
    ],
    "online": true,
    "service_id": "252da07d-4027-45f0-8eff-1077631eddf0",
    "created": true,
    "structure_changed": false
}

La PTZ 2.4GHz

{
    "name": "Cámara de entrada",
    "selector": "camera-entree-bf9313bc9aa50670d9wf7x",
    "features": [
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:basic_flip",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-basic-flip",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Voltear imagen",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:basic_private",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-basic-private",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Modo privacidad",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:motion_switch",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-motion-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Detección de movimiento",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:record_switch",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-record-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Grabación",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:siren_switch",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-siren-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Sirena",
            "category": "siren",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:motion_tracking",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-motion-tracking",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Seguimiento de movimiento",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x:humanoid_filter",
            "selector": "camera-entree-bf9313bc9aa50670d9wf7x-humanoid-filter",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Filtro de detección humana",
            "category": "switch",
            "type": "binary"
        }
    ],
    "device_type": "camera",
    "external_id": "ext:ext-dev-tuya:device:bf9313bc9aa50670d9wf7x",
    "model": "Cámara PTZ LSC",
    "product_id": "n7h0m2x7i2yzol0p",
    "product_key": "n7h0m2x7i2yzol0p",
    "poll_frequency": 10000,
    "should_poll": true,
    "params": [
        {
            "name": "DEVICE_ID",
            "value": "bf9313bc9aa50670d9wf7x"
        },
        {
            "name": "LOCAL_KEY",
            "value": "Y)j!-K2PD3{8GtL."
        },
        {
            "name": "IP_ADDRESS",
            "value": "192.168.1.182"
        },
        {
            "name": "CLOUD_IP",
            "value": "81.11.140.113"
        },
        {
            "name": "LOCAL_OVERRIDE",
            "value": true
        },
        {
            "name": "PROTOCOL_VERSION",
            "value": "3.3"
        },
        {
            "name": "PRODUCT_ID",
            "value": "n7h0m2x7i2yzol0p"
        },
        {
            "name": "PRODUCT_KEY",
            "value": "n7h0m2x7i2yzol0p"
        },
        {
            "name": "CLOUD_READ_STRATEGY",
            "value": "legacy"
        },
        {
            "name": "DEVICE_TYPE",
            "value": "camera"
        }
    ],
    "online": true,
    "service_id": "252da07d-4027-45f0-8eff-1077631eddf0",
    "created": true,
    "structure_changed": false
}

Y el videoportero (sí, lo sé, ya lo tienes, pero…)

{
    "name": "Videoportero WiFi",
    "selector": "visiophone-wifi-bf0e59548489fcb4ea62of",
    "features": [
        {
            "external_id": "ext:ext-dev-tuya:device:bf0e59548489fcb4ea62of:basic_flip",
            "selector": "visiophone-wifi-bf0e59548489fcb4ea62of-basic-flip",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Voltear imagen",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf0e59548489fcb4ea62of:motion_switch",
            "selector": "visiophone-wifi-bf0e59548489fcb4ea62of-motion-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Detección de movimiento",
            "category": "switch",
            "type": "binary"
        },
        {
            "external_id": "ext:ext-dev-tuya:device:bf0e59548489fcb4ea62of:record_switch",
            "selector": "visiophone-wifi-bf0e59548489fcb4ea62of-record-switch",
            "read_only": false,
            "has_feedback": true,
            "min": 0,
            "max": 1,
            "name": "Grabación",
            "category": "switch",
            "type": "binary"
        }
    ],
    "device_type": "camera",
    "external_id": "ext:ext-dev-tuya:device:bf0e59548489fcb4ea62of",
    "model": "Videoportero WiFi",
    "product_id": "i5e3a4qxcsthszin",
    "product_key": "i5e3a4qxcsthszin",
    "poll_frequency": 10000,
    "should_poll": true,
    "params": [
        {
            "name": "DEVICE_ID",
            "value": "bf0e59548489fcb4ea62of"
        },
        {
            "name": "LOCAL_KEY",
            "value": "Rza7;L{]Lv-31q'H"
        },
        {
            "name": "IP_ADDRESS",
            "value": "192.168.1.205"
        },
        {
            "name": "CLOUD_IP",
            "value": "62.235.111.222"
        },
        {
            "name": "LOCAL_OVERRIDE",
            "value": true
        },
        {
            "name": "PROTOCOL_VERSION",
            "value": "3.3"
        },
        {
            "name": "PRODUCT_ID",
            "value": "i5e3a4qxcsthszin"
        },
        {
            "name": "PRODUCT_KEY",
            "value": "i5e3a4qxcsthszin"
        },
        {
            "name": "CLOUD_READ_STRATEGY",
            "value": "legacy"
        },
        {
            "name": "DEVICE_TYPE",
            "value": "camera"
        }
    ],
    "online": true,
    "service_id": "252da07d-4027-45f0-8eff-1077631eddf0",
    "created": true,
    "structure_changed": false
}

Parece bastante bien todo esto, ¿no? En todo caso, las características detectadas y los interruptores no están ahí para decorar, ¡funcionan! (El botón ‹ sirena › le da una nueva dimensión a la parte ‹ alarma › de Gladys. ¡Era lo que me faltaba para que pareciera ‹ real ›!)

Creo que todo esto responde a tus solicitudes, pero no dudes en decírmelo si me he perdido algo.

¡Qué bien :heart_eyes: :joy: !!

Lo miramos y te lo decimos !! ¡Es demasiado genial !! No, pero es increíble de verdad !! En este momento nos sentimos como niños con todo esto :joy: :joy:

Redescubrimos un cierto placer ^^ Y se desbloquean ciertos obstáculos, que solo estaban presentes por falta de tiempo de cada uno !!

Bueno, mientras escribo esto, la versión v1.7.0 ya llega con la cámara ^^ :face_with_peeking_eye: :sweat_smile: :

Lo que prueba el test

  • Detección perfecta : los 3 dispositivos → device_type: camera, con los interruptores. Responden (nube). La sirena que alimenta la alarma Gladys = exactamente el efecto deseado. :white_check_mark:
  • El macaron « degradado » funciona perfectamente : Cámara entrada pasó a Local sola (ella empuja sus DPS a través de la sesión persistente), mientras que Cámara carport y Videoportero siguen Nube con punto naranja — capaces de local pero caídas en nube. Es exactamente el comportamiento diseñado.

La verdadera lección técnica (cámara local)

Los registros muestran localSession connected en los 3, pero poll … fallback=local_poll_failed luego estacionamiento en nube. Y detect_protocol falla en todos los protocolos (3.4 = HMAC mismatch = protocolo incorrecto ; 3.3/3.5 = timeout).
Traducción : la sesión TCP se abre, pero estas cámaras no responden a la solicitud DPS get localmente — algunas empujan sus cambios (→ Local), otras no (→ Nube). Es un comportamiento del firmware de la cámara, no un error.

Conclusión : para las cámaras, la nube es el transporte fiable ; lo local sigue siendo un bono oportunista. Nada que corregir.

¡Y ahora retoma el trabajo hecho en la integración principal sobre el timbre para implementarlo !!

@GBoulvin ! :folded_hands:

Gracias a tus logs ultra-completos (el objeto del Visiophone + el doorbell_pic), pude backportar el visiophone directamente, basándome en la rama core tuya-diagnostics-doorbell-ring que habíamos preparado. Nueva imagen de prueba disponible:

ghcr.io/terdious/gladys-tuya:dev-doorbell

¿Qué hay de nuevo?

Tu Visiophone ya no es una «cámara con 3 toggles»: se convierte en un tipo video-doorbell con:

  • :bell: Timbre (función botón) — se activa cuando se toca el timbre
  • :camera_with_flash: Snapshot (función cámara/imagen) — la foto del toque/detección se muestra en el widget
  • Detección de movimiento, Grabación, LED de estado, Voltear imagen, Pantalla en pantalla (nube + local)

:warning: Snapshot en evento, no hay video en vivo. Las cámaras Tuya no exponen un RTSP local estable — por lo tanto, no hay flujo en vivo como Netatmo. La imagen se actualiza con cada toque de timbre / detección de movimiento. Es una limitación de Tuya, no de Gladys.

¿Cómo probar?

  1. Redespliega el contenedor en el tag :dev-doorbell — y haz un reinicio completo del contenedor (como la última vez :wink:).
  2. Forzar actualización (para actualizar el manifiesto).
  3. El Visiophone cambia de tipo → elimínalo y redescúbrelo para que se recree como video-doorbell.
  4. Pulsar debe estar activado (la imagen y el timbre en tiempo real pasan por la URL firmada ~60 s proporcionada por Pulsar).

Lo que me gustaría que verifiques

  • ¿El Visiophone aparece como video-doorbell con las 7 funciones mencionadas anteriormente?
  • :bell: ¿Un toque de timbre dispara el evento Timbre en Gladys (función botón / historial)?
  • :camera_with_flash: ¿El widget de imagen muestra el snapshot después de un toque / una detección de movimiento?
  • ¿Los toggles (movimiento, grabación, LED, voltear, OSD) responden en la nube?

:magnifying_glass_tilted_right: Si quieres profundizar en los logs, filtra por [Tuya][media]: deberías ver doorbell ring, snapshot published, o encrypted … not supported yet (el movement_detect_pic a veces está cifrado → es normal que se ignore, el doorbell_pic está en claro).

[details=« Quedó intencionalmente de lado por ahora »]

  • Los ajustes enum (visión nocturna, sensibilidad, modo de grabación): aún no hay un tipo «selector» publicado en el núcleo (mismo bloqueo que la velocidad del ventilador del aire acondicionado).
  • El volumen del timbre y el PTZ: próximos incrementos.
  • Las cámaras PTZ siguen siendo del tipo cámara (controles), sin cambios.
    [/details]

:latest no se ve afectado — nada cambia en tu instalación principal hasta que no se valide. ¡Gracias de antemano por la prueba! :rocket:

¡Bingo!

Cuando se presiona el timbre:

Los interruptores funcionan y envían correctamente al cloud (modificación inmediata en la aplicación (no he probado ‹ Grabación › porque no hay tarjeta µSD dentro)).

Sin embargo, la detección de movimiento no ha enviado (todavía) ninguna notificación ni imagen.

El registro:

[2026-08-01T07:51:49.304Z] [INFO] Iniciando la integración de Tuya...
[2026-08-01T07:51:49.505Z] [INFO] [gladys-sdk] conectado a Gladys (http://172.30.0.1:80)
[2026-08-01T07:51:49.505Z] [INFO] WebSocket conectado a Gladys
[2026-08-01T07:51:49.570Z] [INFO] [tuya] Conectando a Tuya...
[2026-08-01T07:51:50.038Z] [INFO] [tuya] Conectado a Tuya
[2026-08-01T07:51:50.126Z] [INFO] [tuya] Se encontraron 6 dispositivos Tuya
[2026-08-01T07:51:50.271Z] [INFO] [tuya] [Tuya][pulsar] conectado al servicio de mensajes de Tuya (eventos en la nube en tiempo real)
[2026-08-01T07:51:50.915Z] [INFO] [tuya] [Tuya][localScan] Iniciando escaneo de difusión UDP mediada durante 10s
[2026-08-01T07:52:00.943Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf0e59548489fcb4ea62of ip=192.168.1.205 versión=3.3
[2026-08-01T07:52:00.943Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf9313bc9aa50670d9wf7x ip=192.168.1.182 versión=3.3
[2026-08-01T07:52:00.944Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf85d2ce4746ff3ebeifas ip=192.168.1.203 versión=3.3
[2026-08-01T07:52:00.944Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf1d9d0b6ed2b5755fkt24 ip=192.168.1.42 versión=3.4
[2026-08-01T07:52:00.946Z] [INFO] [tuya] [Tuya][localScan] Escaneo completo. Se encontraron 4 dispositivo(s).
[2026-08-01T07:52:00.953Z] [WARN] [tuya] La función Tuya con código "fault" no está gestionada
[2026-08-01T07:52:00.956Z] [WARN] [tuya] La función Tuya con código "basic_anti_flicker" no está gestionada
[2026-08-01T07:52:00.956Z] [WARN] [tuya] La función Tuya con código "initiative_message" no está gestionada
[2026-08-01T07:52:44.105Z] [INFO] onScanRequest -> descubriendo dispositivos Tuya
[2026-08-01T07:52:44.253Z] [INFO] [tuya] Se encontraron 6 dispositivos Tuya
[2026-08-01T07:52:44.477Z] [INFO] [tuya] [Tuya][localScan] Iniciando escaneo de difusión UDP mediada durante 10s
[2026-08-01T07:52:54.499Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf85d2ce4746ff3ebeifas ip=192.168.1.203 versión=3.3
[2026-08-01T07:52:54.499Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf1d9d0b6ed2b5755fkt24 ip=192.168.1.42 versión=3.4
[2026-08-01T07:52:54.499Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf0e59548489fcb4ea62of ip=192.168.1.205 versión=3.3
[2026-08-01T07:52:54.499Z] [INFO] [tuya] [Tuya][localScan] Se encontró el dispositivo bf9313bc9aa50670d9wf7x ip=192.168.1.182 versión=3.3
[2026-08-01T07:52:54.500Z] [INFO] [tuya] [Tuya][localScan] Escaneo completo. Se encontraron 4 dispositivo(s).
[2026-08-01T07:54:32.899Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya-2:device:bf85d2ce4746ff3ebeifas
[2026-08-01T07:54:32.915Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T07:54:36.079Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf85d2ce4746ff3ebeifas solicitado=local tiene_local=true modo=nube estrategia=legacy características=7 manejado_local=0 cambiado_local=0 manejado_nube=6 cambiado_nube=6 faltante_nube=0 fallback=local_poll_failed
[2026-08-01T07:54:36.163Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of
[2026-08-01T07:54:36.187Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T07:54:37.905Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T07:54:38.380Z] [INFO] onDeviceCreated <- ext:ext-dev-tuya-2:device:bf9313bc9aa50670d9wf7x
[2026-08-01T07:54:38.474Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T07:54:39.268Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf0e59548489fcb4ea62of solicitado=local tiene_local=true modo=nube estrategia=legacy características=7 manejado_local=0 cambiado_local=0 manejado_nube=5 cambiado_nube=5 faltante_nube=0 fallback=local_poll_failed
[2026-08-01T07:54:41.552Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf9313bc9aa50670d9wf7x solicitado=local tiene_local=true modo=nube estrategia=legacy características=7 manejado_local=0 cambiado_local=0 manejado_nube=6 cambiado_nube=6 faltante_nube=0 fallback=local_poll_failed
[2026-08-01T07:54:43.172Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T07:54:45.441Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf9313bc9aa50670d9wf7x conectado (192.168.1.182, 3.3)
[2026-08-01T07:54:47.897Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T07:54:50.899Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf0e59548489fcb4ea62of local estacionado 300s después de 3 fallos (Local poll timeout) -> nube
[2026-08-01T07:54:50.968Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T07:54:53.971Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf85d2ce4746ff3ebeifas local estacionado 300s después de 3 fallos (Local poll timeout) -> nube
[2026-08-01T07:56:50.050Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:motion_switch = 1
[2026-08-01T07:56:50.536Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:58:40.650Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_flip = 1
[2026-08-01T07:58:41.006Z] [INFO] [tuya] [Tuya][poll] dispositivo=bf0e59548489fcb4ea62of solicitado=local tiene_local=true modo=nube estrategia=legacy características=7 manejado_local=0 cambiado_local=0 manejado_nube=5 cambiado_nube=1 faltante_nube=0 fallback=local_cooldown
[2026-08-01T07:58:52.196Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_flip = 0
[2026-08-01T07:58:52.579Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:58:57.161Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_osd = 1
[2026-08-01T07:58:57.707Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:59:02.659Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_osd = 0
[2026-08-01T07:59:03.112Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:59:06.243Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_osd = 1
[2026-08-01T07:59:06.469Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:59:13.062Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_indicator = 1
[2026-08-01T07:59:13.664Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:59:17.019Z] [INFO] onSetValue <- ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of:basic_indicator = 0
[2026-08-01T07:59:17.374Z] [INFO] [tuya] [Tuya][pulsar] dispositivo=bf0e59548489fcb4ea62of informe en tiempo real publicado 1 cambio(s)
[2026-08-01T07:59:51.004Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T07:59:54.122Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T08:01:28.729Z] [WARN] [tuya] [Tuya][media] imagen movement_detect_pic cifrada no soportada aún (dispositivo=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)
[2026-08-01T08:01:29.002Z] [INFO] [tuya] [Tuya][media] timbre de la puerta (dispositivo=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)
[2026-08-01T08:01:30.202Z] [INFO] [tuya] [Tuya][media] instantánea de timbre de la puerta publicada (dispositivo=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)
[2026-08-01T08:03:38.490Z] [WARN] [tuya] [Tuya][media] imagen movement_detect_pic cifrada no soportada aún (dispositivo=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)
[2026-08-01T08:04:58.329Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf0e59548489fcb4ea62of conectado (192.168.1.205, 3.3)
[2026-08-01T08:05:01.409Z] [INFO] [tuya] [Tuya][localSession] dispositivo=bf85d2ce4746ff3ebeifas conectado (192.168.1.203, 3.3)
[2026-08-01T08:05:35.255Z] [WARN] [tuya] [Tuya][media] imagen movement_detect_pic cifrada no soportada aún (dispositivo=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)

¡Bravo en todo caso, nunca habría creído que fuera posible sin todo el bricolaje!Edición: ¡He elegido bien mi camiseta para publicar en la red… :upside_down_face: (Por cierto, esto hace referencia a una canción de Arno: « Putain Putain, c’est vachement bien, on est quand même tous des Européens »)

Re @GBoulvin ! Disponibilidad en el mismo tag :dev-doorbell (solo tienes que actualizar la imagen, no es necesario cambiar el tag):

Novedad

  • :person_running: Evento « Movimiento »: una detección ahora desencadena un evento en Gladys → utilizable en tus escenas / notificaciones, incluso sin la imagen.
  • :framed_picture: Vista en vivo: al abrir el widget de la cámara, Gladys vuelve a mostrar el último snapshot conocido (último toque / última detección). Tuya no proporciona una captura a demanda, por lo que es la última imagen de evento.

Transparencia: el « Movimiento » se expone como un botón-evento, no como un sensor de movimiento — Gladys aún no tiene un tipo « motion-sensor » publicado para integraciones externas (mismo límite que la velocidad del ventilador del aire acondicionado). Y la imagen de movimiento sigue ausente por el momento: está cifrada (a diferencia de la imagen de la campanilla). El descifrado es el siguiente paso, en una imagen de prueba separada.

:warning: Protocolo de prueba (importante)

Antes de cambiar definitivamente tu campanilla a :latest (prod), ¿puedes probar cada imagen de prueba y darnos tu opinión? Así evitamos congelar algo inestable en producción.

Regla de oro: nunca tengas tu campanilla añadida al mismo tiempo en 2 imágenes distintas (ej. :latest y :dev-doorbell). Un dispositivo Tuya solo acepta un único consumidor — dos integraciones en paralelo se interferirían (ring/Pulsar/sesión local en conflicto, duplicados). Por lo tanto, una sola imagen a la vez: elimina la campanilla de un lado antes de añadirla al otro.

A probar en :dev-doorbell

  • no terminado​:person_running: Moverse frente a la cámara → ¿se desencadena el evento Movimiento (función botón / historial / una pequeña escena de prueba)?
  • no terminado​:framed_picture: Abrir el widget de la cámara → ¿se muestra la última imagen (último toque/detección)?
  • no terminado​:bell: ¿La campanilla + snapshot siguen funcionando?
  • no terminado​:magnifying_glass_tilted_right: Registros [Tuya][media]: deberías ver movement_detect_pic event fired (movimiento) y siempre encrypted movement_detect_pic image not supported yet (imagen de movimiento, normal).

Tan pronto como me confirmes que todo está bien, fusiono en producción y me pongo con el descifrado de la imagen de movimiento en una imagen :dev dedicada. ¡Gracias! :folded_hands:

¡Movimiento detectado y escena funcional!

[2026-08-01T08:53:28.976Z] [WARN] [tuya] [Tuya][media] encrypted movement_detect_pic image not supported yet (device=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)
[2026-08-01T08:53:28.985Z] [INFO] [tuya] [Tuya][media] movement_detect_pic event fired (device=ext:ext-dev-tuya-2:device:bf0e59548489fcb4ea62of)

La última imagen aparece en el widget de la cámara, el botón funciona perfectamente y la instantánea se actualiza inmediatamente…

¡Yo diría que es un GO para la puesta en producción del timbre!

Y lo increíble es que funciona mucho mejor que la aplicación Tuya, que a veces tarda dos minutos (o más) en enviarme una notificación (no es práctico cuando alguien llama).

EDIT: Para información, acabo de probar la detección de movimiento en las cámaras PTZ y funciona.

image

@GBoulvin :tada: v1.9.0 está en producción (:latest) — ¡y todo gracias a tus últimos comentarios! El movimiento desencadena un evento (escenas/notificaciones) y el live-view vuelve a mostrar la última instantánea. Tu timbre está listo para la producción.

Pero antes de cambiarlo definitivamente a :latest, una última prueba me ayudaría mucho: actualiza tu imagen :dev-doorbell (misma etiqueta), ahora contiene un intento experimental de recuperar la imagen de MOVIMIENTO.

¿Por qué esta prueba / qué aporta?

Hoy: un presionar el timbre → imagen :white_check_mark:, pero una detección de movimiento → solo el evento, sin imagen (está cifrada por Tuya). Esta prueba intenta descifrar esta imagen de movimiento. Si funciona:

  • :camera_with_flash: el movimiento también mostrará una foto (no solo el timbre),
  • :movie_camera: desbloquearía la imagen en tus cámaras PTZ también (solo tienen este flujo).

Es una apuesta incierta (incluso la rama interna dejó esto abierto). Si no funciona, ninguna regresión: el timbre sigue siendo perfecto en v1.9.0.

Para probar en :dev-doorbell (actualizado)

  • Mueve algo frente a la cámara → ¿aparece una imagen de movimiento en el widget (además del evento)?
  • :magnifying_glass_tilted_right: Lo más importante: pégame las líneas [Tuya][media] de tus registros justo después de un movimiento. Buscamos uno de estos casos:
    • :white_check_mark: decrypted with aes-128-… + snapshot published → ¡ganado!
    • :orange_circle: downloaded N bytes + decryption did not yield a JPEG → descarga OK pero algoritmo/clave incorrectos (instructivo, iteramos)
    • :red_circle: no candidate host served… / download failed → la URL firmada no pasa (otra pista)

Son estos registros los que nos dirán si la hipótesis es correcta. :folded_hands:

:warning: Recordatorio: una sola imagen a la vez — no tengas el timbre en :latest y :dev-doorbell al mismo tiempo (conflicto en el dispositivo Tuya). Permanece en :dev-doorbell durante la prueba, luego cambia a producción cuando quieras.