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 )
Jeedom 4.2.8
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);
}
}
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
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