12#include "StreamString.h"
29#ifdef USE_WEBSERVER_LOCAL
30#if USE_WEBSERVER_VERSION == 2
32#elif USE_WEBSERVER_VERSION == 3
40static const char *
const TAG =
"web_server";
42#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
43static const char *
const HEADER_PNA_NAME =
"Private-Network-Access-Name";
44static const char *
const HEADER_PNA_ID =
"Private-Network-Access-ID";
45static const char *
const HEADER_CORS_REQ_PNA =
"Access-Control-Request-Private-Network";
46static const char *
const HEADER_CORS_ALLOW_PNA =
"Access-Control-Allow-Private-Network";
50static UrlMatch match_url(
const char *url_ptr,
size_t url_len,
bool only_domain) {
54 if (url_len < 2 || url_ptr[0] !=
'/') {
59 const char *start = url_ptr + 1;
60 const char *
end = url_ptr + url_len;
63 const char *domain_end = (
const char *) memchr(start,
'/',
end - start);
71 match.domain_len = domain_end - start;
79 if (domain_end + 1 >=
end) {
83 const char *id_start = domain_end + 1;
84 const char *id_end = (
const char *) memchr(id_start,
'/',
end - id_start);
89 match.id_len =
end - id_start;
95 match.id_len = id_end - id_start;
98 if (id_end + 1 <
end) {
99 match.method = id_end + 1;
100 match.method_len =
end - (id_end + 1);
109 DeferredEvent item(source, message_generator);
111 auto iter = std::find_if(this->
deferred_queue_.begin(), this->deferred_queue_.end(),
112 [&item](
const DeferredEvent &test) ->
bool { return test == item; });
124 std::string message = de.message_generator_(
web_server_, de.source_);
125 if (this->send(message.c_str(),
"state") != DISCARDED) {
133 ESP_LOGW(TAG,
"Closing stuck EventSource connection after %" PRIu16
" failed sends",
156 if (source ==
nullptr)
158 if (event_type ==
nullptr)
160 if (message_generator ==
nullptr)
163 if (0 != strcmp(event_type,
"state_detail_all") && 0 != strcmp(event_type,
"state")) {
164 ESP_LOGE(TAG,
"Can't defer non-state event");
173 std::string message = message_generator(
web_server_, source);
174 if (this->send(message.c_str(),
"state") == DISCARDED) {
184 uint32_t reconnect) {
185 this->send(message, event,
id, reconnect);
202 uint32_t reconnect) {
212 es->onConnect([
this, ws, es](AsyncEventSourceClient *client) {
216 es->onDisconnect([
this, ws, es](AsyncEventSourceClient *client) {
220 es->handleRequest(request);
229#ifdef USE_WEBSERVER_SORTING
232 root[
"name"] = group.second.name;
233 root[
"sorting_weight"] = group.second.weight;
253 this->remove(source);
260#ifdef USE_WEBSERVER_CSS_INCLUDE
263#ifdef USE_WEBSERVER_JS_INCLUDE
271#if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA)
289 [
this](
int level,
const char *tag,
const char *message,
size_t message_len) {
316#ifdef USE_WEBSERVER_LOCAL
319 AsyncWebServerResponse *response = request->beginResponse(200,
"text/html", INDEX_GZ,
sizeof(INDEX_GZ));
321 AsyncWebServerResponse *response = request->beginResponse_P(200,
"text/html", INDEX_GZ,
sizeof(INDEX_GZ));
323 response->addHeader(
"Content-Encoding",
"gzip");
324 request->send(response);
326#elif USE_WEBSERVER_VERSION >= 2
329 AsyncWebServerResponse *response =
332 AsyncWebServerResponse *response =
336 request->send(response);
340#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
342 AsyncWebServerResponse *response = request->beginResponse(200,
"");
343 response->addHeader(HEADER_CORS_ALLOW_PNA,
"true");
344 response->addHeader(HEADER_PNA_NAME,
App.
get_name().c_str());
346 response->addHeader(HEADER_PNA_ID, mac.c_str());
347 request->send(response);
351#ifdef USE_WEBSERVER_CSS_INCLUDE
354 AsyncWebServerResponse *response =
357 AsyncWebServerResponse *response =
360 response->addHeader(
"Content-Encoding",
"gzip");
361 request->send(response);
365#ifdef USE_WEBSERVER_JS_INCLUDE
368 AsyncWebServerResponse *response =
371 AsyncWebServerResponse *response =
374 response->addHeader(
"Content-Encoding",
"gzip");
375 request->send(response);
380static void set_json_id(JsonObject &root,
EntityBase *obj,
const std::string &
id,
JsonDetail start_config) {
388 root[
"is_disabled_by_default"] = is_disabled;
393static void set_json_value(JsonObject &root, EntityBase *obj,
const std::string &
id,
const T &value,
395 set_json_id(root, obj,
id, start_config);
396 root[
"value"] = value;
400static void set_json_icon_state_value(JsonObject &root, EntityBase *obj,
const std::string &
id,
402 set_json_value(root, obj,
id, value, start_config);
403 root[
"state"] =
state;
407static JsonDetail get_request_detail(AsyncWebServerRequest *request) {
408 auto *param = request->getParam(
"detail");
422 if (request->method() == HTTP_GET && match.
method_empty()) {
423 auto detail = get_request_detail(request);
424 std::string data = this->
sensor_json(obj, obj->state, detail);
425 request->send(200,
"application/json", data.c_str());
440 if (std::isnan(value)) {
447 set_json_icon_state_value(root, obj,
"sensor-" + obj->
get_object_id(),
state, value, start_config);
457#ifdef USE_TEXT_SENSOR
467 if (request->method() == HTTP_GET && match.
method_empty()) {
468 auto detail = get_request_detail(request);
470 request->send(200,
"application/json", data.c_str());
487 set_json_icon_state_value(root, obj,
"text_sensor-" + obj->
get_object_id(), value, value, start_config);
506 if (request->method() == HTTP_GET && match.
method_empty()) {
507 auto detail = get_request_detail(request);
508 std::string data = this->
switch_json(obj, obj->state, detail);
509 request->send(200,
"application/json", data.c_str());
511 this->
defer([obj]() { obj->toggle(); });
514 this->
defer([obj]() { obj->turn_on(); });
517 this->
defer([obj]() { obj->turn_off(); });
534 set_json_icon_state_value(root, obj,
"switch-" + obj->
get_object_id(), value ?
"ON" :
"OFF", value, start_config);
548 if (request->method() == HTTP_GET && match.
method_empty()) {
549 auto detail = get_request_detail(request);
551 request->send(200,
"application/json", data.c_str());
553 this->
defer([obj]() { obj->press(); });
571 set_json_id(root, obj,
"button-" + obj->
get_object_id(), start_config);
579#ifdef USE_BINARY_SENSOR
589 if (request->method() == HTTP_GET && match.
method_empty()) {
590 auto detail = get_request_detail(request);
592 request->send(200,
"application/json", data.c_str());
608 set_json_icon_state_value(root, obj,
"binary_sensor-" + obj->
get_object_id(), value ?
"ON" :
"OFF", value,
628 if (request->method() == HTTP_GET && match.
method_empty()) {
629 auto detail = get_request_detail(request);
630 std::string data = this->
fan_json(obj, detail);
631 request->send(200,
"application/json", data.c_str());
633 this->
defer([obj]() { obj->toggle().perform(); });
640 if (request->hasParam(
"oscillation")) {
641 auto speed = request->getParam(
"oscillation")->value();
645 call.set_oscillating(
true);
648 call.set_oscillating(
false);
651 call.set_oscillating(!obj->oscillating);
678 if (traits.supports_speed()) {
679 root[
"speed_level"] = obj->
speed;
680 root[
"speed_count"] = traits.supported_speed_count();
702 if (request->method() == HTTP_GET && match.
method_empty()) {
703 auto detail = get_request_detail(request);
704 std::string data = this->
light_json(obj, detail);
705 request->send(200,
"application/json", data.c_str());
707 this->
defer([obj]() { obj->toggle().perform(); });
710 auto call = obj->turn_on();
729 auto call = obj->turn_off();
748 set_json_id(root, obj,
"light-" + obj->
get_object_id(), start_config);
753 JsonArray opt = root[
"effects"].to<JsonArray>();
756 opt.add(option->get_name());
775 if (request->method() == HTTP_GET && match.
method_empty()) {
776 auto detail = get_request_detail(request);
777 std::string data = this->
cover_json(obj, detail);
778 request->send(200,
"application/json", data.c_str());
782 auto call = obj->make_call();
784 call.set_command_open();
786 call.set_command_close();
788 call.set_command_stop();
790 call.set_command_toggle();
796 auto traits = obj->get_traits();
797 if ((request->hasParam(
"position") && !traits.get_supports_position()) ||
798 (request->hasParam(
"tilt") && !traits.get_supports_tilt())) {
827 root[
"tilt"] = obj->
tilt;
842 for (
auto *obj :
App.get_numbers()) {
846 if (request->method() == HTTP_GET && match.
method_empty()) {
847 auto detail = get_request_detail(request);
848 std::string data = this->
number_json(obj, obj->state, detail);
849 request->send(200,
"application/json", data.c_str());
857 auto call = obj->make_call();
875 set_json_id(root, obj,
"number-" + obj->
get_object_id(), start_config);
888 if (std::isnan(value)) {
889 root[
"value"] =
"\"NaN\"";
890 root[
"state"] =
"NA";
896 root[
"state"] =
state;
902#ifdef USE_DATETIME_DATE
909 for (
auto *obj :
App.get_dates()) {
912 if (request->method() == HTTP_GET && match.
method_empty()) {
913 auto detail = get_request_detail(request);
914 std::string data = this->
date_json(obj, detail);
915 request->send(200,
"application/json", data.c_str());
923 auto call = obj->make_call();
925 if (!request->hasParam(
"value")) {
947 set_json_id(root, obj,
"date-" + obj->
get_object_id(), start_config);
949 root[
"value"] = value;
950 root[
"state"] = value;
958#ifdef USE_DATETIME_TIME
965 for (
auto *obj :
App.get_times()) {
968 if (request->method() == HTTP_GET && match.
method_empty()) {
969 auto detail = get_request_detail(request);
970 std::string data = this->
time_json(obj, detail);
971 request->send(200,
"application/json", data.c_str());
979 auto call = obj->make_call();
981 if (!request->hasParam(
"value")) {
1002 set_json_id(root, obj,
"time-" + obj->
get_object_id(), start_config);
1004 root[
"value"] = value;
1005 root[
"state"] = value;
1013#ifdef USE_DATETIME_DATETIME
1020 for (
auto *obj :
App.get_datetimes()) {
1023 if (request->method() == HTTP_GET && match.
method_empty()) {
1024 auto detail = get_request_detail(request);
1026 request->send(200,
"application/json", data.c_str());
1034 auto call = obj->make_call();
1036 if (!request->hasParam(
"value")) {
1057 set_json_id(root, obj,
"datetime-" + obj->
get_object_id(), start_config);
1060 root[
"value"] = value;
1061 root[
"state"] = value;
1076 for (
auto *obj :
App.get_texts()) {
1080 if (request->method() == HTTP_GET && match.
method_empty()) {
1081 auto detail = get_request_detail(request);
1082 std::string data = this->
text_json(obj, obj->state, detail);
1083 request->send(200,
"application/json", data.c_str());
1091 auto call = obj->make_call();
1108 return json::build_json([
this, obj, value, start_config](JsonObject root) {
1109 set_json_id(root, obj,
"text-" + obj->
get_object_id(), start_config);
1114 root[
"state"] =
"********";
1116 root[
"state"] = value;
1118 root[
"value"] = value;
1134 for (
auto *obj :
App.get_selects()) {
1138 if (request->method() == HTTP_GET && match.
method_empty()) {
1139 auto detail = get_request_detail(request);
1140 std::string data = this->
select_json(obj, obj->state, detail);
1141 request->send(200,
"application/json", data.c_str());
1150 auto call = obj->make_call();
1166 return json::build_json([
this, obj, value, start_config](JsonObject root) {
1167 set_json_icon_state_value(root, obj,
"select-" + obj->
get_object_id(), value, value, start_config);
1169 JsonArray opt = root[
"option"].to<JsonArray>();
1180#define PSTR_LOCAL(mode_s) strncpy_P(buf, (PGM_P) ((mode_s)), 15)
1189 for (
auto *obj :
App.get_climates()) {
1193 if (request->method() == HTTP_GET && match.
method_empty()) {
1194 auto detail = get_request_detail(request);
1196 request->send(200,
"application/json", data.c_str());
1205 auto call = obj->make_call();
1232 set_json_id(root, obj,
"climate-" + obj->
get_object_id(), start_config);
1235 int8_t current_accuracy = traits.get_current_temperature_accuracy_decimals();
1239 JsonArray opt = root[
"modes"].to<JsonArray>();
1242 if (!traits.get_supported_custom_fan_modes().empty()) {
1243 JsonArray opt = root[
"fan_modes"].to<JsonArray>();
1248 if (!traits.get_supported_custom_fan_modes().empty()) {
1249 JsonArray opt = root[
"custom_fan_modes"].to<JsonArray>();
1250 for (
auto const &
custom_fan_mode : traits.get_supported_custom_fan_modes())
1253 if (traits.get_supports_swing_modes()) {
1254 JsonArray opt = root[
"swing_modes"].to<JsonArray>();
1255 for (
auto swing_mode : traits.get_supported_swing_modes())
1259 JsonArray opt = root[
"presets"].to<JsonArray>();
1264 JsonArray opt = root[
"custom_presets"].to<JsonArray>();
1265 for (
auto const &
custom_preset : traits.get_supported_custom_presets())
1271 bool has_state =
false;
1272 root[
"mode"] = PSTR_LOCAL(climate_mode_to_string(obj->
mode));
1275 root[
"step"] = traits.get_visual_target_temperature_step();
1276 if (traits.get_supports_action()) {
1277 root[
"action"] = PSTR_LOCAL(climate_action_to_string(obj->
action));
1278 root[
"state"] = root[
"action"];
1282 root[
"fan_mode"] = PSTR_LOCAL(climate_fan_mode_to_string(obj->
fan_mode.
value()));
1288 root[
"preset"] = PSTR_LOCAL(climate_preset_to_string(obj->
preset.
value()));
1293 if (traits.get_supports_swing_modes()) {
1294 root[
"swing_mode"] = PSTR_LOCAL(climate_swing_mode_to_string(obj->
swing_mode));
1296 if (traits.get_supports_current_temperature()) {
1300 root[
"current_temperature"] =
"NA";
1303 if (traits.get_supports_two_point_target_temperature()) {
1313 root[
"state"] = root[
"target_temperature"];
1331 if (request->method() == HTTP_GET && match.
method_empty()) {
1332 auto detail = get_request_detail(request);
1333 std::string data = this->
lock_json(obj, obj->state, detail);
1334 request->send(200,
"application/json", data.c_str());
1336 this->
defer([obj]() { obj->lock(); });
1339 this->
defer([obj]() { obj->unlock(); });
1342 this->
defer([obj]() { obj->open(); });
1358 return json::build_json([
this, obj, value, start_config](JsonObject root) {
1379 if (request->method() == HTTP_GET && match.
method_empty()) {
1380 auto detail = get_request_detail(request);
1381 std::string data = this->
valve_json(obj, detail);
1382 request->send(200,
"application/json", data.c_str());
1386 auto call = obj->make_call();
1388 call.set_command_open();
1390 call.set_command_close();
1392 call.set_command_stop();
1394 call.set_command_toggle();
1400 auto traits = obj->get_traits();
1401 if (request->hasParam(
"position") && !traits.get_supports_position()) {
1435#ifdef USE_ALARM_CONTROL_PANEL
1446 if (request->method() == HTTP_GET && match.
method_empty()) {
1447 auto detail = get_request_detail(request);
1449 request->send(200,
"application/json", data.c_str());
1453 auto call = obj->make_call();
1465 call.arm_vacation();
1490 return json::build_json([
this, obj, value, start_config](JsonObject root) {
1492 set_json_icon_state_value(root, obj,
"alarm-control-panel-" + obj->
get_object_id(),
1493 PSTR_LOCAL(alarm_control_panel_state_to_string(value)), value, start_config);
1511 if (request->method() == HTTP_GET && match.
method_empty()) {
1512 auto detail = get_request_detail(request);
1513 std::string data = this->
event_json(obj,
"", detail);
1514 request->send(200,
"application/json", data.c_str());
1521static std::string get_event_type(
event::Event *event) {
1522 return (event && event->
last_event_type) ? *
event->last_event_type :
"";
1534 return json::build_json([
this, obj, event_type, start_config](JsonObject root) {
1535 set_json_id(root, obj,
"event-" + obj->
get_object_id(), start_config);
1536 if (!event_type.empty()) {
1537 root[
"event_type"] = event_type;
1540 JsonArray event_types = root[
"event_types"].to<JsonArray>();
1542 event_types.add(event_type);
1557 return "UPDATE AVAILABLE";
1559 return "INSTALLING";
1575 if (request->method() == HTTP_GET && match.
method_empty()) {
1576 auto detail = get_request_detail(request);
1577 std::string data = this->
update_json(obj, detail);
1578 request->send(200,
"application/json", data.c_str());
1587 this->
defer([obj]()
mutable { obj->perform(); });
1602 set_json_id(root, obj,
"update-" + obj->
get_object_id(), start_config);
1604 root[
"state"] = update_state_to_string(obj->
state);
1618 const auto &url = request->url();
1619 const auto method = request->method();
1626 if (url ==
"/events")
1630#ifdef USE_WEBSERVER_CSS_INCLUDE
1631 if (url ==
"/0.css")
1635#ifdef USE_WEBSERVER_JS_INCLUDE
1640#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
1641 if (method == HTTP_OPTIONS && request->hasHeader(HEADER_CORS_REQ_PNA))
1646 UrlMatch match = match_url(url.c_str(), url.length(),
true);
1651 bool is_get = method == HTTP_GET;
1652 bool is_post = method == HTTP_POST;
1653 bool is_get_or_post = is_get || is_post;
1655 if (!is_get_or_post)
1664#ifdef USE_BINARY_SENSOR
1668#ifdef USE_TEXT_SENSOR
1679 if (is_get_or_post) {
1704#ifdef USE_DATETIME_DATE
1708#ifdef USE_DATETIME_TIME
1712#ifdef USE_DATETIME_DATETIME
1736#ifdef USE_ALARM_CONTROL_PANEL
1749 const auto &url = request->url();
1758 if (url ==
"/events") {
1764#ifdef USE_WEBSERVER_CSS_INCLUDE
1765 if (url ==
"/0.css") {
1771#ifdef USE_WEBSERVER_JS_INCLUDE
1772 if (url ==
"/0.js") {
1778#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
1779 if (request->method() == HTTP_OPTIONS && request->hasHeader(HEADER_CORS_REQ_PNA)) {
1786 UrlMatch match = match_url(url.c_str(), url.length(),
false);
1789 struct ComponentRoute {
1794 static const ComponentRoute ROUTES[] = {
1804#ifdef USE_BINARY_SENSOR
1813#ifdef USE_TEXT_SENSOR
1822#ifdef USE_DATETIME_DATE
1825#ifdef USE_DATETIME_TIME
1828#ifdef USE_DATETIME_DATETIME
1846#ifdef USE_ALARM_CONTROL_PANEL
1855 for (
const auto &route : ROUTES) {
1857 (this->*route.handler)(request, match);
1863 ESP_LOGV(TAG,
"Request for unknown URL: %s", url.c_str());
1864 request->send(404,
"text/plain",
"Not Found");
1870#ifdef USE_WEBSERVER_SORTING
1873 if (this->
sorting_groups_.find(this->sorting_entitys_[entity].group_id) != this->sorting_groups_.end()) {
1880#ifdef USE_WEBSERVER_SORTING
std::string get_comment() const
Get the comment of this Application set by pre_setup().
const std::string & get_friendly_name() const
Get the friendly name of this Application set by pre_setup().
const std::string & get_name() const
Get the name of this Application set by pre_setup().
auto & get_binary_sensors() const
void set_interval(const std::string &name, uint32_t interval, std::function< void()> &&f)
Set an interval function with a unique name.
void defer(const std::string &name, std::function< void()> &&f)
Defer a callback to the next loop() call.
void begin(bool include_internal=false)
void setup_controller(bool include_internal=false)
std::string get_device_class()
Get the device class, using the manual override if set.
std::string get_unit_of_measurement()
Get the unit of measurement, using the manual override if set.
const StringRef & get_name() const
std::string get_icon() const
bool is_disabled_by_default() const
std::string get_object_id() const
EntityCategory get_entity_category() const
Base class for all binary_sensor-type classes.
ClimateDevice - This is the base class for all climate integrations.
ClimateMode mode
The active mode of the climate device.
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
ClimateTraits get_traits()
Get the traits of this climate device with all overrides applied.
float target_temperature
The target temperature of the climate device.
optional< std::string > custom_fan_mode
The active custom fan mode of the climate device.
ClimateSwingMode swing_mode
The active swing mode of the climate device.
float target_temperature_low
The minimum target temperature of the climate device, for climate devices with split target temperatu...
optional< std::string > custom_preset
The active custom preset mode of the climate device.
float current_temperature
The current temperature of the climate device, as reported from the integration.
ClimateAction action
The active state of the climate device.
optional< ClimatePreset > preset
The active preset of the climate device.
float target_temperature_high
The maximum target temperature of the climate device, for climate devices with split target temperatu...
int8_t get_target_temperature_accuracy_decimals() const
Base class for all cover devices.
CoverOperation current_operation
The current operation of the cover (idle, opening, closing).
float tilt
The current tilt value of the cover from 0.0 to 1.0.
float position
The position of the cover from 0.0 (fully closed) to 1.0 (fully open).
bool is_fully_closed() const
Helper method to check if the cover is fully closed. Equivalent to comparing .position against 0....
virtual CoverTraits get_traits()=0
bool get_supports_position() const
bool get_supports_tilt() const
std::set< std::string > get_event_types() const
const std::string * last_event_type
virtual FanTraits get_traits()=0
bool oscillating
The current oscillation state of the fan.
bool state
The current on/off state of the fan.
int speed
The current fan speed level.
bool supports_oscillation() const
Return if this fan supports oscillation.
bool is_on() const
Get the binary true/false state of these light color values.
static void dump_json(LightState &state, JsonObject root)
Dump the state of a light as JSON.
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
const std::vector< LightEffect * > & get_effects() const
Get all effects for this light state.
LightColorValues remote_values
The remote color values reported to the frontend.
Base class for all locks.
void add_on_log_callback(std::function< void(uint8_t, const char *, const char *, size_t)> &&callback)
Register a callback that will be called for every log message sent.
Base-class for all numbers.
float get_min_value() const
float get_max_value() const
NumberMode get_mode() const
value_type const & value() const
Base-class for all selects.
const std::vector< std::string > & get_options() const
Base-class for all sensors.
int8_t get_accuracy_decimals()
Get the accuracy in decimals, using the manual override if set.
Base class for all switches.
virtual bool assumed_state()
Return whether this switch uses an assumed state - i.e.
Base-class for all text inputs.
TextMode get_mode() const
int get_max_length() const
std::string get_pattern() const
int get_min_length() const
const UpdateState & state
const UpdateInfo & update_info
Base class for all valve devices.
bool is_fully_closed() const
Helper method to check if the valve is fully closed. Equivalent to comparing .position against 0....
float position
The position of the valve from 0.0 (fully closed) to 1.0 (fully open).
ValveOperation current_operation
The current operation of the valve (idle, opening, closing).
virtual ValveTraits get_traits()=0
bool get_supports_position() const
void process_deferred_queue_()
void try_send_nodefer(const char *message, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES
uint16_t consecutive_send_failures_
void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator)
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)
ListEntitiesIterator entities_iterator_
std::vector< DeferredEvent > deferred_queue_
void add_new_client(WebServer *ws, AsyncWebServerRequest *request)
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)
void try_send_nodefer(const char *message, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
void on_client_connect_(WebServer *ws, DeferredUpdateEventSource *source)
void on_client_disconnect_(DeferredUpdateEventSource *source)
This class allows users to create a web server with their ESP nodes.
void setup() override
Setup the internal web server and register handlers.
void on_update(update::UpdateEntity *obj) override
static std::string text_sensor_all_json_generator(WebServer *web_server, void *source)
std::string light_json(light::LightState *obj, JsonDetail start_config)
Dump the light state as a JSON string.
std::string date_json(datetime::DateEntity *obj, JsonDetail start_config)
Dump the date state with its value as a JSON string.
std::string get_config_json()
Return the webserver configuration as JSON.
std::map< EntityBase *, SortingComponents > sorting_entitys_
static std::string binary_sensor_state_json_generator(WebServer *web_server, void *source)
std::string binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config)
Dump the binary sensor state with its value as a JSON string.
static std::string button_state_json_generator(WebServer *web_server, void *source)
static std::string lock_all_json_generator(WebServer *web_server, void *source)
void on_light_update(light::LightState *obj) override
static std::string date_all_json_generator(WebServer *web_server, void *source)
std::string update_json(update::UpdateEntity *obj, JsonDetail start_config)
Dump the update state with its value as a JSON string.
void on_cover_update(cover::Cover *obj) override
static std::string text_state_json_generator(WebServer *web_server, void *source)
void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a select request under '/select/<id>'.
std::string number_json(number::Number *obj, float value, JsonDetail start_config)
Dump the number state with its value as a JSON string.
static std::string event_state_json_generator(WebServer *web_server, void *source)
std::string cover_json(cover::Cover *obj, JsonDetail start_config)
Dump the cover state as a JSON string.
static std::string datetime_all_json_generator(WebServer *web_server, void *source)
static std::string sensor_all_json_generator(WebServer *web_server, void *source)
bool isRequestHandlerTrivial() const override
This web handle is not trivial.
WebServer(web_server_base::WebServerBase *base)
std::string text_sensor_json(text_sensor::TextSensor *obj, const std::string &value, JsonDetail start_config)
Dump the text sensor state with its value as a JSON string.
void on_number_update(number::Number *obj, float state) override
void handle_switch_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a switch request under '/switch/<id>/</turn_on/turn_off/toggle>'.
void handle_event_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a event request under '/event<id>'.
void parse_light_param_uint_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(uint32_t), uint32_t scale=1)
void dump_config() override
std::string button_json(button::Button *obj, JsonDetail start_config)
Dump the button details with its value as a JSON string.
std::string valve_json(valve::Valve *obj, JsonDetail start_config)
Dump the valve state as a JSON string.
DeferredUpdateEventSourceList events_
void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a button request under '/button/<id>/press'.
void on_date_update(datetime::DateEntity *obj) override
std::string text_json(text::Text *obj, const std::string &value, JsonDetail start_config)
Dump the text state with its value as a JSON string.
void add_entity_config(EntityBase *entity, float weight, uint64_t group)
std::string datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config)
Dump the datetime state with its value as a JSON string.
void handle_css_request(AsyncWebServerRequest *request)
Handle included css request under '/0.css'.
static std::string sensor_state_json_generator(WebServer *web_server, void *source)
void on_valve_update(valve::Valve *obj) override
void on_climate_update(climate::Climate *obj) override
void on_sensor_update(sensor::Sensor *obj, float state) override
static std::string switch_state_json_generator(WebServer *web_server, void *source)
void add_sorting_info_(JsonObject &root, EntityBase *entity)
void handle_light_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a light request under '/light/<id>/</turn_on/turn_off/toggle>'.
static std::string event_all_json_generator(WebServer *web_server, void *source)
static std::string climate_state_json_generator(WebServer *web_server, void *source)
void on_binary_sensor_update(binary_sensor::BinarySensor *obj) override
static std::string number_all_json_generator(WebServer *web_server, void *source)
void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text input request under '/text/<id>'.
void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a cover request under '/cover/<id>/<open/close/stop/set>'.
void on_select_update(select::Select *obj, const std::string &state, size_t index) override
static std::string date_state_json_generator(WebServer *web_server, void *source)
static std::string valve_all_json_generator(WebServer *web_server, void *source)
static std::string text_all_json_generator(WebServer *web_server, void *source)
web_server_base::WebServerBase * base_
static std::string binary_sensor_all_json_generator(WebServer *web_server, void *source)
static std::string light_state_json_generator(WebServer *web_server, void *source)
void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a lock request under '/lock/<id>/</lock/unlock/open>'.
void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj) override
static std::string light_all_json_generator(WebServer *web_server, void *source)
std::string switch_json(switch_::Switch *obj, bool value, JsonDetail start_config)
Dump the switch state with its value as a JSON string.
void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text sensor request under '/text_sensor/<id>'.
std::string sensor_json(sensor::Sensor *obj, float value, JsonDetail start_config)
Dump the sensor state with its value as a JSON string.
void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a date request under '/date/<id>'.
static std::string cover_all_json_generator(WebServer *web_server, void *source)
void handle_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a sensor request under '/sensor/<id>'.
static std::string text_sensor_state_json_generator(WebServer *web_server, void *source)
void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a number request under '/number/<id>'.
static std::string alarm_control_panel_state_json_generator(WebServer *web_server, void *source)
void handle_index_request(AsyncWebServerRequest *request)
Handle an index request under '/'.
void handle_js_request(AsyncWebServerRequest *request)
Handle included js request under '/0.js'.
void set_js_include(const char *js_include)
Set local path to the script that's embedded in the index page.
void on_text_update(text::Text *obj, const std::string &state) override
static std::string fan_state_json_generator(WebServer *web_server, void *source)
static std::string update_state_json_generator(WebServer *web_server, void *source)
void handleRequest(AsyncWebServerRequest *request) override
Override the web handler's handleRequest method.
static std::string climate_all_json_generator(WebServer *web_server, void *source)
void on_datetime_update(datetime::DateTimeEntity *obj) override
std::string event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config)
Dump the event details with its value as a JSON string.
void on_text_sensor_update(text_sensor::TextSensor *obj, const std::string &state) override
std::string time_json(datetime::TimeEntity *obj, JsonDetail start_config)
Dump the time state with its value as a JSON string.
void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a fan request under '/fan/<id>/</turn_on/turn_off/toggle>'.
static std::string cover_state_json_generator(WebServer *web_server, void *source)
static std::string lock_state_json_generator(WebServer *web_server, void *source)
void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a valve request under '/valve/<id>/<open/close/stop/set>'.
void handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a binary sensor request under '/binary_sensor/<id>'.
static std::string alarm_control_panel_all_json_generator(WebServer *web_server, void *source)
static std::string number_state_json_generator(WebServer *web_server, void *source)
void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a time request under '/time/<id>'.
std::map< uint64_t, SortingGroup > sorting_groups_
void set_css_include(const char *css_include)
Set local path to the script that's embedded in the index page.
static std::string valve_state_json_generator(WebServer *web_server, void *source)
bool canHandle(AsyncWebServerRequest *request) const override
Override the web handler's canHandle method.
std::string lock_json(lock::Lock *obj, lock::LockState value, JsonDetail start_config)
Dump the lock state with its value as a JSON string.
void handle_pna_cors_request(AsyncWebServerRequest *request)
std::string fan_json(fan::Fan *obj, JsonDetail start_config)
Dump the fan state as a JSON string.
void on_fan_update(fan::Fan *obj) override
void parse_light_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(float), float scale=1.0f)
void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a datetime request under '/datetime/<id>'.
void parse_string_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(const std::string &))
void on_event(event::Event *obj, const std::string &event_type) override
void parse_float_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(float))
void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a alarm_control_panel request under '/alarm_control_panel/<id>'.
static std::string time_state_json_generator(WebServer *web_server, void *source)
void on_lock_update(lock::Lock *obj) override
static std::string button_all_json_generator(WebServer *web_server, void *source)
static std::string select_state_json_generator(WebServer *web_server, void *source)
float get_setup_priority() const override
MQTT setup priority.
void parse_int_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(int))
void on_time_update(datetime::TimeEntity *obj) override
std::string select_json(select::Select *obj, const std::string &value, JsonDetail start_config)
Dump the select state with its value as a JSON string.
static std::string update_all_json_generator(WebServer *web_server, void *source)
void on_switch_update(switch_::Switch *obj, bool state) override
void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a update request under '/update/<id>'.
std::string climate_json(climate::Climate *obj, JsonDetail start_config)
Dump the climate details.
static std::string fan_all_json_generator(WebServer *web_server, void *source)
static std::string switch_all_json_generator(WebServer *web_server, void *source)
static std::string time_all_json_generator(WebServer *web_server, void *source)
void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight)
static std::string select_all_json_generator(WebServer *web_server, void *source)
const char * css_include_
static std::string datetime_state_json_generator(WebServer *web_server, void *source)
void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a climate request under '/climate/<id>'.
std::string alarm_control_panel_json(alarm_control_panel::AlarmControlPanel *obj, alarm_control_panel::AlarmControlPanelState value, JsonDetail start_config)
Dump the alarm_control_panel state with its value as a JSON string.
void add_handler(AsyncWebHandler *handler)
uint16_t get_port() const
ClimateSwingMode swing_mode
const LogString * climate_swing_mode_to_string(ClimateSwingMode swing_mode)
Convert the given ClimateSwingMode to a human-readable string.
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
ClimatePreset
Enum for all preset modes.
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
ClimateMode
Enum for all modes a climate device can be in.
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
const char * cover_operation_to_str(CoverOperation op)
std::string build_json(const json_build_t &f)
Build a JSON string with the provided json build function.
LockState
Enum for all states a lock can be in.
const char * lock_state_to_string(LockState state)
std::string get_use_address()
Get the active network hostname.
@ UPDATE_STATE_INSTALLING
const char * valve_operation_to_str(ValveOperation op)
std::string(WebServer *, void *) message_generator_t
Providing packet encoding functions for exchanging data with a remote host.
std::string value_accuracy_to_string(float value, int8_t accuracy_decimals)
Create a string from a value and an accuracy in decimals.
ParseOnOffState parse_on_off(const char *str, const char *on, const char *off)
Parse a string that contains either on, off or toggle.
std::string get_mac_address_pretty()
Get the device MAC address as a string, in colon-separated uppercase hex notation.
int8_t step_to_accuracy_decimals(float step)
Derive accuracy in decimals from an increment step.
std::string str_sprintf(const char *fmt,...)
uint32_t IRAM_ATTR HOT millis()
Application App
Global storage of Application pointer - only one Application can exist.
T id(T value)
Helper function to make id(var) known from lambdas work in custom components.
std::string current_version
std::string latest_version
Internal helper struct that is used to parse incoming URLs.
const char * domain
Pointer to domain within URL, for example "sensor".
bool valid
Whether this match is valid.
bool method_empty() const
bool domain_equals(const char *str) const
bool method_equals(const char *str) const
bool id_equals(const std::string &str) const
friend class DeferredUpdateEventSource
const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE
const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE
const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE