Problèmes lenteur dashboard

je viens de tester avec un certain nombre de device dans les 2 sens (3 Gladys-> device et 2 Device analogique-> Gladys et 2 device tor -> Gladys).

Je ne sais pas actuellement si il y a une limitation, mais l’interface est très lente et plante souvent.
J’ai essayé de faire des scènes, 2 fonctionnaient avec des temps de latence de l’ordre de la seconde.
J’en ai crée 2 autres et plantage.


D’ailleurs au passage, cela n’a rien à voir avec le MQTT, j’ai un autre bug dans le dashboard, j’ai mes capteurs et actionneurs qui apparaissent en double, impossible de supprimer.

J’espère que ces infos vous aideront à corriger des problèmes.

Bonne soirée et à demain …

@CamilleB C’est vraiment pas normal ça! Tu utilise quel navigateur?

image

est il possible par une commande ou par les logs de voir l’activité du raspi ? (charge cpu, mémoire …)

Pour savoir si il est complétement surchargé d’infos ou si c’est un autre problème.

J’ai eu la cas aussi en env de dev sur Firefox, obligé de hard refresh

Edit: je parle de l’affichage en double. Peut être un soucis de cache

tu peux utiliser top ou “htop”

le CPU n’a pas l’air d’être saturé environ 6% de charge et 12% pour la mémoire.
Donc ce n’est sans doute de ce cote qu’il faut chercher.
En effet en faisant un hard refresh, les données se rafraichissent et les commandes sont émises par compte hier soir, j’avais fait deux scenes qui allumait une led bleue/éteignait une rouge quand l’humidité d’un capteur était en dessous d’un seuil puis au dessus d’un autre éteignait la bleue et allumait une rouge. Cela fonctionnait pas mal. Puis j’ai crée deux autres scenes pour qu’un bouton poussoir “capteur” allume une led verte “actionneur”, et là plus aucune des scénes ne fonctionnent.
Je ne sais pas si cela est lié, mais on dirait que Gladys est très lente et qu’elle passe son temps à être sollicité par autre chose …

Pour illustrer :

ok merci, je pensais que tu parlais des valeurs.
as tu une idée où je peux voir si c’est un problème de cache ou non ?

Salut, ctrl+F5 pour faire un hard refresh

2 Likes

@CamilleB Tu n’aurais pas créé un scénario qui s’appelle lui même et ainsi de suite à l’infini ?

Ou un scénario qui créé un event qui lance un autre scénario qui créé un event et qui relance le premier scénario ?

C’est bizarre ton histoire !

Je n’ai pas compris ce qui est lent chez toi, est-ce que c’est Gladys (le programme serveur) qui est lent, ou est-ce que c’est l’interface web qui est lente?

Bonjour Pierre Gilles,
Oui je pensais comme toi, donc hier soir j’ai essayé de nouveau en supprimant tous les scénarii. Le dashboard était toujours lent à s’afficher et Il fallait rafraichir à la main pour voir les données se mettre à jour.
J’ai refait un seul scénario qui a fonctionné une fois et ensuite plus rien.
A la suite de cela, j’ai décidé de réinstaller Gladys. Il était un peu tard, j’ai juste eu le temps de recharger l’image sur la SD.
La suite ce soir …
Vu que je vais partir de 0 si tu veux que je fasse un essai particulier dis moi ?

J’ai créé un autre topic car tout cela n’avait pas trop de rapport avec le MQTT :slight_smile:

C’est dommage que tu ai supprimé l’instance problématique, on aurait pu débugger ce qui n’allait pas ^^

Je vais avoir besoin de plus d’informations sur ton installation:

  • Quel Raspberry Pi as-tu ?
  • Quelle micro-SD (quelle classe? Quelle perf lecture/écriture?)
  • Quelles intégrations avais-tu configuré?
  • Est-ce que tu avais des erreurs particulières dans le navigateur? (Clic-droit sur la page -> Inspecter l’élément -> Console)
  • Est-ce que c’est ton ordinateur qui est lent (navigateur problématique?). C’est un PC récent?
  • Si tu te promène sur le site de démo (https://demo.gladysassistant.com/dashboard), c’est lent aussi ou c’est juste lent chez toi?
  • Depuis que tu as réinstallé, ça va mieux?

C’est la première fois que j’entend ça sur la V4, donc j’aimerais savoir :slight_smile:

pierre-gilles => C’est dommage que tu ai supprimé l’instance problématique, on aurait pu débugger ce qui n’allait pas ^^
Camille => Oups désolé je n’ai pas encore le bon réflexe!!, mais je pensais réellement que mon image était vérolée et irrécupérable

Je vais avoir besoin de plus d’informations sur ton installation:

  • Quel Raspberry Pi as-tu ? => image
  • Quelle micro-SD (quelle classe? Quelle perf lecture/écriture?) => 16 Go, classe 10
  • Quelles intégrations avais-tu configuré? => que le module météo et MQTT
  • Est-ce que tu avais des erreurs particulières dans le navigateur? (Clic-droit sur la page -> Inspecter l’élément -> Console) => je n’ai pas utilisé (inspecter -> console)
  • Est-ce que c’est ton ordinateur qui est lent (navigateur problématique?). C’est un PC récent? => le navigateur n’est pas lent pour les autres applications. PC pas trop vieux.


    voilà à quoi ça ressemble quand j’'utilise firefox sur le dashboard Gladys. (encéphalogramme de la grenouille, ça n’a pas l’air de saturer de ce côté là :wink: )
  • Si tu te promène sur le site de démo (https://demo.gladysassistant.com/dashboard), c’est lent aussi ou c’est juste lent chez toi? => ça fonctionne normalement sur le site de démo.
  • Depuis que tu as réinstallé, ça va mieux?

Pour info, voici les étapes que j’ai suivi pour cette réinstallation, peut être y a t il quelque chose qu’il ne faut pas que je fasse : (j’écris au fur et à mesure de mes actions, ce qui permet de pouvoir reproduire ce que je fais si besoin à volonté)

  1. Flashing de la SD
  2. changement du mot de passe
  3. sudo apt-get update
  4. sudo apt-get upgrade
  5. redemarrage
    image
  6. puis configuration de Gladys par l’interface web
  7. config weather puis intégration dans dashboard
  8. premier essai pour voir la latence de l’IHM, dans le chat je demande "weather ?"
  9. réponse sous environ 3s, je ne sais pas si cela correspond au standard pour cette requête, mais ça me parait acceptable
  10. poursuivons par configuration MQTT puis ajout d’un périphérique (capteur humidité)
  11. intégration dans dashboard, toujours pas de latence et fonctionnement ok
  12. ajout d’autres périphériques (bouton poussoir et led rouge et bleue) fonctionnement ok sans latence
  13. ajout de scenario, ils fonctionnent mais au bout de quelques secondes, c’est le drame, latence te revoilà !!
  14. je crois avoir trouvé la raison, le problème vient des scénarii, ci dessous le scénario initial qui engendre des latences

    comme on peut le voir, la condition étant toujours vraie, selon moi (Dis moi si c’est correct Pierre Gilles), le programme envoie en permanence des commandes turn on à led bleue et turn off à led rouge.
    Ceci doit saturer le mqtt et provoquer les latences.
    J’ai juste ajouté une tempo :

    et cette fois ci, les latences sont moins importantes mais existent, le chat ne fonctionne plus, si je relance ma question : weather ? je n’obtiens pas de réponse sauf si je fais un refresh hard (F5) et même dans ce cas, la fenêtre mets quelques secondes à s’afficher. Le dashboard ne fonctionne plus (impossible de rajouter un périphérique, n’y même de modifier ceux existant)
    même en supprimant les scenarii et en revenant à l’état 12 (ci dessus), les latences et dysfonctionnements sur le chat, dashboard persistent.
    j’ai coupé le broker MQTT pour voir si cela changait quelquechose, mais latence et problème toujours là
    Coupé l’alimentation du raspi, les latences sont toujours là, impossible de modifier le dashboard et le chat me donne une réponse à ma question “weather?” en 10s environ cette fois ci.
    En gros, je suis dans la même situation qu’hier soir, cette fois ci promis je ne tue cette session :slight_smile:

Pierre Gilles : si tu veux que j’execute des commandes/débug, dis moi je lancerai ceci demain.

Je pense qu’on va créer un mode “réinitialiser l’installation Gladys” pour permettre une réinstallation facile :slight_smile:

Merci pour toute ces informations! Au vu de ton retour, il est clair que ton scénario s’appelle lui même, ce qui entraine les lenteurs car le programme se met uniquement à mouliner sur un scénario qui s’appelle lui même, et plus ça avance plus c’est pire.

Non! Un scénario n’est appelé qu’en cas de changement d’état. Gladys n’appelle le scénario que si elle reçoit une nouvelle valeur de ton arduino, et si cette valeur répond à la condition de ton scénario, alors les actions de ton scénario sont exécutées.

J’ai essayé de reproduire ton problème chez moi, sans succès.

Il est possible que le problème ne vienne pas de Gladys mais de ton programme MQTT sur Arduino, tu pourrais le poster ici?

Mon avis:

Ton arduino envoie une valeur à chaque fois qu’il est sollicité, et donc ça créé une boucle infini.

Si ton arduino envoie une valeur d’humidité à chaque fois qu’on le contact pour autre chose, c’est bien simple: il envoie une valeur d’humidité < 20% => Gladys déclenche le scénario => contact l’arduino => l’arduino renvoie une valeur d’humidité => Gladys déclenche le scénario => etc… retour à la case départ.

Tu confirme?

Oui je pense que l’on a mis le point sur le problème.
L’arduino n’attends pas de Gladys d’ordre particulier pour diffuser.

Il diffuse environ toutes les secondes les capteurs dont il fait l’acquisition, donc Gladys voit ses valeurs se rafraichir avec la même périodicité.

Je pourrais changer dans l’arduino le mode de publication et ne publier la valeur d’un capteur que lorsque ce dernier change.

Par contre, quelque chose m’intrique, pourquoi une fois les scénarii supprimés, les latences et les problèmes du dashboard persistent ???

Voici le code de l’arduino tel qu’il est aujourd’hui (en mode debug et pas très optimisé !) :

// Définition des librairies nécessaire

#include <SimpleDHT.h>
#include <Ethernet.h>
#include <PubSubClient.h>
//#include <ArduinoJson.h>

// Définition de constants

//#define mqtt_temperature "mqtt:sensor/temp1"     //Topic temperature

int pinDHT11 = 2;       // Le pin de connexion du capteur
SimpleDHT11 dht11;      // Le type de capteur DHT 11

// les topic pour la température et de l'humidité

const char* topic_t = "Capteur/temperature";
const char* topic_h = "Capteur/humidity";
const char* topic_l7 = "7";
const char* topic_l8 = "8";
const char* topic_l9 = "9";
const char* topic_bp1 = "bp1";
const char* topic_bp2 = "bp2";
const char* clientID = "Arduino45500Gien";
const char* gladys_topic = "gladys/master/device/arduino_vanne/feature/mqtt:humidite/state";
const char* gladys_topic0 = "gladys/master/device/arduino_vanne/feature/mqtt:temperature/state";
const char* gladys_topic1 = "gladys/master/device/arduino_bp_1/feature/mqtt:bp_1/state";
const char* gladys_topic2 = "gladys/master/device/arduino_bp_2/feature/mqtt:bp_2/state";

char USER[10] = "boby88";
char PWD[10] = "tresdur";

char hum[10],tem[10],c[10],d[10],etat[10];
int j=0;
int a;


// les paramètres de connexion du shield Ethernet

byte mac[] = {  0x12, 0xA2, 0xB8, 0x48, 0xAA, 0xF0 };   // L'adresse Mac de votre shield ethernet
IPAddress ip(192, 168, 1, 100); 

// L'adresse du Broker

const char* server = "192.168.1.79";

// instance de la classe EthernetClient : crée un client qui peut se connecter à une adresse IP et un port internet spécifique

EthernetClient ethClient;       // ethClient est juste le nom donné à l'instance

// l'instance de la classe MQTT, cette instance doit être complétée de mqtt.setserver pour être entièrement configuée

PubSubClient mqtt(ethClient);   // mqtt est juste le nom donné à l'instance

void reconnect(void);
void pubCapteur(void);

void setup()
{
// initialisation des entrées/sorties numériques

    pinMode(6, INPUT_PULLUP);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, INPUT_PULLUP);
   
  // Initialisation de la liaison série

  Serial.begin(115200);

  // Initialisation de la connexion TCP

  Ethernet.begin(mac,ip);

  //Edition des objets JSON + publication
 //   StaticJsonDocument<300> JSONbuffer;
 //   char JSONmessageBuffer[100];

  // Initialisation de la connexion au Broker

  mqtt.setServer(server, 1883);
  mqtt.setCallback(callback);
}

void loop()
{
  if(mqtt.connected())
    {
     // Si la connexion au Broker est réalisé envoyer les données
   if(j==5) {pubCapteur(); j=0;}
   else j++;
     mqtt.loop();
    }else {
     // Sinon se reconnecte au Broker
     reconnect();
    }
        delay(300);
}

void callback(char* topic, byte* payload, unsigned int length) {
 //Serial.print("Message arrived [");
 //Serial.print(topic);
 //Serial.print("] ");
 //Serial.print("");
 
    if ((char)topic[31] == 'b')  a = 7;
    if ((char)topic[31] == 'r')  a = 8;
    if ((char)topic[31] == 'v')  a = 9;

//Serial.print((char[1])payload);

   for (int i=0;i<length;i++) {
    char receivedChar = (char)payload[i];
    if (receivedChar == '1')
    digitalWrite(a, HIGH);
    if (receivedChar == '0')
     digitalWrite(a, LOW);
    }
}

void pubCapteur(void)
{
// start working...
  
  // read with raw sample data.
  byte temperature = 0;
  byte humidity = 0;
 byte data[40];
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    //Serial.print("Read DHT11 failed");
    return;
  }
  //Serial.print(humidity);
  dtostrf(humidity, 2, 0, hum);
  dtostrf(temperature, 2, 0, tem);
  dtostrf(digitalRead (10), 1, 0, c);
  dtostrf(digitalRead (6), 1, 0, d); 
 
  // DHT11 sampling rate is 1HZ.
  // convertion des valeurs capturé en chaine de caractére

  // publication des données sur la Broker

  //mqtt.publish(topic_h, hum);
  //mqtt.publish(topic_t, tem);
  //mqtt.publish(topic_bp1, c);
  //mqtt.publish(topic_bp2, d);

    //Serial.print(humidity);

    //Serial.print("......");
    //Serial.print((char)humidity+0);
    //Serial.print("......");
    
//  char* essai = hum;
  //donnees[0] = essai[0];
  //donnees[1] = essai[1];
   // Serial.print(gladys_topic);
   // Serial.print(donnees);

    //} 
 //   JSONbuffer["device_feature_external_id"] = mqtt_temperature;
 //   JSONbuffer["state"] = String(temperature);
 //   serializeJson(JSONbuffer, JSONmessageBuffer);
   mqtt.publish(gladys_topic,hum);   // Publish humidité
   delay(200);
   //mqtt.publish(gladys_topic0,tem);   // Publish temperature
  // delay(100);
   mqtt.publish(gladys_topic1,c);   // Publish BP 1
   delay(200);
   //mqtt.publish(gladys_topic2,d);   // Publish BP 2
   //delay(100);
}


void reconnect(void) {
  // Loop until we're reconnected
  while (!mqtt.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqtt.connect(clientID,USER,PWD)) {
    //if (mqtt.connect("essai-baradel","boby88","tresdur")) {
     Serial.println("connected");
      // Once connected, publish an announcement...
       mqtt.subscribe("gladys/device/mqtt:arduino_led_bleue/feature/mqtt:actionneur/state");
       mqtt.subscribe("gladys/device/mqtt:arduino_led_rouge/feature/mqtt:actionneur1/state");
       mqtt.subscribe("gladys/device/mqtt:arduino_led_verte/feature/mqtt:actionneur2/state");
       
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqtt.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Plusieurs possibilités :

  • Ton Arduino a remplit le broker MQTT de plein de messages, et Gladys est occupée à les dépiler un par un… Même si l’arduino n’en publie plus, peut-être qu’il en reste en attente?
  • La DB a beaucoup de requêtes en attente et peine à tout dépiler
  • Le process Gladys est carrément sous l’eau, l’event-loop de Node.js est peut-être bien remplie…

Ton problème est super intéressant, je pense qu’on va rajouter du rate-limiting dans Gladys pour éviter qu’un capteur déconnant ne sature Gladys à l’avenir :slight_smile:

Merci d’avoir fait l’erreur pour les autres, je vais améliorer le logiciel pour éviter des problèmes comme ici :smiley:

2 Likes

Souhaites tu que je conserve cette image de Gladys pour plus de tests ou est ce que je peux l’écraser ?

Tu peux l’écraser :slight_smile:

@camille @CamilleB J’ai investigué toute cette matinée sur le sujet, et j’ai trouvé la source de l’issue des lenteurs du dashboard lorsqu’il y a une insertion assez conséquente de nouveaux états de périphériques :slight_smile:

Si ça t’intéresse (mais c’est technique), j’ai créé une tâches GitHub qui résume le problème, et qui présente des solutions possibles :

Je ne m’y attellerais pas maintenant (car j’ai pas mal d’autres tâches en attente!), mais au moins le développement est listé :slight_smile:

Merci encore pour tes retours et ton aide !

1 Like