I am using the following payload, taking advice from: Resinchem Tech: MQTT 102: Add Home Assistant Discovery to your DIY Devices
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...");
}
}