ESPHome 2026.2.4
Loading...
Searching...
No Matches
web_server.h
Go to the documentation of this file.
1#pragma once
2
3#include "list_entities.h"
4
6#ifdef USE_WEBSERVER
10#ifdef USE_LOGGER
12#endif
13
14#include <functional>
15#include <list>
16#include <map>
17#include <string>
18#include <utility>
19#include <vector>
20
21#if USE_WEBSERVER_VERSION >= 2
22extern const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM;
23extern const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE;
24#endif
25
26#ifdef USE_WEBSERVER_CSS_INCLUDE
27extern const uint8_t ESPHOME_WEBSERVER_CSS_INCLUDE[] PROGMEM;
28extern const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE;
29#endif
30
31#ifdef USE_WEBSERVER_JS_INCLUDE
32extern const uint8_t ESPHOME_WEBSERVER_JS_INCLUDE[] PROGMEM;
33extern const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE;
34#endif
35
36namespace esphome::web_server {
37
38// Type for parameter names that can be stored in flash on ESP8266
39#ifdef USE_ESP8266
40using ParamNameType = const __FlashStringHelper *;
41#else
42using ParamNameType = const char *;
43#endif
44
45// All platforms need to defer actions to main loop thread.
46// Multi-core platforms need this for thread safety.
47// ESP8266 needs this because ESPAsyncWebServer callbacks run in "sys" context
48// (SDK system context), not "cont" context (continuation/main loop). Calling
49// yield() from sys context causes a panic in the Arduino core.
50#define DEFER_ACTION(capture, action) this->defer([capture]() mutable { action; })
51
57
59struct UrlMatch {
63#ifdef USE_DEVICES
65#endif
66 bool valid{false};
67
68 // Helper methods for string comparisons
69 bool domain_equals(const char *str) const { return this->domain == str; }
70 bool method_equals(const char *str) const { return this->method == str; }
71
72#ifdef USE_ESP8266
73 // Overloads for flash strings on ESP8266
74 bool domain_equals(const __FlashStringHelper *str) const { return this->domain == str; }
75 bool method_equals(const __FlashStringHelper *str) const { return this->method == str; }
76#endif
77
81};
82
83#ifdef USE_WEBSERVER_SORTING
85 float weight;
86 uint64_t group_id;
87};
88
90 std::string name;
91 float weight;
92};
93#endif
94
96
97/*
98 In order to defer updates in arduino mode, we need to create one AsyncEventSource per incoming request to /events.
99 This is because only minimal changes were made to the ESPAsyncWebServer lib_dep, it was undesirable to put deferred
100 update logic into that library. We need one deferred queue per connection so instead of one AsyncEventSource with
101 multiple clients, we have multiple event sources with one client each. This is slightly awkward which is why it's
102 implemented in a more straightforward way for ESP-IDF. Arduino platform will eventually go away and this workaround
103 can be forgotten.
104*/
105#if !defined(USE_ESP32) && defined(USE_ARDUINO)
106using message_generator_t = std::string(WebServer *, void *);
107
109class DeferredUpdateEventSource : public AsyncEventSource {
111
112 /*
113 This class holds a pointer to the source component that wants to publish a state event, and a pointer to a function
114 that will lazily generate that event. The two pointers allow dedup in the deferred queue if multiple publishes for
115 the same component are backed up, and take up only two pointers of memory. The entry in the deferred queue (a
116 std::vector) is the DeferredEvent instance itself (not a pointer to one elsewhere in heap) so still only two
117 pointers per entry (and no heap fragmentation). Even 100 backed up events (you'd have to have at least 100 sensors
118 publishing because of dedup) would take up only 0.8 kB.
119 */
120 struct DeferredEvent {
121 friend class DeferredUpdateEventSource;
122
123 protected:
124 void *source_;
125 message_generator_t *message_generator_;
126
127 public:
128 DeferredEvent(void *source, message_generator_t *message_generator)
129 : source_(source), message_generator_(message_generator) {}
130 bool operator==(const DeferredEvent &test) const {
131 return (source_ == test.source_ && message_generator_ == test.message_generator_);
132 }
133 };
134 static_assert(sizeof(DeferredEvent) == sizeof(void *) + sizeof(message_generator_t *),
135 "DeferredEvent should have no padding");
136
137 protected:
138 // surface a couple methods from the base class
139 using AsyncEventSource::handleRequest;
140 using AsyncEventSource::send;
141
143 // vector is used very specifically for its zero memory overhead even though items are popped from the front (memory
144 // footprint is more important than speed here)
145 std::vector<DeferredEvent> deferred_queue_;
148 static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES = 2500; // ~20 seconds at 125Hz loop rate
149
150 // helper for allowing only unique entries in the queue
151 void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator);
152
154
155 public:
156 DeferredUpdateEventSource(WebServer *ws, const String &url)
157 : AsyncEventSource(url), entities_iterator_(ListEntitiesIterator(ws, this)), web_server_(ws) {}
158
159 void loop();
160
161 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator);
162 void try_send_nodefer(const char *message, const char *event = nullptr, uint32_t id = 0, uint32_t reconnect = 0);
163};
164
165class DeferredUpdateEventSourceList : public std::list<DeferredUpdateEventSource *> {
166 protected:
169
170 public:
171 void loop();
172
173 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator);
174 void try_send_nodefer(const char *message, const char *event = nullptr, uint32_t id = 0, uint32_t reconnect = 0);
175
176 void add_new_client(WebServer *ws, AsyncWebServerRequest *request);
177};
178#endif
179
189class WebServer : public Controller,
190 public Component,
191 public AsyncWebHandler
192#ifdef USE_LOGGER
193 ,
195#endif
196{
197#if !defined(USE_ESP32) && defined(USE_ARDUINO)
199#endif
200
201 public:
203
204#if USE_WEBSERVER_VERSION == 1
210 void set_css_url(const char *css_url);
211
217 void set_js_url(const char *js_url);
218#endif
219
220#ifdef USE_WEBSERVER_CSS_INCLUDE
225 void set_css_include(const char *css_include);
226#endif
227
228#ifdef USE_WEBSERVER_JS_INCLUDE
233 void set_js_include(const char *js_include);
234#endif
235
241 void set_include_internal(bool include_internal) { include_internal_ = include_internal; }
246 void set_expose_log(bool expose_log) { this->expose_log_ = expose_log; }
247
248 // ========== INTERNAL METHODS ==========
249 // (In most use cases you won't need these)
251 void setup() override;
252 void loop() override;
253
254 void dump_config() override;
255
256#ifdef USE_LOGGER
257 void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override;
258#endif
259
261 float get_setup_priority() const override;
262
264 void handle_index_request(AsyncWebServerRequest *request);
265
267 std::string get_config_json();
268
269#ifdef USE_WEBSERVER_CSS_INCLUDE
271 void handle_css_request(AsyncWebServerRequest *request);
272#endif
273
274#ifdef USE_WEBSERVER_JS_INCLUDE
276 void handle_js_request(AsyncWebServerRequest *request);
277#endif
278
279#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
280 // Handle Private Network Access CORS OPTIONS request
281 void handle_pna_cors_request(AsyncWebServerRequest *request);
282#endif
283
284#ifdef USE_SENSOR
285 void on_sensor_update(sensor::Sensor *obj) override;
287 void handle_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
288
289 static std::string sensor_state_json_generator(WebServer *web_server, void *source);
290 static std::string sensor_all_json_generator(WebServer *web_server, void *source);
291#endif
292
293#ifdef USE_SWITCH
294 void on_switch_update(switch_::Switch *obj) override;
295
297 void handle_switch_request(AsyncWebServerRequest *request, const UrlMatch &match);
298
299 static std::string switch_state_json_generator(WebServer *web_server, void *source);
300 static std::string switch_all_json_generator(WebServer *web_server, void *source);
301#endif
302
303#ifdef USE_BUTTON
305 void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match);
306
307 // Buttons are stateless, so there is no button_state_json_generator
308 static std::string button_all_json_generator(WebServer *web_server, void *source);
309#endif
310
311#ifdef USE_BINARY_SENSOR
313
315 void handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
316
317 static std::string binary_sensor_state_json_generator(WebServer *web_server, void *source);
318 static std::string binary_sensor_all_json_generator(WebServer *web_server, void *source);
319#endif
320
321#ifdef USE_FAN
322 void on_fan_update(fan::Fan *obj) override;
323
325 void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match);
326
327 static std::string fan_state_json_generator(WebServer *web_server, void *source);
328 static std::string fan_all_json_generator(WebServer *web_server, void *source);
329#endif
330
331#ifdef USE_LIGHT
332 void on_light_update(light::LightState *obj) override;
333
335 void handle_light_request(AsyncWebServerRequest *request, const UrlMatch &match);
336
337 static std::string light_state_json_generator(WebServer *web_server, void *source);
338 static std::string light_all_json_generator(WebServer *web_server, void *source);
339#endif
340
341#ifdef USE_TEXT_SENSOR
343
345 void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
346
347 static std::string text_sensor_state_json_generator(WebServer *web_server, void *source);
348 static std::string text_sensor_all_json_generator(WebServer *web_server, void *source);
349#endif
350
351#ifdef USE_COVER
352 void on_cover_update(cover::Cover *obj) override;
353
355 void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match);
356
357 static std::string cover_state_json_generator(WebServer *web_server, void *source);
358 static std::string cover_all_json_generator(WebServer *web_server, void *source);
359#endif
360
361#ifdef USE_NUMBER
362 void on_number_update(number::Number *obj) override;
364 void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match);
365
366 static std::string number_state_json_generator(WebServer *web_server, void *source);
367 static std::string number_all_json_generator(WebServer *web_server, void *source);
368#endif
369
370#ifdef USE_DATETIME_DATE
371 void on_date_update(datetime::DateEntity *obj) override;
373 void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match);
374
375 static std::string date_state_json_generator(WebServer *web_server, void *source);
376 static std::string date_all_json_generator(WebServer *web_server, void *source);
377#endif
378
379#ifdef USE_DATETIME_TIME
380 void on_time_update(datetime::TimeEntity *obj) override;
382 void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match);
383
384 static std::string time_state_json_generator(WebServer *web_server, void *source);
385 static std::string time_all_json_generator(WebServer *web_server, void *source);
386#endif
387
388#ifdef USE_DATETIME_DATETIME
391 void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match);
392
393 static std::string datetime_state_json_generator(WebServer *web_server, void *source);
394 static std::string datetime_all_json_generator(WebServer *web_server, void *source);
395#endif
396
397#ifdef USE_TEXT
398 void on_text_update(text::Text *obj) override;
400 void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match);
401
402 static std::string text_state_json_generator(WebServer *web_server, void *source);
403 static std::string text_all_json_generator(WebServer *web_server, void *source);
404#endif
405
406#ifdef USE_SELECT
407 void on_select_update(select::Select *obj) override;
409 void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match);
410
411 static std::string select_state_json_generator(WebServer *web_server, void *source);
412 static std::string select_all_json_generator(WebServer *web_server, void *source);
413#endif
414
415#ifdef USE_CLIMATE
416 void on_climate_update(climate::Climate *obj) override;
418 void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match);
419
420 static std::string climate_state_json_generator(WebServer *web_server, void *source);
421 static std::string climate_all_json_generator(WebServer *web_server, void *source);
422#endif
423
424#ifdef USE_LOCK
425 void on_lock_update(lock::Lock *obj) override;
426
428 void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match);
429
430 static std::string lock_state_json_generator(WebServer *web_server, void *source);
431 static std::string lock_all_json_generator(WebServer *web_server, void *source);
432#endif
433
434#ifdef USE_VALVE
435 void on_valve_update(valve::Valve *obj) override;
436
438 void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match);
439
440 static std::string valve_state_json_generator(WebServer *web_server, void *source);
441 static std::string valve_all_json_generator(WebServer *web_server, void *source);
442#endif
443
444#ifdef USE_ALARM_CONTROL_PANEL
446
448 void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match);
449
450 static std::string alarm_control_panel_state_json_generator(WebServer *web_server, void *source);
451 static std::string alarm_control_panel_all_json_generator(WebServer *web_server, void *source);
452#endif
453
454#ifdef USE_WATER_HEATER
456
458 void handle_water_heater_request(AsyncWebServerRequest *request, const UrlMatch &match);
459
460 static std::string water_heater_state_json_generator(WebServer *web_server, void *source);
461 static std::string water_heater_all_json_generator(WebServer *web_server, void *source);
462#endif
463
464#ifdef USE_INFRARED
466 void handle_infrared_request(AsyncWebServerRequest *request, const UrlMatch &match);
467
468 static std::string infrared_all_json_generator(WebServer *web_server, void *source);
469#endif
470
471#ifdef USE_EVENT
472 void on_event(event::Event *obj) override;
473
474 static std::string event_state_json_generator(WebServer *web_server, void *source);
475 static std::string event_all_json_generator(WebServer *web_server, void *source);
476
478 void handle_event_request(AsyncWebServerRequest *request, const UrlMatch &match);
479#endif
480
481#ifdef USE_UPDATE
482 void on_update(update::UpdateEntity *obj) override;
483
485 void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match);
486
487 static std::string update_state_json_generator(WebServer *web_server, void *source);
488 static std::string update_all_json_generator(WebServer *web_server, void *source);
489#endif
490
492 bool canHandle(AsyncWebServerRequest *request) const override;
494 void handleRequest(AsyncWebServerRequest *request) override;
496 bool isRequestHandlerTrivial() const override; // NOLINT(readability-identifier-naming)
497
498#ifdef USE_WEBSERVER_SORTING
499 void add_entity_config(EntityBase *entity, float weight, uint64_t group);
500 void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight);
501
502 std::map<EntityBase *, SortingComponents> sorting_entitys_;
503 std::map<uint64_t, SortingGroup> sorting_groups_;
504#endif
505
506 bool include_internal_{false};
507
508 protected:
509 void add_sorting_info_(JsonObject &root, EntityBase *entity);
510
511#ifdef USE_LIGHT
512 // Helper to parse and apply a float parameter with optional scaling
513 template<typename T, typename Ret>
514 void parse_light_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(float),
515 float scale = 1.0f) {
516 if (request->hasParam(param_name)) {
517 auto value = parse_number<float>(request->getParam(param_name)->value().c_str());
518 if (value.has_value()) {
519 (call.*setter)(*value / scale);
520 }
521 }
522 }
523
524 // Helper to parse and apply a uint32_t parameter with optional scaling
525 template<typename T, typename Ret>
526 void parse_light_param_uint_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
527 Ret (T::*setter)(uint32_t), uint32_t scale = 1) {
528 if (request->hasParam(param_name)) {
529 auto value = parse_number<uint32_t>(request->getParam(param_name)->value().c_str());
530 if (value.has_value()) {
531 (call.*setter)(*value * scale);
532 }
533 }
534 }
535#endif
536
537 // Generic helper to parse and apply a float parameter
538 template<typename T, typename Ret>
539 void parse_float_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(float)) {
540 if (request->hasParam(param_name)) {
541 auto value = parse_number<float>(request->getParam(param_name)->value().c_str());
542 if (value.has_value()) {
543 (call.*setter)(*value);
544 }
545 }
546 }
547
548 // Generic helper to parse and apply an int parameter
549 template<typename T, typename Ret>
550 void parse_int_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(int)) {
551 if (request->hasParam(param_name)) {
552 auto value = parse_number<int>(request->getParam(param_name)->value().c_str());
553 if (value.has_value()) {
554 (call.*setter)(*value);
555 }
556 }
557 }
558
559 // Generic helper to parse and apply a string parameter
560 template<typename T, typename Ret>
561 void parse_string_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
562 Ret (T::*setter)(const std::string &)) {
563 if (request->hasParam(param_name)) {
564 // .c_str() is required for Arduino framework where value() returns Arduino String instead of std::string
565 std::string value = request->getParam(param_name)->value().c_str(); // NOLINT(readability-redundant-string-cstr)
566 (call.*setter)(value);
567 }
568 }
569
570 // Generic helper to parse and apply a bool parameter
571 // Accepts: "on", "true", "1" (case-insensitive) as true
572 // Accepts: "off", "false", "0" (case-insensitive) as false
573 // Invalid values are ignored (setter not called)
574 template<typename T, typename Ret>
575 void parse_bool_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(bool)) {
576 if (request->hasParam(param_name)) {
577 auto param_value = request->getParam(param_name)->value();
578 // First check on/off (default), then true/false (custom)
579 auto val = parse_on_off(param_value.c_str());
580 if (val == PARSE_NONE) {
581 val = parse_on_off(param_value.c_str(), "true", "false");
582 }
583 if (val == PARSE_ON || param_value == "1") {
584 (call.*setter)(true);
585 } else if (val == PARSE_OFF || param_value == "0") {
586 (call.*setter)(false);
587 }
588 // PARSE_NONE/PARSE_TOGGLE: ignore invalid values
589 }
590 }
591
593#ifdef USE_ESP32
594 AsyncEventSource events_{"/events", this};
595#elif USE_ARDUINO
597#endif
598
599#if USE_WEBSERVER_VERSION == 1
600 const char *css_url_{nullptr};
601 const char *js_url_{nullptr};
602#endif
603#ifdef USE_WEBSERVER_CSS_INCLUDE
604 const char *css_include_{nullptr};
605#endif
606#ifdef USE_WEBSERVER_JS_INCLUDE
607 const char *js_include_{nullptr};
608#endif
609 bool expose_log_{true};
610
611 private:
612#ifdef USE_SENSOR
613 std::string sensor_json_(sensor::Sensor *obj, float value, JsonDetail start_config);
614#endif
615#ifdef USE_SWITCH
616 std::string switch_json_(switch_::Switch *obj, bool value, JsonDetail start_config);
617#endif
618#ifdef USE_BUTTON
619 std::string button_json_(button::Button *obj, JsonDetail start_config);
620#endif
621#ifdef USE_BINARY_SENSOR
622 std::string binary_sensor_json_(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config);
623#endif
624#ifdef USE_FAN
625 std::string fan_json_(fan::Fan *obj, JsonDetail start_config);
626#endif
627#ifdef USE_LIGHT
628 std::string light_json_(light::LightState *obj, JsonDetail start_config);
629#endif
630#ifdef USE_TEXT_SENSOR
631 std::string text_sensor_json_(text_sensor::TextSensor *obj, const std::string &value, JsonDetail start_config);
632#endif
633#ifdef USE_COVER
634 std::string cover_json_(cover::Cover *obj, JsonDetail start_config);
635#endif
636#ifdef USE_NUMBER
637 std::string number_json_(number::Number *obj, float value, JsonDetail start_config);
638#endif
639#ifdef USE_DATETIME_DATE
640 std::string date_json_(datetime::DateEntity *obj, JsonDetail start_config);
641#endif
642#ifdef USE_DATETIME_TIME
643 std::string time_json_(datetime::TimeEntity *obj, JsonDetail start_config);
644#endif
645#ifdef USE_DATETIME_DATETIME
646 std::string datetime_json_(datetime::DateTimeEntity *obj, JsonDetail start_config);
647#endif
648#ifdef USE_TEXT
649 std::string text_json_(text::Text *obj, const std::string &value, JsonDetail start_config);
650#endif
651#ifdef USE_SELECT
652 std::string select_json_(select::Select *obj, StringRef value, JsonDetail start_config);
653#endif
654#ifdef USE_CLIMATE
655 std::string climate_json_(climate::Climate *obj, JsonDetail start_config);
656#endif
657#ifdef USE_LOCK
658 std::string lock_json_(lock::Lock *obj, lock::LockState value, JsonDetail start_config);
659#endif
660#ifdef USE_VALVE
661 std::string valve_json_(valve::Valve *obj, JsonDetail start_config);
662#endif
663#ifdef USE_ALARM_CONTROL_PANEL
664 std::string alarm_control_panel_json_(alarm_control_panel::AlarmControlPanel *obj,
666#endif
667#ifdef USE_EVENT
668 std::string event_json_(event::Event *obj, StringRef event_type, JsonDetail start_config);
669#endif
670#ifdef USE_WATER_HEATER
671 std::string water_heater_json_(water_heater::WaterHeater *obj, JsonDetail start_config);
672#endif
673#ifdef USE_INFRARED
674 std::string infrared_json_(infrared::Infrared *obj, JsonDetail start_config);
675#endif
676#ifdef USE_UPDATE
677 std::string update_json_(update::UpdateEntity *obj, JsonDetail start_config);
678#endif
679};
680
681} // namespace esphome::web_server
682#endif
StringRef is a reference to a string owned by something else.
Definition string_ref.h:26
Base class for all binary_sensor-type classes.
Base class for all buttons.
Definition button.h:25
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:182
Base class for all cover devices.
Definition cover.h:110
Infrared - Base class for infrared remote control implementations.
Definition infrared.h:110
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
Definition light_state.h:91
Base class for all locks.
Definition lock.h:110
Interface for receiving log messages without std::function overhead.
Definition logger.h:60
Base-class for all numbers.
Definition number.h:29
Base-class for all selects.
Definition select.h:29
Base-class for all sensors.
Definition sensor.h:43
Base class for all switches.
Definition switch.h:39
Base-class for all text inputs.
Definition text.h:22
Base class for all valve devices.
Definition valve.h:104
DeferredUpdateEventSource(WebServer *ws, const String &url)
Definition web_server.h:156
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
Definition web_server.h:148
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)
std::vector< DeferredEvent > deferred_queue_
Definition web_server.h:145
void on_client_connect_(DeferredUpdateEventSource *source)
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_disconnect_(DeferredUpdateEventSource *source)
This class allows users to create a web server with their ESP nodes.
Definition web_server.h:196
static std::string water_heater_state_json_generator(WebServer *web_server, void *source)
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)
void on_water_heater_update(water_heater::WaterHeater *obj) override
void set_expose_log(bool expose_log)
Set whether or not the webserver should expose the Log.
Definition web_server.h:246
static std::string water_heater_all_json_generator(WebServer *web_server, void *source)
std::string get_config_json()
Return the webserver configuration as JSON.
std::map< EntityBase *, SortingComponents > sorting_entitys_
Definition web_server.h:502
static std::string binary_sensor_state_json_generator(WebServer *web_server, void *source)
void parse_string_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(const std::string &))
Definition web_server.h:561
void on_text_update(text::Text *obj) override
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)
void parse_float_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(float))
Definition web_server.h:539
void on_cover_update(cover::Cover *obj) override
static std::string text_state_json_generator(WebServer *web_server, void *source)
void set_css_url(const char *css_url)
Set the URL to the CSS <link> that's sent to each client.
void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a select request under '/select/<id>'.
static std::string event_state_json_generator(WebServer *web_server, void *source)
void handle_water_heater_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a water_heater request under '/water_heater/<id>/<mode/set>'.
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)
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 on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override
void parse_light_param_uint_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(uint32_t), uint32_t scale=1)
Definition web_server.h:526
DeferredUpdateEventSourceList events_
Definition web_server.h:596
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
void on_number_update(number::Number *obj) override
void add_entity_config(EntityBase *entity, float weight, uint64_t group)
void set_include_internal(bool include_internal)
Determine whether internal components should be displayed on the web server.
Definition web_server.h:241
void parse_light_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(float), float scale=1.0f)
Definition web_server.h:514
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
static std::string switch_state_json_generator(WebServer *web_server, void *source)
void parse_int_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(int))
Definition web_server.h:550
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>'.
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)
void on_switch_update(switch_::Switch *obj) override
web_server_base::WebServerBase * base_
Definition web_server.h:592
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)
void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text sensor request under '/text_sensor/<id>'.
void parse_bool_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(bool))
Definition web_server.h:575
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 set_js_url(const char *js_url)
Set the URL to the script that's embedded in the index page.
void handle_infrared_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle an infrared request under '/infrared/<id>/transmit'.
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.
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
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 infrared_all_json_generator(WebServer *web_server, void *source)
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>'.
void on_sensor_update(sensor::Sensor *obj) override
std::map< uint64_t, SortingGroup > sorting_groups_
Definition web_server.h:503
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.
void on_event(event::Event *obj) override
void handle_pna_cors_request(AsyncWebServerRequest *request)
void on_fan_update(fan::Fan *obj) override
void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a datetime request under '/datetime/<id>'.
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 on_select_update(select::Select *obj) override
void on_time_update(datetime::TimeEntity *obj) override
static std::string update_all_json_generator(WebServer *web_server, void *source)
void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a update request under '/update/<id>'.
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)
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>'.
void on_text_sensor_update(text_sensor::TextSensor *obj) override
const char * message
Definition component.cpp:38
mopeka_std_values val[4]
LockState
Enum for all states a lock can be in.
Definition lock.h:23
const __FlashStringHelper * ParamNameType
Definition web_server.h:40
std::string(WebServer *, void *) message_generator_t
Definition web_server.h:106
ParseOnOffState parse_on_off(const char *str, const char *on, const char *off)
Parse a string that contains either on, off or toggle.
Definition helpers.cpp:454
optional< T > parse_number(const char *str)
Parse an unsigned decimal number from a null-terminated string.
Definition helpers.h:785
@ PARSE_ON
Definition helpers.h:1293
@ PARSE_OFF
Definition helpers.h:1294
@ PARSE_NONE
Definition helpers.h:1292
Result of matching a URL against an entity.
Definition web_server.h:53
bool matched
True if entity matched the URL.
Definition web_server.h:54
bool action_is_empty
True if no action/method segment in URL.
Definition web_server.h:55
Internal helper struct that is used to parse incoming URLs.
Definition web_server.h:59
StringRef device_name
Device name within URL, empty for main device.
Definition web_server.h:64
bool valid
Whether this match is valid.
Definition web_server.h:66
bool domain_equals(const __FlashStringHelper *str) const
Definition web_server.h:74
EntityMatchResult match_entity(EntityBase *entity) const
Match entity by name first, then fall back to object_id with deprecation warning Returns EntityMatchR...
StringRef method
Method within URL, for example "turn_on".
Definition web_server.h:62
bool domain_equals(const char *str) const
Definition web_server.h:69
bool method_equals(const __FlashStringHelper *str) const
Definition web_server.h:75
bool method_equals(const char *str) const
Definition web_server.h:70
StringRef domain
Domain within URL, for example "sensor".
Definition web_server.h:60
StringRef id
Entity name/id within URL, for example "Temperature".
Definition web_server.h:61
const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM
Definition web_server.h:27
const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE
const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE
const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE