ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
web_server.h
Go to the documentation of this file.
1#pragma once
2
3#include "list_entities.h"
4
8#ifdef USE_WEBSERVER
13#ifdef USE_LOGGER
15#endif
16
17#include <functional>
18#include <list>
19#include <map>
20#include <string>
21#include <utility>
22#include <vector>
23
24#if USE_WEBSERVER_VERSION >= 2
25extern const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM;
26extern const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE;
27#endif
28
29#ifdef USE_WEBSERVER_CSS_INCLUDE
30extern const uint8_t ESPHOME_WEBSERVER_CSS_INCLUDE[] PROGMEM;
31extern const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE;
32#endif
33
34#ifdef USE_WEBSERVER_JS_INCLUDE
35extern const uint8_t ESPHOME_WEBSERVER_JS_INCLUDE[] PROGMEM;
36extern const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE;
37#endif
38
39namespace esphome::web_server {
40
41// ESP-IDF cuts a log event here: nothing a browser log view needs is longer, and it bounds the
42// tail a stalled client keeps. The Arduino backend takes a C string and sends the whole line.
43constexpr size_t LOG_EVENT_MAX_LEN = 512;
44
45// Parameter names live in flash on ESP8266
47
48// All platforms need to defer actions to main loop thread.
49// Multi-core platforms need this for thread safety.
50// ESP8266 needs this because ESPAsyncWebServer callbacks run in "sys" context
51// (SDK system context), not "cont" context (continuation/main loop). Calling
52// yield() from sys context causes a panic in the Arduino core.
53#define DEFER_ACTION(capture, action) this->defer([capture]() mutable { action; })
54
60
62struct UrlMatch {
66#ifdef USE_DEVICES
68#endif
69 bool valid{false};
70 bool include_internal{false};
71
72 // Helper methods for string comparisons
73 bool domain_equals(const char *str) const { return this->domain == str; }
74 bool method_equals(const char *str) const { return this->method == str; }
75
76#ifdef USE_ESP8266
77 // Overloads for flash strings on ESP8266
78 bool domain_equals(const __FlashStringHelper *str) const { return this->domain == str; }
79 bool method_equals(const __FlashStringHelper *str) const { return this->method == str; }
80#endif
81
85};
86
87#ifdef USE_WEBSERVER_SORTING
89 float weight;
90 uint64_t group_id;
91};
92
94 std::string name;
95 float weight;
96};
97#endif
98
100
101/*
102 In order to defer updates in arduino mode, we need to create one AsyncEventSource per incoming request to /events.
103 This is because only minimal changes were made to the ESPAsyncWebServer lib_dep, it was undesirable to put deferred
104 update logic into that library. We need one deferred queue per connection so instead of one AsyncEventSource with
105 multiple clients, we have multiple event sources with one client each. This is slightly awkward which is why it's
106 implemented in a more straightforward way for ESP-IDF. Arduino platform will eventually go away and this workaround
107 can be forgotten.
108*/
109#if !defined(USE_ESP32) && defined(USE_ARDUINO)
111
113class DeferredUpdateEventSource final : public AsyncEventSource {
115
116 /*
117 This class holds a pointer to the source component that wants to publish a state event, and a pointer to a function
118 that will lazily generate that event. The two pointers allow dedup in the deferred queue if multiple publishes for
119 the same component are backed up, and take up only two pointers of memory. The entry in the deferred queue (a
120 std::vector) is the DeferredEvent instance itself (not a pointer to one elsewhere in heap) so still only two
121 pointers per entry (and no heap fragmentation). Even 100 backed up events (you'd have to have at least 100 sensors
122 publishing because of dedup) would take up only 0.8 kB.
123 */
124 struct DeferredEvent {
125 friend class DeferredUpdateEventSource;
126
127 protected:
128 void *source_;
129 message_generator_t *message_generator_;
130
131 public:
132 DeferredEvent(void *source, message_generator_t *message_generator)
133 : source_(source), message_generator_(message_generator) {}
134 bool operator==(const DeferredEvent &test) const {
135 return (source_ == test.source_ && message_generator_ == test.message_generator_);
136 }
137 };
138 static_assert(sizeof(DeferredEvent) == sizeof(void *) + sizeof(message_generator_t *),
139 "DeferredEvent should have no padding");
140
141 protected:
142 // surface a couple methods from the base class
143 using AsyncEventSource::handleRequest;
144 using AsyncEventSource::send;
145
147 // vector is used very specifically for its zero memory overhead even though items are popped from the front (memory
148 // footprint is more important than speed here)
149 std::vector<DeferredEvent> deferred_queue_;
152 static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES = 2500; // ~20 seconds at 125Hz loop rate
153
154 // helper for allowing only unique entries in the queue
155 void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator);
156
158
159 public:
160 DeferredUpdateEventSource(WebServer *ws, const String &url)
161 : AsyncEventSource(url), entities_iterator_(ListEntitiesIterator(ws, this)), web_server_(ws) {}
162
163 void loop();
164
165 // detail_all events go out while entities are still being listed; state events wait until listing is done
166 void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator);
167 // The old event name argument would otherwise convert to true
168 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator) = delete;
169 void try_send_nodefer(const char *message, size_t message_len, const char *event = nullptr, uint32_t id = 0,
170 uint32_t reconnect = 0);
171};
172
173class DeferredUpdateEventSourceList final : public std::list<DeferredUpdateEventSource *> {
174 protected:
177
178 public:
180 bool loop();
181
182 void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator);
183 // The old event name argument would otherwise convert to true
184 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator) = delete;
185 void try_send_nodefer(const char *message, size_t message_len, const char *event = nullptr, uint32_t id = 0,
186 uint32_t reconnect = 0);
187
188 void add_new_client(WebServer *ws, AsyncWebServerRequest *request);
189};
190#endif
191
201class WebServer final : public Component, public AsyncWebHandler {
202#if !defined(USE_ESP32) && defined(USE_ARDUINO)
204#endif
205
206 public:
208
209#if USE_WEBSERVER_VERSION == 1
215 void set_css_url(const char *css_url) { this->css_url_ = css_url; }
216
222 void set_js_url(const char *js_url) { this->js_url_ = js_url; }
223#endif
224
225#ifdef USE_WEBSERVER_CSS_INCLUDE
230 void set_css_include(const char *css_include) { this->css_include_ = css_include; }
231#endif
232
233#ifdef USE_WEBSERVER_JS_INCLUDE
238 void set_js_include(const char *js_include) { this->js_include_ = js_include; }
239#endif
240
246 void set_include_internal(bool include_internal) { include_internal_ = include_internal; }
251 void set_expose_log(bool expose_log) { this->expose_log_ = expose_log; }
252
253#ifdef USE_WEBSERVER_ALLOWED_ORIGINS
266 void set_allowed_origins(const char *const *origins) { this->allowed_origins_ = origins; }
267#endif
268
269 // ========== INTERNAL METHODS ==========
270 // (In most use cases you won't need these)
272 void setup() override;
273 void loop() override;
274
275 void dump_config() override;
276
277#ifdef USE_LOGGER
278 void on_log(uint8_t level, const char *tag, const char *message, size_t message_len);
279#endif
280
282 float get_setup_priority() const override;
283
285 void handle_index_request(AsyncWebServerRequest *request);
286
287#ifdef USE_WEBSERVER_CAPTIVE
290 void start_captive();
291 void end_captive();
292 bool is_captive() const { return this->dns_.is_running(); }
293#endif
294
297
298#ifdef USE_WEBSERVER_CSS_INCLUDE
300 void handle_css_request(AsyncWebServerRequest *request);
301#endif
302
303#ifdef USE_WEBSERVER_JS_INCLUDE
305 void handle_js_request(AsyncWebServerRequest *request);
306#endif
307
308#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
309 // Handle Private Network Access CORS OPTIONS request
310 void handle_pna_cors_request(AsyncWebServerRequest *request);
311#endif
312
313#ifdef USE_SENSOR
316 void handle_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
317
318 static void sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
319 static void sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
320#endif
321
322#ifdef USE_SWITCH
324
326 void handle_switch_request(AsyncWebServerRequest *request, const UrlMatch &match);
327
328 static void switch_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
329 static void switch_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
330#endif
331
332#ifdef USE_BUTTON
334 void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match);
335
336 // Buttons are stateless, so there is no button_state_json_generator
337 static void button_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
338#endif
339
340#ifdef USE_BINARY_SENSOR
342
344 void handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
345
346 static void binary_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
347 static void binary_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
348#endif
349
350#ifdef USE_FAN
351 void on_fan_update(fan::Fan *obj);
352
354 void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match);
355
356 static void fan_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
357 static void fan_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
358#endif
359
360#ifdef USE_LIGHT
362
364 void handle_light_request(AsyncWebServerRequest *request, const UrlMatch &match);
365
366 static void light_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
367 static void light_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
368#endif
369
370#ifdef USE_TEXT_SENSOR
372
374 void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
375
376 static void text_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
377 static void text_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
378#endif
379
380#ifdef USE_COVER
381 void on_cover_update(cover::Cover *obj);
382
384 void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match);
385
386 static void cover_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
387 static void cover_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
388#endif
389
390#ifdef USE_NUMBER
393 void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match);
394
395 static void number_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
396 static void number_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
397#endif
398
399#ifdef USE_DATETIME_DATE
402 void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match);
403
404 static void date_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
405 static void date_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
406#endif
407
408#ifdef USE_DATETIME_TIME
411 void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match);
412
413 static void time_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
414 static void time_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
415#endif
416
417#ifdef USE_DATETIME_DATETIME
420 void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match);
421
422 static void datetime_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
423 static void datetime_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
424#endif
425
426#ifdef USE_TEXT
427 void on_text_update(text::Text *obj);
429 void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match);
430
431 static void text_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
432 static void text_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
433#endif
434
435#ifdef USE_SELECT
438 void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match);
439
440 static void select_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
441 static void select_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
442#endif
443
444#ifdef USE_CLIMATE
447 void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match);
448
449 static void climate_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
450 static void climate_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
451#endif
452
453#ifdef USE_LOCK
454 void on_lock_update(lock::Lock *obj);
455
457 void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match);
458
459 static void lock_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
460 static void lock_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
461#endif
462
463#ifdef USE_VALVE
464 void on_valve_update(valve::Valve *obj);
465
467 void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match);
468
469 static void valve_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
470 static void valve_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
471#endif
472
473#ifdef USE_ALARM_CONTROL_PANEL
475
477 void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match);
478
479 static void alarm_control_panel_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
480 static void alarm_control_panel_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
481#endif
482
483#ifdef USE_WATER_HEATER
485
487 void handle_water_heater_request(AsyncWebServerRequest *request, const UrlMatch &match);
488
489 static void water_heater_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
490 static void water_heater_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
491#endif
492
493#ifdef USE_INFRARED
495 void handle_infrared_request(AsyncWebServerRequest *request, const UrlMatch &match);
496
497 static void infrared_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
498#endif
499#ifdef USE_RADIO_FREQUENCY
501 void handle_radio_frequency_request(AsyncWebServerRequest *request, const UrlMatch &match);
502
503 static void radio_frequency_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
504#endif
505
506#ifdef USE_MEDIA_PLAYER
507 // Not exposed over HTTP; the stub only satisfies ControllerContract
509#endif
510
511#ifdef USE_EVENT
512 void on_event(event::Event *obj);
513
514 static void event_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
515 static void event_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
516
518 void handle_event_request(AsyncWebServerRequest *request, const UrlMatch &match);
519#endif
520
521#ifdef USE_UPDATE
523
525 void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match);
526
527 static void update_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
528 static void update_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
529#endif
530
532 bool canHandle(AsyncWebServerRequest *request) const override;
534 void handleRequest(AsyncWebServerRequest *request) override;
536 bool isRequestHandlerTrivial() const override; // NOLINT(readability-identifier-naming)
537
538#ifdef USE_WEBSERVER_SORTING
539 void add_entity_config(EntityBase *entity, float weight, uint64_t group);
540 void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight);
541
542 std::map<EntityBase *, SortingComponents> sorting_entitys_;
543 std::map<uint64_t, SortingGroup> sorting_groups_;
544#endif
545
546 bool include_internal_{false};
547
548 protected:
549 // Declared here so it packs into the padding after include_internal_
550 bool expose_log_{true};
551
552 // Out of line so the per-domain update callbacks stay small
553 // source stays the concrete entity pointer, since the generators cast it back to that type
554 template<typename T> void send_state_event_(T *obj, message_generator_t *generator) {
555 this->send_state_event_(obj, static_cast<const EntityBase *>(obj), generator);
556 }
557 void send_state_event_(void *source, const EntityBase *entity, message_generator_t *generator);
558
559 void add_sorting_info_(JsonObject &root, EntityBase *entity);
560
561#ifdef USE_LIGHT
562 // Helper to parse and apply a float parameter with optional scaling
563 template<typename T, typename Ret>
564 void parse_light_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(float),
565 float scale = 1.0f) {
566 auto value = parse_number<float>(request->arg(param_name).c_str());
567 if (value.has_value()) {
568 (call.*setter)(*value / scale);
569 }
570 }
571
572 // Helper to parse and apply a uint32_t parameter with optional scaling
573 template<typename T, typename Ret>
574 void parse_light_param_uint_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
575 Ret (T::*setter)(uint32_t), uint32_t scale = 1) {
576 auto value = parse_number<uint32_t>(request->arg(param_name).c_str());
577 if (value.has_value()) {
578 (call.*setter)(*value * scale);
579 }
580 }
581#endif
582
583 // Generic helper to parse and apply a numeric parameter
584 template<typename NumT, typename T, typename Ret>
585 void parse_num_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(NumT)) {
586 auto value = parse_number<NumT>(request->arg(param_name).c_str());
587 if (value.has_value()) {
588 (call.*setter)(*value);
589 }
590 }
591
592 // Generic helper to parse and apply a string parameter using const char* setter (avoids std::string allocation)
593 template<typename T, typename Ret>
594 void parse_cstr_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
595 Ret (T::*setter)(const char *, size_t)) {
596 if (request->hasArg(param_name)) {
597 const auto &value = request->arg(param_name);
598 (call.*setter)(value.c_str(), value.length());
599 }
600 }
601
602 // Generic helper to parse and apply a bool parameter
603 // Accepts: "on", "true", "1" (case-insensitive) as true
604 // Accepts: "off", "false", "0" (case-insensitive) as false
605 // Invalid values are ignored (setter not called)
606 template<typename T, typename Ret>
607 void parse_bool_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(bool)) {
608 const auto &param_value = request->arg(param_name);
609 // Arduino String has isEmpty() not empty(), use length() for cross-platform compatibility
610 if (param_value.length() > 0) { // NOLINT(readability-container-size-empty)
611 // First check on/off (default), then true/false (custom)
612 auto val = parse_on_off(param_value.c_str());
613 if (val == PARSE_NONE) {
614 val = parse_on_off(param_value.c_str(), "true", "false");
615 }
616 if (val == PARSE_ON || param_value == "1") {
617 (call.*setter)(true);
618 } else if (val == PARSE_OFF || param_value == "0") {
619 (call.*setter)(false);
620 }
621 // PARSE_NONE/PARSE_TOGGLE: ignore invalid values
622 }
623 }
624
626#ifdef USE_ESP32
627 AsyncEventSource events_{StringRef::from_lit("/events"), this};
628#elif USE_ARDUINO
630#endif
631#ifdef USE_WEBSERVER_CAPTIVE
632 void handle_not_found_(AsyncWebServerRequest *request);
634#endif
635
636#if USE_WEBSERVER_VERSION == 1
637 const char *css_url_{nullptr};
638 const char *js_url_{nullptr};
639#endif
640#ifdef USE_WEBSERVER_CSS_INCLUDE
641 const char *css_include_{nullptr};
642#endif
643#ifdef USE_WEBSERVER_JS_INCLUDE
644 const char *js_include_{nullptr};
645#endif
646#ifdef USE_WEBSERVER_ALLOWED_ORIGINS
647 // Extra origins allowed to make cross-origin browser requests ("*" means any origin).
648 // Only compiled when allowed_origins is configured; same-origin is always allowed regardless.
649 const char *const *allowed_origins_{nullptr};
650#endif
651
655 bool is_request_origin_allowed_(AsyncWebServerRequest *request, const std::string &origin);
656
657 private:
658#ifdef USE_SENSOR
659 void sensor_json_(sensor::Sensor *obj, float value, JsonDetail start_config, json::JsonBuilder &builder);
660#endif
661#ifdef USE_SWITCH
662 void switch_json_(switch_::Switch *obj, bool value, JsonDetail start_config, json::JsonBuilder &builder);
663#endif
664#ifdef USE_BUTTON
665 void button_json_(button::Button *obj, JsonDetail start_config, json::JsonBuilder &builder);
666#endif
667#ifdef USE_BINARY_SENSOR
668 void binary_sensor_json_(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config,
669 json::JsonBuilder &builder);
670#endif
671#ifdef USE_FAN
672 void fan_json_(fan::Fan *obj, JsonDetail start_config, json::JsonBuilder &builder);
673#endif
674#ifdef USE_LIGHT
675 void light_json_(light::LightState *obj, JsonDetail start_config, json::JsonBuilder &builder);
676#endif
677#ifdef USE_TEXT_SENSOR
678 void text_sensor_json_(text_sensor::TextSensor *obj, const std::string &value, JsonDetail start_config,
679 json::JsonBuilder &builder);
680#endif
681#ifdef USE_COVER
682 void cover_json_(cover::Cover *obj, JsonDetail start_config, json::JsonBuilder &builder);
683#endif
684#ifdef USE_NUMBER
685 void number_json_(number::Number *obj, JsonDetail start_config, json::JsonBuilder &builder);
686#endif
687#ifdef USE_DATETIME_DATE
688 void date_json_(datetime::DateEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
689#endif
690#ifdef USE_DATETIME_TIME
691 void time_json_(datetime::TimeEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
692#endif
693#ifdef USE_DATETIME_DATETIME
694 void datetime_json_(datetime::DateTimeEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
695#endif
696#ifdef USE_TEXT
697 void text_json_(text::Text *obj, const std::string &value, JsonDetail start_config, json::JsonBuilder &builder);
698#endif
699#ifdef USE_SELECT
700 void select_json_(select::Select *obj, StringRef value, JsonDetail start_config, json::JsonBuilder &builder);
701#endif
702#ifdef USE_CLIMATE
703 void climate_json_(climate::Climate *obj, JsonDetail start_config, json::JsonBuilder &builder);
704#endif
705#ifdef USE_LOCK
706 void lock_json_(lock::Lock *obj, lock::LockState value, JsonDetail start_config, json::JsonBuilder &builder);
707#endif
708#ifdef USE_VALVE
709 void valve_json_(valve::Valve *obj, JsonDetail start_config, json::JsonBuilder &builder);
710#endif
711#ifdef USE_ALARM_CONTROL_PANEL
712 void alarm_control_panel_json_(alarm_control_panel::AlarmControlPanel *obj,
714 json::JsonBuilder &builder);
715#endif
716#ifdef USE_EVENT
717 void event_json_(event::Event *obj, StringRef event_type, JsonDetail start_config, json::JsonBuilder &builder);
718#endif
719#ifdef USE_WATER_HEATER
720 void water_heater_json_(water_heater::WaterHeater *obj, JsonDetail start_config, json::JsonBuilder &builder);
721#endif
722#ifdef USE_INFRARED
723 void infrared_json_(infrared::Infrared *obj, JsonDetail start_config, json::JsonBuilder &builder);
724#endif
725#ifdef USE_RADIO_FREQUENCY
726 void radio_frequency_json_(radio_frequency::RadioFrequency *obj, JsonDetail start_config, json::JsonBuilder &builder);
727#endif
728#ifdef USE_UPDATE
729 void update_json_(update::UpdateEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
730#endif
731};
732
733#ifdef USE_WEBSERVER_CAPTIVE
734extern WebServer *global_web_server; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
735#endif
736
737} // namespace esphome::web_server
738#endif
StringRef is a reference to a string owned by something else.
Definition string_ref.h:31
static constexpr StringRef from_lit(const CharT(&s)[N])
Definition string_ref.h:55
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:192
Base class for all cover devices.
Definition cover.h:115
Infrared - Base class for infrared remote control implementations.
Definition infrared.h:44
Builder class for creating JSON documents without lambdas.
Definition json_util.h:256
Buffer for JSON serialization that uses stack allocation for small payloads.
Definition json_util.h:36
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
Definition light_state.h:68
Base class for all locks.
Definition lock.h:112
Base-class for all numbers.
Definition number.h:29
RadioFrequency - Base class for radio frequency implementations.
Base-class for all selects.
Definition select.h:28
Base-class for all sensors.
Definition sensor.h:47
Base class for all switches.
Definition switch.h:43
Base-class for all text inputs.
Definition text.h:20
Base class for all valve devices.
Definition valve.h:102
DeferredUpdateEventSource(WebServer *ws, const String &url)
Definition web_server.h:160
static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES
Definition web_server.h:152
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)=delete
void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator)
void try_send_nodefer(const char *message, size_t message_len, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator)
std::vector< DeferredEvent > deferred_queue_
Definition web_server.h:149
void on_client_connect_(DeferredUpdateEventSource *source)
void try_send_nodefer(const char *message, size_t message_len, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
void add_new_client(WebServer *ws, AsyncWebServerRequest *request)
void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator)
void on_client_disconnect_(DeferredUpdateEventSource *source)
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)=delete
bool loop()
Returns true if there are event sources remaining (including pending cleanup).
This class allows users to create a web server with their ESP nodes.
Definition web_server.h:201
static void alarm_control_panel_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void setup() override
Setup the internal web server and register handlers.
void start_captive()
AP mode: DNS answers every name with the AP address and unknown URLs redirect to the interface.
void set_expose_log(bool expose_log)
Set whether or not the webserver should expose the Log.
Definition web_server.h:251
static void text_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
json::SerializationBuffer get_config_json()
Return the webserver configuration as JSON.
std::map< EntityBase *, SortingComponents > sorting_entitys_
Definition web_server.h:542
static void light_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_light_update(light::LightState *obj)
void set_allowed_origins(const char *const *origins)
Set the origins that browsers are allowed to make cross-origin requests from.
Definition web_server.h:266
static void date_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_text_sensor_update(text_sensor::TextSensor *obj)
void on_lock_update(lock::Lock *obj)
void set_css_url(const char *css_url)
Set the URL to the CSS <link> that's sent to each client.
Definition web_server.h:215
void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a select request under '/select/<id>'.
void on_date_update(datetime::DateEntity *obj)
static void event_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_log(uint8_t level, const char *tag, const char *message, size_t message_len)
static void cover_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_water_heater_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a water_heater request under '/water_heater/<id>/<mode/set>'.
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>'.
static void datetime_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
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:574
static void sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
DeferredUpdateEventSourceList events_
Definition web_server.h:629
static void infrared_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void switch_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a button request under '/button/<id>/press'.
void on_update(update::UpdateEntity *obj)
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:246
void handle_radio_frequency_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a radio frequency request under '/radio_frequency/<id>/transmit'.
static void update_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void parse_light_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(float), float scale=1.0f)
Definition web_server.h:564
void handle_css_request(AsyncWebServerRequest *request)
Handle included css request under '/0.css'.
static void binary_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void water_heater_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void datetime_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void date_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void select_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void time_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_binary_sensor_update(binary_sensor::BinarySensor *obj)
void on_cover_update(cover::Cover *obj)
web_server_base::CaptiveDNS dns_
Definition web_server.h:633
static void number_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_fan_update(fan::Fan *obj)
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 void update_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text input request under '/text/<id>'.
void on_climate_update(climate::Climate *obj)
void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a cover request under '/cover/<id>/<open/close/stop/set>'.
void on_time_update(datetime::TimeEntity *obj)
static void event_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void switch_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void text_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void valve_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
web_server_base::WebServerBase * base_
Definition web_server.h:625
void on_event(event::Event *obj)
void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a lock request under '/lock/<id>/</lock/unlock/open>'.
void on_water_heater_update(water_heater::WaterHeater *obj)
void on_number_update(number::Number *obj)
static void fan_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text sensor request under '/text_sensor/<id>'.
static void select_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void parse_bool_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(bool))
Definition web_server.h:607
bool is_request_origin_allowed_(AsyncWebServerRequest *request, const std::string &origin)
Check whether the given request Origin is permitted.
void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a date request under '/date/<id>'.
void set_js_url(const char *js_url)
Set the URL to the script that's embedded in the index page.
Definition web_server.h:222
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>'.
void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a number request under '/number/<id>'.
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 on_select_update(select::Select *obj)
void on_sensor_update(sensor::Sensor *obj)
void set_js_include(const char *js_include)
Set local path to the script that's embedded in the index page.
Definition web_server.h:238
static void text_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void radio_frequency_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void time_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handleRequest(AsyncWebServerRequest *request) override
Override the web handler's handleRequest method.
void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a fan request under '/fan/<id>/</turn_on/turn_off/toggle>'.
static void button_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void parse_cstr_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(const char *, size_t))
Definition web_server.h:594
static void alarm_control_panel_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void number_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_switch_update(switch_::Switch *obj)
static void light_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
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 void lock_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a time request under '/time/<id>'.
std::map< uint64_t, SortingGroup > sorting_groups_
Definition web_server.h:543
void set_css_include(const char *css_include)
Set local path to the script that's embedded in the index page.
Definition web_server.h:230
static void fan_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
bool canHandle(AsyncWebServerRequest *request) const override
Override the web handler's canHandle method.
void on_valve_update(valve::Valve *obj)
static void water_heater_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void on_datetime_update(datetime::DateTimeEntity *obj)
void send_state_event_(T *obj, message_generator_t *generator)
Definition web_server.h:554
void handle_pna_cors_request(AsyncWebServerRequest *request)
void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj)
void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a datetime request under '/datetime/<id>'.
void on_text_update(text::Text *obj)
void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a alarm_control_panel request under '/alarm_control_panel/<id>'.
const char *const * allowed_origins_
Definition web_server.h:649
float get_setup_priority() const override
MQTT setup priority.
void handle_not_found_(AsyncWebServerRequest *request)
static void text_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void parse_num_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret(T::*setter)(NumT))
Definition web_server.h:585
static void climate_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a update request under '/update/<id>'.
void on_media_player_update(media_player::MediaPlayer *)
Definition web_server.h:508
static void lock_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight)
static void valve_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void cover_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void binary_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
static void climate_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a climate request under '/climate/<id>'.
const LogString * message
Definition component.cpp:35
mopeka_std_values val[3]
LockState
Enum for all states a lock can be in.
Definition lock.h:22
ProgmemStr ParamNameType
Definition web_server.h:46
WebServer * global_web_server
constexpr size_t LOG_EVENT_MAX_LEN
Definition web_server.h:43
void(WebServer *, void *, json::JsonBuilder &) message_generator_t
Definition web_server.h:110
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:554
optional< T > parse_number(const char *str)
Parse an unsigned decimal number from a null-terminated string.
Definition helpers.h:1352
@ PARSE_ON
Definition helpers.h:1741
@ PARSE_OFF
Definition helpers.h:1742
@ PARSE_NONE
Definition helpers.h:1740
const __FlashStringHelper * ProgmemStr
Definition progmem.h:31
static void uint32_t
Result of matching a URL against an entity.
Definition web_server.h:56
bool matched
True if entity matched the URL.
Definition web_server.h:57
bool action_is_empty
True if no action/method segment in URL.
Definition web_server.h:58
Internal helper struct that is used to parse incoming URLs.
Definition web_server.h:62
StringRef device_name
Device name within URL, empty for main device.
Definition web_server.h:67
bool valid
Whether this match is valid.
Definition web_server.h:69
bool domain_equals(const __FlashStringHelper *str) const
Definition web_server.h:78
EntityMatchResult match_entity(EntityBase *entity) const
Match entity by name; internal entities match only if include_internal is set Returns EntityMatchResu...
StringRef method
Method within URL, for example "turn_on".
Definition web_server.h:65
bool domain_equals(const char *str) const
Definition web_server.h:73
bool method_equals(const __FlashStringHelper *str) const
Definition web_server.h:79
bool method_equals(const char *str) const
Definition web_server.h:74
StringRef domain
Domain within URL, for example "sensor".
Definition web_server.h:63
StringRef id
Entity name/id within URL, for example "Temperature".
Definition web_server.h:64
bool include_internal
Whether internal entities may match, the web server's include_internal.
Definition web_server.h:70
const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM
Definition web_server.h:30
const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE
const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE
const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE