From 8a2b1d9359decb113e58959b7cbbfa75bc519f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Mon, 13 Sep 2021 10:06:28 +0200 Subject: [PATCH] Expose select on Frontend `web_server:` (#2245) --- esphome/components/web_server/web_server.cpp | 43 +++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index dc97bcd5c2..f82a8893eb 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -25,7 +25,8 @@ namespace web_server { static const char *const TAG = "web_server"; -void write_row(AsyncResponseStream *stream, Nameable *obj, const std::string &klass, const std::string &action) { +void write_row(AsyncResponseStream *stream, Nameable *obj, const std::string &klass, const std::string &action, + const std::function &action_func = nullptr) { if (obj->is_internal()) return; stream->print("print(obj->get_name().c_str()); stream->print(""); stream->print(action.c_str()); + if (action_func) { + action_func(*stream, obj); + } stream->print(""); stream->print(""); } @@ -219,7 +223,17 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) { #ifdef USE_SELECT for (auto *obj : App.get_selects()) - write_row(stream, obj, "select", ""); + write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, Nameable *obj) { + select::Select *select = (select::Select *) obj; + stream.print(""); + }); #endif stream->print(F("

See ESPHome Web API for " @@ -648,8 +662,27 @@ void WebServer::handle_select_request(AsyncWebServerRequest *request, const UrlM continue; if (obj->get_object_id() != match.id) continue; - std::string data = this->select_json(obj, obj->state); - request->send(200, "text/json", data.c_str()); + + if (request->method() == HTTP_GET) { + std::string data = this->select_json(obj, obj->state); + request->send(200, "text/json", data.c_str()); + return; + } + + if (match.method != "set") { + request->send(404); + return; + } + + auto call = obj->make_call(); + + if (request->hasParam("option")) { + String option = request->getParam("option")->value(); + call.set_option(option.c_str()); // NOLINT(clang-diagnostic-deprecated-declarations) + } + + this->defer([call]() mutable { call.perform(); }); + request->send(200); return; } request->send(404); @@ -721,7 +754,7 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) { #endif #ifdef USE_SELECT - if (request->method() == HTTP_GET && match.domain == "select") + if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "select") return true; #endif