Bonjour @LaurentLaBricole,
Désolé pour cette réponse tardive, je n’étais pas disponible de la journée.
Oui elles me semblaient cohérentes en tout cas, donc le decoder doit être bon.
Et en effet j’en étais arrivé à la même conclusion, capteur non utilisé donc valeur par défaut => 327,67°C pour TempC_DS.
Alors pour convertir le decoder en format utilisable dans Node Red, j’ai d’abord demandé à ChatGPT, il m’a bien converti le code mais les valeurs étaient comment dire… hautement improbables… (657°C). Idem avec Le Chat.
Avant de rentrer plus en profondeur dans le code proposé pour essayer de comprendre et d’abandonner rapidement devant mes lacunes en code, j’ai demandé à Grok et là du premier coup ça fonctionnait.
Prompt classique du style : Voici un code utilisable dans Chrisptack pour décoder des data d’un message MQTT, adapte moi ce code pour une utilisation dans un noeud fonction de Node Red
À noter, j’ai utilisé le decoder au format .txt pour Chirpstack que tu as ciblé dans ton premier lien.
Sans plus de suspens voici le code que tu peux essayer dans ta fonction sous Node Red pour obtenir les valeurs des fPorts 2, 3, 4 et 5 :
// Fonction helper pour padding hex (inchangée)
function str_pad(byte) {
var zero = '0';
var hex = byte.toString(16);
var tmp = 2 - hex.length;
return zero.substr(0, tmp) + hex;
}
// Fonction de décodage adaptée (similaire à l'original, mais sans variables inutilisé)
function Decode(fPort, bytes) {
var decode = {};
if (fPort == 2) {
if (bytes.length == 11) {
decode.TempC_SHT = parseFloat(((bytes[0] << 24 >> 16 | bytes[1]) / 100).toFixed(2));
decode.Hum_SHT = parseFloat(((bytes[2] << 24 >> 16 | bytes[3]) / 10).toFixed(1));
decode.TempC_DS = parseFloat(((bytes[4] << 24 >> 16 | bytes[5]) / 100).toFixed(2));
decode.Ext = bytes[6];
decode.Systimestamp = (bytes[7] << 24 | bytes[8] << 16 | bytes[9] << 8 | bytes[10]);
decode.Node_type = "LHT52";
return decode;
} else {
decode.Status = "RPL data or sensor reset";
decode.Node_type = "LHT52";
return decode;
}
}
if (fPort == 3) {
decode.Status = "Data retrieved, your need to parse it by the application server";
decode.Node_type = "LHT52";
return decode;
}
if (fPort == 4) {
decode.DS18B20_ID = str_pad(bytes[0]) + str_pad(bytes[1]) + str_pad(bytes[2]) + str_pad(bytes[3]) +
str_pad(bytes[4]) + str_pad(bytes[5]) + str_pad(bytes[6]) + str_pad(bytes[7]);
decode.Node_type = "LHT52";
return decode;
}
if (fPort == 5) {
decode.Sensor_Model = bytes[0];
decode.Firmware_Version = str_pad((bytes[1] << 8) | bytes[2]);
decode.Freq_Band = bytes[3];
decode.Sub_Band = bytes[4];
decode.Bat_mV = bytes[5] << 8 | bytes[6];
decode.Node_type = "LHT52";
return decode;
}
// Cas par défaut si fPort non géré
decode.Status = "fPort non supporté";
return decode;
}
// Corps principal du nœud function
var payload = msg.payload; // L'objet JSON de l'uplink MQTT
if (payload && payload.data && payload.fPort) {
// Décoder le base64 en Buffer, puis en tableau d'octets (uint8)
var base64Data = payload.data;
var buffer = Buffer.from(base64Data, 'base64');
var bytes = Array.from(buffer); // Convertir en array pour compatibilité avec le code original
var fPort = payload.fPort;
// Appeler la fonction de décodage
var decoded = Decode(fPort, bytes);
// Remplacer msg.payload par les données décodées
msg.payload = decoded;
} else {
// Erreur si les champs requis manquent
msg.payload = { error: "Données MQTT invalides (data ou fPort manquant)" };
}
return msg;