Issue with nested MQTT Payload

I am using the following payload, taking advice from: Resinchem Tech: MQTT 102: Add Home Assistant Discovery to your DIY Devices

Sample Arduino code for publishing devices using Home Assistant MQTT Discovery. See the following for use case: https://youtu.be/VHiCtZqllU8 or https://resinchemtech.blogspot.com/2023/12/mqtt-auto-discovery.html (github.com)

I can only seem to get the following:

My logs show the following error for sensors 2-4:

2024-02-29 15:21:13.183 ERROR (MainThread) [homeassistant.components.sensor] Platform mqtt does not generate unique IDs. ID TDSMonitortapTDS is already used by sensor.mqtt_tdsmonitor_taptds - ignoring sensor.mqtt_tdsmonitor_taptds_2
2024-02-29 15:21:13.184 ERROR (MainThread) [homeassistant.components.sensor] Platform mqtt does not generate unique IDs. ID TDSMonitortapTDS is already used by sensor.mqtt_tdsmonitor_taptds - ignoring sensor.mqtt_tdsmonitor_taptds_2
2024-02-29 15:21:13.184 ERROR (MainThread) [homeassistant.components.sensor] Platform mqtt does not generate unique IDs. ID TDSMonitortapTDS is already used by sensor.mqtt_tdsmonitor_taptds - ignoring sensor.mqtt_tdsmonitor_taptds_2

I can only assume there is something missing from after this section as it appears to not move onto the next device name for the subsequent sensors

    devicetapTDS["cu"] = "http://10.0.0.14/config";  //web interface for device, with discovery toggle
    serializeJson(doc, buffer1);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);
void haDiscovery () {
  char topic[128];
  if (auto_discovery) {
    char buffer1[512];
    char buffer2[512];
    char buffer3[512];
    char buffer4[512];
    char uid[128];
    DynamicJsonDocument doc(512);
    doc.clear();
    Serial.println("Discovering new devices...");

    //tapTDS Sensor
    Serial.println("Adding TDS Sensor...Tap TDS");
    //Create unique Topic based on devUniqueID
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "tapTDS/config");
    //Create unique_id based on decUniqueID
    strcpy(uid, "TDSMonitor");
    strcat(uid, "tapTDS");
    //Create JSON payload per HA documentation
    doc["name"] = "Tap TDS";
    doc["obj_id"] = "mqtt_TDSmonitor_tapTDS";
    doc["dev_cla"] = "volatile_organic_compounds_parts";
    doc["uniq_id"] = uid;
    doc["stat_t"] = "stat/TDSMonitor/tapTDS";
    doc["unit_of_meas"] = "ppm";
    doc["ic"] = "mdi:water-pump";
    JsonObject devicetapTDS = doc.createNestedObject("device");
    devicetapTDS["ids"] = "tdsmonitor";
    devicetapTDS["name"] = "TDS Monitor";
    devicetapTDS["mf"] = "DeezNutzInc";
    devicetapTDS["mdl"] = "TDS Monitor Elite";
    devicetapTDS["sw"] = "1.89";
    devicetapTDS["hw"] = "1.0";
    devicetapTDS["cu"] = "http://10.0.0.14/config";  //web interface for device, with discovery toggle
    serializeJson(doc, buffer1);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);


    //prediTDS Sensor
    Serial.println("Adding TDS Sensor...Pre-DI TDS");
    //Create unique Topic based on devUniqueID
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "prediTDS/config");
    //Create unique_id based on decUniqueID
    strcpy(uid, "TDSMonitor");
    strcat(uid, "prediTDS");
    //Create JSON payload per HA documentation
    doc.clear();
    doc["name"] = "Pre-DI TDS";
    doc["obj_id"] = "mqtt_TDSmonitor_prediTDS";
    doc["dev_cla"] = "volatile_organic_compounds_parts";
    doc["uniq_id"] = uid;
    doc["stat_t"] = "stat/TDSMonitor/prediTDS";
    doc["unit_of_meas"] = "ppm";
    doc["ic"] = "mdi:toilet";
    JsonObject deviceprediTDS = doc.createNestedObject("device");
    deviceprediTDS["ids"] = "tdsmonitor";
    deviceprediTDS["name"] = "TDS Monitor";
    serializeJson(doc, buffer2);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);

    //outTDS Sensor
    Serial.println("Adding TDS Sensor...Output TDS");
    //Create unique Topic based on devUniqueID
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "outTDS/config");
    //Create unique_id based on decUniqueID
    strcpy(uid, "TDSMonitor");
    strcat(uid, "outTDS");
    //Create JSON payload per HA documentation
    doc.clear();
    doc["name"] = "Output TDS";
    doc["obj_id"] = "mqtt_TDSmonitor_outTDS";
    doc["dev_cla"] = "volatile_organic_compounds_parts";
    doc["uniq_id"] = uid;
    doc["stat_t"] = "stat/TDSMonitor/outTDS";
    doc["unit_of_meas"] = "ppm";
    doc["ic"] = "mdi:water-check";
    JsonObject deviceoutTDS = doc.createNestedObject("device");
    deviceoutTDS["ids"] = "tdsmonitor";
    deviceoutTDS["name"] = "TDS Monitor";
    serializeJson(doc, buffer3);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);

    //IP Address Diagnostic
    Serial.println("Adding IP Diagnostic Sensor...");
    //Create unique Topic based on devUniqueID
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "IP/config");
    //Create unique_id based on decUniqueID
    strcpy(uid, "TDSMonitor");
    strcat(uid, "IP");
    //Create JSON payload per HA documentation
    doc.clear();
    doc["name"] = "IP Address";
    doc["uniq_id"] = uid;
    doc["ent_cat"] = "diagnostic";
    doc["stat_t"] = "stat/TDSMonitor/ipaddress";
    JsonObject deviceIP = doc.createNestedObject("device");
    deviceIP = doc.createNestedObject("device");
    deviceIP["ids"] = "tdsmonitor";
    deviceIP["name"] = "TDS Monitor";
    serializeJson(doc, buffer4);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);

    Serial.println("All Devices Added!");

  } else {

    //Remove all entities by publishing empty payloads
    //Must use original topic, so recreate from original Unique ID
    //This will immediately remove/delete the device/entities from HA
    Serial.println("Removing discovered devices...");

    //tapTDS Sensor
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "tapTDS/config");
    client.publish(topic, "");

    //prediTDS Sensor
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "prediTDS/config");
    client.publish(topic, "");

    //outTDS Sensor
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "outTDS/config");
    client.publish(topic, "");

    //IP Diragnostics Sensor
    strcpy(topic, "homeassistant/sensor/");
    strcat(topic, "TDSMonitor");
    strcat(topic, "IP/config");
    client.publish(topic, "");

    Serial.println("All Devices Removed...");
    }
}

ah realised there was a mistake in the uploaders code:

His code
Your code has:

    serializeJson(doc, buffer1);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);
    serializeJson(doc, buffer2);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);
    serializeJson(doc, buffer3);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);
    serializeJson(doc, buffer4);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);

I assumed this means the buffer1 was important given it needed to be used as it was nested, appears this is just a typo from a copy paste potentially and should be

    serializeJson(doc, buffer1);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer1, true);
    serializeJson(doc, buffer2);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer2, true);
    serializeJson(doc, buffer3);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer3, true);
    serializeJson(doc, buffer4);
    //Publish discovery topic and payload (with retained flag)
    client.publish(topic, buffer4, true);