mirror of
https://github.com/esphome/esphome.git
synced 2025-09-17 02:32:20 +01:00
Merge branch 'webserver_remove_lambas' into integration
This commit is contained in:
@@ -35,25 +35,10 @@ struct SpiRamAllocator : ArduinoJson::Allocator {
|
|||||||
|
|
||||||
std::string build_json(const json_build_t &f) {
|
std::string build_json(const json_build_t &f) {
|
||||||
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
||||||
#ifdef USE_PSRAM
|
JsonBuilder builder;
|
||||||
auto doc_allocator = SpiRamAllocator();
|
JsonObject root = builder.root();
|
||||||
JsonDocument json_document(&doc_allocator);
|
|
||||||
#else
|
|
||||||
JsonDocument json_document;
|
|
||||||
#endif
|
|
||||||
if (json_document.overflowed()) {
|
|
||||||
ESP_LOGE(TAG, "Could not allocate memory for JSON document!");
|
|
||||||
return "{}";
|
|
||||||
}
|
|
||||||
JsonObject root = json_document.to<JsonObject>();
|
|
||||||
f(root);
|
f(root);
|
||||||
if (json_document.overflowed()) {
|
return builder.serialize();
|
||||||
ESP_LOGE(TAG, "Could not allocate memory for JSON document!");
|
|
||||||
return "{}";
|
|
||||||
}
|
|
||||||
std::string output;
|
|
||||||
serializeJson(json_document, output);
|
|
||||||
return output;
|
|
||||||
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,5 +69,53 @@ bool parse_json(const std::string &data, const json_parse_t &f) {
|
|||||||
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JsonBuilder implementation
|
||||||
|
class JsonBuilder::Impl {
|
||||||
|
public:
|
||||||
|
Impl() {
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
allocator_ = std::make_unique<SpiRamAllocator>();
|
||||||
|
doc_ = std::make_unique<JsonDocument>(allocator_.get());
|
||||||
|
#else
|
||||||
|
doc_ = std::make_unique<JsonDocument>();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonObject root() {
|
||||||
|
if (!root_created_) {
|
||||||
|
root_ = doc_->to<JsonObject>();
|
||||||
|
root_created_ = true;
|
||||||
|
}
|
||||||
|
return root_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool overflowed() const { return doc_->overflowed(); }
|
||||||
|
|
||||||
|
void serialize_to(std::string &output) { serializeJson(*doc_, output); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef USE_PSRAM
|
||||||
|
std::unique_ptr<SpiRamAllocator> allocator_;
|
||||||
|
#endif
|
||||||
|
std::unique_ptr<JsonDocument> doc_;
|
||||||
|
JsonObject root_;
|
||||||
|
bool root_created_{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
JsonBuilder::JsonBuilder() : impl_(std::make_unique<Impl>()) {}
|
||||||
|
JsonBuilder::~JsonBuilder() = default;
|
||||||
|
|
||||||
|
JsonObject JsonBuilder::root() { return impl_->root(); }
|
||||||
|
|
||||||
|
std::string JsonBuilder::serialize() {
|
||||||
|
if (impl_->overflowed()) {
|
||||||
|
ESP_LOGE(TAG, "JSON document overflow");
|
||||||
|
return "{}";
|
||||||
|
}
|
||||||
|
std::string output;
|
||||||
|
impl_->serialize_to(output);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace json
|
} // namespace json
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
@@ -25,5 +25,20 @@ std::string build_json(const json_build_t &f);
|
|||||||
/// Parse a JSON string and run the provided json parse function if it's valid.
|
/// Parse a JSON string and run the provided json parse function if it's valid.
|
||||||
bool parse_json(const std::string &data, const json_parse_t &f);
|
bool parse_json(const std::string &data, const json_parse_t &f);
|
||||||
|
|
||||||
|
/// Builder class for creating JSON documents without lambdas
|
||||||
|
class JsonBuilder {
|
||||||
|
public:
|
||||||
|
JsonBuilder();
|
||||||
|
~JsonBuilder();
|
||||||
|
|
||||||
|
JsonObject root();
|
||||||
|
std::string serialize();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Use opaque pointer to hide implementation details
|
||||||
|
class Impl;
|
||||||
|
std::unique_ptr<Impl> impl_;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace json
|
} // namespace json
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
@@ -228,10 +228,11 @@ void DeferredUpdateEventSourceList::on_client_connect_(WebServer *ws, DeferredUp
|
|||||||
|
|
||||||
#ifdef USE_WEBSERVER_SORTING
|
#ifdef USE_WEBSERVER_SORTING
|
||||||
for (auto &group : ws->sorting_groups_) {
|
for (auto &group : ws->sorting_groups_) {
|
||||||
message = json::build_json([group](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
root["name"] = group.second.name;
|
root["name"] = group.second.name;
|
||||||
root["sorting_weight"] = group.second.weight;
|
root["sorting_weight"] = group.second.weight;
|
||||||
});
|
message = builder.serialize();
|
||||||
|
|
||||||
// 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");
|
||||||
@@ -265,7 +266,9 @@ void WebServer::set_js_include(const char *js_include) { this->js_include_ = js_
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string WebServer::get_config_json() {
|
std::string WebServer::get_config_json() {
|
||||||
return json::build_json([this](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
root["title"] = App.get_friendly_name().empty() ? App.get_name() : App.get_friendly_name();
|
root["title"] = App.get_friendly_name().empty() ? App.get_name() : App.get_friendly_name();
|
||||||
root["comment"] = App.get_comment();
|
root["comment"] = App.get_comment();
|
||||||
#if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA)
|
#if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA)
|
||||||
@@ -275,7 +278,8 @@ std::string WebServer::get_config_json() {
|
|||||||
#endif
|
#endif
|
||||||
root["log"] = this->expose_log_;
|
root["log"] = this->expose_log_;
|
||||||
root["lang"] = "en";
|
root["lang"] = "en";
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServer::setup() {
|
void WebServer::setup() {
|
||||||
@@ -435,7 +439,10 @@ std::string WebServer::sensor_all_json_generator(WebServer *web_server, void *so
|
|||||||
return web_server->sensor_json((sensor::Sensor *) (source), ((sensor::Sensor *) (source))->state, DETAIL_ALL);
|
return web_server->sensor_json((sensor::Sensor *) (source), ((sensor::Sensor *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::sensor_json(sensor::Sensor *obj, float value, JsonDetail start_config) {
|
std::string WebServer::sensor_json(sensor::Sensor *obj, float value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
|
// Build JSON directly inline
|
||||||
std::string state;
|
std::string state;
|
||||||
if (std::isnan(value)) {
|
if (std::isnan(value)) {
|
||||||
state = "NA";
|
state = "NA";
|
||||||
@@ -450,7 +457,8 @@ std::string WebServer::sensor_json(sensor::Sensor *obj, float value, JsonDetail
|
|||||||
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();
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -483,12 +491,15 @@ std::string WebServer::text_sensor_all_json_generator(WebServer *web_server, voi
|
|||||||
}
|
}
|
||||||
std::string WebServer::text_sensor_json(text_sensor::TextSensor *obj, const std::string &value,
|
std::string WebServer::text_sensor_json(text_sensor::TextSensor *obj, const std::string &value,
|
||||||
JsonDetail start_config) {
|
JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.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) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -553,13 +564,16 @@ std::string WebServer::switch_all_json_generator(WebServer *web_server, void *so
|
|||||||
return web_server->switch_json((switch_::Switch *) (source), ((switch_::Switch *) (source))->state, DETAIL_ALL);
|
return web_server->switch_json((switch_::Switch *) (source), ((switch_::Switch *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::switch_json(switch_::Switch *obj, bool value, JsonDetail start_config) {
|
std::string WebServer::switch_json(switch_::Switch *obj, bool value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
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();
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -590,12 +604,15 @@ std::string WebServer::button_all_json_generator(WebServer *web_server, void *so
|
|||||||
return web_server->button_json((button::Button *) (source), DETAIL_ALL);
|
return web_server->button_json((button::Button *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::button_json(button::Button *obj, JsonDetail start_config) {
|
std::string WebServer::button_json(button::Button *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.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) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -627,13 +644,16 @@ std::string WebServer::binary_sensor_all_json_generator(WebServer *web_server, v
|
|||||||
((binary_sensor::BinarySensor *) (source))->state, DETAIL_ALL);
|
((binary_sensor::BinarySensor *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config) {
|
std::string WebServer::binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
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) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -694,7 +714,9 @@ std::string WebServer::fan_all_json_generator(WebServer *web_server, void *sourc
|
|||||||
return web_server->fan_json((fan::Fan *) (source), DETAIL_ALL);
|
return web_server->fan_json((fan::Fan *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) {
|
std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_icon_state_value(root, obj, "fan-" + obj->get_object_id(), obj->state ? "ON" : "OFF", obj->state,
|
set_json_icon_state_value(root, obj, "fan-" + obj->get_object_id(), obj->state ? "ON" : "OFF", obj->state,
|
||||||
start_config);
|
start_config);
|
||||||
const auto traits = obj->get_traits();
|
const auto traits = obj->get_traits();
|
||||||
@@ -707,7 +729,8 @@ std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) {
|
|||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -767,7 +790,9 @@ std::string WebServer::light_all_json_generator(WebServer *web_server, void *sou
|
|||||||
return web_server->light_json((light::LightState *) (source), DETAIL_ALL);
|
return web_server->light_json((light::LightState *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::light_json(light::LightState *obj, JsonDetail start_config) {
|
std::string WebServer::light_json(light::LightState *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "light-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "light-" + obj->get_object_id(), start_config);
|
||||||
root["state"] = obj->remote_values.is_on() ? "ON" : "OFF";
|
root["state"] = obj->remote_values.is_on() ? "ON" : "OFF";
|
||||||
|
|
||||||
@@ -780,7 +805,8 @@ std::string WebServer::light_json(light::LightState *obj, JsonDetail start_confi
|
|||||||
}
|
}
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -839,7 +865,9 @@ std::string WebServer::cover_all_json_generator(WebServer *web_server, void *sou
|
|||||||
return web_server->cover_json((cover::Cover *) (source), DETAIL_ALL);
|
return web_server->cover_json((cover::Cover *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) {
|
std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_icon_state_value(root, obj, "cover-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
set_json_icon_state_value(root, obj, "cover-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
||||||
obj->position, start_config);
|
obj->position, start_config);
|
||||||
root["current_operation"] = cover::cover_operation_to_str(obj->current_operation);
|
root["current_operation"] = cover::cover_operation_to_str(obj->current_operation);
|
||||||
@@ -851,7 +879,8 @@ std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) {
|
|||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -894,15 +923,16 @@ std::string WebServer::number_all_json_generator(WebServer *web_server, void *so
|
|||||||
return web_server->number_json((number::Number *) (source), ((number::Number *) (source))->state, DETAIL_ALL);
|
return web_server->number_json((number::Number *) (source), ((number::Number *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::number_json(number::Number *obj, float value, JsonDetail start_config) {
|
std::string WebServer::number_json(number::Number *obj, float value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "number-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "number-" + obj->get_object_id(), start_config);
|
||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
root["min_value"] =
|
root["min_value"] =
|
||||||
value_accuracy_to_string(obj->traits.get_min_value(), step_to_accuracy_decimals(obj->traits.get_step()));
|
value_accuracy_to_string(obj->traits.get_min_value(), step_to_accuracy_decimals(obj->traits.get_step()));
|
||||||
root["max_value"] =
|
root["max_value"] =
|
||||||
value_accuracy_to_string(obj->traits.get_max_value(), step_to_accuracy_decimals(obj->traits.get_step()));
|
value_accuracy_to_string(obj->traits.get_max_value(), step_to_accuracy_decimals(obj->traits.get_step()));
|
||||||
root["step"] =
|
root["step"] = value_accuracy_to_string(obj->traits.get_step(), step_to_accuracy_decimals(obj->traits.get_step()));
|
||||||
value_accuracy_to_string(obj->traits.get_step(), step_to_accuracy_decimals(obj->traits.get_step()));
|
|
||||||
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();
|
||||||
@@ -918,7 +948,8 @@ std::string WebServer::number_json(number::Number *obj, float value, JsonDetail
|
|||||||
state += " " + obj->traits.get_unit_of_measurement();
|
state += " " + obj->traits.get_unit_of_measurement();
|
||||||
root["state"] = state;
|
root["state"] = state;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -966,7 +997,9 @@ std::string WebServer::date_all_json_generator(WebServer *web_server, void *sour
|
|||||||
return web_server->date_json((datetime::DateEntity *) (source), DETAIL_ALL);
|
return web_server->date_json((datetime::DateEntity *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::date_json(datetime::DateEntity *obj, JsonDetail start_config) {
|
std::string WebServer::date_json(datetime::DateEntity *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "date-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "date-" + obj->get_object_id(), start_config);
|
||||||
std::string value = str_sprintf("%d-%02d-%02d", obj->year, obj->month, obj->day);
|
std::string value = str_sprintf("%d-%02d-%02d", obj->year, obj->month, obj->day);
|
||||||
root["value"] = value;
|
root["value"] = value;
|
||||||
@@ -974,7 +1007,8 @@ std::string WebServer::date_json(datetime::DateEntity *obj, JsonDetail start_con
|
|||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif // USE_DATETIME_DATE
|
#endif // USE_DATETIME_DATE
|
||||||
|
|
||||||
@@ -1021,7 +1055,9 @@ std::string WebServer::time_all_json_generator(WebServer *web_server, void *sour
|
|||||||
return web_server->time_json((datetime::TimeEntity *) (source), DETAIL_ALL);
|
return web_server->time_json((datetime::TimeEntity *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::time_json(datetime::TimeEntity *obj, JsonDetail start_config) {
|
std::string WebServer::time_json(datetime::TimeEntity *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "time-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "time-" + obj->get_object_id(), start_config);
|
||||||
std::string value = str_sprintf("%02d:%02d:%02d", obj->hour, obj->minute, obj->second);
|
std::string value = str_sprintf("%02d:%02d:%02d", obj->hour, obj->minute, obj->second);
|
||||||
root["value"] = value;
|
root["value"] = value;
|
||||||
@@ -1029,7 +1065,8 @@ std::string WebServer::time_json(datetime::TimeEntity *obj, JsonDetail start_con
|
|||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif // USE_DATETIME_TIME
|
#endif // USE_DATETIME_TIME
|
||||||
|
|
||||||
@@ -1076,16 +1113,19 @@ std::string WebServer::datetime_all_json_generator(WebServer *web_server, void *
|
|||||||
return web_server->datetime_json((datetime::DateTimeEntity *) (source), DETAIL_ALL);
|
return web_server->datetime_json((datetime::DateTimeEntity *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config) {
|
std::string WebServer::datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "datetime-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "datetime-" + obj->get_object_id(), start_config);
|
||||||
std::string value = str_sprintf("%d-%02d-%02d %02d:%02d:%02d", obj->year, obj->month, obj->day, obj->hour,
|
std::string value =
|
||||||
obj->minute, obj->second);
|
str_sprintf("%d-%02d-%02d %02d:%02d:%02d", obj->year, obj->month, obj->day, obj->hour, obj->minute, obj->second);
|
||||||
root["value"] = value;
|
root["value"] = value;
|
||||||
root["state"] = value;
|
root["state"] = value;
|
||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif // USE_DATETIME_DATETIME
|
#endif // USE_DATETIME_DATETIME
|
||||||
|
|
||||||
@@ -1128,7 +1168,9 @@ std::string WebServer::text_all_json_generator(WebServer *web_server, void *sour
|
|||||||
return web_server->text_json((text::Text *) (source), ((text::Text *) (source))->state, DETAIL_ALL);
|
return web_server->text_json((text::Text *) (source), ((text::Text *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::text_json(text::Text *obj, const std::string &value, JsonDetail start_config) {
|
std::string WebServer::text_json(text::Text *obj, const std::string &value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "text-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "text-" + obj->get_object_id(), start_config);
|
||||||
root["min_length"] = obj->traits.get_min_length();
|
root["min_length"] = obj->traits.get_min_length();
|
||||||
root["max_length"] = obj->traits.get_max_length();
|
root["max_length"] = obj->traits.get_max_length();
|
||||||
@@ -1143,7 +1185,8 @@ std::string WebServer::text_json(text::Text *obj, const std::string &value, Json
|
|||||||
root["mode"] = (int) obj->traits.get_mode();
|
root["mode"] = (int) obj->traits.get_mode();
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1186,7 +1229,9 @@ std::string WebServer::select_all_json_generator(WebServer *web_server, void *so
|
|||||||
return web_server->select_json((select::Select *) (source), ((select::Select *) (source))->state, DETAIL_ALL);
|
return web_server->select_json((select::Select *) (source), ((select::Select *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::select_json(select::Select *obj, const std::string &value, JsonDetail start_config) {
|
std::string WebServer::select_json(select::Select *obj, const std::string &value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_icon_state_value(root, obj, "select-" + obj->get_object_id(), value, value, start_config);
|
set_json_icon_state_value(root, obj, "select-" + obj->get_object_id(), value, value, start_config);
|
||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
JsonArray opt = root["option"].to<JsonArray>();
|
JsonArray opt = root["option"].to<JsonArray>();
|
||||||
@@ -1195,7 +1240,8 @@ std::string WebServer::select_json(select::Select *obj, const std::string &value
|
|||||||
}
|
}
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1251,7 +1297,8 @@ std::string WebServer::climate_all_json_generator(WebServer *web_server, void *s
|
|||||||
}
|
}
|
||||||
std::string WebServer::climate_json(climate::Climate *obj, JsonDetail start_config) {
|
std::string WebServer::climate_json(climate::Climate *obj, JsonDetail start_config) {
|
||||||
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
set_json_id(root, obj, "climate-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "climate-" + obj->get_object_id(), start_config);
|
||||||
const auto traits = obj->get_traits();
|
const auto traits = obj->get_traits();
|
||||||
int8_t target_accuracy = traits.get_target_temperature_accuracy_decimals();
|
int8_t target_accuracy = traits.get_target_temperature_accuracy_decimals();
|
||||||
@@ -1335,7 +1382,8 @@ std::string WebServer::climate_json(climate::Climate *obj, JsonDetail start_conf
|
|||||||
if (!has_state)
|
if (!has_state)
|
||||||
root["state"] = root["target_temperature"];
|
root["state"] = root["target_temperature"];
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1401,13 +1449,16 @@ std::string WebServer::lock_all_json_generator(WebServer *web_server, void *sour
|
|||||||
return web_server->lock_json((lock::Lock *) (source), ((lock::Lock *) (source))->state, DETAIL_ALL);
|
return web_server->lock_json((lock::Lock *) (source), ((lock::Lock *) (source))->state, DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::lock_json(lock::Lock *obj, lock::LockState value, JsonDetail start_config) {
|
std::string WebServer::lock_json(lock::Lock *obj, lock::LockState value, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
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) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1464,7 +1515,9 @@ std::string WebServer::valve_all_json_generator(WebServer *web_server, void *sou
|
|||||||
return web_server->valve_json((valve::Valve *) (source), DETAIL_ALL);
|
return web_server->valve_json((valve::Valve *) (source), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::valve_json(valve::Valve *obj, JsonDetail start_config) {
|
std::string WebServer::valve_json(valve::Valve *obj, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_icon_state_value(root, obj, "valve-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
set_json_icon_state_value(root, obj, "valve-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
||||||
obj->position, start_config);
|
obj->position, start_config);
|
||||||
root["current_operation"] = valve::valve_operation_to_str(obj->current_operation);
|
root["current_operation"] = valve::valve_operation_to_str(obj->current_operation);
|
||||||
@@ -1474,7 +1527,8 @@ std::string WebServer::valve_json(valve::Valve *obj, JsonDetail start_config) {
|
|||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1533,14 +1587,17 @@ std::string WebServer::alarm_control_panel_all_json_generator(WebServer *web_ser
|
|||||||
std::string WebServer::alarm_control_panel_json(alarm_control_panel::AlarmControlPanel *obj,
|
std::string WebServer::alarm_control_panel_json(alarm_control_panel::AlarmControlPanel *obj,
|
||||||
alarm_control_panel::AlarmControlPanelState value,
|
alarm_control_panel::AlarmControlPanelState value,
|
||||||
JsonDetail start_config) {
|
JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, value, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
char buf[16];
|
char buf[16];
|
||||||
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) {
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1577,7 +1634,9 @@ std::string WebServer::event_all_json_generator(WebServer *web_server, void *sou
|
|||||||
return web_server->event_json(event, get_event_type(event), DETAIL_ALL);
|
return web_server->event_json(event, get_event_type(event), DETAIL_ALL);
|
||||||
}
|
}
|
||||||
std::string WebServer::event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config) {
|
std::string WebServer::event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config) {
|
||||||
return json::build_json([this, obj, event_type, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "event-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "event-" + obj->get_object_id(), start_config);
|
||||||
if (!event_type.empty()) {
|
if (!event_type.empty()) {
|
||||||
root["event_type"] = event_type;
|
root["event_type"] = event_type;
|
||||||
@@ -1590,7 +1649,8 @@ std::string WebServer::event_json(event::Event *obj, const std::string &event_ty
|
|||||||
root["device_class"] = obj->get_device_class();
|
root["device_class"] = obj->get_device_class();
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1644,7 +1704,9 @@ std::string WebServer::update_all_json_generator(WebServer *web_server, void *so
|
|||||||
}
|
}
|
||||||
std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_config) {
|
std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_config) {
|
||||||
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
||||||
return json::build_json([this, obj, start_config](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
|
|
||||||
set_json_id(root, obj, "update-" + obj->get_object_id(), start_config);
|
set_json_id(root, obj, "update-" + obj->get_object_id(), start_config);
|
||||||
root["value"] = obj->update_info.latest_version;
|
root["value"] = obj->update_info.latest_version;
|
||||||
root["state"] = update_state_to_string(obj->state);
|
root["state"] = update_state_to_string(obj->state);
|
||||||
@@ -1655,7 +1717,8 @@ std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_c
|
|||||||
root["release_url"] = obj->update_info.release_url;
|
root["release_url"] = obj->update_info.release_url;
|
||||||
this->add_sorting_info_(root, obj);
|
this->add_sorting_info_(root, obj);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
return builder.serialize();
|
||||||
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -392,10 +392,11 @@ AsyncEventSourceResponse::AsyncEventSourceResponse(const AsyncWebServerRequest *
|
|||||||
#ifdef USE_WEBSERVER_SORTING
|
#ifdef USE_WEBSERVER_SORTING
|
||||||
for (auto &group : ws->sorting_groups_) {
|
for (auto &group : ws->sorting_groups_) {
|
||||||
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks) false positive with ArduinoJson
|
||||||
message = json::build_json([group](JsonObject root) {
|
json::JsonBuilder builder;
|
||||||
|
JsonObject root = builder.root();
|
||||||
root["name"] = group.second.name;
|
root["name"] = group.second.name;
|
||||||
root["sorting_weight"] = group.second.weight;
|
root["sorting_weight"] = group.second.weight;
|
||||||
});
|
message = builder.serialize();
|
||||||
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
|
||||||
|
|
||||||
// a (very) large number of these should be able to be queued initially without defer
|
// a (very) large number of these should be able to be queued initially without defer
|
||||||
|
Reference in New Issue
Block a user