Erreur JMQTT dans callback.php(90)

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 :slightly_smiling_face:

❌ 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.

Je viens d’avoir à nouveau la même erreur à 18H10 pour un autre équipement. Toujours la ligne 90 incriminée.

PHP Fatal error:  Uncaught ArgumentCountError: 4 arguments are required, 3 given in /var/www/html/plugins/jMQTT/core/php/callback.php:90