Erreur / perte de connexion avec Service NetAtmo

Salut @Terdious, ce matin je me suis aperçu que mon thermostat NetAtmo ne remontait plus d’info dans Gladys.
Dans la configuration le service n’était plus connecté. J’ai alors cliqué sur Sauvegarder et connecter et revalider sur la page NetAtmo qui s’ouvre.
Malheureusement les données ne remontent toujours pas.
J’ai essayé de supprimer le thermostat et de le remettre mais sans succès.
Dans les logs j’obtiens l’erreur ci-dessous:

025-03-22T13:22:08+0100 <info> netatmo.loadDevices.js:146 (NetatmoHandler.loadDevices) Netatmo devices not supported : 0
2025-03-22T13:22:08+0100 <info> netatmo.discoverDevices.js:23 (NetatmoHandler.discoverDevices) 2 Netatmo devices found
2025-03-22T13:22:08+0100 <info> netatmo.convertDeviceEnergy.js:108 (NetatmoHandler.convertDeviceEnergy) Netatmo Energy device "undefined, NAPlug" converted
2025-03-22T13:22:08+0100 <info> netatmo.convertDeviceEnergy.js:108 (NetatmoHandler.convertDeviceEnergy) Netatmo Energy device "Thermostat, NATherm1" converted
2025-03-22T13:22:11+0100 <error> netatmo.loadDeviceDetails.js:101 (NetatmoHandler.loadDeviceDetails) Error getting devices details - error:  AxiosError: Request failed with status code 400
    at settle (/src/server/services/netatmo/node_modules/axios/lib/core/settle.js:19:12)
    at IncomingMessage.handleStreamEnd (/src/server/services/netatmo/node_modules/axios/lib/adapters/http.js:585:11)
    at IncomingMessage.emit (node:events:530:35)
    at endReadableNT (node:internal/streams/readable:1698:12)
    at processTicksAndRejections (node:internal/process/task_queues:90:21) {
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },

J’ai pas mis les logs complet car il y a des infos perso dedans mais si besoin je peux te les envoyer en privée.

Autre point, dans la page découverte NetAtmo il ne trouve donc pas mon thermostat et Gladys est figée. Plus aucun bouton ne fonctionne.

As-tu des soucis de ton côté?

PS: mon thermostat est bien connecté dans l’application NetAtmo et je peux le piloter depuis l’application de mon téléphone sans problème.

Salut @_Will_71,

Alors en effet, j’ai eu le meme souci. Il a fallu que je me rende sur la page de dev.netatmo pour « unban ». Visiblement Gladys a réalisé trop de requete et l’api a banni l’application … :

Suite a une maj ??

Par contre j’ai plein de données manquantes malgré tout, je dois jeter un oeil cette semaine voir si quelque chose a changé côté API ou côté Gladys sur une maj …

Ok merci de ton retour. Je peux pas te confirmer exactement si cela s’est produit avant ou après la dernière mise à jour.
Pour essayer j’ai recréer une app dans NetAtmo et essayé de reconfigurer le service mais plus rien ne fonctionne, Gladys ne détecte plus mon thermostat et la page de configuration se fige

Ok ! Je tente de debug demain et te previens si besoin de tes logs !!
Mon Node-red a également des soucis donc …
Pour Gladys en remontant les courbes a 30 jours, je vois une derniere data au 15/03. Du coup pas lié à une maj.
Par contre mes commandes passent bien … strange tout ça.

1 « J'aime »

J’ai réactivé Netatmo dans NodeRed et je confirme que cela ne fonctionne pas non plus.
Enfin quand je génère un token cela fonctionne 5 min et après plus rien.

1 « J'aime »

Voila le retour des données avec NodeRed


Donc cela confirme que cela fonctionne seulement un certain temps après avoir recreer un token chez Netatmo.
Donc il y a bien un problème chez eux ou ils ont changé quelque chose.

1 « J'aime »

Tadam ! Suite à MAJ d’Axios :

Sauf que non, rien de plus !! Et la réponse de chatGPT est rédhibitoire pour Axios … C’est fou !!

@pierre-gilles, une idée de contournement ? Je test avec undici comme préco ici ? Je ne connais pas donc je préfère demander avant de me lancer.

1 « J'aime »

La proposition de ChatGPT est bonne, undici est une librairie sérieuse développée par des membres de l’équipe Node.js, stable et légère :

Donc effectivement migrer vers ça est une bonne solution, ça devrait pas être trop compliqué je pense.

J’ai effectivement eu plusieurs mail ce week-end sur la boite mail Gladys me disant que l’intégration Netatmo est cassée :stuck_out_tongue:

1 « J'aime »

Parfait, je test le correctif.

Bon ça va, heureusement que je fais mon petit tour journalier ^^ Pour dire, je ne m’étais aperçu de rien depuis le 15/03…

Merci @_Will_71 !!

3 « J'aime »

Bonne nouvelle !! Ca match !!

2 « J'aime »

Excellent !! Dis moi dès que t’as une PR :smiley:

1 « J'aime »

Les tests furent longs … Désolé

Normalement c’est bon @pierre-gilles !

1 « J'aime »

Merci pour la PR !

Je t’ai fais des retours :slight_smile:

Thx !!

Question : Je l’utilise dans les tests, c’est pour cela que je l’ai installé en global en plus du service. Dois-je faire autrement ? Le réinstaller dans les tests ?

Effectivement, dans ce cas tu peux l’installer dans les devDependencies ! :slight_smile:

1 « J'aime »

Répondu et corrigé !!

Je t’ai répondu :slight_smile:

1 « J'aime »

Salut @pierre-gilles,

Merci pour la review et ta rigueur. Pour ma part, c’est moche … incapable de trouver les bonnes infos.

Bref… J’ai corrigé selon ce que tu m’as fourni.
Par contre le dernier test a échoué sur mon dernier push qui n’était que textuel, sur autre chose que la PR :

  2815 passing (2m)
  1 failing

  1) house.arm
       should arm a house:
     expected emit to be called 4 times but was called twice
    emit(websocket.send-all, { payload: { house: "test-house" }, type: "alarm.arming" }) => null at House.arm (/home/runner/work/Gladys/Gladys/server/lib/house/house.arm.js:11:35)
    emit(trigger.check, { house: "test-house", type: "alarm.arming" }) => null at House.arm (/home/runner/work/Gladys/Gladys/server/lib/house/house.arm.js:12:36)
  AssertError: expected emit to be called 4 times but was called twice
      emit(websocket.send-all, { payload: { house: "test-house" }, type: "alarm.arming" }) => null at House.arm (lib/house/house.arm.js:11:35)
      emit(trigger.check, { house: "test-house", type: "alarm.arming" }) => null at House.arm (lib/house/house.arm.js:12:36)
      at Object.fail (node_modules/sinon/lib/sinon/assert.js:107:21)
      at failAssertion (node_modules/sinon/lib/sinon/assert.js:66:16)
      at Object.assertCallCount [as callCount] (node_modules/sinon/lib/sinon/assert.js:148:13)
      at Context.<anonymous> (test/lib/house/house.arm.test.js:33:12)

On ne peut toujours pas relancer ceux-ci lorsque échoué. Le souci étant que j’ai la même erreur en local maintenant … Je ne comprend pas !

Je suis désolé, mais j’ai besoin d’aide, si cela à lieu en local également, il doit forcément y avoir une raison, qui existait peut-être déjà auparavant mais été … couverte ? Pourrais-tu m’aider à comprendre et comment chercher le souci ?

EDIT : Le pire est que si je le lance en solo ce test, il plante toujours ???

Bon c’est fou, je ne comprend pas pourquoi c’est arrivé d’un coup, si je lance 10 fois juste les tests de server/test/lib/house/house.arm.test.js ça plante en permanence maintenant en local sur l’origine :

  it('should arm a house', async () => {
    await house.arm('test-house');
    await Promise.delay(5);
    assert.callCount(event.emit, 4);

Si je passe à un delay de 8, ça plante 1 fois sur 8 :

  it('should arm a house', async () => {
    await house.arm('test-house');
    await Promise.delay(8);
    assert.callCount(event.emit, 4);

Et si je passe à un delay de 10, ça ne plante plus :

  it('should arm a house', async () => {
    await house.arm('test-house');
    await Promise.delay(10);
    assert.callCount(event.emit, 4);

Je suis incapable de déterminer ce que mes changements modifient dans le comportement de ce test en particulier …

J’ai fait une commande pour lancer les tests sur le service Netatmo + lib/house en mettant le delay à 8, pas de soucis 3 fois de suite… mais toujours 1 fois / 2 avec un delay à 5 …

Edit : J’ai push une modification : Ajout d’espace sur certains textes d’erreurs et les tests passent. Mais serait-il possible qu’on voit ensemble quand même pourquoi on a des échecs aléatoires comme ça (et visiblement pas tant aléatoire que ça en local…).