     "Last IR Received: " + lastIrReceived +
     " <i>(" + timeSince(lastIrReceivedTime) + ")</i><br>"
 #endif  // IR_RX
+    "Duplicate Wifi networks: " +
+        String(HIDE_DUPLIATE_NETWORKS ? "Hide" : "Show") + "<br>"
+    "Min Wifi signal required: "
+#ifdef MIN_SIGNAL_STRENGTH
+        + String(static_cast<int>(MIN_SIGNAL_STRENGTH)) +
+#else  // MIN_SIGNAL_STRENGTH
+        "8"
+#endif  // MIN_SIGNAL_STRENGTH
+        "%<br>"
+    "Serial debugging: "
+#if DEBUG
+        + String(isSerialGpioUsedByIr() ? "Off" : "On") +
+#else  // DEBUG
+        "Off"
+#endif  // DEBUG
+        "<br>"
     "</p>"
 #if MQTT_ENABLE
     "<h4>MQTT Information</h4>"

  // 14,  // GPIO 14 / D5 e.g. ir_server/send_2
  // 16,  // GPIO 16 / D0 e.g. ir_server/send_3
};

#define QOS 1  // MQTT broker should queue up any unreceived messages for us
// #define QOS 0  // MQTT broker WON'T queue up messages for us. Fire & Forget.

#define KEY_PROTOCOL "protocol"
#define KEY_MODEL "model"

const uint32_t kStatListenPeriodMs = 5 * 1000;  // mSeconds
#endif  // MQTT_ENABLE

#if DEBUG
bool isSerialGpioUsedByIr(void) {
  const uint8_t kSerialTxGpio = 1;  // The GPIO serial output is sent too.
                                    // Note: *DOES NOT* control Serial output.
  // Ensure we are not trodding on anything IR related.
#ifdef IR_RX
  if (IR_RX == kSerialTxGpio)
    return true;  // Serial port is in use by IR capture. Abort.
#endif  // IR_RX
  for (uint8_t i = 0; i < kSendTableSize; i++)
    if (gpioTable[i] == kSerialTxGpio)
      return true;  // Serial port is in use for IR sending. Abort.
  return false;  // Not in use as far as we can tell.
}
#endif  // DEBUG

// Debug messages get sent to the serial port.
void debug(String str) {
#if DEBUG
  if (isSerialGpioUsedByIr()) return;  // Abort.
  uint32_t now = millis();
  Serial.printf("%07u.%03u: %s\n", now / 1000, now % 1000, str.c_str());
#endif  // DEBUG
