#include #define JSON_SIZE 512 namespace Ha { void buildDeviceConfig(JsonDocument& jsonDoc) { JsonObject device = jsonDoc.createNestedObject("device"); device["name"] = "ESP Clock"; device["suggested_area"] = "Living room"; JsonArray connections = device.createNestedArray("connections"); JsonArray mac = connections.createNestedArray(); mac.add("mac"); mac.add(WiFi.macAddress()); } void buildCommandConfig(char(&output)[JSON_SIZE], const char* name, const char* uniqueId, const char* commandTopic) { StaticJsonDocument jsonDoc; buildDeviceConfig(jsonDoc); jsonDoc["name"] = name; jsonDoc["unique_id"] = uniqueId; jsonDoc["command_topic"] = commandTopic; serializeJson(jsonDoc, output); } struct SensorConfig { const char* deviceClass; const char* unitMeasure; const char* valueTemplate; void buildConfig(char(&output)[JSON_SIZE], const char* name, const char* uniqueId, const char* stateTopic) { StaticJsonDocument jsonDoc; buildDeviceConfig(jsonDoc); jsonDoc["name"] = name; jsonDoc["unique_id"] = uniqueId; jsonDoc["state_topic"] = stateTopic; jsonDoc["device_class"] = deviceClass; jsonDoc["unit_of_measurement"] = unitMeasure; jsonDoc["value_template"] = valueTemplate; serializeJson(jsonDoc, output); } }; struct TemperatureConfig : SensorConfig { TemperatureConfig() { deviceClass = "temperature"; unitMeasure = "°C"; valueTemplate = "{{ value_json.temperature }}"; } }; struct PressureConfig : SensorConfig { PressureConfig() { deviceClass = "pressure"; unitMeasure = "hPa"; valueTemplate = "{{ value_json.pressure }}"; } }; struct AltitudeConfig : SensorConfig { AltitudeConfig() { deviceClass = "distance"; unitMeasure = "m"; valueTemplate = "{{ value_json.altitude }}"; } }; }