Erreur "managerEventListener was not registered as handler" - événements Meross reçus mais non propagés vers Etat

Bonjour,

Je rencontre un bug récurrent avec le plugin MerosSync (2 modules Meross MSG100 - porte de garage + portail coulissant) : les changements d’état du device ne remontent plus automatiquement dans Jeedom, alors que l’app Meross officielle affiche bien l’état correct en temps réel

Symptômes - L’app Meross (iOS) affiche l’état correct du device en temps réel

- Dans Jeedom, la commande « Etat » de l’équipement reste figée sur une ancienne valeur, jusqu’à déclenchement manuel de la commande Refresh… après quoi l’état se met bien à jour

- Le push automatique (temps réel) ne fonctionne donc pas ou plus, alors que le polling manuel fonctionne

Erreur relevée dans les logs du plugin :

[2026-08-06 18:37:49] ERROR [meross_iot.manager] : Coroutine function <function managerEventListener at 0x7f0c0f6455e0> was not registered as handler for this device 

[2026-08-10 17:44:23] ERROR [meross_iot.manager] : Coroutine function <function managerEventListener at 0x7f2658ce75e0> was not registered as handler for this device 

Cette erreur apparaît de façon récurrente (constatée à plusieurs jours d’intervalle, le 6 et le 10 août), à chaque fois qu’un événement semble être émis par le device côté Meross cloud.

Autre erreur constatée précédemment (résolue depuis, possiblement liée)

[2026-08-02 10:10:12] ERROR [meross_iot.manager] : Timeout occurred while waiting a response for message [...] sent to device uuid 24070367017190610702c4e7ae060c1f. Timeout was: 10.000000 seconds. Mqtt Host: mqtt-eu-4.meross.com:443.

(timeouts répétés toutes les ~10 min sur Appliance.System.Ability, sur plusieurs heures, avant de se résorber après redémarrage du plugin)

Ce que j’ai déjà vérifié :

- App Meross mobile : device toujours affiché en ligne, état correct

- Redémarrage du plugin MerosSync : n’a pas résolu le problème de push, seul un Refresh manuel force la mise à jour

- Le comportement est identique sur les 2 équipements Meross que j’utilise (porte de garage + portail), donc pas spécifique à un device

Palliatif actuel

Scénario Jeedom qui déclenche la commande Refresh toutes les 10 minutes, en attendant une résolution du bug de push temps réel

Environnement

- Version Jeedom : Version : 4.6.1
Source : default
Branche : master
Système : diy

- Version du plugin MerosSync : Version 2026-03-08 01:13:12

- Modules concernés : Meross MSG100 x2

- Installation : VM

Merci d’avance pour votre aide, je reste dispo pour fournir plus de logs si besoin :slight_smile:

Mise à jour : cause identifiée et correctif testé

Le Refresh manuel qui marchait et l’app Meross à jour, c’était bien ça : le cloud pousse l’état, MerosSync ne l’écrit pas dans Jeedom.

Les timeouts MQTT et l’erreur managerEventListener was not registered as handler for this device existent, mais ce n’est pas la cause du Etat figé.
managerEventListener est vide. Le PUSH garage arrive bien dans deviceEventListener.

Ce qu’on voit dans les logs (MSG100)

  1. Commande Ouvrir : aSetOn - We open the door :→ le device bouge.

  2. PHP : mise à jour état 1 : Etat est forcé à 1 (fermé, dans la convention du plugin).

  3. PUSH Appliance.GarageDoor.State / open: 1 reçu.

  4. Aucune mise à jour de onoff_0.

Convention déjà utilisée au sync :

  • ouvert : Etat = 0

  • fermé : Etat = 1

2 bugs dans MerosSync 2026-03-08

  1. resources/MerossIOTd/MerossIOTd.py deviceEventListener traite CONTROL_TOGGLEX et les alarmes, pasNamespace.GARAGE_DOOR_STATE. Le PUSH est seulement loggé.

  2. core/class/MerosSync.class.php Après setOn/setOff, l’état est écrit avec $res[‹ result ›]. Le démon renvoie 1 après un open et 0 après un close → pour un garage, Etat est inversé.

Correctif appliqué localement, validé (Jeedom, télécommande, bouton mural, sans Refresh)

Dans deviceEventListener, avant le else :

Python

elif namespace == Namespace.GARAGE_DOOR_STATE:
        logger.debug(f"GarageDoor Event data: {data}")
        d['key'] = 'onoff'
        state = data.get('state')
        if isinstance(state, list):
            state = state[0]
        is_open = int(state.get('open', 0))
        d['value'] = 0 if is_open else 1
        d['channel'] = state.get('channel', 0)
        jc.send(d)

Dans execute(), cases on/off, à la place du checkAndUpdateCmd(…, $res[‹ result ›]) :

PHP

$stateCmd = $eqLogic->getCmd(null, 'onoff_'.$channel);
if (is_object($stateCmd) && $stateCmd->getGeneric_type() == 'GARAGE_STATE') {
    $eqLogic->checkAndUpdateCmd('onoff_'.$channel, $action == 'on' ? 0 : 1);
} else {
    $eqLogic->checkAndUpdateCmd('onoff_'.$channel, $res['result']);
}

Est-ce que tu peux l’intégrer en stable ? En attendant j’ai bloqué les mises à jour du plugin pour ne pas écraser le patch.