diff --git a/include/bmp.h b/include/bmp.h index 164d187..5ce8f40 100644 --- a/include/bmp.h +++ b/include/bmp.h @@ -5,7 +5,6 @@ namespace Bmp { Adafruit_BMP280 bmp; // I2C Interface struct { - const char* topic = "esp_clock/sensor/bmp280/data"; float temp; float pressure; float altitude; diff --git a/include/mqtt.h b/include/mqtt.h index 4a9342a..6b341f8 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -1,13 +1,16 @@ #include #include +#include #define MQTT_HOST IPAddress(192, 168, 5, 138) #define MQTT_PORT 1883 namespace Mqtt { + void publishConfig(); void publishCommand(); void publishBmp280(); + Task tPublishConfig(TASK_IMMEDIATE, TASK_ONCE, publishConfig, &ts); Task tPublish(TASK_SECOND, TASK_FOREVER, publishCommand, &ts); Task tPublishBmp(5 * TASK_MINUTE, TASK_FOREVER, publishBmp280, &ts); @@ -27,7 +30,39 @@ namespace Mqtt { } } commands; - const char* bmpTopic = "esp_clock/sensor/bmp280/data"; + const char* bmpTopic = "homeassistant/sensor/esp_clock/state"; + + void publishConfig() { + StaticJsonDocument<255> jsonDoc; + JsonObject device = jsonDoc.createNestedObject("device"); + device["name"] = "ESP Clock"; + + JsonObject sensor = jsonDoc.createNestedObject("sensor"); + sensor["device_class"] = "temperature"; + sensor["name"] = "Livingroom Temperature"; + sensor["unique_id"] = "livingroom_temperature"; + sensor["unit_of_measurement"] = "°C"; + sensor["state_topic"] = bmpTopic; + sensor["value_template"] = "{{ value_json.temperature}}"; + sensor["device"] = device; + char message[255]; + serializeJson(jsonDoc, message); + client.publish("homeassistant/sensor/esp_clock_temperature/config", 0, false, message); + + jsonDoc.clear(); + sensor.clear(); + sensor = jsonDoc.createNestedObject("sensor"); + sensor["device_class"] = "pressure"; + sensor["name"] = "Livingroom Pressure"; + sensor["unique_id"] = "livingroom_pressure"; + sensor["unit_of_measurement"] = "hPa"; + sensor["state_topic"] = bmpTopic; + sensor["value_template"] = "{{ value_json.pressure}}"; + sensor["device"] = device; + char message1[255]; + serializeJson(jsonDoc, message); + client.publish("homeassistant/sensor/esp_clock_pressure/config", 0, false, message1); + } void publishCommand() { if (uint8_t cmd = commands.getCurrent()) { @@ -43,13 +78,18 @@ namespace Mqtt { void publishBmp280() { Bmp::data.readAll(); + StaticJsonDocument<255> jsonDoc; + JsonObject sensor = jsonDoc.createNestedObject("sensor"); + sensor["temperature"] = Bmp::data.temp; + sensor["pressure"] = Bmp::data.pressure; char message[255]; - sprintf(message, "{\"temperature\":%.2f, \"pressure\":%.2f, \"altitude\": %.2f}", Bmp::data.temp, Bmp::data.pressure, Bmp::data.altitude); - client.publish(bmpTopic, 0, true, message); + serializeJson(jsonDoc, message); + client.publish(bmpTopic, 0, false, message); } void setup() { client.onConnect([](bool sessionPresent) { + tPublishConfig.enable(); tPublish.enableDelayed(); tPublishBmp.enable(); Serial.println("Connected to MQTT"); diff --git a/platformio.ini b/platformio.ini index ee570c6..3d8262c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -23,6 +23,7 @@ lib_deps = arkhipenko/TaskScheduler@^3.4.0 adafruit/Adafruit Unified Sensor @ ^1.1.4 adafruit/Adafruit BMP280 Library@^2.5.0 + bblanchon/ArduinoJson@6.16.1 build_flags = -D IR=0 -D WIFI_ALWAYS_ON=1 [env:laptop_home]