Problème : faible réactivité de Gladys chaque heure pendant quelques minutes. Peut-être la faute de Enedis?

Depuis quelques semaines, j’ai une latence de quelques secondes dans mes scènes et dans l’affichage du dashboard. Par exemple j’appuie sur un bouton zigbee, et la lampe zigbee ne s’allume que 3-4 secondes après. Mais ce n’est pas systématique, et en général tout est bien réactif. En fait, ça semble ce produire quelques minutes toutes les heures…

Je pense que mon mini-pc sur lequel tourne Gladys est trop sollicité, mais je ne sais pas trop comment savoir quel processus est le fautif.

J’observe ça dans les infos remontées toutes les minutes depuis mes sondes dans node-red (ne faites pas attention au libellé ‹ raspberri-pi4 ›, c’est juste que je n’ai pas renommé après être passé sur un mini-pc) :


On y voit une conso de RAM importante (ça aiderait sûrement que je l’augmente…) et surtout un passage du CPU de 15% à 35%, correspondant à la période pendant laquelle Gladys perd sa réactivité.

Qu’est-ce que je peux analyser pour repérer d’où vient le souci ?

Rien d’autre que Gladys ne tourne sur mon mini-pc.

Je crois avoir mis la main sur le fautif : Chaque heure, au moment où j’observe le ralentissement important du dashboard et des scènes de Gladys, la tâche « Synchronisation des données Enedis » se lance et dure plus de 10 minutes !

J’ai téléchargé les logs de Gladys pour essayer d’y repérer des lignes en lien avec Enedis, mais je n’obtiens que 20 minutes de logs environ, dans un fichier de 330 Ko, alors que la page système de Gladys indique que les logs seront tronqués à 20 Mo. C’est bizarre parce que mon dernier redémarrage de Gladys était il y a 17 heures…
Et quand je lance « dockers logs -t gladys » en SSH sur mon mini-PC, je n’obtiens pas plus de logs.

Donc plusieurs questions:

  • Comment je peux configurer Gladys pour conserver des logs plus longs ? Sur 24h, ça me semblerait mieux pour pouvoir faire une analyse en cas de souci, non?
  • Comment je peux m’assurer que le fautif de mes ralentissements est bien lié à Enedis ?
  • Si le souci vient bien de là, que faire pour résoudre ? J’ai pensé supprimé l’intégration Enedis, puis la remettre ensuite, mais :
    • est-ce que je risque de perdre mon historique de données, où tout reviendra ? J’ai des données Enedis depuis aout 2022 dans Gladys…
    • est-ce que supprimer et recréer l’intégration Enedis va m’obliger à reconfigurer la hiérarchie des appareils dans le suivi de l’énergie, puisque Enedis est la racine de tout ?

Merci par avance pour vos conseils !

Hello Stéphane,

Je viens de regarder chez moi, j’ai aussi ces tâches de synchro toutes les heures et contrairement à toi je n’ai pas de soucis, elles passent en moins de 5 secondes.

Merci pour ce retour. Ça confirme que je dois bien avoir un souci sur mon installation :wink:

Salut @StephaneB,

Merci pour la capture, elle confirme le symptôme. Mais attention à un piège important : cette tâche fait deux choses, et les 12 minutes affichées couvrent les deux.

  1. Le téléchargement et l’insertion des données Enedis. Contrairement à ce qu’on pourrait croire, Gladys ne retélécharge pas tout l’historique à chaque fois : il repart normalement de la dernière date synchronisée moins 7 jours (Enedis corrige parfois ses données a posteriori). Ça fait ~7 points pour la conso journalière, et ~336 points si tu as la courbe de charge 30 minutes. Quelques secondes, normalement — c’est ce que voit @PhilippeMA.
  2. Le recalcul des coûts énergétiques, déclenché juste derrière, à l’intérieur de la même tâche. Il n’apparaît donc pas comme une tâche séparée dans la liste, mais son temps est bien compté dans les 12 minutes. Et ce recalcul balaie tous tes appareils ayant des fonctionnalités « énergie », pas seulement Enedis : pour chaque fonctionnalité de coût, il supprime puis réinsère les valeurs sur toute la période.

La vraie question est donc : laquelle des deux phases prend les 12 minutes ? Tes logs vont trancher en une minute.

Comment le savoir

Va dans Paramètres → Système → Télécharger les logs. Tu récupères un fichier avec les logs de ton instance, en un clic.

Le bon moment pour le faire : la synchro Enedis tourne toutes les heures entre HH:30 et HH:50 (la minute exacte est tirée au hasard au démarrage de Gladys, pour éviter que tous les utilisateurs tapent sur l’API en même temps). Donc si tu télécharges les logs juste après avoir constaté un ralentissement, le cycle qui t’intéresse est forcément dedans — pas besoin de 24 h d’historique, c’est ça qui répond à ta première question.

Ensuite, dans le fichier, cherche ces trois lignes :

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

Trois choses à regarder :

  • La date après after. Si c’est bien il y a ~7 jours, la phase 1 fait son travail normal. Si c’est 2000-01-01 ou une date ancienne (2022, 2024…), on tient le bug : ta synchro repart de zéro à chaque heure au lieu de repartir de la dernière date connue. Elle rejoue alors des dizaines de milliers de points de courbe de charge toutes les heures, et déclenche derrière un recalcul de coûts sur tout ton historique. Ça collerait parfaitement avec 12 minutes.
  • L’écart de temps entre Enedis: Syncing et Calculating cost : c’est la durée exacte de la phase 1. Si l’essentiel des 12 minutes se situe après Calculating cost, c’est le recalcul de coûts le coupable.
  • Le Found N energy devices : c’est le nombre d’appareils que le recalcul balaie à chaque cycle. Si N est élevé (grosse hiérarchie avec beaucoup de sous-compteurs), c’est là que part le temps.

Indice complémentaire, encore plus rapide et sans logs : la barre de progression de la tâche ne suit que la phase 1. Si elle monte à 100 % en quelques secondes puis que la tâche reste « en cours » pendant plusieurs minutes, c’est le recalcul de coûts.

Pourquoi tu n’as que 20 minutes de logs

Ce n’est pas une limite de Gladys : Gladys n’écrit pas de fichier de log, tout part sur la sortie standard du conteneur et c’est Docker qui stocke. La commande d’installation officielle contient --log-opt max-size=10m sans max-file, donc Docker ne garde qu’un seul fichier : dès qu’il atteint 10 Mo, il repart d’un fichier vide et l’ancien est perdu. Tu es simplement tombé peu après une rotation.

Pour ton diagnostic ce n’est pas bloquant — télécharge les logs dans la foulée d’un ralentissement et tu auras la fenêtre qu’il faut. Si un jour tu recrées ton conteneur (mise à jour manuelle, changement de config…), tu peux ajouter --log-opt max-file=5 à ta commande docker run pour garder jusqu’à 5 fichiers, mais ce n’est pas la peine de le recréer juste pour ça maintenant.

Supprimer / réinstaller l’intégration : surtout pas

Tes craintes sont fondées, et même en dessous de la réalité :

  • Supprimer un appareil supprime en cascade ses fonctionnalités et tout leur historique. Tes données depuis août 2022 seraient bien perdues, et non récupérables : Enedis ne redonne au mieux que ~3 ans de conso journalière, et beaucoup moins sur la courbe de charge 30 minutes.
  • Tu casserais aussi toute ta hiérarchie énergétique, à reconstruire à la main.
  • Et surtout ça ne servirait à rien : tu n’as pas besoin de supprimer quoi que ce soit pour resynchroniser. Le bouton « Rafraîchir » en haut de la page de l’intégration Enedis relance déjà une synchronisation complète depuis le début. (Attention, celle-là est longue par nature, plusieurs dizaines de minutes — c’est normal, et chaque clic relance tout l’historique, donc pas de clic en boucle.)

Donc ne supprime rien, on va trouver.

OK, je vais analyser tout ça demain et je reviendrai donner le résultat. Merci pour l’aide :+1:

Alors j’ai observé ce qui se passait pendant un ralentissement ce matin de 11h36 à 11h48. J’ai récupérer ensuite les logs (docker logs gladys) allant de 11h30 à 11h50.

Les logs complets sont ici :log-gladys-pendant-surcharge.log - pCloud

Si je filtre les lignes d’info qui concernent les extensions de prohand, melcloud et netatmo, il me reste ça :

2026-08-22T09:30:00.225943779Z 2026-08-22T11:30:00+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:26 (EnergyMonitoringHandler.calculateEnergyFromIndex) Calculating consumption from index in timezone Europe/Paris for window Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:01.121704771Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:35 (EnergyMonitoringHandler.calculateEnergyFromIndex) Found 79 energy devices
2026-08-22T09:30:01.122944109Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:66 (EnergyMonitoringHandler.calculateEnergyFromIndex) Found 31 devices with both INDEX and thirty-minutes-consumption features
2026-08-22T09:30:01.792318089Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:01.886579600Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:01.970218917Z 2026-08-22T11:30:01+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.047875441Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.132442036Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.211205756Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.293403017Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Compteur Zlinky at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.435322988Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Mesure conso PaC et General at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.606255344Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.08999999999991815 for device Mesure conso PaC et General at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:02.811307301Z 2026-08-22T11:30:02+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.37999999999999545 for device Mesure conso four et plaques at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.032964821Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Mesure conso four et plaques at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.388952271Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise Circulateur plancher chauffant at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.456959142Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.3000000000001819 for device Prise Panneaux solaires at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.538274251Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.03000000000002956 for device Prise VMC at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.648167433Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise ampli 5.1 at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:03.792599092Z 2026-08-22T11:30:03+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise appareils multimédias at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:04.080448191Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise chargeurs vélo at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:04.231232041Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise chauffe-eau at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:04.332767096Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise circulation bassin at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:04.538412271Z 2026-08-22T11:30:04+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.030000000000086402 for device Prise congel sous-sol at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:05.562600627Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise controleur PaC at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:05.642213673Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.009999999999999787 for device Prise fontaine at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:05.747737223Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.009999999999990905 for device Prise freebox at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:05.894420962Z 2026-08-22T11:30:05+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0.01999999999998181 for device Prise frigo-congel cuisine at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:06.075765006Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise lave-vaisselle at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:06.249029169Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise ordi bureau at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:06.522794882Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise pompe eau de pluie at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:06.844778433Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise pompe à chaleur at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:06.923382110Z 2026-08-22T11:30:06+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise sèche-linge at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:07.096358178Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise vidéo-projecteur at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:07.204719038Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:153 () Saved consumption 0 for device Prise yaourtière at Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:07.217546687Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:164 (EnergyMonitoringHandler.calculateEnergyFromIndex) Finished calculating consumption from index for 31 devices
2026-08-22T09:30:07.253029354Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:26 (EnergyMonitoringHandler.calculateEnergyFromIndex) Calculating production from index in timezone Europe/Paris for window Sat Aug 22 2026 11:30:00 GMT+0200 (Central European Summer Time)
2026-08-22T09:30:07.279138340Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:35 (EnergyMonitoringHandler.calculateEnergyFromIndex) Found 0 energy devices
2026-08-22T09:30:07.280068380Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:66 (EnergyMonitoringHandler.calculateEnergyFromIndex) Found 0 devices with both INDEX and thirty-minutes-production features
2026-08-22T09:30:07.281260041Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateEnergyFromIndex.js:164 (EnergyMonitoringHandler.calculateEnergyFromIndex) Finished calculating production from index for 0 devices
2026-08-22T09:30:07.307269461Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:34 (EnergyMonitoringHandler.calculateCostFrom) Calculating cost in timezone Europe/Paris
2026-08-22T09:30:07.657529925Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:38 (EnergyMonitoringHandler.calculateCostFrom) Found 25 energy devices
2026-08-22T09:30:07.727225210Z 2026-08-22T11:30:07+0200 <info> energy-monitoring.calculateCostFrom.js:126 () Device 90ce8dc9-b3ac-48fe-8940-841d6aeee0c1 has tempo prices and Map is empty, getting EDF tempo historical
2026-08-22T09:30:07.730060633Z 2026-08-22T11:30:07+0200 <info> contracts.buildEdfTempoDayMap.js:19 (buildEdfTempoDayMap) Building EDF tempo historical map from 2026-08-21
2026-08-22T09:30:07.740101623Z 2026-08-22T11:30:07+0200 <info> contracts.buildEdfTempoDayMap.js:52 (buildEdfTempoDayMap) All 2 EDF tempo days found in cache (from 2026-08-21 to 2026-08-22)
2026-08-22T09:30:07.811619887Z 2026-08-22T11:30:07+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 40dd1280-6d50-4580-83c8-e494c08f37dc.
2026-08-22T09:30:07.978401793Z 2026-08-22T11:30:07+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 1ede5f2e-7789-4964-9bc0-9b00ef8cfbe1.
2026-08-22T09:30:08.133414395Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = ced1c552-2d2a-4119-a9fe-7be34f5a6d17.
2026-08-22T09:30:08.347691854Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = aaba2941-6ff0-49a5-9204-d5018fc7b0bd.
2026-08-22T09:30:08.667566479Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 4b5f49fb-70f6-4a95-ab71-0b5cbaf1f74b.
2026-08-22T09:30:08.879626460Z 2026-08-22T11:30:08+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 5b6f48cd-6295-4c12-abdc-1b46421e6fca.
2026-08-22T09:30:09.123264891Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 79e1d044-f7c3-4dfd-9798-628efd4a0ee4.
2026-08-22T09:30:09.563066324Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = f4bdabde-f137-408f-8fb3-7f432271ad90.
2026-08-22T09:30:09.850078635Z 2026-08-22T11:30:09+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 896b973e-85da-4247-a844-a1e994e342b9.
2026-08-22T09:30:10.138206342Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 8d70db63-979d-4ba1-8d07-01fbe3609f28.
2026-08-22T09:30:10.388330818Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d76b8b99-3807-4d2c-becc-ca5377e224b4.
2026-08-22T09:30:10.674524141Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = b9c0b21c-1c21-4446-8ad7-535dfc81b67c.
2026-08-22T09:30:10.949199606Z 2026-08-22T11:30:10+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 09d39d7e-5204-4ab4-afda-394a8f4d9b48.
2026-08-22T09:30:11.262557972Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 212a6b8e-eb39-443e-8325-c741a7816eba.
2026-08-22T09:30:11.544134344Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d4d7c6cb-080b-41c7-b5b2-076825cb382a.
2026-08-22T09:30:11.841341537Z 2026-08-22T11:30:11+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = cffc3961-c3db-40c9-941a-1ffe9d36f26a.
2026-08-22T09:30:12.118171491Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 178ef579-31c3-4e94-8a58-31cb2f6bee42.
2026-08-22T09:30:12.359589117Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = e796720b-19a1-4e71-b2ee-420978d504e1.
2026-08-22T09:30:12.600363037Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 56908815-e60a-4e14-b586-7d56a07fb430.
2026-08-22T09:30:12.863408289Z 2026-08-22T11:30:12+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 2a43d6b1-63cf-47c1-a3d1-2b4a2ea968bb.
2026-08-22T09:30:13.156550321Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 59e123c8-3d0b-454e-a20a-e90b8deeda12.
2026-08-22T09:30:13.416077142Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = fb4134df-a7c8-4f8b-83bf-8517e1df2c76.
2026-08-22T09:30:13.701174320Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d8cfb77f-5979-414e-aa32-4f548b5f92cd.
2026-08-22T09:30:13.957885319Z 2026-08-22T11:30:13+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 3efa0164-afce-4277-9a48-9e923dd7bdf0.
2026-08-22T09:30:14.227498093Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d9964116-b5e1-4c5b-9167-816e938e2d76.
2026-08-22T09:30:14.500695100Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = fc550b4f-b17e-4b70-af16-e1995e019c96.
2026-08-22T09:30:14.924357684Z 2026-08-22T11:30:14+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 10999f49-2cb9-4219-9979-33c2d6919a7f.
2026-08-22T09:30:15.189534575Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 9355ea88-d340-4a39-846f-737fafe60209.
2026-08-22T09:30:15.511661892Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 39aa6cef-00b0-4218-b4eb-4c1f9bb718de.
2026-08-22T09:30:15.716199233Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 55e325ef-8c54-4481-9213-23cc83985109.
2026-08-22T09:30:15.935813191Z 2026-08-22T11:30:15+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for 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: Syncing 06558900066149 after 2026-08-14
2026-08-22T09:36:27.589366968Z 2026-08-22T11:36:27+0200 <info> enedis.sync.js:44 (recursiveBatchCall) Enedis: Syncing 06558900066149 after 2026-08-15
2026-08-22T09:37:02.248453741Z 2026-08-22T11:37:02+0200 <info> energy-monitoring.calculateCostFrom.js:34 (EnergyMonitoringHandler.calculateCostFrom) Calculating cost in timezone Europe/Paris
2026-08-22T09:37:02.743256593Z 2026-08-22T11:37:02+0200 <info> energy-monitoring.calculateCostFrom.js:38 (EnergyMonitoringHandler.calculateCostFrom) Found 25 energy devices
2026-08-22T09:37:03.158032208Z 2026-08-22T11:37:03+0200 <info> energy-monitoring.calculateCostFrom.js:126 () Device 90ce8dc9-b3ac-48fe-8940-841d6aeee0c1 has tempo prices and Map is empty, getting EDF tempo historical
2026-08-22T09:37:03.160061894Z 2026-08-22T11:37:03+0200 <info> contracts.buildEdfTempoDayMap.js:19 (buildEdfTempoDayMap) Building EDF tempo historical map from 2026-08-14
2026-08-22T09:37:03.176366583Z 2026-08-22T11:37:03+0200 <info> contracts.buildEdfTempoDayMap.js:52 (buildEdfTempoDayMap) All 9 EDF tempo days found in cache (from 2026-08-14 to 2026-08-22)
2026-08-22T09:37:20.652322833Z 2026-08-22T11:37:20+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 40dd1280-6d50-4580-83c8-e494c08f37dc.
2026-08-22T09:37:40.882913002Z 2026-08-22T11:37:40+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 1ede5f2e-7789-4964-9bc0-9b00ef8cfbe1.
2026-08-22T09:38:01.521148847Z 2026-08-22T11:38:01+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = ced1c552-2d2a-4119-a9fe-7be34f5a6d17.
2026-08-22T09:38:21.143400676Z 2026-08-22T11:38:21+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = aaba2941-6ff0-49a5-9204-d5018fc7b0bd.
2026-08-22T09:38:42.168250001Z 2026-08-22T11:38:42+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 4b5f49fb-70f6-4a95-ab71-0b5cbaf1f74b.
2026-08-22T09:39:04.045789281Z 2026-08-22T11:39:04+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 5b6f48cd-6295-4c12-abdc-1b46421e6fca.
2026-08-22T09:39:25.250822208Z 2026-08-22T11:39:25+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 79e1d044-f7c3-4dfd-9798-628efd4a0ee4.
2026-08-22T09:39:47.151292427Z 2026-08-22T11:39:47+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 07cf603e-3c3b-4ecc-9ce4-87f2f16cbaef.
2026-08-22T09:40:09.032173230Z 2026-08-22T11:40:09+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = f4bdabde-f137-408f-8fb3-7f432271ad90.
2026-08-22T09:40:29.630179715Z 2026-08-22T11:40:29+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 896b973e-85da-4247-a844-a1e994e342b9.
2026-08-22T09:40:50.552164640Z 2026-08-22T11:40:50+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 8d70db63-979d-4ba1-8d07-01fbe3609f28.
2026-08-22T09:41:11.882783690Z 2026-08-22T11:41:11+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d76b8b99-3807-4d2c-becc-ca5377e224b4.
2026-08-22T09:41:32.863451901Z 2026-08-22T11:41:32+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = b9c0b21c-1c21-4446-8ad7-535dfc81b67c.
2026-08-22T09:41:53.347144646Z 2026-08-22T11:41:53+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 09d39d7e-5204-4ab4-afda-394a8f4d9b48.
2026-08-22T09:42:14.273207632Z 2026-08-22T11:42:14+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 212a6b8e-eb39-443e-8325-c741a7816eba.
2026-08-22T09:42:35.269890234Z 2026-08-22T11:42:35+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d4d7c6cb-080b-41c7-b5b2-076825cb382a.
2026-08-22T09:42:55.110720580Z 2026-08-22T11:42:55+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = cffc3961-c3db-40c9-941a-1ffe9d36f26a.
2026-08-22T09:43:16.626924625Z 2026-08-22T11:43:16+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 178ef579-31c3-4e94-8a58-31cb2f6bee42.
2026-08-22T09:43:39.205060304Z 2026-08-22T11:43:39+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = e796720b-19a1-4e71-b2ee-420978d504e1.
2026-08-22T09:43:49.392672455Z 2026-08-22T11:43:49+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 56908815-e60a-4e14-b586-7d56a07fb430.
2026-08-22T09:44:08.730355351Z 2026-08-22T11:44:08+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 2a43d6b1-63cf-47c1-a3d1-2b4a2ea968bb.
2026-08-22T09:44:30.020353087Z 2026-08-22T11:44:30+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 59e123c8-3d0b-454e-a20a-e90b8deeda12.
2026-08-22T09:44:50.917166245Z 2026-08-22T11:44:50+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = fb4134df-a7c8-4f8b-83bf-8517e1df2c76.
2026-08-22T09:45:12.317759412Z 2026-08-22T11:45:12+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d8cfb77f-5979-414e-aa32-4f548b5f92cd.
2026-08-22T09:45:32.845566956Z 2026-08-22T11:45:32+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 3efa0164-afce-4277-9a48-9e923dd7bdf0.
2026-08-22T09:45:54.535325404Z 2026-08-22T11:45:54+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = d9964116-b5e1-4c5b-9167-816e938e2d76.
2026-08-22T09:46:16.206679888Z 2026-08-22T11:46:16+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = fc550b4f-b17e-4b70-af16-e1995e019c96.
2026-08-22T09:46:36.348576345Z 2026-08-22T11:46:36+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 10999f49-2cb9-4219-9979-33c2d6919a7f.
2026-08-22T09:46:57.605137190Z 2026-08-22T11:46:57+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 9355ea88-d340-4a39-846f-737fafe60209.
2026-08-22T09:47:19.496451604Z 2026-08-22T11:47:19+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 39aa6cef-00b0-4218-b4eb-4c1f9bb718de.
2026-08-22T09:47:41.892196972Z 2026-08-22T11:47:41+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for 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) Scheduling timer to check for device_feature "zigbee2mqtt-sonde-t-frigo-cuisine-temperature-sensor-decimal-temperature" state in 900000ms
2026-08-22T09:48:03.662680063Z 2026-08-22T11:48:03+0200 <info> index.js:369 () DuckDB : Inserting chunk 0 for deviceFeature = 774b17c5-2c8d-48eb-b982-eb744fc8556f.

Voilà quelques remarques/questions que j’en déduis :

  • Ma synchro ne repart pas de zéro à chaque fois. La date est au 14/8, il y a 8 jours. OK
  • La phase 1 prend 36 secondes, donc ok. ça voudrait dire que la phase 2 dure plus de 10 minutes. Est-ce que les différents « Inserting chunk 0 » qui vont de 11:30 à 11:48 en sont le signe ?
  • J’ai plusieurs lignes qui indique le nombre de ‹ found devices ›, mais avec des valeurs différentes : 79, 31, 0, 0, 25, 25, 25. Normal ?
  • je ne sais pas si c’est normal qu’il semble y avoir 2 cycles qui se chevauchent : le « Enedis: syncing » apparait 2 fois, le « Calculating cost » aussi

Merci d’avance pour votre aide

@pierre-gilles j’imagine que tu es très concentré sur la préparation de Gladys v5, mais si tu as la possibilité de regarder les logs que j’ai collectés suite à ton dernier message, je suis preneur de tes conseils… Merci d’avance.

Salut tout le monde !

Ce sujet est désormais en cours de développement.

Une PR a été ouverte pour ne recalculer les coûts énergie que pour les appareils réellement impactés par une synchro Enedis (et ainsi éviter les ralentissements horaires) :

N’hésitez pas à suivre la PR, à tester (optionnel, surtout pour les petites demandes) et à faire vos retours ici si besoin.

WTF ? :flushed_face: :partying_face:

Salut @StephaneB, merci pour les logs !

Verdict : c’est bien la phase 2 (le recalcul des coûts), et ton log le prouve tout seul.

Le déroulé exact de ta fenêtre 11:30 → 11:48

Il y a deux tâches différentes dans ton log, et c’est leur comparaison qui est éclairante :

Heure Ce qui tourne Durée
11:30:00 → 11:30:07 Calcul de la conso depuis les index (31 paires index/30-min) 7 s
11:30:07 Calcul de la production depuis les index (0 appareil) instantané
11:30:07 → 11:30:15 Recalcul des coûts, 25 appareils, fenêtre = 30 minutes 8 s :white_check_mark:
11:36:26 → 11:36:27 Enedis, conso quotidienne, depuis le 14/08 (8 points) 1 s
11:36:27 → 11:37:02 Enedis, courbe de charge, depuis le 15/08 (384 points) 35 s
11:37:02 → 11:48:03 Recalcul des coûts, 25 appareils, fenêtre = 8 jours 11 min :cross_mark:

Le même code, les mêmes 25 appareils, exécuté deux fois à 7 minutes d’intervalle : 8 secondes dans un cas, 11 minutes dans l’autre. La seule variable, c’est la largeur de la fenêtre recalculée : 30 minutes contre 8 jours.

Et 11:36:26 → 11:48:03 = 11 min 40, ce qui colle avec les ~12 min affichées sur la tâche.

Au passage, les 36 s de la phase 1 sont normales et volontaires : Gladys insère les points de courbe de charge avec un délai de 50 ms entre chacun pour ne pas saturer le CPU pendant l’import. 384 points × 50 ms ≈ 35 s. C’est exactement ce qu’on voit. Rien à corriger de ce côté.

Tes 4 questions

1. « Ma synchro ne repart pas de zéro » — Exact, RAS de ce côté. after 2026-08-14, c’est bien la dernière date synchronisée moins 7 jours. Le bug que je redoutais n’est pas là.

Petite précision au passage : si tu vois deux dates différentes (14/08 puis 15/08), ce n’est pas une anomalie — ce sont tes deux fonctionnalités Enedis (conso quotidienne et courbe de charge) qui tiennent chacune leur propre date de dernière synchro.

2. « Est-ce que les Inserting chunk 0 sont le signe ? » — Oui, c’est exactement le bon marqueur, mais attention à ne pas mélanger les deux blocs :

  • 31 lignes entre 11:30:07 et 11:30:15 → la tâche de routine. ~0,25 s par fonctionnalité.
  • 32 lignes entre 11:37:20 et 11:48:03 → le recalcul déclenché par Enedis. ~20 s par fonctionnalité.

Rapporté au nombre de points traités (384 points de courbe de charge sur 8 jours contre 1 seul sur 30 minutes), ça fait environ 55 ms par point recalculé. C’est beaucoup trop, et c’est chez moi maintenant.

3. Les « Found N » différents (79 / 31 / 0 / 0 / 25…) — Tout est normal, ce sont des compteurs qui ne comptent pas la même chose :

  • 79 = appareils portant une fonctionnalité de catégorie energy_sensor, switch ou teleinformation (le vivier large où on cherche des index).
  • 31 = parmi eux, le nombre de couples « index ↔ 30-minutes » reliés entre eux. Attention, le message dit « devices » mais compte en réalité des couples de fonctionnalités — c’est pour ça que « Compteur Zlinky » revient 7 fois d’affilée juste après : ton Zlinky expose plusieurs index (EASF01…EASF10 pour Tempo).
  • 0 / 0 = la même chose côté production. Tu n’as pas d’index de production déclaré (tes panneaux sont suivis via une prise, donc côté conso), donc 0. Normal.
  • 25 = le filtre du recalcul de coût, qui est plus restrictif (uniquement la catégorie energy_sensor). Cette ligne apparaît une fois par recalcul de coût — d’où sa répétition.

4. « Deux cycles qui se chevauchent ? » — Non, rassure-toi, et c’est même impossible : tout passe par une file d’attente qui sérialise les traitements. Ce que tu vois, ce sont deux tâches distinctes :

  • celle de 11:30, planifiée toutes les 30 minutes (à HH:00 et HH:30) ;
  • celle de 11:36, la synchro Enedis horaire, qui appelle le recalcul des coûts en fin de course.

Les deux appellent la même fonction, d’où les lignes en double.

Pourquoi 11 minutes chez toi et 5 secondes chez @PhilippeMA

Parce que le recalcul post-synchro ne tient compte ni de ce qui a réellement changé, ni de la taille de l’installation :

  • il repart de la date la plus ancienne resynchronisée, soit toujours ~J-8 (à cause du filet de sécurité de 7 jours) ;
  • et il rejoue tous tes appareils énergie, pas seulement Enedis.

Chez toi, ça fait ~33 fonctionnalités de coût × 8 jours × 48 points, soit de l’ordre de 12 000 points supprimés, recalculés et réinsérés chaque heure — alors que seule la fonctionnalité Enedis a reçu de nouvelles données. Chez Philippe, avec un ou deux appareils, le même traitement passe inaperçu.

Tu ne fais rien de travers : tu es juste le premier à avoir une installation assez grosse pour rendre le problème visible.

Ce que je vais corriger

C’est un vrai défaut de conception, pas un problème de ton installation.

J’ai proposé une PR avec :

  1. Ne recalculer que ce qui a bougé : après une synchro Enedis, seules les fonctionnalités réellement impactées doivent être reprises, pas la totalité du parc.
  2. Ne recalculer que les jours réellement modifiés, au lieu d’une fenêtre fixe de 8 jours à chaque cycle.
  3. Optimiser la boucle interne (les 55 ms par point) : les périodes de validité des tarifs sont reconstruites avec conversion de fuseau horaire pour chaque point, alors qu’elles pourraient l’être une seule fois.
  4. Faire remonter la phase 2 dans la barre de progression : aujourd’hui elle ne suit que le téléchargement, d’où la tâche qui reste « en cours » à 100 % pendant 10 minutes.

Merci pour l’analyse et soulagé de savoir qu’il y aura une solution ! Et je suis donc encore plus impatient de découvrir la prochaine version :wink: