[Résolu] Lenteurs Gladys Plus au Canada

Salut @pierre-gilles,

Je ne sais pas si c’est dû à mon emplacement (Canada), mais je constate des lenteurs importantes quand je contrôle mes équipements via Gladys Plus.

Plus de contexte :

  • Chargement de la page de Gladys Plus : rapide (environ 2 sec, vs 1.3 sec en local)
  • Contrôle d’une prise (On/Off) : lent (jusqu’à 30 secondes) vs moins de 2 sec au pire des cas en local
  • Contrôle d’un thermostat (consigne) : échoue régulièrement vs moins de 2 sec en local

J’ai pensé à une erreur chez moi, mais j’ai une fibre de 3Gbps symétrique et tout fonctionne bien en local.

Salut @lmilcent :slight_smile: Tu es le premier utilisateur Canadien (wouhou!), donc il y a peut-être un peu de fine-tuning à faire aha

J’aimerais vraiment être plus actif en Amérique du nord donc c’est l’occasion parfaite pour moi de tester mon offre là bas :smiley:

Je vais t’envoyer des informations en privée pour que tu puisses faire des tests

1 « J'aime »

Je mets le message de la fin ici: ce n’était pas lié à Gladys Plus ni au Canada (temps de réponse de 125ms testé par @lmilcent depuis le Canada), mais à des scènes trop agressives toutes les 5 secondes qui saturait la queue d’évènements Gladys :slight_smile:

1 « J'aime »

Merci @pierre-gilles pour l’accompagnement et pour comprendre ce qui pouvait rendre Gladys Plus instable.

Origine du problème

Pour expliquer à tout le monde en détail, j’ai un thermostat connecté de la marque Sinopé (Sinopé TH1123ZB control via MQTT | Zigbee2MQTT), qui aurait un bug l’empêchant de m’envoyer les valeurs de consommation. Donc quand le chauffage s’allume, il m’affiche toujours « 0 W » consommé en instantanné.
Comme la période de chauffe se faire par 15 secondes, il fallait que je récupère cette valeur très régulièrement pour par rater un cycle.

Solution de contournement avec une scène (cause du problème avec Gladys Plus)

J’avais créé une scène comme l’image suivante, mais appliqué à 3x thermostats (là on en voit qu’un seul). Cette scène s’exécutait toutes les 5 secondes.
Gladys localement ne bronchait pas, ça tournait bien sans instabilité et sans trop utiliser les ressources CPU. Mais lorsque j’utilisais Gladys Plus, c’était une autre histoire, j’avais parfois des lenteurs jusqu’à 30 secondes pour commander une prise !!

Solution définitive

Pour forcer mes thermostats à renvoyer leurs données à jour régulièrement, sans demander à Gladys de faire le travail, puisque ça provoque des effets de bords, j’ai fait la même chose, mais avec Zigbee2MQTT directement.

Extensions

Zigbee2MQTT propose un système d’extensions, permettant d’ajouter des fonctionnalités. Il faut écrire du code en javascript, qui sera exécuté suivant différents événements.

Dans mon cas, j’ai fait en sorte que toutes les 5 secondes, mes trois thermostats soit forcé d’être mis à jour sur leurs valeurs de consommation électrique.
Résultat, plus de lenteurs sur Gladys et j’ai bien mes données régulièrement.

Voici le code en texte :

class ForceUpdateSinopeExtension{
    constructor(zigbee, mqtt, state, publishEntityState, eventBus, settings, logger) {
        logger.info('Loaded  ForceUpdateSinopeExtension');
        this.mqttBaseTopic = settings.get().mqtt.base_topic;
        this.eventBus = eventBus;
        this.mqtt = mqtt;
        this.eventBus.on('stateChange', this.onStateChange.bind(this), this.constructor.name);

        // List of devices to update
        this.devices = [
          'bureau-thermostat-sinope',
          'piecedevie-thermostat-sinope',
          'chambreenfant-thermostat-sinope'
        ];
        this.lastMessageTime = Date.now() / 1000;
    }

    
    async onStateChange() {
        const now = Date.now() / 1000; // get current time in seconds
        if (now - this.lastMessageTime >= 5) { // check if 5 seconds have passed since last message
            this.lastMessageTime = now;
            console.log('----> Forcing updates of sinope devices (every 5 sec).');
            // update all values from  a list
            for (const device of this.devices) {
                const topic = `${this.mqttBaseTopic}/${device}/get`;
                const data = {
                  'power': true,
                  'voltage': true,
                  'current': true,
                  'energy': true
                }
                this.mqtt.onMessage(topic, JSON.stringify(data));
            }
        }
    }

    async onMQTTMessage(topic, message) {
        // console.log({topic, message});
    }

    async stop() {
        this.eventBus.removeListeners(this.constructor.name);
    }
}

module.exports = ForceUpdateSinopeExtension;
4 « J'aime »

Pour info les extensions ne semblent pas être sauvegardées par Gladys Plus. Il faut donc garder le code de son coté pour le remettre en cas de restauration.

1 « J'aime »