Problema: Gladys se vuelve poco reactiva cada hora durante unos minutos. ¿Será culpa de Enedis?

Desde hace unas semanas, tengo un retraso de unos segundos en mis escenas y en la visualización del panel de control. Por ejemplo, presiono un botón Zigbee y la lámpara Zigbee solo se enciende 3-4 segundos después. Pero no es sistemático, y en general todo es bastante reactivo. De hecho, parece que ocurre cada pocas minutos durante unas horas…

Creo que mi mini-PC en el que se ejecuta Gladys está demasiado solicitado, pero no sé cómo saber qué proceso es el culpable.

Observo esto en la información que se remonta cada minuto desde mis sondas en Node-RED (no hagan caso al rótulo ‹ raspberri-pi4 ›, es solo que no lo renombré después de pasar a un mini-PC):


Se puede ver un consumo importante de RAM (seguramente ayudaría aumentar la memoria…) y sobre todo un aumento del CPU del 15% al 35%, correspondiente al período en el que Gladys pierde su reactividad.

¿Qué puedo analizar para detectar de dónde viene el problema?

Nada más que Gladys se ejecuta en mi mini-PC.

Creo que he encontrado al culpable: cada hora, en el momento en que observo el importante ralentamiento del panel de control y de las escenas de Gladys, se lanza la tarea « Sincronización de datos de Enedis » y dura más de 10 minutos!

He descargado los registros de Gladys para intentar encontrar líneas relacionadas con Enedis, pero solo obtengo unos 20 minutos de registros, en un archivo de 330 Ko, mientras que la página del sistema de Gladys indica que los registros se truncarán a 20 Mo. Es raro porque mi último reinicio de Gladys fue hace 17 horas…
Y cuando lanzo « dockers logs -t gladys » en SSH en mi mini-PC, no obtengo más registros.

Por lo tanto, varias preguntas:

  • ¿Cómo puedo configurar Gladys para conservar registros más largos? Durante 24 horas, me parecería mejor para poder hacer un análisis en caso de problemas, ¿no?
  • ¿Cómo puedo asegurarme de que el culpable de mis ralentizaciones está realmente relacionado con Enedis?
  • Si el problema proviene de allí, ¿qué hacer para resolverlo? Pensé en eliminar la integración de Enedis y luego volver a ponerla, pero:
    • ¿corro el riesgo de perder mi historial de datos, o todo volverá? Tengo datos de Enedis desde agosto de 2022 en Gladys…
    • ¿eliminar y recrear la integración de Enedis me obligará a reconfigurar la jerarquía de los dispositivos en el seguimiento de la energía, ya que Enedis es la raíz de todo?

¡Gracias de antemano por sus consejos!

Hola Stéphane,

Acabo de mirar en mi casa, también tengo estas tareas de sincronización cada hora y, a diferencia de ti, no tengo problemas, se ejecutan en menos de 5 segundos.

Gracias por tu respuesta. Esto confirma que debo tener un problema con mi instalación :wink:

Hola @StephaneB,

Gracias por la captura, confirma el síntoma. Pero cuidado con una trampa importante: esta tarea hace dos cosas, y los 12 minutos mostrados cubren ambas.

  1. La descarga e inserción de los datos de Enedis. Contrario a lo que podríamos pensar, Gladys no vuelve a descargar todo el historial cada vez: normalmente comienza desde la última fecha sincronizada menos 7 días (Enedis a veces corrige sus datos a posteriori). Esto hace ~7 puntos para el consumo diario, y ~336 puntos si tienes la curva de carga cada 30 minutos. Unos segundos, normalmente — es lo que ve @PhilippeMA.
  2. El recálculo de los costos energéticos, desencadenado justo después, dentro de la misma tarea. Por lo tanto, no aparece como una tarea separada en la lista, pero su tiempo sí se cuenta dentro de los 12 minutos. Y este recálculo abarca todos tus dispositivos con funcionalidades de «energía», no solo Enedis: para cada funcionalidad de costo, elimina e inserta los valores en todo el período.

La verdadera pregunta es, entonces: ¿cuál de las dos fases toma los 12 minutos? Tus registros lo aclararán en un minuto.

Cómo saberlo

Ve a Configuración → Sistema → Descargar registros. Obtienes un archivo con los registros de tu instancia, en un clic.

El mejor momento para hacerlo: la sincronización de Enedis se ejecuta cada hora entre HH:30 y HH:50 (el minuto exacto se elige aleatoriamente al inicio de Gladys, para evitar que todos los usuarios golpeen la API al mismo tiempo). Por lo tanto, si descargas los registros justo después de notar un retraso, el ciclo que te interesa está definitivamente ahí — no necesitas 24 horas de historial, eso responde a tu primera pregunta.

Luego, en el archivo, busca estas tres líneas:

Enedis: Syncing 12345678901234 after 2026-08-13
Calculating cost in timezone Europe/Paris
Found 14 energy devices

Tres cosas a revisar:

  • La fecha después de after. Si es hace ~7 días, la fase 1 está haciendo su trabajo normal. Si es 2000-01-01 o una fecha antigua (2022, 2024…), encontramos el error: tu sincronización comienza desde cero cada hora en lugar de continuar desde la última fecha conocida. Repite entonces decenas de miles de puntos de la curva de carga cada hora, y desencadena un recálculo de costos en todo tu historial. Esto encajaría perfectamente con 12 minutos.
  • La diferencia de tiempo entre Enedis: Syncing y Calculating cost: es la duración exacta de la fase 1. Si la mayor parte de los 12 minutos ocurre después de Calculating cost, es el recálculo de costos el culpable.
  • El Found N energy devices: es el número de dispositivos que el recálculo abarca en cada ciclo. Si N es alto (gran jerarquía con muchos subcontadores), es ahí donde se va el tiempo.

Pista adicional, aún más rápida y sin registros: la barra de progreso de la tarea sigue solo la fase 1. Si sube al 100 % en unos segundos y luego la tarea permanece «en curso» durante varios minutos, es el recálculo de costos.

¿Por qué solo tienes 20 minutos de registros?

No es un límite de Gladys: Gladys no escribe un archivo de registro, todo va a la salida estándar del contenedor y es Docker quien almacena. El comando de instalación oficial contiene --log-opt max-size=10m sin max-file, por lo que Docker solo guarda un archivo: tan pronto como alcanza 10 Mo, comienza de nuevo con un archivo vacío y el anterior se pierde. Simplemente has caído poco después de una rotación.

Para tu diagnóstico no es un problema — descarga los registros inmediatamente después de un retraso y tendrás la ventana que necesitas. Si un día recreas tu contenedor (actualización manual, cambio de configuración…), puedes agregar --log-opt max-file=5 a tu comando docker run para guardar hasta 5 archivos, pero no es necesario recrearlo solo por eso ahora.

Eliminar / reinstalar la integración: ¡no lo hagas!

Tus preocupaciones son fundadas, y aún más:

  • Eliminar un dispositivo elimina en cascada sus funcionalidades y todo su historial. Tus datos desde agosto de 2022 se perderían, y no serían recuperables: Enedis solo devuelve como máximo ~3 años de consumo diario, y mucho menos en la curva de carga cada 30 minutos.
  • También romperías toda tu jerarquía energética, que tendrías que reconstruir manualmente.
  • Y sobre todo no serviría de nada: no necesitas eliminar nada para resincronizar. El botón «Actualizar» en la parte superior de la página de la integración de Enedis ya inicia una sincronización completa desde el principio. (Atención, esta es larga por naturaleza, varias decenas de minutos — es normal, y cada clic reinicia todo el historial, por lo que no hagas clic en bucle.)

Por lo tanto, no elimines nada, lo encontraremos.

Vale, lo analizaré todo mañana y volveré a dar el resultado. Gracias por la ayuda :+1:

Entonces observé lo que sucedía durante una ralentización esta mañana de 11:36 a 11:48. Luego recuperé los registros (docker logs gladys) desde las 11:30 hasta las 11:50.

Los registros completos están aquí: log-gladys-pendant-surcharge.log - pCloud

Si filtro las líneas de información que se refieren a las extensiones de prohand, melcloud y netatmo, me queda esto:

2026-08-22T09:30:00.225943779Z 2026-08-22T11:30:00+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:26 (EnergyMonitoringHandler.calculateEnergyFromIndex) Cálculo del consumo a partir del índice en la zona horaria Europa/París para la ventana del sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:01.121704771Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:35 (EnergyMonitoringHandler.calculateEnergyFromIndex) Se encontraron 79 dispositivos de energía
2026-08-22T09:30:01.122944109Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:66 (EnergyMonitoringHandler.calculateEnergyFromIndex) Se encontraron 31 dispositivos con las características de índice y consumo cada treinta minutos
2026-08-22T09:30:01.792318089Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:01.886579600Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:01.970218917Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.047875441Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.132442036Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.211205756Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.293403017Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Compteur Zlinky el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.435322988Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Mesure conso PaC et General el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.606255344Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.08999999999991815 para el dispositivo Mesure conso PaC et General el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:02.811307301Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.37999999999999545 para el dispositivo Mesure conso four et plaques el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.032964821Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Mesure conso four et plaques el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.388952271Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise Circulateur plancher chauffant el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.456959142Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.3000000000001819 para el dispositivo Prise Panneaux solaires el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.538274251Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.03000000000002956 para el dispositivo Prise VMC el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.648167433Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise ampli 5.1 el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:03.792599092Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise appareils multimédias el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:04.080448191Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise chargeurs vélo el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:04.231232041Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise chauffe-eau el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:04.332767096Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise circulation bassin el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:04.538412271Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.030000000000086402 para el dispositivo Prise congel sous-sol el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:05.562600627Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise controleur PaC el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:05.642213673Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.009999999999999787 para el dispositivo Prise fontaine el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:05.747737223Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.009999999999990905 para el dispositivo Prise freebox el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:05.894420962Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0.01999999999998181 para el dispositivo Prise frigo-congel cuisine el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:06.075765006Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise lave-vaisselle el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:06.249029169Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise ordi bureau el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:06.522794882Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise pompe eau de pluie el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:06.844778433Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise pompe à chaleur el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:06.923382110Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise sèche-linge el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:07.096358178Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise vidéo-projecteur el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:07.204719038Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Se guardó el consumo 0 para el dispositivo Prise yaourtière el sábado 22 de agosto de 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:07.217546687Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:164 (EnergyMonitoringHandler.calculateEnergyFromIndex) Finalizada la calculación del consumo desde el índice para 31 dispositivos
2026-08-22T09:30:07.253029354Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:26 (EnergyMonitoringHandler.calculateEnergyFromIndex) Calculando producción desde el índice en la zona horaria Europa/París para la ventana Sat Aug 22 2026 11:30:00 GMT+0200 (Hora de verano de Europa central)
2026-08-22T09:30:07.279138340Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:35 (EnergyMonitoringHandler.calculateEnergyFromIndex) Se encontraron 0 dispositivos de energía
2026-08-22T09:30:07.280068380Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:66 (EnergyMonitoringHandler.calculateEnergyFromIndex) Se encontraron 0 dispositivos con ambas características INDEX y thirty-minutes-production
2026-08-22T09:30:07.281260041Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:164 (EnergyMonitoringHandler.calculateEnergyFromIndex) Finalizada la calculación de la producción desde el índice para 0 dispositivos
2026-08-22T09:30:07.307269461Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:34 (EnergyMonitoringHandler.calculateCostFrom) Calculando el costo en la zona horaria Europa/París
2026-08-22T09:30:07.657529925Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:38 (EnergyMonitoringHandler.calculateCostFrom) Se encontraron 25 dispositivos de energía
2026-08-22T09:30:07.727225210Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:126 () El dispositivo 90ce8dc9-b3ac-48fe-8940-841d6aeee0c1 tiene precios tempo y el mapa está vacío, obteniendo el histórico EDF tempo
2026-08-22T09:30:07.730060633Z 2026-08-22T11:30:07+0200 <info> contracts.buildEdfTempoDayMap.js:19 (buildEdfTempoDayMap) Construyendo el mapa histórico EDF tempo desde 2026-08-21
2026-08-22T09:30:07.740101623Z 2026-08-22T11:30:07+0200 <info> contracts.buildEdfTempoDayMap.js:52 (buildEdfTempoDayMap) Se encontraron todos los 2 días EDF tempo en la caché (desde 2026-08-21 hasta 2026-08-22)
2026-08-22T09:30:07.811619887Z 2026-08-22T11:30:07+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 40dd1280-6d50-4580-83c8-e494c08f37dc.
2026-08-22T09:30:07.978401793Z 2026-08-22T11:30:07+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 1ede5f2e-7789-4964-9bc0-9b00ef8cfbe1.
2026-08-22T09:30:08.133414395Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = ced1c552-2d2a-4119-a9fe-7be34f5a6d17.
2026-08-22T09:30:08.347691854Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = aaba2941-6ff0-49a5-9204-d5018fc7b0bd.
2026-08-22T09:30:08.667566479Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 4b5f49fb-70f6-4a95-ab71-0b5cbaf1f74b.
2026-08-22T09:30:08.879626460Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 5b6f48cd-6295-4c12-abdc-1b46421e6fca.
2026-08-22T09:30:09.123264891Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 79e1d044-f7c3-4dfd-9798-628efd4a0ee4.
2026-08-22T09:30:09.563066324Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = f4bdabde-f137-408f-8fb3-7f432271ad90.
2026-08-22T09:30:09.850078635Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 896b973e-85da-4247-a844-a1e994e342b9.
2026-08-22T09:30:10.138206342Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 8d70db63-979d-4ba1-8d07-01fbe3609f28.
2026-08-22T09:30:10.388330818Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d76b8b99-3807-4d2c-becc-ca5377e224b4.
2026-08-22T09:30:10.674524141Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = b9c0b21c-1c21-4446-8ad7-535dfc81b67c.
2026-08-22T09:30:10.949199606Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 09d39d7e-5204-4ab4-afda-394a8f4d9b48.
2026-08-22T09:30:11.262557972Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 212a6b8e-eb39-443e-8325-c741a7816eba.
2026-08-22T09:30:11.544134344Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d4d7c6cb-080b-41c7-b5b2-076825cb382a.
2026-08-22T09:30:11.841341537Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = cffc3961-c3db-40c9-941a-1ffe9d36f26a.
2026-08-22T09:30:12.118171491Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 178ef579-31c3-4e94-8a58-31cb2f6bee42.
2026-08-22T09:30:12.359589117Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = e796720b-19a1-4e71-b2ee-420978d504e1.
2026-08-22T09:30:12.600363037Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 56908815-e60a-4e14-b586-7d56a07fb430.
2026-08-22T09:30:12.863408289Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 2a43d6b1-63cf-47c1-a3d1-2b4a2ea968bb.
2026-08-22T09:30:13.156550321Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 59e123c8-3d0b-454e-a20a-e90b8deeda12.
2026-08-22T09:30:13.416077142Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = fb4134df-a7c8-4f8b-83bf-8517e1df2c76.
2026-08-22T09:30:13.701174320Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d8cfb77f-5979-414e-aa32-4f548b5f92cd.
2026-08-22T09:30:13.957885319Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 3efa0164-afce-4277-9a48-9e923dd7bdf0.
2026-08-22T09:30:14.227498093Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d9964116-b5e1-4c5b-9167-816e938e2d76.
2026-08-22T09:30:14.500695100Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = fc550b4f-b17e-4b70-af16-e1995e019c96.
2026-08-22T09:30:14.924357684Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 10999f49-2cb9-4219-9979-33c2d6919a7f.
2026-08-22T09:30:15.189534575Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 9355ea88-d340-4a39-846f-737fafe60209.
2026-08-22T09:30:15.511661892Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 39aa6cef-00b0-4218-b4eb-4c1f9bb718de.
2026-08-22T09:30:15.716199233Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 55e325ef-8c54-4481-9213-23cc83985109.
2026-08-22T09:30:15.935813191Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 774b17c5-2c8d-48eb-b982-eb744fc8556f.
2026-08-22T09:36:26.225531844Z 2026-08-22T11:36:26+0200 <info> enedis.sync.js:44 (recursiveBatchCall) Enedis: Sincronizando 06558900066149 después del 2026-08-14
2026-08-22T09:36:27.589366968Z 2026-08-22T11:36:27+0200 <info> enedis.sync.js:44 (recursiveBatchCall) Enedis: Sincronizando 06558900066149 después del 2026-08-15
2026-08-22T09:37:02.248453741Z 2026-08-22T11:37:02+0200 <info> energy-monitoring.calculateCostFrom.js:34 (EnergyMonitoringHandler.calculateCostFrom) Calculando el costo en la zona horaria Europa/París
2026-08-22T09:37:02.743256593Z 2026-08-22T11:37:02+0200 <info> energy-monitoring.calculateCostFrom.js:38 (EnergyMonitoringHandler.calculateCostFrom) Se encontraron 25 dispositivos de energía
2026-08-22T09:37:03.158032208Z 2026-08-22T11:37:03+0200 <info> energy-monitoring.calculateCostFrom.js:126 () El dispositivo 90ce8dc9-b3ac-48fe-8940-841d6aeee0c1 tiene precios tempo y el mapa está vacío, obteniendo el histórico EDF tempo
2026-08-22T09:37:03.160061894Z 2026-08-22T11:37:03+0200 <info> contracts.buildEdfTempoDayMap.js:19 (buildEdfTempoDayMap) Construyendo el mapa histórico EDF tempo desde el 2026-08-14
2026-08-22T09:37:03.176366583Z 2026-08-22T11:37:03+0200 <info> contracts.buildEdfTempoDayMap.js:52 (buildEdfTempoDayMap) Se encontraron todos los 9 días EDF tempo en la caché (del 2026-08-14 al 2026-08-22)
2026-08-22T09:37:20.652322833Z 2026-08-22T11:37:20+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 40dd1280-6d50-4580-83c8-e494c08f37dc.
2026-08-22T09:37:40.882913002Z 2026-08-22T11:37:40+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 1ede5f2e-7789-4964-9bc0-9b00ef8cfbe1.
2026-08-22T09:38:01.521148847Z 2026-08-22T11:38:01+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = ced1c552-2d2a-4119-a9fe-7be34f5a6d17.
2026-08-22T09:38:21.143400676Z 2026-08-22T11:38:21+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = aaba2941-6ff0-49a5-9204-d5018fc7b0bd.
2026-08-22T09:38:42.168250001Z 2026-08-22T11:38:42+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 4b5f49fb-70f6-4a95-ab71-0b5cbaf1f74b.
2026-08-22T09:39:04.045789281Z 2026-08-22T11:39:04+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 5b6f48cd-6295-4c12-abdc-1b46421e6fca.
2026-08-22T09:39:25.250822208Z 2026-08-22T11:39:25+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 79e1d044-f7c3-4dfd-9798-628efd4a0ee4.
2026-08-22T09:39:47.151292427Z 2026-08-22T11:39:47+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 07cf603e-3c3b-4ecc-9ce4-87f2f16cbaef.
2026-08-22T09:40:09.032173230Z 2026-08-22T11:40:09+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = f4bdabde-f137-408f-8fb3-7f432271ad90.
2026-08-22T09:40:29.630179715Z 2026-08-22T11:40:29+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 896b973e-85da-4247-a844-a1e994e342b9.
2026-08-22T09:40:50.552164640Z 2026-08-22T11:40:50+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 8d70db63-979d-4ba1-8d07-01fbe3609f28.
2026-08-22T09:41:11.882783690Z 2026-08-22T11:41:11+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d76b8b99-3807-4d2c-becc-ca5377e224b4.
2026-08-22T09:41:32.863451901Z 2026-08-22T11:41:32+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = b9c0b21c-1c21-4446-8ad7-535dfc81b67c.
2026-08-22T09:41:53.347144646Z 2026-08-22T11:41:53+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 09d39d7e-5204-4ab4-afda-394a8f4d9b48.
2026-08-22T09:42:14.273207632Z 2026-08-22T11:42:14+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 212a6b8e-eb39-443e-8325-c741a7816eba.
2026-08-22T09:42:35.269890234Z 2026-08-22T11:42:35+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d4d7c6cb-080b-41c7-b5b2-076825cb382a.
2026-08-22T09:42:55.110720580Z 2026-08-22T11:42:55+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = cffc3961-c3db-40c9-941a-1ffe9d36f26a.
2026-08-22T09:43:16.626924625Z 2026-08-22T11:43:16+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 178ef579-31c3-4e94-8a58-31cb2f6bee42.
2026-08-22T09:43:39.205060304Z 2026-08-22T11:43:39+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = e796720b-19a1-4e71-b2ee-420978d504e1.
2026-08-22T09:43:49.392672455Z 2026-08-22T11:43:49+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 56908815-e60a-4e14-b586-7d56a07fb430.
2026-08-22T09:44:08.730355351Z 2026-08-22T11:44:08+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 2a43d6b1-63cf-47c1-a3d1-2b4a2ea968bb.
2026-08-22T09:44:30.020353087Z 2026-08-22T11:44:30+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 59e123c8-3d0b-454e-a20a-e90b8deeda12.
2026-08-22T09:44:50.917166245Z 2026-08-22T11:44:50+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = fb4134df-a7c8-4f8b-83bf-8517e1df2c76.
2026-08-22T09:45:12.317759412Z 2026-08-22T11:45:12+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d8cfb77f-5979-414e-aa32-4f548b5f92cd.
2026-08-22T09:45:32.845566956Z 2026-08-22T11:45:32+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 3efa0164-afce-4277-9a48-9e923dd7bdf0.
2026-08-22T09:45:54.535325404Z 2026-08-22T11:45:54+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = d9964116-b5e1-4c5b-9167-816e938e2d76.
2026-08-22T09:46:16.206679888Z 2026-08-22T11:46:16+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = fc550b4f-b17e-4b70-af16-e1995e019c96.
2026-08-22T09:46:36.348576345Z 2026-08-22T11:46:36+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 10999f49-2cb9-4219-9979-33c2d6919a7f.
2026-08-22T09:46:57.605137190Z 2026-08-22T11:46:57+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 9355ea88-d340-4a39-846f-737fafe60209.
2026-08-22T09:47:19.496451604Z 2026-08-22T11:47:19+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 39aa6cef-00b0-4218-b4eb-4c1f9bb718de.
2026-08-22T09:47:41.892196972Z 2026-08-22T11:47:41+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 55e325ef-8c54-4481-9213-23cc83985109.
2026-08-22T09:47:43.000018861Z 2026-08-22T11:47:42+0200 <info> scene.triggers.js:91 (Object.device.new-state) Programando temporizador para verificar el estado del dispositivo "zigbee2mqtt-sonde-t-frigo-cuisine-temperature-sensor-decimal-temperature" en 900000ms
2026-08-22T09:48:03.662680063Z 2026-08-22T11:48:03+0200 <info> index.js:369 () DuckDB: Insertando fragmento 0 para deviceFeature = 774b17c5-2c8d-48eb-b982-eb744fc8556f.

Aquí hay algunos comentarios/preguntas que se me ocurren:

  • Mi sincronización no comienza desde cero cada vez. La fecha es el 14/8, hace 8 días. OK
  • La fase 1 tarda 36 segundos, por lo que está bien. Esto significaría que la fase 2 dura más de 10 minutos. ¿Los diferentes « Insertando fragmento 0 » que van de 11:30 a 11:48 son una señal de esto?
  • Tengo varias líneas que indican el número de ‹ dispositivos encontrados ›, pero con valores diferentes: 79, 31, 0, 0, 25, 25, 25. ¿Es normal?
  • No sé si es normal que parezca haber 2 ciclos que se superponen: « Enedis: sincronizando » aparece 2 veces, « Calculando costo » también

Gracias de antemano por su ayuda

@pierre-gilles imagino que estás muy concentrado en la preparación de Gladys v5, pero si tienes la posibilidad de mirar los logs que he recopilado tras tu último mensaje, estaré encantado de recibir tus consejos… Gracias de antemano.

¡Hola a todos!

Este tema ahora está en desarrollo.

Se ha abierto una PR para recalcular los costes energéticos solo para los dispositivos realmente afectados por una sincronización de Enedis (y así evitar los retrasos horarios):

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

¿Qué demonios? :flushed_face: :partying_face:

¡Hola @StephaneB, gracias por los registros!

Verdict: es la fase 2 (el recálculo de costos), y tu registro lo demuestra por sí solo.

El desarrollo exacto de tu ventana 11:30 → 11:48

Hay dos tareas diferentes en tu registro, y es su comparación la que es esclarecedora:

Hora Lo que se ejecuta Duración
11:30:00 → 11:30:07 Cálculo del consumo desde los índices (31 pares índice/30-min) 7 s
11:30:07 Cálculo de la producción desde los índices (0 dispositivo) instantáneo
11:30:07 → 11:30:15 Recálculo de costos, 25 dispositivos, ventana = 30 minutos 8 s :white_check_mark:
11:36:26 → 11:36:27 Enedis, consumo diario, desde el 14/08 (8 puntos) 1 s
11:36:27 → 11:37:02 Enedis, curva de carga, desde el 15/08 (384 puntos) 35 s
11:37:02 → 11:48:03 Recálculo de costos, 25 dispositivos, ventana = 8 días 11 min :cross_mark:

El mismo código, los mismos 25 dispositivos, ejecutados dos veces con 7 minutos de intervalo: 8 segundos en un caso, 11 minutos en el otro. La única variable es el ancho de la ventana recalculada: 30 minutos contra 8 días.

Y 11:36:26 → 11:48:03 = 11 min 40, lo que coincide con los ~12 min mostrados en la tarea.

De paso, los 36 s de la fase 1 son normales y voluntarias: Gladys inserta los puntos de la curva de carga con un retraso de 50 ms entre cada uno para no saturar el CPU durante la importación. 384 puntos × 50 ms ≈ 35 s. Es exactamente lo que vemos. Nada que corregir por este lado.

Tus 4 preguntas

1. « Mi sincronización no comienza de cero » — Exacto, todo está bien por este lado. after 2026-08-14, es la última fecha sincronizada menos 7 días. El error que temía no está ahí.

Pequeña precisión de paso: si ves dos fechas diferentes (14/08 luego 15/08), no es una anomalía — son tus dos funcionalidades Enedis (consumo diario y curva de carga) que cada una mantiene su propia fecha de última sincronización.

2. « ¿Los Inserting chunk 0 son la señal? » — Sí, es exactamente el buen marcador, pero cuidado de no mezclar los dos bloques:

  • 31 líneas entre 11:30:07 y 11:30:15 → la tarea de rutina. ~0,25 s por funcionalidad.
  • 32 líneas entre 11:37:20 y 11:48:03 → el recálculo desencadenado por Enedis. ~20 s por funcionalidad.

Relacionado con el número de puntos tratados (384 puntos de curva de carga sobre 8 días contra 1 solo sobre 30 minutos), eso hace aproximadamente 55 ms por punto recalculado. Es demasiado, y ahora es mi problema.

3. Los « Found N » diferentes (79 / 31 / 0 / 0 / 25…) — Todo es normal, son contadores que no cuentan lo mismo:

  • 79 = dispositivos que llevan una funcionalidad de categoría energy_sensor, switch o teleinformation (el vivero amplio donde buscamos índices).
  • 31 = entre ellos, el número de pares « índice ↔ 30-minutos » conectados entre sí. Atención, el mensaje dice « devices » pero en realidad cuenta pares de funcionalidades — es por eso que « Contador Zlinky » aparece 7 veces seguidas justo después: tu Zlinky expone varios índices (EASF01…EASF10 para Tempo).
  • 0 / 0 = lo mismo del lado de la producción. No tienes un índice de producción declarado (tus paneles son seguidos a través de un enchufe, por lo tanto del lado del consumo), por lo tanto 0. Normal.
  • 25 = el filtro del recálculo de costo, que es más restrictivo (solo la categoría energy_sensor). Esta línea aparece una vez por recálculo de costo — de ahí su repetición.

4. « Dos ciclos que se superponen? » — No, tranquilo, y es incluso imposible: todo pasa por una cola que serializa los tratamientos. Lo que ves son dos tareas distintas:

  • la de 11:30, programada cada 30 minutos (a HH:00 y HH:30);
  • la de 11:36, la sincronización horaria de Enedis, que llama al recálculo de costos al final.

Las dos llaman a la misma función, de ahí las líneas duplicadas.

¿Por qué 11 minutos en tu caso y 5 segundos en el de @PhilippeMA?

Porque el recálculo post-sincronización no tiene en cuenta ni lo que realmente ha cambiado, ni el tamaño de la instalación:

  • comienza desde la fecha más antigua resincronizada, es decir siempre ~J-8 (debido a la red de seguridad de 7 días);
  • y vuelve a ejecutar todos tus dispositivos de energía, no solo Enedis.

En tu caso, eso hace ~33 funcionalidades de costo × 8 días × 48 puntos, es decir del orden de 12 000 puntos eliminados, recalculados y reinsertados cada hora — mientras que solo la funcionalidad Enedis ha recibido nuevos datos. En el caso de Philippe, con uno o dos dispositivos, el mismo tratamiento pasa desapercibido.

No estás haciendo nada mal: solo eres el primero en tener una instalación lo suficientemente grande como para hacer visible el problema.

Lo que voy a corregir

Es un verdadero defecto de diseño, no un problema de tu instalación.

He propuesto una PR con:

  1. Recalcular solo lo que se ha movido: después de una sincronización de Enedis, solo las funcionalidades realmente afectadas deben ser retomadas, no todo el parque.
  2. Recalcular solo los días realmente modificados, en lugar de una ventana fija de 8 días en cada ciclo.
  3. Optimizar el bucle interno (los 55 ms por punto): los períodos de validez de las tarifas se reconstruyen con conversión de zona horaria para cada punto, cuando podrían hacerse una sola vez.
  4. Hacer que la fase 2 avance en la barra de progreso: hoy solo sigue la descarga, de ahí la tarea que permanece « en curso » al 100 % durante 10 minutos.

¡Gracias por el análisis y aliviado de saber que habrá una solución! Y por eso estoy aún más impaciente por descubrir la próxima versión :wink: