diff --git a/mqtt_discovery.cpp b/mqtt_discovery.cpp index b775504..e962913 100644 --- a/mqtt_discovery.cpp +++ b/mqtt_discovery.cpp @@ -4,32 +4,47 @@ #include "constants.h" +struct sensor_config { + const char* name; + const char* unique_id; + const char* value_template; + const char* identifier; + const char* device_class; + const char* unit; + const char* state_class; + const char* entity_category; +}; + static bool publish_config(PubSubClient* mqtt, const char* topic, - const char* name, const char* unique_id, - const char* value_template, const char* identifier, - const char* device_class, const char* unit) { - StaticJsonDocument<256> doc; - doc["unique_id"] = unique_id; - doc["name"] = name; + const struct sensor_config* config) { + StaticJsonDocument<512> doc; + doc["unique_id"] = config->unique_id; + doc["name"] = config->name; doc["state_topic"] = TOPIC_STATE; - doc["value_template"] = value_template; - if (device_class != NULL) { - doc["device_class"] = device_class; + doc["value_template"] = config->value_template; + if (config->device_class != NULL) { + doc["device_class"] = config->device_class; } - if (unit != NULL) { - doc["unit_of_measurement"] = unit; + if (config->unit != NULL) { + doc["unit_of_measurement"] = config->unit; + } + if (config->state_class != NULL) { + doc["state_class"] = config->state_class; + } + if (config->entity_category != NULL) { + doc["entity_category"] = config->entity_category; } auto device = doc.createNestedObject("device"); device["manufacturer"] = DEVICE_MANUFACTURER; device["name"] = DEVICE_NAME; device["model"] = DEVICE_MODEL; auto ident = device.createNestedArray("identifiers"); - ident.add(identifier); + ident.add(config->identifier); String msg; serializeJson(doc, msg); auto payload = msg.c_str(); Serial.printf("Publishing configuration for %s (%zd bytes) to %s ... ", - unique_id, strlen(payload), topic); + config->unique_id, strlen(payload), topic); auto r = mqtt->publish(topic, payload, true); Serial.println(r ? "OK" : "FAILED"); return r; @@ -37,18 +52,49 @@ static bool publish_config(PubSubClient* mqtt, const char* topic, bool publish_all_config(PubSubClient* mqtt, const char* ident) { bool ret = true; - publish_config(mqtt, TOPIC_CFG_MOISTURE, "Garden Sensor Moisture", - "sensor.garden_sensor_moisture", - "{{ value_json.moisture }}", ident, NULL, NULL); - publish_config(mqtt, TOPIC_CFG_TEMPERATURE, "Garden Sensor Temperature", - "sensor.garden_sensor_temperature", - "{{ value_json.temperature }}", ident, "temperature", "°C"); - publish_config(mqtt, TOPIC_CFG_BATTERY, "Garden Sensor Battery Level", - "sensor.garden_sensor_battery_level", - "{{ value_json.battery_level }}", ident, "voltage", "V"); - publish_config(mqtt, TOPIC_CFG_RSSI, "Garden Sensor Signal Strength", - "sensor.garden_sensor_rssi", "{{ value_json.rssi }}", ident, - "signal_strength", "dBm"); + struct sensor_config moisture = { + .name = "Garden Sensor Moisture", + .unique_id = "sensor.garden_sensor_moisture", + .value_template = "{{ value_json.moisture }}", + .identifier = ident, + .device_class = NULL, + .unit = NULL, + .state_class = "measurement", + .entity_category = NULL}; + publish_config(mqtt, TOPIC_CFG_MOISTURE, &moisture); + struct sensor_config temperature = { + .name = "Garden Sensor Temperature", + .unique_id = "sensor.garden_sensor_temperature", + .value_template = "{{ value_json.temperature }}", + .identifier = ident, + .device_class = "temperature", + .unit = "°C", + .state_class = NULL, + .entity_category = NULL, + }; + publish_config(mqtt, TOPIC_CFG_TEMPERATURE, &temperature); + struct sensor_config battery = { + .name = "Garden Sensor Battery Level", + .unique_id = "sensor.garden_sensor_battery_level", + .value_template = "{{ value_json.battery_level }}", + .identifier = ident, + .device_class = "voltage", + .unit = "V", + .state_class = NULL, + .entity_category = "diagnostic", + }; + publish_config(mqtt, TOPIC_CFG_BATTERY, &battery); + struct sensor_config signal = { + .name = "Garden Sensor Signal Strength", + .unique_id = "sensor.garden_sensor_rssi", + .value_template = "{{ value_json.rssi }}", + .identifier = ident, + .device_class = "signal_strength", + .unit = "dBm", + .state_class = NULL, + .entity_category = "diagnostic", + }; + publish_config(mqtt, TOPIC_CFG_RSSI, &signal); return ret; } \ No newline at end of file