#pragma once #include "esphome.h" #include "esphome/components/web_server_base/web_server_base.h" #include "esphome/components/json/json_util.h" #include #include #include struct MicrowaveData { std::string id; std::string name; int state; bool paused; int remaining_time; int progress; }; // Global states parsed from the API static std::vector g_microwaves; static bool g_cloud_alert = true; static std::string g_update_time = "--:--"; static bool g_received_update = false; // Callback signature for refreshing UI using DisplayUpdateCallback = std::function; static DisplayUpdateCallback g_display_callback = nullptr; class DisplayApiHandler : public esphome::web_server_idf::AsyncWebHandler { public: bool canHandle(esphome::web_server_idf::AsyncWebServerRequest *request) const override { // Provide the 513-byte buffer expected by ESPHome's new memory-safe API char url_buf[513]; return request->url_to(url_buf) == "/api/display"; } void handleRequest(esphome::web_server_idf::AsyncWebServerRequest *request) override { request->send(200, "application/json", "{\"status\":\"ok\"}"); } void handleBody(esphome::web_server_idf::AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override { std::string body((char *)data, len); esphome::json::parse_json(body, [](JsonObject root) -> bool { g_cloud_alert = root["cloud_alert"] | false; g_update_time = root["update_time"] | "--:--"; g_microwaves.clear(); JsonArray mw_array = root["microwaves"]; for (JsonObject mw : mw_array) { MicrowaveData md; md.id = mw["id"] | "unknown"; md.name = mw["name"] | "Microwave"; md.state = mw["state"] | 4; md.paused = mw["paused"] | false; md.remaining_time = mw["remaining_time"] | 0; md.progress = mw["progress"] | 0; g_microwaves.push_back(md); } g_received_update = true; ESP_LOGI("custom_api", "Received update. Cloud Alert: %d, Microwaves: %d", g_cloud_alert, g_microwaves.size()); if (g_display_callback != nullptr) { g_display_callback(); } return true; }); request->send(200, "application/json", "{\"status\":\"ok\"}"); } }; inline void setup_display_api(DisplayUpdateCallback callback) { g_display_callback = callback; if (esphome::web_server_base::global_web_server_base != nullptr) { esphome::web_server_base::global_web_server_base->add_handler(new DisplayApiHandler()); ESP_LOGI("custom_api", "Successfully registered /api/display POST handler"); } else { ESP_LOGE("custom_api", "Failed to register endpoint: global_web_server_base is null"); } }