Bonjour,
Utilisation de JMQTT en version beta sur Debian 12 et Core 4.5.
Cette erreur apparait 3 fois cette nuit dans http.error, c’est la première fois qu’elle apparait :
0000|[Mon Dec 08 01:00:36.091131 2025] [php:error] [pid 193329:tid 193329] [client 127.0.0.1:60298] PHP Fatal error: Uncaught ArgumentCountError: 4 arguments are required, 3 given in /var/www/html/plugins/jMQTT/core/php/callback.php:90\nStack trace:\n#0 /var/www/html/plugins/jMQTT/core/php/callback.php(90): sprintf()\n#1 {main}\n thrown in /var/www/html/plugins/jMQTT/core/php/callback.php on line 90
En complément d’analyse j’ai dans le log JMQTD à la même heure :
0002|[2025-12-08 01:00:36,129] ERROR JMsg.Snd SockOut send() : COULD NOT send TO Jeedom: [{'cmd': 'messageIn', 'id': '1500' etc .... la ligne est trop longue derrière pour être posté.
Le bloc concerné dans callback.php est :
// Check if daemon is in a correct state or deny the message
if (!$authorized && ($message['cmd'] != 'daemonUp')) {
if (is_null($authorized))
jMQTT::logger(
'debug',
$head . sprintf
(__("Impossible d'autoriser la cmd '%2\$s' avant la commande 'daemonUp': '%3\$s'", __FILE__),
$message['cmd'],
json_encode($message)
)
);
else
jMQTT::logger(
'debug',
$head . sprintf(
__("Message refusé (démon invalide) : '%2\$s'", __FILE__),
json_encode($message)
)
);
continue;
}
J’ai soumis l’erreur à chatgpt et voici son diagnostic que je te soumet si ça peut t’avancer. Bad, je ne touche à rien de ton code de toute façon sans ton retour. C’est ton code ![]()
❌ Le problème : usage incorrect des index dans sprintf()
Dans les deux appels à sprintf(), le texte utilise des placeholders indexés comme :
* %2\$s
* %3\$s
➡️ Mais tu ne fournis que 1 ou 2 arguments, donc le placeholder %3\$s n’a pas d’argument correspondant → d’où l’erreur :
ArgumentCountError: 4 arguments are required, 3 given
🔥 Erreur 1 : bloc when $authorized is null
Tu as :
sprintf( __("Impossible d'autoriser la cmd '%2\$s' avant la commande 'daemonUp': '%3\$s'", __FILE__), $message['cmd'], json_encode($message) )
Le texte contient :
* %2$s → OK (argument #2)
* %3$s → ❌ (argument #3 inexistant)
Or tu passes seulement 2 arguments :
1. $message['cmd']
2. json_encode($message)
➡️ Donc il manque un 3ᵉ argument, ou il faut retirer la référence %3.
🔥 Erreur 2 : bloc else
sprintf(
__("Message refusé (démon invalide) : '%2\$s'", __FILE__),
json_encode($message)
)
Ici :
* %2$s est demandé
* Mais tu passes 1 seul argument
→ Même problème.
✅ Solution recommandée
✔️ Option A : Utiliser des placeholders simples (%s), plus clair et sans ambiguïtés
Bloc 1 corrigé :
jMQTT::logger( 'debug', $head . sprintf( __("Impossible d'autoriser la cmd '%s' avant la commande 'daemonUp': '%s'", __FILE__), $message['cmd'], json_encode($message) ) );
Bloc 2 corrigé :
jMQTT::logger(
'debug',
$head . sprintf(
__("Message refusé (démon invalide) : '%s'", __FILE__),
json_encode($message)
)
);
➡️ Nombre de %s = nombre d’arguments → plus d’erreur.
✔️ Option B : conserver %2$s / %3$s mais fournir les 3 arguments
(peu utile ici, inutilement complexe)
🧹 Bonus : Il y a une parenthèse mal placée dans ton premier logger()
Tu as :
$head . sprintf
(__("Impossible ..."), $message['cmd'], json_encode($message)
)
);
➡️ Cela devait provoquer une erreur syntaxique lors de l’exécution si les logs passaient dedans.
📌 Conclusion
Le bug vient de :
* placeholders indexés %2$s / %3$s
* alors que seulement 1 ou 2 arguments sont fournis.