86 lines
2.7 KiB
C++
86 lines
2.7 KiB
C++
#pragma once
|
|
#include "esphome.h"
|
|
#include "esphome/components/web_server_base/web_server_base.h"
|
|
#include "esphome/components/json/json_util.h"
|
|
#include <functional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
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<MicrowaveData> 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<void()>;
|
|
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");
|
|
}
|
|
} |