Problème d'envoi des messages MQTT de la station météo Ecowitt GW2000A vers le broker MQTT local

Matériel :
GW 2000 ainsi que toute autre passerelle Ecowitt compatible MQTT
Station : WS69, pour toute autre station ou capteurs ajoutés (connectés à la passerelle), il faudra repérer les informations brutes du topic.
Ici les informations brutes sont :
PASSKEY=xxxxxxxxxxxxxxxxxxxxxx&stationtype=GW2000A_V3.2.9&runtime=44089&heap=71100&dateutc=2026-03-08%2005%3A34%3A21&dns_err_cnt=0&cdnflg=7&tempinf=67.28&humidityin=48&baromrelin=29.317&baromabsin=29.317&tempf=67.28&humidity=49&vpd=0.343&winddir=47&winddir_avg10m=47&windspeedmph=0.00&windgustmph=0.00&maxdailygust=0.00&solarradiation=0.00&uv=0&rainratein=0.000&eventrainin=0.110&hourlyrainin=0.000&last24hrainin=0.110&dailyrainin=0.000&weeklyrainin=0.000&monthlyrainin=0.130&yearlyrainin=0.130&temp2f=44.24&humidity2=80&temp3f=66.38&humidity3=56&temp4f=73.40&humidity4=39&temp5f=67.46&humidity5=44&wh65batt=0&batt2=0&batt3=0&batt4=0&batt5=0&freq=868M&model=GW2000A&interval=60

Les informations à récupérer sont : tempinf, humidityin, baromrelin, etc.
note : les informations concernant la batterie ne sont pas traitées dans ce tuto.

0 - Configurer le GW2000
Aller sur son serveur http.
Il faut une version récente du firmware pour que le MQTT soit possible, GW2000A_V3.2.9 possède le MQTT. Le firmware peut être changé dans l’app ecowitt.
Dans : Weather Services


L’adresse IP et le port sont ceux du broker jMQTT ci-dessous.

1 - Dans jMQTT
La configuration du broker:

L’équipement :

le Topic:

2 - Créer un virtuel :


qui contient :

3 - Créer un scénario déclenché par l’évènement :
#[Extérieur][Ecowitt][Brut]#
Créer un bloc code avec :

// 1. Récupération de la chaîne brute (Adaptez le nom de la commande jMQTT)
$brut = cmd::byString("#[Extérieur][Ecowitt][Brut]#")->execCmd();
parse_str($brut, $data);

// 2. Fonction de mise à jour simplifiée
// Note : Remplacez "#[Extérieur][Station Météo]..." par les vrais noms de vos commandes virtuelles
function updateCmd($cmdName, $value) {
    try {
        $cmd = cmd::byString($cmdName);
        if (is_object($cmd)) {
            $cmd->event($value);
        }
    } catch (Exception $e) {
        // La commande n'existe pas encore, on ignore
    }
}

// --- TEMPÉRATURES (°F -> °C) ---
// Formule : (F - 32) / 1.8
if (isset($data['tempinf'])) updateCmd("#[Extérieur][Station Météo][Temp_Int]#", round(($data['tempinf'] - 32) / 1.8, 1));
if (isset($data['tempf']))    updateCmd("#[Extérieur][Station Météo][Temp_Ext]#", round(($data['tempf'] - 32) / 1.8, 1));
// Capteurs additionnels (temp2f, temp3f, etc.)
for ($i = 2; $i <= 6; $i++) {
    if (isset($data["temp{$i}f"])) updateCmd("#[Extérieur][Station Météo][Temp_Sonde_{$i}]#", round(($data["temp{$i}f"] - 32) / 1.8, 1));
}

// --- HUMIDITÉ (%) ---
if (isset($data['humidityin'])) updateCmd("#[Extérieur][Station Météo][Hum_Int]#", $data['humidityin']);
if (isset($data['humidity']))   updateCmd("#[Extérieur][Station Météo][Hum_Ext]#", $data['humidity']);
for ($i = 2; $i <= 6; $i++) {
    if (isset($data["humidity{$i}"])) updateCmd("#[Extérieur][Station Météo][Hum_Sonde_{$i}]#", $data["humidity{$i}"]);
}

// --- PRESSION (inHg -> hPa) ---
// Formule : inHg * 33.8639
if (isset($data['baromrelin'])) updateCmd("#[Extérieur][Station Météo][Pression_Relative]#", round($data['baromrelin'] * 33.8639, 1));
if (isset($data['baromabsin'])) updateCmd("#[Extérieur][Station Météo][Pression_Absolue]#", round($data['baromabsin'] * 33.8639, 1));

// --- VENT (mph -> km/h) ---
// Formule : mph * 1.60934
if (isset($data['windspeedmph'])) updateCmd("#[Extérieur][Station Météo][Vent_Vitesse]#", round($data['windspeedmph'] * 1.60934, 1));
if (isset($data['windgustmph']))   updateCmd("#[Extérieur][Station Météo][Vent_Rafale]#", round($data['windgustmph'] * 1.60934, 1));
if (isset($data['maxdailygust']))  updateCmd("#[Extérieur][Station Météo][Vent_Rafale_Max_Jour]#", round($data['maxdailygust'] * 1.60934, 1));
if (isset($data['winddir']))       updateCmd("#[Extérieur][Station Météo][Vent_Direction]#", $data['winddir']);

// --- PLUIE (pouces -> mm) ---
// Formule : inch * 25.4
if (isset($data['rainratein']))   updateCmd("#[Extérieur][Station Météo][Pluie_Intensite]#", round($data['rainratein'] * 25.4, 1));
if (isset($data['dailyrainin']))  updateCmd("#[Extérieur][Station Météo][Pluie_Jour]#", round($data['dailyrainin'] * 25.4, 1));
if (isset($data['weeklyrainin'])) updateCmd("#[Extérieur][Station Météo][Pluie_Semaine]#", round($data['weeklyrainin'] * 25.4, 1));
if (isset($data['monthlyrainin'])) updateCmd("#[Extérieur][Station Météo][Pluie_Mois]#", round($data['monthlyrainin'] * 25.4, 1));
if (isset($data['yearlyrainin']))  updateCmd("#[Extérieur][Station Météo][Pluie_Annee]#", round($data['yearlyrainin'] * 25.4, 1));

// --- SOLAIRE & UV ---
if (isset($data['solarradiation'])) updateCmd("#[Extérieur][Station Météo][Solaire_Radiation]#", $data['solarradiation']);
if (isset($data['uv']))             updateCmd("#[Extérieur][Station Météo][UV]#", $data['uv']);

Résultat :
image
Le WS69 sort de sa boite, certaines informations sont à 0.

Merci Gemini

2 « J'aime »