mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	reduce memory
This commit is contained in:
		| @@ -211,6 +211,7 @@ async def add_entity_config(entity, config): | |||||||
|     sorting_weight = config.get(CONF_SORTING_WEIGHT, 50) |     sorting_weight = config.get(CONF_SORTING_WEIGHT, 50) | ||||||
|     sorting_group_hash = hash(config.get(CONF_SORTING_GROUP_ID)) |     sorting_group_hash = hash(config.get(CONF_SORTING_GROUP_ID)) | ||||||
|  |  | ||||||
|  |     cg.add_define("USE_WEBSERVER_SORTING") | ||||||
|     cg.add( |     cg.add( | ||||||
|         web_server.add_entity_config( |         web_server.add_entity_config( | ||||||
|             entity, |             entity, | ||||||
| @@ -296,4 +297,5 @@ async def to_code(config): | |||||||
|         cg.add_define("USE_WEBSERVER_LOCAL") |         cg.add_define("USE_WEBSERVER_LOCAL") | ||||||
|  |  | ||||||
|     if (sorting_group_config := config.get(CONF_SORTING_GROUPS)) is not None: |     if (sorting_group_config := config.get(CONF_SORTING_GROUPS)) is not None: | ||||||
|  |         cg.add_define("USE_WEBSERVER_SORTING") | ||||||
|         add_sorting_groups(var, sorting_group_config) |         add_sorting_groups(var, sorting_group_config) | ||||||
|   | |||||||
| @@ -184,6 +184,7 @@ void DeferredUpdateEventSourceList::on_client_connect_(WebServer *ws, DeferredUp | |||||||
|   std::string message = ws->get_config_json(); |   std::string message = ws->get_config_json(); | ||||||
|   source->try_send_nodefer(message.c_str(), "ping", millis(), 30000); |   source->try_send_nodefer(message.c_str(), "ping", millis(), 30000); | ||||||
|  |  | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|   for (auto &group : ws->sorting_groups_) { |   for (auto &group : ws->sorting_groups_) { | ||||||
|     message = json::build_json([group](JsonObject root) { |     message = json::build_json([group](JsonObject root) { | ||||||
|       root["name"] = group.second.name; |       root["name"] = group.second.name; | ||||||
| @@ -193,6 +194,7 @@ void DeferredUpdateEventSourceList::on_client_connect_(WebServer *ws, DeferredUp | |||||||
|     // up to 31 groups should be able to be queued initially without defer |     // up to 31 groups should be able to be queued initially without defer | ||||||
|     source->try_send_nodefer(message.c_str(), "sorting_group"); |     source->try_send_nodefer(message.c_str(), "sorting_group"); | ||||||
|   } |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   source->entities_iterator_.begin(ws->include_internal_); |   source->entities_iterator_.begin(ws->include_internal_); | ||||||
|  |  | ||||||
| @@ -411,7 +413,9 @@ std::string WebServer::sensor_json(sensor::Sensor *obj, float value, JsonDetail | |||||||
|     } |     } | ||||||
|     set_json_icon_state_value(root, obj, "sensor-" + obj->get_object_id(), state, value, start_config); |     set_json_icon_state_value(root, obj, "sensor-" + obj->get_object_id(), state, value, start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|       if (!obj->get_unit_of_measurement().empty()) |       if (!obj->get_unit_of_measurement().empty()) | ||||||
|         root["uom"] = obj->get_unit_of_measurement(); |         root["uom"] = obj->get_unit_of_measurement(); | ||||||
|     } |     } | ||||||
| @@ -455,7 +459,9 @@ std::string WebServer::text_sensor_json(text_sensor::TextSensor *obj, const std: | |||||||
|   return json::build_json([this, obj, value, start_config](JsonObject root) { |   return json::build_json([this, obj, value, start_config](JsonObject root) { | ||||||
|     set_json_icon_state_value(root, obj, "text_sensor-" + obj->get_object_id(), value, value, start_config); |     set_json_icon_state_value(root, obj, "text_sensor-" + obj->get_object_id(), value, value, start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -507,7 +513,9 @@ std::string WebServer::switch_json(switch_::Switch *obj, bool value, JsonDetail | |||||||
|     set_json_icon_state_value(root, obj, "switch-" + obj->get_object_id(), value ? "ON" : "OFF", value, start_config); |     set_json_icon_state_value(root, obj, "switch-" + obj->get_object_id(), value ? "ON" : "OFF", value, start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|       root["assumed_state"] = obj->assumed_state(); |       root["assumed_state"] = obj->assumed_state(); | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -547,7 +555,9 @@ std::string WebServer::button_json(button::Button *obj, JsonDetail start_config) | |||||||
|   return json::build_json([this, obj, start_config](JsonObject root) { |   return json::build_json([this, obj, start_config](JsonObject root) { | ||||||
|     set_json_id(root, obj, "button-" + obj->get_object_id(), start_config); |     set_json_id(root, obj, "button-" + obj->get_object_id(), start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -589,7 +599,9 @@ std::string WebServer::binary_sensor_json(binary_sensor::BinarySensor *obj, bool | |||||||
|     set_json_icon_state_value(root, obj, "binary_sensor-" + obj->get_object_id(), value ? "ON" : "OFF", value, |     set_json_icon_state_value(root, obj, "binary_sensor-" + obj->get_object_id(), value ? "ON" : "OFF", value, | ||||||
|                               start_config); |                               start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -674,7 +686,9 @@ std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) { | |||||||
|     if (obj->get_traits().supports_oscillation()) |     if (obj->get_traits().supports_oscillation()) | ||||||
|       root["oscillation"] = obj->oscillating; |       root["oscillation"] = obj->oscillating; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -794,7 +808,9 @@ std::string WebServer::light_json(light::LightState *obj, JsonDetail start_confi | |||||||
|       for (auto const &option : obj->get_effects()) { |       for (auto const &option : obj->get_effects()) { | ||||||
|         opt.add(option->get_name()); |         opt.add(option->get_name()); | ||||||
|       } |       } | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -879,7 +895,9 @@ std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) { | |||||||
|     if (obj->get_traits().get_supports_tilt()) |     if (obj->get_traits().get_supports_tilt()) | ||||||
|       root["tilt"] = obj->tilt; |       root["tilt"] = obj->tilt; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -944,7 +962,9 @@ std::string WebServer::number_json(number::Number *obj, float value, JsonDetail | |||||||
|       root["mode"] = (int) obj->traits.get_mode(); |       root["mode"] = (int) obj->traits.get_mode(); | ||||||
|       if (!obj->traits.get_unit_of_measurement().empty()) |       if (!obj->traits.get_unit_of_measurement().empty()) | ||||||
|         root["uom"] = obj->traits.get_unit_of_measurement(); |         root["uom"] = obj->traits.get_unit_of_measurement(); | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|     if (std::isnan(value)) { |     if (std::isnan(value)) { | ||||||
|       root["value"] = "\"NaN\""; |       root["value"] = "\"NaN\""; | ||||||
| @@ -1017,7 +1037,9 @@ std::string WebServer::date_json(datetime::DateEntity *obj, JsonDetail start_con | |||||||
|     root["value"] = value; |     root["value"] = value; | ||||||
|     root["state"] = value; |     root["state"] = value; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1079,7 +1101,9 @@ std::string WebServer::time_json(datetime::TimeEntity *obj, JsonDetail start_con | |||||||
|     root["value"] = value; |     root["value"] = value; | ||||||
|     root["state"] = value; |     root["state"] = value; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1142,7 +1166,9 @@ std::string WebServer::datetime_json(datetime::DateTimeEntity *obj, JsonDetail s | |||||||
|     root["value"] = value; |     root["value"] = value; | ||||||
|     root["state"] = value; |     root["state"] = value; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1207,7 +1233,9 @@ std::string WebServer::text_json(text::Text *obj, const std::string &value, Json | |||||||
|     root["value"] = value; |     root["value"] = value; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|       root["mode"] = (int) obj->traits.get_mode(); |       root["mode"] = (int) obj->traits.get_mode(); | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1267,7 +1295,9 @@ std::string WebServer::select_json(select::Select *obj, const std::string &value | |||||||
|       for (auto &option : obj->traits.get_options()) { |       for (auto &option : obj->traits.get_options()) { | ||||||
|         opt.add(option); |         opt.add(option); | ||||||
|       } |       } | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1388,7 +1418,9 @@ std::string WebServer::climate_json(climate::Climate *obj, JsonDetail start_conf | |||||||
|         for (auto const &custom_preset : traits.get_supported_custom_presets()) |         for (auto const &custom_preset : traits.get_supported_custom_presets()) | ||||||
|           opt.add(custom_preset); |           opt.add(custom_preset); | ||||||
|       } |       } | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool has_state = false; |     bool has_state = false; | ||||||
| @@ -1485,7 +1517,9 @@ std::string WebServer::lock_json(lock::Lock *obj, lock::LockState value, JsonDet | |||||||
|     set_json_icon_state_value(root, obj, "lock-" + obj->get_object_id(), lock::lock_state_to_string(value), value, |     set_json_icon_state_value(root, obj, "lock-" + obj->get_object_id(), lock::lock_state_to_string(value), value, | ||||||
|                               start_config); |                               start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1561,7 +1595,9 @@ std::string WebServer::valve_json(valve::Valve *obj, JsonDetail start_config) { | |||||||
|     if (obj->get_traits().get_supports_position()) |     if (obj->get_traits().get_supports_position()) | ||||||
|       root["position"] = obj->position; |       root["position"] = obj->position; | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1633,7 +1669,9 @@ std::string WebServer::alarm_control_panel_json(alarm_control_panel::AlarmContro | |||||||
|     set_json_icon_state_value(root, obj, "alarm-control-panel-" + obj->get_object_id(), |     set_json_icon_state_value(root, obj, "alarm-control-panel-" + obj->get_object_id(), | ||||||
|                               PSTR_LOCAL(alarm_control_panel_state_to_string(value)), value, start_config); |                               PSTR_LOCAL(alarm_control_panel_state_to_string(value)), value, start_config); | ||||||
|     if (start_config == DETAIL_ALL) { |     if (start_config == DETAIL_ALL) { | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1682,7 +1720,9 @@ std::string WebServer::event_json(event::Event *obj, const std::string &event_ty | |||||||
|         event_types.add(event_type); |         event_types.add(event_type); | ||||||
|       } |       } | ||||||
|       root["device_class"] = obj->get_device_class(); |       root["device_class"] = obj->get_device_class(); | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -1750,7 +1790,9 @@ std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_c | |||||||
|       root["title"] = obj->update_info.title; |       root["title"] = obj->update_info.title; | ||||||
|       root["summary"] = obj->update_info.summary; |       root["summary"] = obj->update_info.summary; | ||||||
|       root["release_url"] = obj->update_info.release_url; |       root["release_url"] = obj->update_info.release_url; | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|       this->add_sorting_info_(root, obj); |       this->add_sorting_info_(root, obj); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -2060,6 +2102,7 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) { | |||||||
|  |  | ||||||
| bool WebServer::isRequestHandlerTrivial() const { return false; } | bool WebServer::isRequestHandlerTrivial() const { return false; } | ||||||
|  |  | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
| void WebServer::add_entity_config(EntityBase *entity, float weight, uint64_t group) { | void WebServer::add_entity_config(EntityBase *entity, float weight, uint64_t group) { | ||||||
|   this->sorting_entitys_[entity] = SortingComponents{weight, group}; |   this->sorting_entitys_[entity] = SortingComponents{weight, group}; | ||||||
| } | } | ||||||
| @@ -2076,6 +2119,7 @@ void WebServer::add_sorting_info_(JsonObject &root, EntityBase *entity) { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| void WebServer::schedule_(std::function<void()> &&f) { | void WebServer::schedule_(std::function<void()> &&f) { | ||||||
| #ifdef USE_ESP32 | #ifdef USE_ESP32 | ||||||
|   | |||||||
| @@ -46,6 +46,7 @@ struct UrlMatch { | |||||||
|   bool valid;          ///< Whether this match is valid |   bool valid;          ///< Whether this match is valid | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
| struct SortingComponents { | struct SortingComponents { | ||||||
|   float weight; |   float weight; | ||||||
|   uint64_t group_id; |   uint64_t group_id; | ||||||
| @@ -55,6 +56,7 @@ struct SortingGroup { | |||||||
|   std::string name; |   std::string name; | ||||||
|   float weight; |   float weight; | ||||||
| }; | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| enum JsonDetail { DETAIL_ALL, DETAIL_STATE }; | enum JsonDetail { DETAIL_ALL, DETAIL_STATE }; | ||||||
|  |  | ||||||
| @@ -474,15 +476,20 @@ class WebServer : public Controller, public Component, public AsyncWebHandler { | |||||||
|   /// This web handle is not trivial. |   /// This web handle is not trivial. | ||||||
|   bool isRequestHandlerTrivial() const override;  // NOLINT(readability-identifier-naming) |   bool isRequestHandlerTrivial() const override;  // NOLINT(readability-identifier-naming) | ||||||
|  |  | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|   void add_entity_config(EntityBase *entity, float weight, uint64_t group); |   void add_entity_config(EntityBase *entity, float weight, uint64_t group); | ||||||
|   void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight); |   void add_sorting_group(uint64_t group_id, const std::string &group_name, float weight); | ||||||
|  |  | ||||||
|   std::map<EntityBase *, SortingComponents> sorting_entitys_; |   std::map<EntityBase *, SortingComponents> sorting_entitys_; | ||||||
|   std::map<uint64_t, SortingGroup> sorting_groups_; |   std::map<uint64_t, SortingGroup> sorting_groups_; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   bool include_internal_{false}; |   bool include_internal_{false}; | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|  | #ifdef USE_WEBSERVER_SORTING | ||||||
|   void add_sorting_info_(JsonObject &root, EntityBase *entity); |   void add_sorting_info_(JsonObject &root, EntityBase *entity); | ||||||
|  | #endif | ||||||
|   void schedule_(std::function<void()> &&f); |   void schedule_(std::function<void()> &&f); | ||||||
|   web_server_base::WebServerBase *base_; |   web_server_base::WebServerBase *base_; | ||||||
| #ifdef USE_ARDUINO | #ifdef USE_ARDUINO | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user