13#if !defined(USE_ESP32) && defined(USE_ARDUINO)
14#include "StreamString.h"
31#ifdef USE_WEBSERVER_LOCAL
32#if USE_WEBSERVER_VERSION == 2
34#elif USE_WEBSERVER_VERSION == 3
42static const char *
const TAG =
"web_server";
45static constexpr size_t PSTR_LOCAL_SIZE = 18;
46#define PSTR_LOCAL(mode_s) ESPHOME_strncpy_P(buf, (ESPHOME_PGM_P) ((mode_s)), PSTR_LOCAL_SIZE - 1)
48#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
49static const char *
const HEADER_PNA_NAME =
"Private-Network-Access-Name";
50static const char *
const HEADER_PNA_ID =
"Private-Network-Access-ID";
51static const char *
const HEADER_CORS_REQ_PNA =
"Access-Control-Request-Private-Network";
52static const char *
const HEADER_CORS_ALLOW_PNA =
"Access-Control-Allow-Private-Network";
56static UrlMatch match_url(
const char *url_ptr,
size_t url_len,
bool only_domain) {
60 if (url_len < 2 || url_ptr[0] !=
'/') {
65 const char *start = url_ptr + 1;
66 const char *
end = url_ptr + url_len;
69 const char *domain_end = (
const char *) memchr(start,
'/',
end - start);
77 match.domain_len = domain_end - start;
85 if (domain_end + 1 >=
end) {
89 const char *id_start = domain_end + 1;
90 const char *id_end = (
const char *) memchr(id_start,
'/',
end - id_start);
95 match.id_len =
end - id_start;
101 match.id_len = id_end - id_start;
104 if (id_end + 1 <
end) {
105 match.method = id_end + 1;
106 match.method_len =
end - (id_end + 1);
112#if !defined(USE_ESP32) && defined(USE_ARDUINO)
115 DeferredEvent item(source, message_generator);
123 this->deferred_queue_.push_back(item);
130 if (this->send(
message.c_str(),
"state") != DISCARDED) {
142 ESP_LOGW(TAG,
"Closing stuck EventSource connection after %" PRIu16
" failed sends",
161 if (this->count() == 0)
169 if (source ==
nullptr)
171 if (event_type ==
nullptr)
173 if (message_generator ==
nullptr)
176 if (0 != strcmp(event_type,
"state_detail_all") && 0 != strcmp(event_type,
"state")) {
177 ESP_LOGE(TAG,
"Can't defer non-state event");
187 if (this->send(
message.c_str(),
"state") == DISCARDED) {
197 uint32_t reconnect) {
198 this->send(
message, event,
id, reconnect);
218 uint32_t reconnect) {
228 es->onConnect([
this, es](AsyncEventSourceClient *client) { this->
on_client_connect_(es); });
232 es->handleRequest(request);
237 ws->
defer([ws, source]() {
243#ifdef USE_WEBSERVER_SORTING
246 JsonObject root = builder.
root();
247 root[ESPHOME_F(
"name")] = group.second.name;
248 root[ESPHOME_F(
"sorting_weight")] = group.second.weight;
270 this->remove(source);
278#ifdef USE_WEBSERVER_CSS_INCLUDE
281#ifdef USE_WEBSERVER_JS_INCLUDE
287 JsonObject root = builder.
root();
291#if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA)
292 root[ESPHOME_F(
"ota")] =
false;
294 root[ESPHOME_F(
"ota")] =
true;
297 root[ESPHOME_F(
"lang")] =
"en";
342#ifdef USE_WEBSERVER_LOCAL
345 AsyncWebServerResponse *response = request->beginResponse(200,
"text/html", INDEX_GZ,
sizeof(INDEX_GZ));
347 AsyncWebServerResponse *response = request->beginResponse_P(200,
"text/html", INDEX_GZ,
sizeof(INDEX_GZ));
349 response->addHeader(
"Content-Encoding",
"gzip");
350 request->send(response);
352#elif USE_WEBSERVER_VERSION >= 2
355 AsyncWebServerResponse *response =
358 AsyncWebServerResponse *response =
362 request->send(response);
366#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
368 AsyncWebServerResponse *response = request->beginResponse(200,
"");
369 response->addHeader(HEADER_CORS_ALLOW_PNA,
"true");
370 response->addHeader(HEADER_PNA_NAME,
App.
get_name().c_str());
373 request->send(response);
377#ifdef USE_WEBSERVER_CSS_INCLUDE
380 AsyncWebServerResponse *response =
383 AsyncWebServerResponse *response =
386 response->addHeader(
"Content-Encoding",
"gzip");
387 request->send(response);
391#ifdef USE_WEBSERVER_JS_INCLUDE
394 AsyncWebServerResponse *response =
397 AsyncWebServerResponse *response =
400 response->addHeader(
"Content-Encoding",
"gzip");
401 request->send(response);
406static void set_json_id(JsonObject &root,
EntityBase *obj,
const char *prefix,
JsonDetail start_config) {
409 snprintf(id_buf,
sizeof(id_buf),
"%s-%s", prefix, object_id.c_str());
410 root[ESPHOME_F(
"id")] = id_buf;
412 root[ESPHOME_F(
"name")] = obj->
get_name();
417 root[ESPHOME_F(
"is_disabled_by_default")] = is_disabled;
424static void set_json_value(JsonObject &root, EntityBase *obj,
const char *prefix,
const T &value,
426 set_json_id(root, obj, prefix, start_config);
427 root[ESPHOME_F(
"value")] = value;
431static void set_json_icon_state_value(JsonObject &root, EntityBase *obj,
const char *prefix,
const std::string &
state,
433 set_json_value(root, obj, prefix, value, start_config);
434 root[ESPHOME_F(
"state")] =
state;
438static JsonDetail get_request_detail(AsyncWebServerRequest *request) {
439 auto *param = request->getParam(
"detail");
455 auto detail = get_request_detail(request);
456 std::string data = this->
sensor_json(obj, obj->state, detail);
457 request->send(200,
"application/json", data.c_str());
471 JsonObject root = builder.
root();
477 set_json_icon_state_value(root, obj,
"sensor",
state, value, start_config);
480 if (!uom_ref.empty())
481 root[ESPHOME_F(
"uom")] = uom_ref;
488#ifdef USE_TEXT_SENSOR
500 auto detail = get_request_detail(request);
502 request->send(200,
"application/json", data.c_str());
519 JsonObject root = builder.
root();
521 set_json_icon_state_value(root, obj,
"text_sensor", value, value, start_config);
541 if (request->method() == HTTP_GET && match.
method_empty()) {
542 auto detail = get_request_detail(request);
543 std::string data = this->
switch_json(obj, obj->state, detail);
544 request->send(200,
"application/json", data.c_str());
549 enum SwitchAction { NONE, TOGGLE, TURN_ON, TURN_OFF };
550 SwitchAction action = NONE;
560 if (action != NONE) {
561 this->
defer([obj, action]() {
592 JsonObject root = builder.
root();
594 set_json_icon_state_value(root, obj,
"switch", value ?
"ON" :
"OFF", value, start_config);
609 if (request->method() == HTTP_GET && match.
method_empty()) {
610 auto detail = get_request_detail(request);
612 request->send(200,
"application/json", data.c_str());
614 this->
defer([obj]() { obj->press(); });
632 JsonObject root = builder.
root();
634 set_json_id(root, obj,
"button", start_config);
643#ifdef USE_BINARY_SENSOR
655 auto detail = get_request_detail(request);
657 request->send(200,
"application/json", data.c_str());
673 JsonObject root = builder.
root();
675 set_json_icon_state_value(root, obj,
"binary_sensor", value ?
"ON" :
"OFF", value, start_config);
695 if (request->method() == HTTP_GET && match.
method_empty()) {
696 auto detail = get_request_detail(request);
697 std::string data = this->
fan_json(obj, detail);
698 request->send(200,
"application/json", data.c_str());
700 this->
defer([obj]() { obj->toggle().perform(); });
705 if (!is_on && !is_off) {
709 auto call = is_on ? obj->turn_on() : obj->turn_off();
713 if (request->hasParam(
"oscillation")) {
714 auto speed = request->getParam(
"oscillation")->value();
718 call.set_oscillating(
true);
721 call.set_oscillating(
false);
724 call.set_oscillating(!obj->oscillating);
746 JsonObject root = builder.
root();
748 set_json_icon_state_value(root, obj,
"fan", obj->
state ?
"ON" :
"OFF", obj->
state, start_config);
750 if (traits.supports_speed()) {
751 root[ESPHOME_F(
"speed_level")] = obj->
speed;
752 root[ESPHOME_F(
"speed_count")] = traits.supported_speed_count();
775 if (request->method() == HTTP_GET && match.
method_empty()) {
776 auto detail = get_request_detail(request);
777 std::string data = this->
light_json(obj, detail);
778 request->send(200,
"application/json", data.c_str());
780 this->
defer([obj]() { obj->toggle().perform(); });
785 if (!is_on && !is_off) {
789 auto call = is_on ? obj->turn_on() : obj->turn_off();
824 JsonObject root = builder.
root();
826 set_json_value(root, obj,
"light", obj->
remote_values.
is_on() ?
"ON" :
"OFF", start_config);
830 JsonArray opt = root[ESPHOME_F(
"effects")].to<JsonArray>();
833 opt.add(option->get_name());
853 if (request->method() == HTTP_GET && match.
method_empty()) {
854 auto detail = get_request_detail(request);
855 std::string data = this->
cover_json(obj, detail);
856 request->send(200,
"application/json", data.c_str());
860 auto call = obj->make_call();
863 static const struct {
874 for (
const auto &method : METHODS) {
876 (
call.*method.action)();
887 auto traits = obj->get_traits();
888 if ((request->hasParam(
"position") && !traits.get_supports_position()) ||
889 (request->hasParam(
"tilt") && !traits.get_supports_tilt())) {
911 JsonObject root = builder.
root();
915 char buf[PSTR_LOCAL_SIZE];
919 root[ESPHOME_F(
"position")] = obj->
position;
921 root[ESPHOME_F(
"tilt")] = obj->
tilt;
937 for (
auto *obj :
App.get_numbers()) {
941 if (request->method() == HTTP_GET && match.
method_empty()) {
942 auto detail = get_request_detail(request);
943 std::string data = this->
number_json(obj, obj->state, detail);
944 request->send(200,
"application/json", data.c_str());
952 auto call = obj->make_call();
970 JsonObject root = builder.
root();
974 std::string val_str = std::isnan(value)
977 std::string state_str = std::isnan(value) ?
"NA"
980 set_json_icon_state_value(root, obj,
"number", state_str, val_str, start_config);
982 root[ESPHOME_F(
"min_value")] =
984 root[ESPHOME_F(
"max_value")] =
986 root[ESPHOME_F(
"step")] =
989 if (!uom_ref.empty())
990 root[ESPHOME_F(
"uom")] = uom_ref;
998#ifdef USE_DATETIME_DATE
1005 for (
auto *obj :
App.get_dates()) {
1008 if (request->method() == HTTP_GET && match.
method_empty()) {
1009 auto detail = get_request_detail(request);
1010 std::string data = this->
date_json(obj, detail);
1011 request->send(200,
"application/json", data.c_str());
1019 auto call = obj->make_call();
1021 if (!request->hasParam(
"value")) {
1043 JsonObject root = builder.
root();
1046 set_json_icon_state_value(root, obj,
"date", value, value, start_config);
1055#ifdef USE_DATETIME_TIME
1062 for (
auto *obj :
App.get_times()) {
1065 if (request->method() == HTTP_GET && match.
method_empty()) {
1066 auto detail = get_request_detail(request);
1067 std::string data = this->
time_json(obj, detail);
1068 request->send(200,
"application/json", data.c_str());
1076 auto call = obj->make_call();
1078 if (!request->hasParam(
"value")) {
1099 JsonObject root = builder.
root();
1102 set_json_icon_state_value(root, obj,
"time", value, value, start_config);
1111#ifdef USE_DATETIME_DATETIME
1118 for (
auto *obj :
App.get_datetimes()) {
1121 if (request->method() == HTTP_GET && match.
method_empty()) {
1122 auto detail = get_request_detail(request);
1124 request->send(200,
"application/json", data.c_str());
1132 auto call = obj->make_call();
1134 if (!request->hasParam(
"value")) {
1155 JsonObject root = builder.
root();
1159 set_json_icon_state_value(root, obj,
"datetime", value, value, start_config);
1175 for (
auto *obj :
App.get_texts()) {
1179 if (request->method() == HTTP_GET && match.
method_empty()) {
1180 auto detail = get_request_detail(request);
1181 std::string data = this->
text_json(obj, obj->state, detail);
1182 request->send(200,
"application/json", data.c_str());
1190 auto call = obj->make_call();
1208 JsonObject root = builder.
root();
1211 set_json_icon_state_value(root, obj,
"text",
state, value, start_config);
1231 for (
auto *obj :
App.get_selects()) {
1235 if (request->method() == HTTP_GET && match.
method_empty()) {
1236 auto detail = get_request_detail(request);
1237 std::string data = this->
select_json(obj, obj->
has_state() ? obj->current_option() :
"", detail);
1238 request->send(200,
"application/json", data.c_str());
1247 auto call = obj->make_call();
1266 JsonObject root = builder.
root();
1268 set_json_icon_state_value(root, obj,
"select", value, value, start_config);
1270 JsonArray opt = root[ESPHOME_F(
"option")].to<JsonArray>();
1288 for (
auto *obj :
App.get_climates()) {
1292 if (request->method() == HTTP_GET && match.
method_empty()) {
1293 auto detail = get_request_detail(request);
1295 request->send(200,
"application/json", data.c_str());
1304 auto call = obj->make_call();
1333 JsonObject root = builder.
root();
1334 set_json_id(root, obj,
"climate", start_config);
1337 int8_t current_accuracy = traits.get_current_temperature_accuracy_decimals();
1338 char buf[PSTR_LOCAL_SIZE];
1341 JsonArray opt = root[ESPHOME_F(
"modes")].to<JsonArray>();
1344 if (!traits.get_supported_custom_fan_modes().empty()) {
1345 JsonArray opt = root[ESPHOME_F(
"fan_modes")].to<JsonArray>();
1350 if (!traits.get_supported_custom_fan_modes().empty()) {
1351 JsonArray opt = root[ESPHOME_F(
"custom_fan_modes")].to<JsonArray>();
1352 for (
auto const &
custom_fan_mode : traits.get_supported_custom_fan_modes())
1355 if (traits.get_supports_swing_modes()) {
1356 JsonArray opt = root[ESPHOME_F(
"swing_modes")].to<JsonArray>();
1357 for (
auto swing_mode : traits.get_supported_swing_modes())
1361 JsonArray opt = root[ESPHOME_F(
"presets")].to<JsonArray>();
1365 if (!traits.get_supported_custom_presets().empty() && obj->
has_custom_preset()) {
1366 JsonArray opt = root[ESPHOME_F(
"custom_presets")].to<JsonArray>();
1367 for (
auto const &
custom_preset : traits.get_supported_custom_presets())
1373 bool has_state =
false;
1374 root[ESPHOME_F(
"mode")] = PSTR_LOCAL(climate_mode_to_string(obj->
mode));
1377 root[ESPHOME_F(
"step")] = traits.get_visual_target_temperature_step();
1379 root[ESPHOME_F(
"action")] = PSTR_LOCAL(climate_action_to_string(obj->
action));
1380 root[ESPHOME_F(
"state")] = root[ESPHOME_F(
"action")];
1384 root[ESPHOME_F(
"fan_mode")] = PSTR_LOCAL(climate_fan_mode_to_string(obj->
fan_mode.
value()));
1390 root[ESPHOME_F(
"preset")] = PSTR_LOCAL(climate_preset_to_string(obj->
preset.
value()));
1392 if (!traits.get_supported_custom_presets().empty() && obj->
has_custom_preset()) {
1395 if (traits.get_supports_swing_modes()) {
1396 root[ESPHOME_F(
"swing_mode")] = PSTR_LOCAL(climate_swing_mode_to_string(obj->
swing_mode));
1402 root[ESPHOME_F(
"current_temperature")] =
"NA";
1408 root[ESPHOME_F(
"target_temperature_high")] =
1417 root[ESPHOME_F(
"state")] = root[ESPHOME_F(
"target_temperature")];
1436 if (request->method() == HTTP_GET && match.
method_empty()) {
1437 auto detail = get_request_detail(request);
1438 std::string data = this->
lock_json(obj, obj->state, detail);
1439 request->send(200,
"application/json", data.c_str());
1444 enum LockAction { NONE, LOCK, UNLOCK, OPEN };
1445 LockAction action = NONE;
1455 if (action != NONE) {
1456 this->
defer([obj, action]() {
1487 JsonObject root = builder.
root();
1489 char buf[PSTR_LOCAL_SIZE];
1510 if (request->method() == HTTP_GET && match.
method_empty()) {
1511 auto detail = get_request_detail(request);
1512 std::string data = this->
valve_json(obj, detail);
1513 request->send(200,
"application/json", data.c_str());
1517 auto call = obj->make_call();
1520 static const struct {
1531 for (
const auto &method : METHODS) {
1533 (
call.*method.action)();
1544 auto traits = obj->get_traits();
1545 if (request->hasParam(
"position") && !traits.get_supports_position()) {
1566 JsonObject root = builder.
root();
1570 char buf[PSTR_LOCAL_SIZE];
1574 root[ESPHOME_F(
"position")] = obj->
position;
1583#ifdef USE_ALARM_CONTROL_PANEL
1594 if (request->method() == HTTP_GET && match.
method_empty()) {
1595 auto detail = get_request_detail(request);
1597 request->send(200,
"application/json", data.c_str());
1601 auto call = obj->make_call();
1605 static const struct {
1617 for (
const auto &method : METHODS) {
1619 (
call.*method.action)();
1650 JsonObject root = builder.
root();
1652 char buf[PSTR_LOCAL_SIZE];
1653 set_json_icon_state_value(root, obj,
"alarm-control-panel", PSTR_LOCAL(alarm_control_panel_state_to_string(value)),
1654 value, start_config);
1677 auto detail = get_request_detail(request);
1678 std::string data = this->
event_json(obj,
"", detail);
1679 request->send(200,
"application/json", data.c_str());
1686static std::string get_event_type(
event::Event *event) {
1687 const char *last_type =
event ?
event->get_last_event_type() :
nullptr;
1688 return last_type ? last_type :
"";
1702 JsonObject root = builder.
root();
1704 set_json_id(root, obj,
"event", start_config);
1705 if (!event_type.empty()) {
1706 root[ESPHOME_F(
"event_type")] = event_type;
1709 JsonArray event_types = root[ESPHOME_F(
"event_types")].to<JsonArray>();
1711 event_types.add(event_type);
1726 return LOG_STR(
"NO UPDATE");
1728 return LOG_STR(
"UPDATE AVAILABLE");
1730 return LOG_STR(
"INSTALLING");
1732 return LOG_STR(
"UNKNOWN");
1744 if (request->method() == HTTP_GET && match.
method_empty()) {
1745 auto detail = get_request_detail(request);
1746 std::string data = this->
update_json(obj, detail);
1747 request->send(200,
"application/json", data.c_str());
1756 this->
defer([obj]()
mutable { obj->perform(); });
1773 JsonObject root = builder.
root();
1775 char buf[PSTR_LOCAL_SIZE];
1776 set_json_icon_state_value(root, obj,
"update", PSTR_LOCAL(update_state_to_string(obj->
state)),
1792 const auto &url = request->url();
1793 const auto method = request->method();
1796 static const char *
const STATIC_URLS[] = {
1798#if !defined(USE_ESP32) && defined(USE_ARDUINO)
1801#ifdef USE_WEBSERVER_CSS_INCLUDE
1804#ifdef USE_WEBSERVER_JS_INCLUDE
1809 for (
const auto &static_url : STATIC_URLS) {
1810 if (url == static_url)
1814#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
1815 if (method == HTTP_OPTIONS && request->hasHeader(HEADER_CORS_REQ_PNA))
1820 UrlMatch match = match_url(url.c_str(), url.length(),
true);
1825 bool is_get = method == HTTP_GET;
1826 bool is_post = method == HTTP_POST;
1827 bool is_get_or_post = is_get || is_post;
1829 if (!is_get_or_post)
1833 static const char *
const GET_ONLY_DOMAINS[] = {
1837#ifdef USE_BINARY_SENSOR
1840#ifdef USE_TEXT_SENSOR
1848 static const char *
const GET_POST_DOMAINS[] = {
1867#ifdef USE_DATETIME_DATE
1870#ifdef USE_DATETIME_TIME
1873#ifdef USE_DATETIME_DATETIME
1891#ifdef USE_ALARM_CONTROL_PANEL
1892 "alarm_control_panel",
1901 for (
const auto &domain : GET_ONLY_DOMAINS) {
1908 if (is_get_or_post) {
1909 for (
const auto &domain : GET_POST_DOMAINS) {
1918 const auto &url = request->url();
1926#if !defined(USE_ESP32) && defined(USE_ARDUINO)
1927 if (url ==
"/events") {
1928 this->
events_.add_new_client(
this, request);
1933#ifdef USE_WEBSERVER_CSS_INCLUDE
1934 if (url ==
"/0.css") {
1940#ifdef USE_WEBSERVER_JS_INCLUDE
1941 if (url ==
"/0.js") {
1947#ifdef USE_WEBSERVER_PRIVATE_NETWORK_ACCESS
1948 if (request->method() == HTTP_OPTIONS && request->hasHeader(HEADER_CORS_REQ_PNA)) {
1955 UrlMatch match = match_url(url.c_str(), url.length(),
false);
1976#ifdef USE_BINARY_SENSOR
1991#ifdef USE_TEXT_SENSOR
2006#ifdef USE_DATETIME_DATE
2011#ifdef USE_DATETIME_TIME
2016#ifdef USE_DATETIME_DATETIME
2046#ifdef USE_ALARM_CONTROL_PANEL
2058 ESP_LOGV(TAG,
"Request for unknown URL: %s", url.c_str());
2059 request->send(404,
"text/plain",
"Not Found");
2066#ifdef USE_WEBSERVER_SORTING
2069 if (this->
sorting_groups_.find(this->sorting_entitys_[entity].group_id) != this->sorting_groups_.end()) {
2076#ifdef USE_WEBSERVER_SORTING
const std::string & get_friendly_name() const
Get the friendly name of this Application set by pre_setup().
const std::string & get_name() const
Get the name of this Application set by pre_setup().
StringRef get_comment_ref() const
Get the comment as StringRef (avoids allocation)
auto & get_binary_sensors() const
void set_interval(const std::string &name, uint32_t interval, std::function< void()> &&f)
Set an interval function with a unique name.
void defer(const std::string &name, std::function< void()> &&f)
Defer a callback to the next loop() call.
void begin(bool include_internal=false)
static void register_controller(Controller *controller)
Register a controller to receive entity state updates.
StringRef get_device_class_ref() const
Get the device class as StringRef.
StringRef get_unit_of_measurement_ref() const
Get the unit of measurement as StringRef.
const StringRef & get_name() const
StringRef get_icon_ref() const
bool is_disabled_by_default() const
std::string get_object_id() const
EntityCategory get_entity_category() const
AlarmControlPanelCall & arm_night()
AlarmControlPanelCall & disarm()
AlarmControlPanelCall & arm_away()
AlarmControlPanelCall & arm_home()
AlarmControlPanelCall & arm_vacation()
Base class for all binary_sensor-type classes.
ClimateDevice - This is the base class for all climate integrations.
ClimateMode mode
The active mode of the climate device.
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
ClimateTraits get_traits()
Get the traits of this climate device with all overrides applied.
float target_temperature
The target temperature of the climate device.
const char * get_custom_fan_mode() const
Get the active custom fan mode (read-only access).
ClimateSwingMode swing_mode
The active swing mode of the climate device.
float target_temperature_low
The minimum target temperature of the climate device, for climate devices with split target temperatu...
const char * get_custom_preset() const
Get the active custom preset (read-only access).
bool has_custom_preset() const
Check if a custom preset is currently active.
float current_temperature
The current temperature of the climate device, as reported from the integration.
ClimateAction action
The active state of the climate device.
bool has_custom_fan_mode() const
Check if a custom fan mode is currently active.
optional< ClimatePreset > preset
The active preset of the climate device.
float target_temperature_high
The maximum target temperature of the climate device, for climate devices with split target temperatu...
int8_t get_target_temperature_accuracy_decimals() const
CoverCall & set_command_toggle()
Set the command to toggle the cover.
CoverCall & set_command_open()
Set the command to open the cover.
CoverCall & set_command_close()
Set the command to close the cover.
CoverCall & set_command_stop()
Set the command to stop the cover.
Base class for all cover devices.
CoverOperation current_operation
The current operation of the cover (idle, opening, closing).
float tilt
The current tilt value of the cover from 0.0 to 1.0.
float position
The position of the cover from 0.0 (fully closed) to 1.0 (fully open).
bool is_fully_closed() const
Helper method to check if the cover is fully closed. Equivalent to comparing .position against 0....
virtual CoverTraits get_traits()=0
bool get_supports_position() const
bool get_supports_tilt() const
const FixedVector< const char * > & get_event_types() const
Return the event types supported by this event.
virtual FanTraits get_traits()=0
bool oscillating
The current oscillation state of the fan.
bool state
The current on/off state of the fan.
int speed
The current fan speed level.
bool supports_oscillation() const
Return if this fan supports oscillation.
Builder class for creating JSON documents without lambdas.
bool is_on() const
Get the binary true/false state of these light color values.
static void dump_json(LightState &state, JsonObject root)
Dump the state of a light as JSON.
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
LightColorValues remote_values
The remote color values reported to the frontend.
const FixedVector< LightEffect * > & get_effects() const
Get all effects for this light state.
Base class for all locks.
void add_log_listener(LogListener *listener)
Register a log listener to receive log messages.
Base-class for all numbers.
float get_min_value() const
float get_max_value() const
NumberMode get_mode() const
value_type const & value() const
Base-class for all selects.
const FixedVector< const char * > & get_options() const
Base-class for all sensors.
int8_t get_accuracy_decimals()
Get the accuracy in decimals, using the manual override if set.
Base class for all switches.
virtual bool assumed_state()
Return whether this switch uses an assumed state - i.e.
Base-class for all text inputs.
TextMode get_mode() const
int get_max_length() const
int get_min_length() const
const char * get_pattern_c_str() const
const UpdateState & state
const UpdateInfo & update_info
ValveCall & set_command_close()
Set the command to close the valve.
ValveCall & set_command_toggle()
Set the command to toggle the valve.
ValveCall & set_command_stop()
Set the command to stop the valve.
ValveCall & set_command_open()
Set the command to open the valve.
Base class for all valve devices.
bool is_fully_closed() const
Helper method to check if the valve is fully closed. Equivalent to comparing .position against 0....
float position
The position of the valve from 0.0 (fully closed) to 1.0 (fully open).
ValveOperation current_operation
The current operation of the valve (idle, opening, closing).
virtual ValveTraits get_traits()=0
bool get_supports_position() const
void process_deferred_queue_()
void try_send_nodefer(const char *message, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
static constexpr uint16_t MAX_CONSECUTIVE_SEND_FAILURES
uint16_t consecutive_send_failures_
void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator)
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)
ListEntitiesIterator entities_iterator_
std::vector< DeferredEvent > deferred_queue_
void 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.
void setup() override
Setup the internal web server and register handlers.
void on_update(update::UpdateEntity *obj) override
static std::string text_sensor_all_json_generator(WebServer *web_server, void *source)
std::string light_json(light::LightState *obj, JsonDetail start_config)
Dump the light state as a JSON string.
std::string date_json(datetime::DateEntity *obj, JsonDetail start_config)
Dump the date state with its value as a JSON string.
std::string get_config_json()
Return the webserver configuration as JSON.
std::map< EntityBase *, SortingComponents > sorting_entitys_
static std::string binary_sensor_state_json_generator(WebServer *web_server, void *source)
void on_text_update(text::Text *obj) override
std::string binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config)
Dump the binary sensor state with its value as a JSON string.
static std::string button_state_json_generator(WebServer *web_server, void *source)
static std::string lock_all_json_generator(WebServer *web_server, void *source)
void on_light_update(light::LightState *obj) override
static std::string date_all_json_generator(WebServer *web_server, void *source)
std::string update_json(update::UpdateEntity *obj, JsonDetail start_config)
Dump the update state with its value as a JSON string.
void on_cover_update(cover::Cover *obj) override
static std::string text_state_json_generator(WebServer *web_server, void *source)
void handle_select_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a select request under '/select/<id>'.
std::string number_json(number::Number *obj, float value, JsonDetail start_config)
Dump the number state with its value as a JSON string.
static std::string event_state_json_generator(WebServer *web_server, void *source)
std::string cover_json(cover::Cover *obj, JsonDetail start_config)
Dump the cover state as a JSON string.
static std::string datetime_all_json_generator(WebServer *web_server, void *source)
static std::string sensor_all_json_generator(WebServer *web_server, void *source)
bool isRequestHandlerTrivial() const override
This web handle is not trivial.
WebServer(web_server_base::WebServerBase *base)
std::string text_sensor_json(text_sensor::TextSensor *obj, const std::string &value, JsonDetail start_config)
Dump the text sensor state with its value as a JSON string.
void handle_switch_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a switch request under '/switch/<id>/</turn_on/turn_off/toggle>'.
void handle_event_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a event request under '/event<id>'.
void parse_light_param_uint_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(uint32_t), uint32_t scale=1)
void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override
std::string select_json(select::Select *obj, const char *value, JsonDetail start_config)
Dump the select state with its value as a JSON string.
void dump_config() override
std::string button_json(button::Button *obj, JsonDetail start_config)
Dump the button details with its value as a JSON string.
std::string valve_json(valve::Valve *obj, JsonDetail start_config)
Dump the valve state as a JSON string.
void handle_button_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a button request under '/button/<id>/press'.
void on_date_update(datetime::DateEntity *obj) override
std::string text_json(text::Text *obj, const std::string &value, JsonDetail start_config)
Dump the text state with its value as a JSON string.
void on_number_update(number::Number *obj) override
void add_entity_config(EntityBase *entity, float weight, uint64_t group)
std::string datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config)
Dump the datetime state with its value as a JSON string.
void handle_css_request(AsyncWebServerRequest *request)
Handle included css request under '/0.css'.
static std::string sensor_state_json_generator(WebServer *web_server, void *source)
void on_valve_update(valve::Valve *obj) override
void on_climate_update(climate::Climate *obj) override
static std::string switch_state_json_generator(WebServer *web_server, void *source)
void add_sorting_info_(JsonObject &root, EntityBase *entity)
void handle_light_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a light request under '/light/<id>/</turn_on/turn_off/toggle>'.
static std::string event_all_json_generator(WebServer *web_server, void *source)
static std::string climate_state_json_generator(WebServer *web_server, void *source)
void on_binary_sensor_update(binary_sensor::BinarySensor *obj) override
static std::string number_all_json_generator(WebServer *web_server, void *source)
void handle_text_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text input request under '/text/<id>'.
void handle_cover_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a cover request under '/cover/<id>/<open/close/stop/set>'.
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_
static std::string binary_sensor_all_json_generator(WebServer *web_server, void *source)
static std::string light_state_json_generator(WebServer *web_server, void *source)
void handle_lock_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a lock request under '/lock/<id>/</lock/unlock/open>'.
void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj) override
static std::string light_all_json_generator(WebServer *web_server, void *source)
std::string switch_json(switch_::Switch *obj, bool value, JsonDetail start_config)
Dump the switch state with its value as a JSON string.
void handle_text_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a text sensor request under '/text_sensor/<id>'.
std::string sensor_json(sensor::Sensor *obj, float value, JsonDetail start_config)
Dump the sensor state with its value as a JSON string.
void handle_date_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a date request under '/date/<id>'.
static std::string cover_all_json_generator(WebServer *web_server, void *source)
void handle_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a sensor request under '/sensor/<id>'.
static std::string text_sensor_state_json_generator(WebServer *web_server, void *source)
void handle_number_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a number request under '/number/<id>'.
static std::string alarm_control_panel_state_json_generator(WebServer *web_server, void *source)
void handle_index_request(AsyncWebServerRequest *request)
Handle an index request under '/'.
void handle_js_request(AsyncWebServerRequest *request)
Handle included js request under '/0.js'.
void set_js_include(const char *js_include)
Set local path to the script that's embedded in the index page.
static std::string fan_state_json_generator(WebServer *web_server, void *source)
static std::string update_state_json_generator(WebServer *web_server, void *source)
void handleRequest(AsyncWebServerRequest *request) override
Override the web handler's handleRequest method.
static std::string climate_all_json_generator(WebServer *web_server, void *source)
void on_datetime_update(datetime::DateTimeEntity *obj) override
std::string event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config)
Dump the event details with its value as a JSON string.
std::string time_json(datetime::TimeEntity *obj, JsonDetail start_config)
Dump the time state with its value as a JSON string.
void handle_fan_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a fan request under '/fan/<id>/</turn_on/turn_off/toggle>'.
static std::string cover_state_json_generator(WebServer *web_server, void *source)
static std::string lock_state_json_generator(WebServer *web_server, void *source)
void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a valve request under '/valve/<id>/<open/close/stop/set>'.
void handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a binary sensor request under '/binary_sensor/<id>'.
static std::string alarm_control_panel_all_json_generator(WebServer *web_server, void *source)
static std::string number_state_json_generator(WebServer *web_server, void *source)
void handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a time request under '/time/<id>'.
void on_sensor_update(sensor::Sensor *obj) override
std::map< uint64_t, SortingGroup > sorting_groups_
void set_css_include(const char *css_include)
Set local path to the script that's embedded in the index page.
static std::string valve_state_json_generator(WebServer *web_server, void *source)
bool canHandle(AsyncWebServerRequest *request) const override
Override the web handler's canHandle method.
std::string lock_json(lock::Lock *obj, lock::LockState value, JsonDetail start_config)
Dump the lock state with its value as a JSON string.
void on_event(event::Event *obj) override
void handle_pna_cors_request(AsyncWebServerRequest *request)
std::string fan_json(fan::Fan *obj, JsonDetail start_config)
Dump the fan state as a JSON string.
void on_fan_update(fan::Fan *obj) override
void parse_light_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(float), float scale=1.0f)
void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a datetime request under '/datetime/<id>'.
void parse_string_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(const std::string &))
void parse_float_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(float))
void handle_alarm_control_panel_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a alarm_control_panel request under '/alarm_control_panel/<id>'.
static std::string time_state_json_generator(WebServer *web_server, void *source)
void on_lock_update(lock::Lock *obj) override
static std::string button_all_json_generator(WebServer *web_server, void *source)
static std::string select_state_json_generator(WebServer *web_server, void *source)
float get_setup_priority() const override
MQTT setup priority.
void parse_int_param_(AsyncWebServerRequest *request, const char *param_name, T &call, Ret(T::*setter)(int))
void on_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>'.
std::string climate_json(climate::Climate *obj, JsonDetail start_config)
Dump the climate details.
static std::string fan_all_json_generator(WebServer *web_server, void *source)
static std::string switch_all_json_generator(WebServer *web_server, void *source)
static std::string time_all_json_generator(WebServer *web_server, void *source)
void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight)
static std::string select_all_json_generator(WebServer *web_server, void *source)
const char * css_include_
static std::string datetime_state_json_generator(WebServer *web_server, void *source)
void handle_climate_request(AsyncWebServerRequest *request, const UrlMatch &match)
Handle a climate request under '/climate/<id>'.
std::string alarm_control_panel_json(alarm_control_panel::AlarmControlPanel *obj, alarm_control_panel::AlarmControlPanelState value, JsonDetail start_config)
Dump the alarm_control_panel state with its value as a JSON string.
void on_text_sensor_update(text_sensor::TextSensor *obj) override
void add_handler(AsyncWebHandler *handler)
uint16_t get_port() const
ClimateSwingMode swing_mode
@ CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_SUPPORTS_ACTION
@ CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE
const LogString * climate_swing_mode_to_string(ClimateSwingMode swing_mode)
Convert the given ClimateSwingMode to a human-readable string.
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
ClimatePreset
Enum for all preset modes NOTE: If adding values, update ClimatePresetMask in climate_traits....
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
ClimateMode
Enum for all modes a climate device can be in.
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
ClimateFanMode
NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value.
const LogString * cover_operation_to_str(CoverOperation op)
const LogString * lock_state_to_string(LockState state)
LockState
Enum for all states a lock can be in.
const char * get_use_address()
Get the active network hostname.
@ UPDATE_STATE_INSTALLING
const LogString * valve_operation_to_str(ValveOperation op)
std::string(WebServer *, void *) message_generator_t
Providing packet encoding functions for exchanging data with a remote host.
std::string value_accuracy_to_string(float value, int8_t accuracy_decimals)
Create a string from a value and an accuracy in decimals.
ParseOnOffState parse_on_off(const char *str, const char *on, const char *off)
Parse a string that contains either on, off or toggle.
std::string value_accuracy_with_uom_to_string(float value, int8_t accuracy_decimals, StringRef unit_of_measurement)
Create a string from a value, an accuracy in decimals, and a unit of measurement.
int8_t step_to_accuracy_decimals(float step)
Derive accuracy in decimals from an increment step.
const char * get_mac_address_pretty_into_buffer(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf)
Get the device MAC address into the given buffer, in colon-separated uppercase hex notation.
std::string str_sprintf(const char *fmt,...)
uint32_t IRAM_ATTR HOT millis()
Application App
Global storage of Application pointer - only one Application can exist.
std::string current_version
std::string latest_version
Internal helper struct that is used to parse incoming URLs.
const char * domain
Pointer to domain within URL, for example "sensor".
bool valid
Whether this match is valid.
bool id_equals_entity(EntityBase *entity) const
bool method_empty() const
bool domain_equals(const char *str) const
bool method_equals(const char *str) const
friend class DeferredUpdateEventSource
const size_t ESPHOME_WEBSERVER_INDEX_HTML_SIZE
const size_t ESPHOME_WEBSERVER_CSS_INCLUDE_SIZE
const size_t ESPHOME_WEBSERVER_JS_INCLUDE_SIZE