Erreur lors de l'activation du nettoyage de la base

Bonsoir,

J’ai une erreur qui traine du à jmqtt dans le log cleaningdb:

0677|Remove cmd because no eqLogic found : [shelly1l-bureau:input:0]
0678|PHP Fatal error:  Uncaught Error: Call to a member function log() on bool in /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php:438
0679|Stack trace:
0680|#0 /var/www/html/core/class/DB.class.php(338): jMQTTCmd->preRemove()
0681|#1 /var/www/html/core/class/cmd.class.php(1023): DB::remove()
0682|#2 /var/www/html/install/cleaning.php(56): cmd->remove()
0683|#3 {main}
0684|thrown in /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php on line 438

Elle se produit si je déclenche depuis le menu Jeedom Configuration/ OS/DB / Nettoyage de la base de donnée
J’ai vérifié et ça correspond à un équipement qui n’existe plus sur mon Jeedom

RAS sinon sur le plugin en lui même qui tourne comme un charme

Des pistes ?

Système:
Nuc proxmox
debian 11 (Je sais que cette version de debian n’est pas encore complètement supportée :wink: )
Jeedom 4.2.8

Hello @cddu33,

Si la commande (qui est en train d’être supprimée) n’est attachée à aucun équipement, impossible d’accéder au loger de l’eqLogic, donc ça crash.
Joli bug, super rare et présent depuis la création de jMQTT.
Bien vu !

Puisque tu es dev, je te propose de valider rapidement le fix en remplacent ta fonction jMQTTCmd::preRemove() dans plugins/jMQTT/core/class/jMQTTCmd.class.php par :

    public function preRemove() {
        $eqLogic = $this->getEqLogic();
        if ($eqLogic) {
            $eqLogic->log('info', 'Removing command ' . $this->getLogName());
            // Remove batteryStatus from eqLogic on delete
            if ($this->isBattery()) {
                $eqLogic->setStatus('battery', null);
                $eqLogic->setStatus('batteryDatetime', null);
            }
        } else {
            log::add('jMQTT', 'info', 'Removing orphan command #'.$this->getId().'#');
        }
        $listener = listener::searchClassFunctionOption(__CLASS__, 'listenerAction', '"cmd":"'.$this->getId().'"');
        foreach ($listener as $l) {
            log::add('jMQTT', 'debug', 'Listener Removed from #'.$l->getOption('cmd').'#');
            $l->remove();
        }
    }

Et ensuite de relancer le nettoyage de ta BDD.

Je te laisse confirmer que jMQTTCmd::preRemove() est bien égal à ça avant le changement :

    public function preRemove() {
        $eqLogic = $this->getEqLogic();
        $eqLogic->log('info', 'Removing command ' . $this->getLogName());
        $listener = listener::searchClassFunctionOption(__CLASS__, 'listenerAction', '"cmd":"'.$this->getId().'"');
        foreach ($listener as $l) {
            log::add('jMQTT', 'debug', 'Listener Removed from #'.$l->getOption('cmd').'#');
            $l->remove();
        }
        // Remove batteryStatus from eqLogic on delete
        if ($this->isBattery()) {
            $eqLogic->setStatus('battery', null);
            $eqLogic->setStatus('batteryDatetime', null);
        }
    }

N’hésite pas à me faire un retour.

Pour suivi : https://github.com/Domochip/jMQTT/issues/136

1 « J'aime »

Bonsoir,
Merci pour le retour.

J’ai bien ça dans la fonction.

Par contre j’ai changé la fonction mais en regardant ton code je ne vois pas de différence entre les 2.

Pas d’amélioration sur le cleandb

0677|Remove cmd because no eqLogic found : [shelly1l-bureau:input:0]
0678|PHP Fatal error:  Uncaught Error: Call to a member function log() on bool in /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php:438
0679|Stack trace:
0680|#0 /var/www/html/core/class/DB.class.php(338): jMQTTCmd->preRemove()
0681|#1 /var/www/html/core/class/cmd.class.php(1023): DB::remove()
0682|#2 /var/www/html/install/cleaning.php(56): cmd->remove()
0683|#3 {main}
0684|thrown in /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php on line 438

j’ai fait ceci , c’est pas forcement le mieux mais ça fonctionne

public function preRemove() {
      if ($eqLogic != ''){
        $eqLogic = $this->getEqLogic();
        $eqLogic->log('info', 'Removing command ' . $this->getLogName());   
      }
      	$listener = listener::searchClassFunctionOption(__CLASS__, 'listenerAction', '"cmd":"'.$this->getId().'"');
        foreach ($listener as $l) {
            log::add('jMQTT', 'debug', 'Listener Removed from #'.$l->getOption('cmd').'#');
            $l->remove();
        }
        // Remove batteryStatus from eqLogic on delete
        if ($this->isBattery()) {
            $eqLogic->setStatus('battery', null);
            $eqLogic->setStatus('batteryDatetime', null);
        }
    }

Hello, j’ai bien merdé dans les copier-coller…
Je viens de modifier, dans ton code il reste des $eqLogic sur la seconde partie mais ca devait le faire dans ton cas précis (pas une batterie).
Désolé pour le contre temps :confused:

pas de problème.

a oui c’était un équipement sans batterie que j’avais ^^

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.