#include "web_server.h" #include "esphome/core/application.h" #if USE_WEBSERVER_VERSION == 1 namespace esphome { namespace web_server { void write_row(AsyncResponseStream *stream, EntityBase *obj, const std::string &klass, const std::string &action, const std::function &action_func = nullptr) { stream->print("print(klass.c_str()); if (obj->is_internal()) stream->print(" internal"); stream->print("\" id=\""); stream->print(klass.c_str()); stream->print("-"); stream->print(obj->get_object_id().c_str()); stream->print("\">"); stream->print(obj->get_name().c_str()); stream->print(""); stream->print(action.c_str()); if (action_func) { action_func(*stream, obj); } stream->print(""); stream->print(""); } void WebServer::set_css_url(const char *css_url) { this->css_url_ = css_url; } void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; } void WebServer::handle_index_request(AsyncWebServerRequest *request) { AsyncResponseStream *stream = request->beginResponseStream("text/html"); const std::string &title = App.get_name(); stream->print(F("")); stream->print(title.c_str()); stream->print(F("")); #ifdef USE_WEBSERVER_CSS_INCLUDE stream->print(F("")); #endif if (strlen(this->css_url_) > 0) { stream->print(F(R"(print(this->css_url_); stream->print(F("\">")); } stream->print(F("")); stream->print(F("

")); stream->print(title.c_str()); stream->print(F("

")); stream->print(F("

States

")); #ifdef USE_SENSOR for (auto *obj : App.get_sensors()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "sensor", ""); } #endif #ifdef USE_SWITCH for (auto *obj : App.get_switches()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "switch", ""); } #endif #ifdef USE_BUTTON for (auto *obj : App.get_buttons()) write_row(stream, obj, "button", ""); #endif #ifdef USE_BINARY_SENSOR for (auto *obj : App.get_binary_sensors()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "binary_sensor", ""); } #endif #ifdef USE_FAN for (auto *obj : App.get_fans()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "fan", ""); } #endif #ifdef USE_LIGHT for (auto *obj : App.get_lights()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "light", ""); } #endif #ifdef USE_TEXT_SENSOR for (auto *obj : App.get_text_sensors()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "text_sensor", ""); } #endif #ifdef USE_COVER for (auto *obj : App.get_covers()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "cover", ""); } #endif #ifdef USE_NUMBER for (auto *obj : App.get_numbers()) { if (this->include_internal_ || !obj->is_internal()) { write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) { number::Number *number = (number::Number *) obj; stream.print(R"(traits.get_min_value()); stream.print(R"(" max=")"); stream.print(number->traits.get_max_value()); stream.print(R"(" step=")"); stream.print(number->traits.get_step()); stream.print(R"(" value=")"); stream.print(number->state); stream.print(R"("/>)"); }); } } #endif #ifdef USE_TEXT for (auto *obj : App.get_texts()) { if (this->include_internal_ || !obj->is_internal()) { write_row(stream, obj, "text", "", [](AsyncResponseStream &stream, EntityBase *obj) { text::Text *text = (text::Text *) obj; auto mode = (int) text->traits.get_mode(); stream.print(R"(traits.get_min_length()); stream.print(R"(" maxlength=")"); stream.print(text->traits.get_max_length()); stream.print(R"(" pattern=")"); stream.print(text->traits.get_pattern().c_str()); stream.print(R"(" value=")"); stream.print(text->state.c_str()); stream.print(R"("/>)"); }); } } #endif #ifdef USE_SELECT for (auto *obj : App.get_selects()) { if (this->include_internal_ || !obj->is_internal()) { write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, EntityBase *obj) { select::Select *select = (select::Select *) obj; stream.print(""); }); } } #endif #ifdef USE_LOCK for (auto *obj : App.get_locks()) { if (this->include_internal_ || !obj->is_internal()) { write_row(stream, obj, "lock", "", [](AsyncResponseStream &stream, EntityBase *obj) { lock::Lock *lock = (lock::Lock *) obj; stream.print(""); if (lock->traits.get_supports_open()) { stream.print(""); } }); } } #endif #ifdef USE_CLIMATE for (auto *obj : App.get_climates()) { if (this->include_internal_ || !obj->is_internal()) write_row(stream, obj, "climate", ""); } #endif stream->print(F("
NameStateActions

See ESPHome Web API for " "REST API documentation.

")); if (this->allow_ota_) { stream->print( F("

OTA Update

")); } stream->print(F("

Debug Log

"));
#ifdef USE_WEBSERVER_JS_INCLUDE
  if (this->js_include_ != nullptr) {
    stream->print(F(""));
  }
#endif
  if (strlen(this->js_url_) > 0) {
    stream->print(F(""));
  }
  stream->print(F("
")); request->send(stream); } } // namespace web_server } // namespace esphome #endif