Transformer un message en plusieurs commandes Jeedom

Bonjour à tous,

Je reçois des messages MQTT contenant plusieurs données sous la forme suivante :

paramètre1=valeur1&paramètre2=valeur2&paramètre3=valeur3&paramètre4=valeur4

Exemple concret :

PASSKEY=0DF3FDE6228BEFE8385CC95BEF90A756&stationtype=GW2000A_V3.2.2&runtime=19484&heap=127964&dateutc=2025-03-27%2016%3A46%3A27&tempinf=70.70&humidityin=35&baromrelin=29.642&baromabsin=29.642&tempf=62.24&humidity=46&vpd=0.305&winddir=306&windspeedmph=0.00&windgustmph=2.24&maxdailygust=11.63&solarradiation=77.11&uv=0&rrain_piezo=0.000&erain_piezo=0.000&hrain_piezo=0.000&drain_piezo=0.000&wrain_piezo=0.000&mrain_piezo=1.512&yrain_piezo=333.933&srain_piezo=0&ws90cap_volt=5.5&ws90_ver=147&wh90batt=3.28&freq=868M&model=GW2000A&interval=60

Le message est publié sur le topic : ecowitt-gw2000/weather.

Je souhaite extraire chaque paramètre et l’associer à une commande Jeedom via le plugin MQTT Manager (je l’utilise déjà avec Z-wave JS).

Comment puis-je procéder pour que chaque valeur soit exploitable individuellement ?

Merci d’avance pour votre aide !

Bonjour,

Vous avez déjà eu une réponse dans votre précédent post :

L’avez-vous exploitée ?
Avez-vous lu la documentation du plugin jMQTT ?

Oui, justement j’ai regardé avec notamment ce chapitre :

J’avoue ne pas trop comprendre le fonctionnement. J’ai fait des tests sans succès.

PASSKEY=0DF3FDE6228BEFE8385CC95BEF90A756&stationtype=GW2000A_V3.2.2&runtime=19484&heap=127964&dateutc=2025-03-27%2016%3A46%3A27&tempinf=70.70&humidityin=35&baromrelin=29.642&baromabsin=29.642&tempf=62.24&humidity=46&vpd=0.305&winddir=306&windspeedmph=0.00&windgustmph=2.24&maxdailygust=11.63&solarradiation=77.11&uv=0&rrain_piezo=0.000&erain_piezo=0.000&hrain_piezo=0.000&drain_piezo=0.000&wrain_piezo=0.000&mrain_piezo=1.512&yrain_piezo=333.933&srain_piezo=0&ws90cap_volt=5.5&ws90_ver=147&wh90batt=3.28&freq=868M&model=GW2000A&interval=60

Assez surprenant comme payload. Pas très exploitable facilement.
Aucune configuration possible sur la mise en forme du payloard? Json par exemple?

Si in choisit un des deux autres protocoles, au lieu de mqtt, cela donne quoi?

Les autres protocoles c’est pour envoyer sur des plateformes de météo sur internet.

Ok.

Si aucune solution voir alors:

Bonjour,

C’est vrai que n’étant pas un json cela ne devrait pas fonctionner avec plugin-jmqtt.

C’est toujours les mêmes paramètres ? Dans le même ordre ?
Si oui cela devrait être facile avec un bloc code (avec la fonction explode).

Je pense que la chaine peut évolué, car on peut ajouter des capteurs à la centrale météo.

C’est un peu dommage qu’Ecowitt n’ai pas spécifier plusieurs topics. Je leur ai fait part de ce problème. On verra bien le retour.

Bonjour,

J’ai fait un truc rapide, un peu sale. Il reste des lignes de debug.
C’est un template Jeedom de scénario. Il faut enlever l’extension .txt.
Ecowitt_MQTT.json.txt (6,9 Ko)

Ce scénario te sort valeur1 parametre1 valeur2 parametre2 etc … sous forme de tag.
A toi ensuite d’utiliser ces tags dans un virtuel (il faut utiliser la commande « event » dans le scénario).
Les 2 derniers blocs Action sont uniquement là pour illustrer tu peux les virer.

Il faut bien entendu remplacer le 1er tag du scénario par ta commande mqtt qui correspond à ta sortie mqtt de ta station.

//Initialisation de différentes variables
//---------------------------------------------------------

$tags = $scenario->getTags();

//Copie dans une variable spécifique pour éviter une confusion dans les tags quand exécution simultanée du scénario
$array = $tags;

$payload = strtolower($array['#payload#']);

//--------------------------------------------------------------------
  
$array = explode("&",$payload);
$print_array_init = print_r($array,true);
$scenario->setLog('array initial :' ."\n" .$print_array_init ."\n");

foreach($array as $key => $value) {
  	$array_temp = explode("=", $value);
	//$print_array_init = print_r($array_temp,true);
	//$scenario->setLog('array initial :' ."\n" .$print_array_init ."\n");
  	$nom_param = 'parametre' .$key;
  	//$scenario->setLog('nom :' .$nom_param ."\n");
    $valeur_param = 'valeur' .$key;
  	//$scenario->setLog('nom :' .$valeur_param ."\n");
  	//$$nom = $array_temp[0];
  	$tags['#' .$nom_param .'#'] = $array_temp[0];
  	$tags['#' .$valeur_param .'#'] = $array_temp[1];
      
}



$scenario->setTags($tags);

ou un peu plus simple (pas sur !), sans passer par des tags

// Récupérer la valeur brute
$valeur = cmd::byString("#[Aucun][test][test]#")->execCmd();

// Parsing de la chaine en tableau
parse_str($valeur, $data);

// recup de la temperature (tempf)
if (isset($data['tempf'])) {
    cmd::byString("#[Aucun][test][temp]#")->event($data['tempf']);
}

// recup de l'humidité (humidity)
if (isset($data['humidity'])) {
    cmd::byString("#[Aucun][test][hum]#")->event($data['humidity']);
}

Avec comme declencheur ta commande info MQTT

Norbert

2 « J'aime »

Bonjour,

C’est plus simple mais tu dois rentrer les paramètres en dur dans le code.
Cependant de mon côté ça doit être fait tout de même dans le virtuel donc ça revient au même.

Globalement ta proposition est plus lisible et plus compacte.
Je crois même que tu peux te passer du str_replace.

1 « J'aime »

Et avec des regex, on peut retrouver les champs.

Après c’est vraiment dommage ce formatage de chaine dans les message MQTT de la station météo. A voir le retour du support.

Plutôt que dommage, je pense que tu voulais dire que c’est nul ! Ça doit faire 20 ans qu’on ne formate plus des sorties comme ça !!

Après Ecowitt c’est chinois :sweat_smile:

Mais franchement ca reste une bonne station météo je trouve !

Hello,

En effet, ce n’est pas possible directement.

Oui je pense aussi, c’est une chaîne faite pour être interprétée par PHP: parse_str - Manual

Bad

1 « J'aime »

Bonjour,

Oui ce sont des stations réputées.
Un peu de lecture si ça t’intéresse :
https://meshka.eu/Ecowitt/dokuwiki/doku.php?id=start

1 « J'aime »

Bonjour,

et en utilisant Jmqtt en ajoutant une commande json, par exemple [tempinf] ?

Bonjour,

Ce n’est pas un json.

J’ai eu un retour du support d’écowitt :

Hi Arnaud,

That’s great!

The maximum supported password length is 64 bytes.

Regarding your second question, our engineers have stated that there are currently no plans for modifications.

Thank you for your understanding!

Best regards

Ecowitt Support Team

Il faudra donc faire autrement

Bonjour,

Tu as eu 2 solutions proposées :

1 « J'aime »