ESPHome 2026.10.2
Loading...
Searching...
No Matches
web_server.h
Go to the documentation of this file.
1#pragma once
2
3#include "list_entities.h"
4
7#ifdef USE_WEBSERVER
12#ifdef USE_LOGGER
14#endif
15
16#include <functional>
17#include <list>
18#include <map>
19#include <string>
20#include <utility>
21#include <vector>
22
23#if USE_WEBSERVER_VERSION >= 2
24extern const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM;
25extern const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE;
26#endif
27
28#ifdef USE_WEBSERVER_CSS_INCLUDE
29extern const uint8_t ESPHOME_WEBSERVER_CSS_INCLUDE[] PROGMEM;
30extern const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE;
31#endif
32
33#ifdef USE_WEBSERVER_JS_INCLUDE
34extern const uint8_t ESPHOME_WEBSERVER_JS_INCLUDE[] PROGMEM;
35extern const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE;
36#endif
37
38namespace esphome::web_server {
39
40// ESP-IDF cuts a log event here: nothing a browser log view needs is longer, and it bounds the
41// tail a stalled client keeps. The Arduino backend takes a C string and sends the whole line.
42constexpr size_t LOG_EVENT_MAX_LEN = 512;
43
44// Parameter names live in flash on ESP8266
46
47// All platforms need to defer actions to main loop thread.
48// Multi-core platforms need this for thread safety.
49// ESP8266 needs this because ESPAsyncWebServer callbacks run in "sys" context
50// (SDK system context), not "cont" context (continuation/main loop). Calling
51// yield() from sys context causes a panic in the Arduino core.
52#define DEFER_ACTION(capture, action) this->defer([capture]() mutable { action; })
53
59
61struct UrlMatch {
65#ifdef USE_DEVICES
67#endif
68 bool valid{false};
69
70 // Helper methods for string comparisons
71 bool domain_equals(const char *str) const { return this->domain == str; }
72 bool method_equals(const char *str) const { return this->method == str; }
73
74#ifdef USE_ESP8266
75 // Overloads for flash strings on ESP8266
76 bool domain_equals(const __FlashStringHelper *str) const { return this->domain == str; }
77 bool method_equals(const __FlashStringHelper *str) const { return this->method == str; }
78#endif
79
83};
84
85#ifdef USE_WEBSERVER_SORTING
87 float weight;
88 uint64_t group_id;
89};
90
92 std::string name;
93 float weight;
94};
95#endif
96
98
99/*
100 In order to defer updates in arduino mode, we need to create one AsyncEventSource per incoming request to /events.
101 This is because only minimal changes were made to the ESPAsyncWebServer lib_dep, it was undesirable to put deferred
102 update logic into that library. We need one deferred queue per connection so instead of one AsyncEventSource with
103 multiple clients, we have multiple event sources with one client each. This is slightly awkward which is why it's
104 implemented in a more straightforward way for ESP-IDF. Arduino platform will eventually go away and this workaround
105 can be forgotten.
106*/
107#if !defined(USE_ESP32) && defined(USE_ARDUINO)
109
111class DeferredUpdateEventSource final : public AsyncEventSource {
113
114 /*
115 This class holds a pointer to the source component that wants to publish a state event, and a pointer to a function
116 that will lazily generate that event. The two pointers allow dedup in the deferred queue if multiple publishes for
117 the same component are backed up, and take up only two pointers of memory. The entry in the deferred queue (a
118 std::vector) is the DeferredEvent instance itself (not a pointer to one elsewhere in heap) so still only two
119 pointers per entry (and no heap fragmentation). Even 100 backed up events (you'd have to have at least 100 sensors
120 publishing because of dedup) would take up only 0.8 kB.
121 */
122 struct DeferredEvent {
123 friend class DeferredUpdateEventSource;
124
125 protected:
126 void *source_;
127 message_generator_t *message_generator_;
128
129 public:
130 DeferredEvent(void *source, message_generator_t *message_generator)
131 : source_(source), message_generator_(message_generator) {}
132 bool operator==(const DeferredEvent &test) const {
133 return (source_ == test.source_ && message_generator_ == test.message_generator_);
134 }
135 };
136 static_assert(sizeof(DeferredEvent) == sizeof(void *) + sizeof(message_generator_t *),
137 "DeferredEvent should have no padding");
138
139 protected:
140 // surface a couple methods from the base class
141 using AsyncEventSource::handleRequest;
142 using AsyncEventSource::send;
143
145 // vector is used very specifically for its zero memory overhead even though items are popped from the front (memory
146 // footprint is more important than speed here)
147 std::vector<DeferredEvent> deferred_queue_;
150 static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES = 2500; // ~20 seconds at 125Hz loop rate
151
152 // helper for allowing only unique entries in the queue
153 void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator);
154
156
157 public:
158 DeferredUpdateEventSource(WebServer *ws, const String &url)
159 : AsyncEventSource(url), entities_iterator_(ListEntitiesIterator(ws, this)), web_server_(ws) {}
160
161 void loop();
162
163 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator);
164 void try_send_nodefer(const char *message, size_t message_len, const char *event = nullptr, uint32_t id = 0,
165 uint32_t reconnect = 0);
166};
167
168class DeferredUpdateEventSourceList final : public std::list<DeferredUpdateEventSource *> {
169 protected:
172
173 public:
175 bool loop();
176
177 void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator);
178 void try_send_nodefer(const char *message, size_t message_len, const char *event = nullptr, uint32_t id = 0,
179 uint32_t reconnect = 0);
180
181 void add_new_client(WebServer *ws, AsyncWebServerRequest *request);
182};
183#endif
184
194class WebServer final : public Component, public AsyncWebHandler {
195#if !defined(USE_ESP32) && defined(USE_ARDUINO)
197#endif
198
199 public:
201
202#if USE_WEBSERVER_VERSION == 1
208 void set_css_url(const char *css_url) { this->css_url_ = css_url; }
209
215 void set_js_url(const char *js_url) { this->js_url_ = js_url; }
216#endif
217
218#ifdef USE_WEBSERVER_CSS_INCLUDE
223 void set_css_include(const char *css_include) { this->css_include_ = css_include; }
224#endif
225
226#ifdef USE_WEBSERVER_JS_INCLUDE
231 void set_js_include(const char *js_include) { this->js_include_ = js_include; }
232#endif
233
239 void set_include_internal(bool include_internal) { include_internal_ = include_internal; }
244 void set_expose_log(bool expose_log) { this->expose_log_ = expose_log; }
245
246#ifdef USE_WEBSERVER_ALLOWED_ORIGINS
259 void set_allowed_origins(const char *const *origins) { this->allowed_origins_ = origins; }
260#endif
261
262 // ========== INTERNAL METHODS ==========
263 // (In most use cases you won't need these)
265 void setup() override;
266 void loop() override;
267
268 void dump_config() override;
269
270#ifdef USE_LOGGER
271 void on_log(uint8_t level, const char *tag, const char *message, size_t message_len);
272#endif
273
275 float get_setup_priority() const override;
276
278 void handle_index_request(AsyncWebServerRequest *request);
279
282
283#ifdef USE_WEBSERVER_CSS_INCLUDE
285 void handle_css_request(AsyncWebServerRequest *request);
286#endif
287
288#ifdef USE_WEBSERVER_JS_INCLUDE
290 void handle_js_request(AsyncWebServerRequest *request);
291#endif
292
293#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
294 // Handle Private Network Access CORS OPTIONS request
295 void handle_pna_cors_request(AsyncWebServerRequest *request);
296#endif
297
298#ifdef USE_SENSOR
301 void handle_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
302
303 static void sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
304 static void sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
305#endif
306
307#ifdef USE_SWITCH
309
311 void handle_switch_request(AsyncWebServerRequest *request, const UrlMatch &match);
312
313 static void switch_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
314 static void switch_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
315#endif
316
317#ifdef USE_BUTTON
319 void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match);
320
321 // Buttons are stateless, so there is no button_state_json_generator
322 static void button_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
323#endif
324
325#ifdef USE_BINARY_SENSOR
327
329 void handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
330
331 static void binary_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
332 static void binary_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
333#endif
334
335#ifdef USE_FAN
336 void on_fan_update(fan::Fan *obj);
337
339 void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match);
340
341 static void fan_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
342 static void fan_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
343#endif
344
345#ifdef USE_LIGHT
347
349 void handle_light_request(AsyncWebServerRequest *request, const UrlMatch &match);
350
351 static void light_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
352 static void light_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
353#endif
354
355#ifdef USE_TEXT_SENSOR
357
359 void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match);
360
361 static void text_sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
362 static void text_sensor_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
363#endif
364
365#ifdef USE_COVER
366 void on_cover_update(cover::Cover *obj);
367
369 void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match);
370
371 static void cover_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
372 static void cover_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
373#endif
374
375#ifdef USE_NUMBER
378 void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match);
379
380 static void number_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
381 static void number_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
382#endif
383
384#ifdef USE_DATETIME_DATE
387 void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match);
388
389 static void date_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
390 static void date_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
391#endif
392
393#ifdef USE_DATETIME_TIME
396 void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match);
397
398 static void time_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
399 static void time_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
400#endif
401
402#ifdef USE_DATETIME_DATETIME
405 void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match);
406
407 static void datetime_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
408 static void datetime_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
409#endif
410
411#ifdef USE_TEXT
412 void on_text_update(text::Text *obj);
414 void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match);
415
416 static void text_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
417 static void text_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
418#endif
419
420#ifdef USE_SELECT
423 void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match);
424
425 static void select_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
426 static void select_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
427#endif
428
429#ifdef USE_CLIMATE
432 void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match);
433
434 static void climate_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
435 static void climate_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
436#endif
437
438#ifdef USE_LOCK
439 void on_lock_update(lock::Lock *obj);
440
442 void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match);
443
444 static void lock_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
445 static void lock_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
446#endif
447
448#ifdef USE_VALVE
449 void on_valve_update(valve::Valve *obj);
450
452 void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match);
453
454 static void valve_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
455 static void valve_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
456#endif
457
458#ifdef USE_ALARM_CONTROL_PANEL
460
462 void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match);
463
464 static void alarm_control_panel_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
465 static void alarm_control_panel_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
466#endif
467
468#ifdef USE_WATER_HEATER
470
472 void handle_water_heater_request(AsyncWebServerRequest *request, const UrlMatch &match);
473
474 static void water_heater_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
475 static void water_heater_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
476#endif
477
478#ifdef USE_INFRARED
480 void handle_infrared_request(AsyncWebServerRequest *request, const UrlMatch &match);
481
482 static void infrared_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
483#endif
484#ifdef USE_RADIO_FREQUENCY
486 void handle_radio_frequency_request(AsyncWebServerRequest *request, const UrlMatch &match);
487
488 static void radio_frequency_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
489#endif
490
491#ifdef USE_MEDIA_PLAYER
492 // Not exposed over HTTP; the stub only satisfies ControllerContract
494#endif
495
496#ifdef USE_EVENT
497 void on_event(event::Event *obj);
498
499 static void event_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
500 static void event_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
501
503 void handle_event_request(AsyncWebServerRequest *request, const UrlMatch &match);
504#endif
505
506#ifdef USE_UPDATE
508
510 void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match);
511
512 static void update_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
513 static void update_all_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder);
514#endif
515
517 bool canHandle(AsyncWebServerRequest *request) const override;
519 void handleRequest(AsyncWebServerRequest *request) override;
521 bool isRequestHandlerTrivial() const override; // NOLINT(readability-identifier-naming)
522
523#ifdef USE_WEBSERVER_SORTING
524 void add_entity_config(EntityBase *entity, float weight, uint64_t group);
525 void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight);
526
527 std::map<EntityBase *, SortingComponents> sorting_entitys_;
528 std::map<uint64_t, SortingGroup> sorting_groups_;
529#endif
530
531 bool include_internal_{false};
532
533 protected:
534 // Declared here so it packs into the padding after include_internal_
535 bool expose_log_{true};
536
537 void add_sorting_info_(JsonObject &root, EntityBase *entity);
538
539#ifdef USE_LIGHT
540 // Helper to parse and apply a float parameter with optional scaling
541 template<typename T, typename Ret>
542 void parse_light_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(float),
543 float scale = 1.0f) {
544 auto value = parse_number<float>(request->arg(param_name).c_str());
545 if (value.has_value()) {
546 (call.*setter)(*value / scale);
547 }
548 }
549
550 // Helper to parse and apply a uint32_t parameter with optional scaling
551 template<typename T, typename Ret>
552 void parse_light_param_uint_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
553 Ret (T::*setter)(uint32_t), uint32_t scale = 1) {
554 auto value = parse_number<uint32_t>(request->arg(param_name).c_str());
555 if (value.has_value()) {
556 (call.*setter)(*value * scale);
557 }
558 }
559#endif
560
561 // Generic helper to parse and apply a numeric parameter
562 template<typename NumT, typename T, typename Ret>
563 void parse_num_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(NumT)) {
564 auto value = parse_number<NumT>(request->arg(param_name).c_str());
565 if (value.has_value()) {
566 (call.*setter)(*value);
567 }
568 }
569
570 // Generic helper to parse and apply a string parameter using const char* setter (avoids std::string allocation)
571 template<typename T, typename Ret>
572 void parse_cstr_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call,
573 Ret (T::*setter)(const char *, size_t)) {
574 if (request->hasArg(param_name)) {
575 const auto &value = request->arg(param_name);
576 (call.*setter)(value.c_str(), value.length());
577 }
578 }
579
580 // Generic helper to parse and apply a bool parameter
581 // Accepts: "on", "true", "1" (case-insensitive) as true
582 // Accepts: "off", "false", "0" (case-insensitive) as false
583 // Invalid values are ignored (setter not called)
584 template<typename T, typename Ret>
585 void parse_bool_param_(AsyncWebServerRequest *request, ParamNameType param_name, T &call, Ret (T::*setter)(bool)) {
586 const auto &param_value = request->arg(param_name);
587 // Arduino String has isEmpty() not empty(), use length() for cross-platform compatibility
588 if (param_value.length() > 0) { // NOLINT(readability-container-size-empty)
589 // First check on/off (default), then true/false (custom)
590 auto val = parse_on_off(param_value.c_str());
591 if (val == PARSE_NONE) {
592 val = parse_on_off(param_value.c_str(), "true", "false");
593 }
594 if (val == PARSE_ON || param_value == "1") {
595 (call.*setter)(true);
596 } else if (val == PARSE_OFF || param_value == "0") {
597 (call.*setter)(false);
598 }
599 // PARSE_NONE/PARSE_TOGGLE: ignore invalid values
600 }
601 }
602
604#ifdef USE_ESP32
605 AsyncEventSource events_{StringRef::from_lit("/events"), this};
606#elif USE_ARDUINO
608#endif
609
610#if USE_WEBSERVER_VERSION == 1
611 const char *css_url_{nullptr};
612 const char *js_url_{nullptr};
613#endif
614#ifdef USE_WEBSERVER_CSS_INCLUDE
615 const char *css_include_{nullptr};
616#endif
617#ifdef USE_WEBSERVER_JS_INCLUDE
618 const char *js_include_{nullptr};
619#endif
620#ifdef USE_WEBSERVER_ALLOWED_ORIGINS
621 // Extra origins allowed to make cross-origin browser requests ("*" means any origin).
622 // Only compiled when allowed_origins is configured; same-origin is always allowed regardless.
623 const char *const *allowed_origins_{nullptr};
624#endif
625
629 bool is_request_origin_allowed_(AsyncWebServerRequest *request, const std::string &origin);
630
631 private:
632#ifdef USE_SENSOR
633 void sensor_json_(sensor::Sensor *obj, float value, JsonDetail start_config, json::JsonBuilder &builder);
634#endif
635#ifdef USE_SWITCH
636 void switch_json_(switch_::Switch *obj, bool value, JsonDetail start_config, json::JsonBuilder &builder);
637#endif
638#ifdef USE_BUTTON
639 void button_json_(button::Button *obj, JsonDetail start_config, json::JsonBuilder &builder);
640#endif
641#ifdef USE_BINARY_SENSOR
642 void binary_sensor_json_(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config,
643 json::JsonBuilder &builder);
644#endif
645#ifdef USE_FAN
646 void fan_json_(fan::Fan *obj, JsonDetail start_config, json::JsonBuilder &builder);
647#endif
648#ifdef USE_LIGHT
649 void light_json_(light::LightState *obj, JsonDetail start_config, json::JsonBuilder &builder);
650#endif
651#ifdef USE_TEXT_SENSOR
652 void text_sensor_json_(text_sensor::TextSensor *obj, const std::string &value, JsonDetail start_config,
653 json::JsonBuilder &builder);
654#endif
655#ifdef USE_COVER
656 void cover_json_(cover::Cover *obj, JsonDetail start_config, json::JsonBuilder &builder);
657#endif
658#ifdef USE_NUMBER
659 void number_json_(number::Number *obj, float value, JsonDetail start_config, json::JsonBuilder &builder);
660#endif
661#ifdef USE_DATETIME_DATE
662 void date_json_(datetime::DateEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
663#endif
664#ifdef USE_DATETIME_TIME
665 void time_json_(datetime::TimeEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
666#endif
667#ifdef USE_DATETIME_DATETIME
668 void datetime_json_(datetime::DateTimeEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
669#endif
670#ifdef USE_TEXT
671 void text_json_(text::Text *obj, const std::string &value, JsonDetail start_config, json::JsonBuilder &builder);
672#endif
673#ifdef USE_SELECT
674 void select_json_(select::Select *obj, StringRef value, JsonDetail start_config, json::JsonBuilder &builder);
675#endif
676#ifdef USE_CLIMATE
677 void climate_json_(climate::Climate *obj, JsonDetail start_config, json::JsonBuilder &builder);
678#endif
679#ifdef USE_LOCK
680 void lock_json_(lock::Lock *obj, lock::LockState value, JsonDetail start_config, json::JsonBuilder &builder);
681#endif
682#ifdef USE_VALVE
683 void valve_json_(valve::Valve *obj, JsonDetail start_config, json::JsonBuilder &builder);
684#endif
685#ifdef USE_ALARM_CONTROL_PANEL
686 void alarm_control_panel_json_(alarm_control_panel::AlarmControlPanel *obj,
688 json::JsonBuilder &builder);
689#endif
690#ifdef USE_EVENT
691 void event_json_(event::Event *obj, StringRef event_type, JsonDetail start_config, json::JsonBuilder &builder);
692#endif
693#ifdef USE_WATER_HEATER
694 void water_heater_json_(water_heater::WaterHeater *obj, JsonDetail start_config, json::JsonBuilder &builder);
695#endif
696#ifdef USE_INFRARED
697 void infrared_json_(infrared::Infrared *obj, JsonDetail start_config, json::JsonBuilder &builder);
698#endif
699#ifdef USE_RADIO_FREQUENCY
700 void radio_frequency_json_(radio_frequency::RadioFrequency *obj, JsonDetail start_config, json::JsonBuilder &builder);
701#endif
702#ifdef USE_UPDATE
703 void update_json_(update::UpdateEntity *obj, JsonDetail start_config, json::JsonBuilder &builder);
704#endif
705};
706
707} // namespace esphome::web_server
708#endif
StringRef is a reference to a string owned by something else.
Definition string_ref.h:30
static constexpr StringRef from_lit(const CharT(&s)[N])
Definition string_ref.h:54
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:195
Base class for all cover devices.
Definition cover.h:110
Infrared - Base class for infrared remote control implementations.
Definition infrared.h:44
Builder class for creating JSON documents without lambdas.
Definition json_util.h:244
Buffer for JSON serialization that uses stack allocation for small payloads.
Definition json_util.h:23
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:109
Base-class for all numbers.
Definition number.h:29
RadioFrequency - Base class for radio frequency implementations.
Base-class for all selects.
Definition select.h:29
Base-class for all sensors.
Definition sensor.h:47
Base class for all switches.
Definition switch.h:38
Base-class for all text inputs.
Definition text.h:21
Base class for all valve devices.
Definition valve.h:103
DeferredUpdateEventSource(WebServer *ws, const String &url)
Definition web_server.h:158
static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES
Definition web_server.h:150
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, const char *event_type, message_generator_t *message_generator)
std::vector< DeferredEvent > deferred_queue_
Definition web_server.h:147
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, const char *event_type, message_generator_t *message_generator)
void on_client_disconnect_(DeferredUpdateEventSource *source)
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:194
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 set_expose_log(bool expose_log)
Set whether or not the webserver should expose the Log.
Definition web_server.h:244
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:527
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:259
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:208
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:552
static void sensor_state_json_generator(WebServer *web_server, void *source, json::JsonBuilder &builder)
DeferredUpdateEventSourceList events_
Definition web_server.h:607
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:239
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:542
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)
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:603
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:585
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:215
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:231
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:572
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:528
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:223
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 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:623
float get_setup_priority() const override
MQTT setup priority.
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:563
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:493
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:23
ProgmemStr ParamNameType
Definition web_server.h:45
constexpr size_t LOG_EVENT_MAX_LEN
Definition web_server.h:42
void(WebServer *, void *, json::JsonBuilder &) message_generator_t
Definition web_server.h:108
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:493
optional< T > parse_number(const char *str)
Parse an unsigned decimal number from a null-terminated string.
Definition helpers.h:1273
@ PARSE_ON
Definition helpers.h:1699
@ PARSE_OFF
Definition helpers.h:1700
@ PARSE_NONE
Definition helpers.h:1698
const __FlashStringHelper * ProgmemStr
Definition progmem.h:29
static void uint32_t
Result of matching a URL against an entity.
Definition web_server.h:55
bool matched
True if entity matched the URL.
Definition web_server.h:56
bool action_is_empty
True if no action/method segment in URL.
Definition web_server.h:57
Internal helper struct that is used to parse incoming URLs.
Definition web_server.h:61
StringRef device_name
Device name within URL, empty for main device.
Definition web_server.h:66
bool valid
Whether this match is valid.
Definition web_server.h:68
bool domain_equals(const __FlashStringHelper *str) const
Definition web_server.h:76
EntityMatchResult match_entity(EntityBase *entity) const
Match entity by name Returns EntityMatchResult with match status and whether action segment is empty.
StringRef method
Method within URL, for example "turn_on".
Definition web_server.h:64
bool domain_equals(const char *str) const
Definition web_server.h:71
bool method_equals(const __FlashStringHelper *str) const
Definition web_server.h:77
bool method_equals(const char *str) const
Definition web_server.h:72
StringRef domain
Domain within URL, for example "sensor".
Definition web_server.h:62
StringRef id
Entity name/id within URL, for example "Temperature".
Definition web_server.h:63
const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM
Definition web_server.h:29
const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE
const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE
const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE