Interpretation d'un message reçu en MQTT d'un routeur solaire F1ATB

Bonjour, j’ai un routeur solaire F1ATB et depuis la mise jour du logiciel, je ne reçois plus les messages MQTT de manière lisible.
Sur jMQTT je voie des valeurs ressemblant à ça :

eyJQdWlzc2FuY2VTX00iOiAwLCAiUHVpc3NhbmNlSV9NIjogMCwgIlRlbnNpb25fTSI6IDIzOC4wLCAiSW50ZW5zaXRlX00iOiAzLjAsICJQb3dlckZhY3Rvcl9NIjogMS4wMCwgIkVuZXJnaWVfTV9Tb3V0aXJlZSI6MTI2NzA0ODQsIkVuZXJnaWVfTV9JbmplY3RlZSI6MCwgIkVuZXJnaWVKb3VyX01fU291dGlyZWUiOjE5NTEsICJFbmVyZ2llSm91cl9NX0luamVjdGVlIjowLCJMVEFSRiI6IkDl/T8PIiwgIkNvZGVfVGFyaWZhaXJlIjowfQ==

Alors que sur le logiciel, MQTT Explorer sur Windows, j’ai

{« PuissanceS_M »: 0, « PuissanceI_M »: 0, « Tension_M »: 240.0, « Intensite_M »: 3.0, « PowerFactor_M »: 1.00, « Energie_M_Soutiree »:12670484,« Energie_M_Injectee »:0, « EnergieJour_M_Soutiree »:1951, « EnergieJour_M_Injectee »:0,« LTARF »:« @��? », « Code_Tarifaire »:0}

Comment décomposer le message bizarre que je reçois en commande utilisable comme d’habitude?
Merci

Bonjour,
C’est du base64.
Si tu vas ici https://www.base64decode.org/
et que tu passes la valeur encodée, tu l’auras en clair.

Maintenant je ne pourrai pas plus t’aider sur ton routeur :confused:

1 « J'aime »

Hello,

Ca ressemble au même souci de décodage qu’ici : Messages étranges reçus - #3 par Bad

Bad avait demandé à la personne de tester un truc mais n’a jamais eu de réponse (enfin pas dans le fil du post).

Problème surement lié à cette chaine :

@��?

En effet, @Donovan-88 il faut que tu essayes le correctif proposé dans cet autre sujet.

@kaktusatomik effectivement ce site décode correctement le message.
@Bison et @Bad , c’est bon je viens de tester la méthode énumérée dans l’autre sujet et ça fonctionne après avoir redémarrer le démon. Maitenant j’ai bien la valeur sous cette forme :

Citation :
« PuissanceS_M »: 496, « PuissanceI_M »: 0, « Tension_M »: 240.0, « Intensite_M »: 2.0, « PowerFactor_M »: 0.84, « Energie_M_Soutiree »:12673314,« Energie_M_Injectee »:0, « EnergieJour_M_Soutiree »:4781, « EnergieJour_M_Injectee »:0,« LTARF »:« @��? », « Code_Tarifaire »:0}

Il faut maintenant que je la décortique pour pouvoir utiliser les valeurs dans des Widgets et/ou scénarios.

De plus, à chaque actualisation MQTT, j’ai une erreur :

Citation :
jMQTTComFromDaemon::msgIn() a levé l’Exception: [MySQL] Error code : 22001 (1406). Data too long for column ‹ value › at row 1 : REPLACE INTO history SET cmd_id=:cmd_id, datetime=:datetime, value=:value

Merci en tout cas pour votre aide

Erreur disparue lorsque je décoche l’option « Historiser »

1 « J'aime »

Oui, il faut VRAIMENT éviter d’historiser les commandes info/autre.

Je te laisse marquer le sujet comme résolu ?

Pourquoi du coup?

Une solution pour séparer toutes les valeurs ou ça n’a rien a voir avec le plugin?

Non, ça n’a rien à voir avec le plugin.

La base de données de Jeedom est plutôt conçue pour stocker des nombres ou booléens, et en plus le texte est limité en longueur et très gourmand en place.

Merci c’est bon à savoir. Donc dans une commande info numérique, on peut l’historiser sans soucis vu que c’est du numérique?

Par contre j’ai testé avec la doc du plugin, d’obtenir une valeur dans une commande mais impossible.
J’ai fait :

  • Nom de la commande : Puissance Apparente
  • Type : Info
  • Sous-type : Numérique
  • Topic : routeur1/routeur1_rms_state
  • Chemin Json : JSONPATH($.PuissanceS_M) ou $.PuissanceS_M ou [PuissanceS_M][0]

Et je n’obtiens aucunes valeurs. La syntaxe n’est pas bonne?

Bonjour, j’ai réussi à parcer les différentes valeurs avec un scénario et un code généré par ChatGPT qui en plus me fait un calcul pour une valeur :

// Récupérer le message JSON depuis la commande
$json = cmd::byString('#[Extérieur][Routeur][routeur1_rms_state]#')->execCmd();

// Nettoyer les caractères spéciaux
$json = clean_json_string($json);

$data = json_decode($json, true);

// Vérifiez que le JSON a été correctement décodé
if (json_last_error() === JSON_ERROR_NONE) {
    // Mettre à jour les commandes info avec les valeurs du JSON
    if (isset($data['PuissanceS_M'])) {
        // Mettre à jour la puissance active
        cmd::byString("#[Extérieur][Routeur][Puissance Active]#")->event($data['PuissanceS_M']);
        
        // Calculer la puissance apparente si le facteur de puissance est disponible
        if (isset($data['PowerFactor_M']) && $data['PowerFactor_M'] != 0) {
            $puissanceApparente = $data['PuissanceS_M'] / $data['PowerFactor_M'];
            // Convertir en entier pour supprimer les décimales
            $puissanceApparente = intval($puissanceApparente);
            cmd::byString("#[Extérieur][Routeur][Puissance Apparente]#")->event($puissanceApparente);
        } else {
            log::add('scenario', 'error', 'Facteur de puissance non valide ou manquant');
        }
    } else {
        log::add('scenario', 'error', 'Clé "PuissanceS_M" manquante dans le JSON');
    }

    // Ajoutez les mises à jour pour les autres commandes info ici de la même manière

} else {
    // Si le JSON n'est pas valide, écrivez un message de log pour le débogage
    log::add('scenario', 'error', 'Erreur de décodage JSON: ' . json_last_error_msg());
}

/**
 * Fonction pour nettoyer une chaîne JSON en supprimant les caractères spéciaux.
 * @param string $json_string Chaîne JSON à nettoyer.
 * @return string Chaîne JSON nettoyée.
 */
function clean_json_string($json_string) {
    // Supprimer les caractères non-ASCII et les caractères de contrôle
    return preg_replace('/[^\x20-\x7F]/', '', $json_string);
}

Mais ce scénario se lance à chaque fois qu’un message MQTT est reçu. Soit toutes les 5 secondes. Ça ne risque pas de surcharger la domotique ?