فهرست منبع

fix: require configured mqtt iata before broker connect

Jared Dohrman 3 ماه پیش
والد
کامیت
bf57f342b3

+ 7 - 0
docs/custom-cli.md

@@ -14,6 +14,7 @@ These commands are available on `*_repeater_mqtt` firmware targets.
 - `get mqtt.statuscfg`: shows whether periodic status messages are enabled as a simple `on` or `off` value. Most users can just use `get mqtt.status`.
 - `get mqtt.iata`: shows the IATA/location code used in MQTT topics.
 - `set mqtt.iata <code>`: sets the IATA/location code, for example `MEL`.
+- `set mqtt.iata UNSET`: marks MQTT IATA as not configured yet. While it is `UNSET`, enabled MQTT brokers stay disconnected until a real code is saved.
 
 ### MQTT Identity
 
@@ -43,6 +44,12 @@ These commands are available on `*_repeater_mqtt` firmware targets.
 - `get mqtt.letsmesh-us`
 - `set mqtt.letsmesh-us on|off`
 
+Notes:
+
+- new repeater MQTT installs default `mqtt.iata` to `UNSET`
+- `letsmesh-eu` and `letsmesh-us` remain off by default unless already configured in saved prefs
+- if `mqtt.iata` is `UNSET`, `eastmesh-au`, `letsmesh-eu`, and `letsmesh-us` will not connect even if they are toggled on
+
 Legacy dotted aliases are also accepted:
 
 - `mqtt.eastmesh.au`

+ 3 - 1
docs/web-panel.md

@@ -174,10 +174,12 @@ This section includes:
 - `mqtt.email`: owner contact email.
 - MQTT server toggles: `eastmesh-au`, `letsmesh-eu`, and `letsmesh-us`.
 
-`MEL` is used as the default dropdown option until the repeater's saved value is loaded.
+`UNSET - To be configured` is the default for new repeater MQTT installs until a real saved value exists.
 
 Notes:
 
+- when `mqtt.iata` is `UNSET`, the panel shows a banner at the top reminding you to set it under MQTT Settings
+- while `mqtt.iata` is `UNSET`, enabled MQTT brokers do not attempt to connect
 - the current MQTT server states are loaded when the page opens
 - you can toggle each MQTT server on or off from this panel
 - if all three servers are enabled at once, the panel shows a warning recommending two at most

+ 21 - 0
release-notes.yml

@@ -344,3 +344,24 @@ releases:
         area: web-panel
         text: "Updated the repeater web panel and custom CLI docs to reflect full web CLI access and the new HTTP-to-HTTPS behavior."
     breaking_changes: []
+
+  - track: repeater-mqtt
+    version: "1.3.7"
+    tag: "repeater-mqtt-eastmesh-v1.3.7"
+    date: "2026-04-20"
+    previous_version: "1.3.6"
+    summary: "Made MQTT IATA explicit on fresh repeater installs, blocked broker connects until it is configured, and surfaced the missing-IATA state in the web panel and CLI status."
+    changes:
+      - type: changed
+        area: mqtt
+        text: "Changed fresh repeater_mqtt defaults to use `mqtt.iata=UNSET` instead of pre-filling Melbourne."
+      - type: fixed
+        area: mqtt
+        text: "Blocked EastMesh and LetsMesh broker connection attempts while `mqtt.iata` is unset, and reported `invalid iata` in `get mqtt.status` for enabled brokers until a real code is saved."
+      - type: changed
+        area: web-panel
+        text: "Added a top-of-page warning banner and inline MQTT Settings warning when the repeater still needs its MQTT IATA configured."
+      - type: docs
+        area: mqtt
+        text: "Updated the custom CLI and web panel docs to describe the unset-first MQTT IATA flow and the resulting broker behaviour."
+    breaking_changes: []

+ 3 - 0
src/helpers/mqtt/MQTTPrefs.cpp

@@ -63,6 +63,9 @@ bool MQTTPrefsStore::load(FILESYSTEM* fs, MQTTPrefs& prefs) {
   if (prefs.legacy_wifi_powersave > 2) {
     prefs.legacy_wifi_powersave = 0;
   }
+  if (prefs.iata[0] == 0) {
+    StrHelper::strncpy(prefs.iata, MQTT_DEFAULT_IATA, sizeof(prefs.iata));
+  }
   prefs.status_interval_ms = kFixedStatusIntervalMs;
   prefs.enabled_mask &= 0x07;
   return true;

+ 5 - 1
src/helpers/mqtt/MQTTPrefs.h

@@ -6,7 +6,11 @@
 #include <stdint.h>
 
 #ifndef MQTT_DEFAULT_IATA
-  #define MQTT_DEFAULT_IATA "MEL"
+  #define MQTT_DEFAULT_IATA "UNSET"
+#endif
+
+#ifndef MQTT_UNSET_IATA
+  #define MQTT_UNSET_IATA "UNSET"
 #endif
 
 struct MQTTPrefs {

+ 14 - 1
src/helpers/mqtt/MQTTUplink.cpp

@@ -124,6 +124,10 @@ bool MQTTUplink::hasEnabledBroker() const {
   return (_prefs.enabled_mask & 0x07) != 0;
 }
 
+bool MQTTUplink::isUnsetIataValue(const char* iata) {
+  return iata == nullptr || iata[0] == 0 || strcmp(iata, MQTT_UNSET_IATA) == 0;
+}
+
 uint8_t MQTTUplink::normalizeEnabledMask(uint8_t mask) {
   uint8_t normalized = 0;
   uint8_t count = 0;
@@ -599,7 +603,8 @@ void MQTTUplink::ensureBroker(BrokerState& broker, bool allow_new_connect) {
     return;
   }
   bool enabled = (_prefs.enabled_mask & broker.spec->bit) != 0;
-  if (!enabled) {
+  bool iata_configured = !isUnsetIataValue(_prefs.iata);
+  if (!enabled || !iata_configured) {
     if (broker.client != nullptr || broker.token != nullptr || broker.connected || broker.connect_announced ||
         broker.reconnect_pending || broker.next_connect_attempt != 0 || broker.last_connect_attempt != 0 ||
         broker.reconnect_failures != 0 || broker.token_expires_at != 0) {
@@ -828,6 +833,9 @@ void MQTTUplink::formatStatusReply(char* reply, size_t reply_size) const {
     if ((_prefs.enabled_mask & bit) == 0) {
       return "off";
     }
+    if (isUnsetIataValue(_prefs.iata)) {
+      return "invalid iata";
+    }
     const BrokerState* broker = nullptr;
     for (const BrokerState& candidate : _brokers) {
       if (candidate.spec != nullptr && candidate.spec->bit == bit) {
@@ -911,6 +919,11 @@ bool MQTTUplink::setIata(const char* iata) {
   for (size_t i = 0; cleaned[i] != 0; ++i) {
     cleaned[i] = toupper(static_cast<unsigned char>(cleaned[i]));
   }
+  if (strcmp(cleaned, MQTT_UNSET_IATA) == 0) {
+    StrHelper::strncpy(_prefs.iata, MQTT_UNSET_IATA, sizeof(_prefs.iata));
+    refreshIdentityStrings();
+    return savePrefs();
+  }
   StrHelper::strncpy(_prefs.iata, cleaned, sizeof(_prefs.iata));
   refreshIdentityStrings();
   return savePrefs();

+ 1 - 0
src/helpers/mqtt/MQTTUplink.h

@@ -111,6 +111,7 @@ private:
   static constexpr uint8_t kLetsmeshUsBit = 0x04;
   static constexpr uint8_t kMaxEnabledBrokers = 2;
   static const BrokerSpec kBrokerSpecs[3];
+  static bool isUnsetIataValue(const char* iata);
 
   BrokerState _brokers[3];
 

+ 36 - 1
src/helpers/web/WebPanelServer.cpp

@@ -431,6 +431,8 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
     .mode-label.disabled { opacity:.4; }
     .visually-hidden { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }
     .panel-copy, .panel-note, .panel-status, .panel-warning, .stats-empty, .stats-error, .events-empty, .spark-status { font-size:13px; line-height:1.45; font-weight:400; }
+    .top-banner { display:none; margin-bottom:18px; padding:12px 14px; border-radius:12px; border:1px solid rgba(212,90,90,.45); background:rgba(212,90,90,.12); color:var(--text); }
+    .top-banner.visible { display:block; }
     .panel-warning { min-height:1.4em; color:var(--status-red); }
     .panel-note { color:var(--text-muted); }
     .panel-status { min-height:1.4em; color:var(--text-muted); }
@@ -528,6 +530,7 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
 </head>
 <body>
   <main>
+    <section class="top-banner" id="mqttIataBanner">MQTT IATA needs setting under MQTT Settings.</section>
     <section class="card" id="login" style="display:none">
       <h1>Repeater Config</h1>
       <p>Use the repeater admin password to unlock the command console.</p>
@@ -813,6 +816,9 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
           <label class="label" for="mqttIata">MQTT IATA</label>
           <div class="inline-actions">
             <select id="mqttIata">
+              <optgroup label="Configuration">
+                <option value="UNSET">UNSET - To be configured</option>
+              </optgroup>
               <optgroup label="ACT">
                 <option value="CBR">CBR - Canberra</option>
               </optgroup>
@@ -872,7 +878,7 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
                 <option value="AVV">AVV - Avalon</option>
                 <option value="GEX">GEX - Geelong West</option>
                 <option value="MEB">MEB - Essendon Fields</option>
-                <option value="MEL" selected>MEL - Melbourne</option>
+                <option value="MEL">MEL - Melbourne</option>
                 <option value="MQL">MQL - Mildura</option>
               </optgroup>
             </select>
@@ -1940,6 +1946,7 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
       ).join("");
     }
     function showAuthedUi(show) {
+      const mqttIataBanner = document.getElementById("mqttIataBanner");
       document.getElementById("login").style.display = show ? "none" : "block";
       document.getElementById("actionsPanel").style.display = show ? "block" : "none";
       document.getElementById("cliPanel").style.display = show && !isStatsPage ? "block" : "none";
@@ -1950,6 +1957,7 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
       document.getElementById("statsPagePanel").style.display = show && isStatsPage ? "block" : "none";
       document.getElementById("repeaterSettingsPanel").style.display = show && !isStatsPage ? "block" : "none";
       if (!show) {
+        if (mqttIataBanner) mqttIataBanner.classList.remove("visible");
         commandQueue = Promise.resolve();
         const passwordEl = document.getElementById("password");
         if (passwordEl) passwordEl.value = "";
@@ -1961,6 +1969,23 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
         if (trendsEl) trendsEl.innerHTML = "";
       }
     }
+    function isUnsetMqttIata(value) {
+      return String(value || "").trim().toUpperCase() === "UNSET";
+    }
+    function refreshMqttIataWarning() {
+      const input = document.getElementById("mqttIata");
+      const banner = document.getElementById("mqttIataBanner");
+      const inlineWarning = document.getElementById("mqttBrokerWarning");
+      const showWarning = !!(input && isUnsetMqttIata(input.value));
+      if (banner) {
+        banner.classList.toggle("visible", showWarning && !isStatsPage);
+      }
+      if (inlineWarning) {
+        inlineWarning.textContent = showWarning
+          ? "MQTT IATA is unset. Set it before enabling EastMesh or LetsMesh brokers."
+          : "";
+      }
+    }
     function queueCommand(task) {
       const next = commandQueue.then(task, task);
       commandQueue = next.catch(() => {});
@@ -1998,6 +2023,9 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
       if (value !== input.value) input.value = value;
       const result = await runCommand(prefix + value);
       if (!result.ok) return;
+      if (inputId === "mqttIata") {
+        refreshMqttIataWarning();
+      }
       if (inputId === "nodeName") {
         await loadField("get name", "nodeName", null, { recordHistory:false, updateInput:false });
       }
@@ -2012,6 +2040,9 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
         value = value.toUpperCase();
       }
       document.getElementById(inputId).value = value;
+      if (inputId === "mqttIata") {
+        refreshMqttIataWarning();
+      }
       if (inputId === "nodeName") {
         updatePanelTitle(value);
       }
@@ -2251,6 +2282,10 @@ const char kWebPanelAppHtml[] PROGMEM = R"HTML(
 	    document.querySelectorAll("[data-cmd]").forEach((btn) => btn.onclick = () => runCommand(btn.dataset.cmd));
 	    document.querySelectorAll("[data-prefix]").forEach((btn) => btn.onclick = () => runPrefixed(btn.dataset.prefix, btn.dataset.input));
 	    document.querySelectorAll("[data-load-cmd]").forEach((btn) => btn.onclick = () => loadField(btn.dataset.loadCmd, btn.dataset.loadInput, btn.dataset.loadFormat));
+	    const mqttIataSelect = document.getElementById("mqttIata");
+	    if (mqttIataSelect) {
+	      mqttIataSelect.addEventListener("change", refreshMqttIataWarning);
+	    }
 	    async function setEastmeshMode(enabled) {
 	      if (enabled && getLetsmeshMode() === "both") {
 	        await setLetsmeshMode("eu");

+ 35 - 35
variants/eastmesh_mqtt/platformio.ini

@@ -13,7 +13,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Ebyte_EoRa-S3.build_src_filter}
   +<helpers/ui/SSD1306Display.cpp>
@@ -45,7 +45,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Generic_E22.lib_deps}
@@ -72,7 +72,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Generic_E22.lib_deps}
@@ -92,7 +92,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_E213_base.build_src_filter}
   +<helpers/ui/E213Display.cpp>
@@ -118,7 +118,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_E290_base.build_src_filter}
   +<helpers/ui/E290Display.cpp>
@@ -143,7 +143,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_T190_base.build_src_filter}
   +<../examples/simple_repeater>
@@ -167,7 +167,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_tracker_v2.build_src_filter}
   +<helpers/ui/ST7735Display.cpp>
@@ -193,7 +193,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_lora32_v2.build_src_filter}
   +<../examples/simple_repeater>
@@ -219,7 +219,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_lora32_v3.build_src_filter}
   +<helpers/ui/SSD1306Display.cpp>
@@ -245,7 +245,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
   -D ARDUINO_USB_CDC_ON_BOOT=1
 build_src_filter = ${heltec_v4_oled.build_src_filter}
@@ -272,7 +272,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${heltec_v4_tft.build_src_filter}
   +<helpers/ui/ST7789LCDDisplay.cpp>
@@ -298,7 +298,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_Wireless_Paper_base.build_src_filter}
   +<helpers/ui/E213Display.cpp>
@@ -325,7 +325,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_tracker_base.build_src_filter}
   +<helpers/ui/ST7735Display.cpp>
@@ -349,7 +349,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Heltec_lora32_v3.build_src_filter}
   +<../examples/simple_repeater>
@@ -375,7 +375,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
   +<helpers/ui/SSD1306Display.cpp>
@@ -401,7 +401,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_T3S3_sx1276.build_src_filter}
   +<helpers/ui/SSD1306Display.cpp>
@@ -427,7 +427,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_TBeam_1W.build_src_filter}
   +<../examples/simple_repeater>
@@ -450,7 +450,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_TDeck.build_src_filter}
   +<../examples/simple_repeater>
@@ -478,7 +478,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${tlora_c6.lib_deps}
@@ -500,7 +500,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${M5Stack_Unit_C6L.lib_deps}
@@ -526,7 +526,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Meshadventurer.lib_deps}
@@ -553,7 +553,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Meshadventurer.lib_deps}
@@ -576,7 +576,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Meshimi.lib_deps}
@@ -596,7 +596,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${nibble_screen_connect_base.build_src_filter}
   +<helpers/ui/SSD1306Display.cpp>
@@ -620,7 +620,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${rak3112.build_src_filter}
   +<../examples/simple_repeater>
@@ -644,7 +644,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Station_G2.build_src_filter}
   +<../examples/simple_repeater>
@@ -669,7 +669,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${Station_G2.build_src_filter}
   +<../examples/simple_repeater>
@@ -692,7 +692,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${T_Beam_S3_Supreme_SX1262.build_src_filter}
   +<../examples/simple_repeater>
@@ -715,7 +715,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_TBeam_SX1262.build_src_filter}
   +<../examples/simple_repeater>
@@ -739,7 +739,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 build_src_filter = ${LilyGo_TBeam_SX1276.build_src_filter}
   +<../examples/simple_repeater>
@@ -767,7 +767,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${ThinkNode_M2.lib_deps}
@@ -791,7 +791,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${ThinkNode_M5.lib_deps}
@@ -814,7 +814,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${WHY2025_badge.lib_deps}
@@ -836,7 +836,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Xiao_C6.lib_deps}
@@ -858,7 +858,7 @@ build_flags =
   -D MQTT_DEBUG=1
   -D WIFI_SSID='"myssid"'
   -D WIFI_PWD='"mypwd"'
-  -D MQTT_DEFAULT_IATA='"MEL"'
+  -D MQTT_DEFAULT_IATA='"UNSET"'
   -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1
 lib_deps =
   ${Xiao_S3_WIO.lib_deps}