From ae05f133e12c7901e790631ecbdb0b395596d813 Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:42:26 +0100 Subject: [PATCH] Move webserver to core package This is reverting back from cJson to ArduinoJson as that was adding to memory consumption when webserver was used (quite common), reducing the benefits of a lighter library. --- esphome/nspanel_esphome_advanced.yaml | 9 -- esphome/nspanel_esphome_core.yaml | 126 ++++++++++++++------------ 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/esphome/nspanel_esphome_advanced.yaml b/esphome/nspanel_esphome_advanced.yaml index 6b145c0..24e419f 100644 --- a/esphome/nspanel_esphome_advanced.yaml +++ b/esphome/nspanel_esphome_advanced.yaml @@ -12,7 +12,6 @@ substitutions: ## Change only in your ## ## local yaml substitutions ## ap_password: ${wifi_password} - web_password: ${wifi_password} ############################## button: @@ -96,14 +95,6 @@ time: - component.update: api_timestamp - component.update: device_timestamp -##### Web server ##### -web_server: - id: web_server_std - port: 80 - auth: - username: admin - password: ${web_password} - wifi: ap: ssid: "${name}" diff --git a/esphome/nspanel_esphome_core.yaml b/esphome/nspanel_esphome_core.yaml index 7a5b0d4..8450774 100644 --- a/esphome/nspanel_esphome_core.yaml +++ b/esphome/nspanel_esphome_core.yaml @@ -168,6 +168,14 @@ time: - logger.log: "System clock synchronized" - script.execute: refresh_datetime +##### Web server ##### +web_server: + id: web_server_std + port: 80 + auth: + username: admin + password: ${web_password} + ##### START - API CONFIGURATION ##### api: id: api_server @@ -1756,92 +1764,92 @@ text_sensor: on_value: then: - lambda: |- - cJSON *json = cJSON_Parse(x.c_str()); - if (!json) { - ESP_LOGE("text_sensor.disp1_local_event", "Error parsing json: %s", x.c_str()); + DynamicJsonDocument json(1024); + DeserializationError error = deserializeJson(json, x.c_str()); + if (error) { + ESP_LOGE("text_sensor.disp1_local_event", "Error parsing json: %s", x.c_str()); + ESP_LOGE("text_sensor.disp1_local_event", "Error: %s", error.c_str()); } else { - const cJSON* page = cJSON_GetObjectItemCaseSensitive(json, "page"); - const cJSON* event = cJSON_GetObjectItemCaseSensitive(json, "event"); - const cJSON* component = cJSON_GetObjectItemCaseSensitive(json, "component"); - const cJSON* key = cJSON_GetObjectItemCaseSensitive(json, "key"); - const cJSON* value = cJSON_GetObjectItemCaseSensitive(json, "value"); - const cJSON* embedded = cJSON_GetObjectItemCaseSensitive(json, "embedded"); + const std::string page = json["page"]; + const std::string event = json["event"]; + const std::string component = json["component"]; + const std::string key = json["key"]; + const std::string value = json["value"]; esphome::api::CustomAPIDevice ha_event; // Send event to Home Assistant - if (json_cmp_string(event, "short_click") or json_cmp_string(event, "long_click")) { - ha_button->execute(json_get_text(page), json_get_text(component), json_get_text(event)); - } else if (json_cmp_string(page, "light") or json_cmp_string(page, "climate")) { // Generic event + if (event == "short_click" or event == "long_click") { + ha_button->execute(page.c_str(), component.c_str(), event.c_str()); + } else if (page == "light" or page == "climate") { // Generic event ha_event.fire_homeassistant_event("esphome.nspanel_ha_blueprint", { {"device_name", device_name->state.c_str()}, {"type", "generic"}, - {"page", json_get_text(page, current_page->state.c_str())}, - {"component", json_get_text(component)}, - {"event", json_get_text(event)}, - {"value", json_get_text(value)}, + {"page", page.c_str()}, + {"component", component.c_str()}, + {"event", event.c_str()}, + {"value", value.c_str()}, {"entity", detailed_entity->state.c_str()} }); } // page based actions - if (json_cmp_string(page, "alarm")) { - const cJSON* code_format = cJSON_GetObjectItemCaseSensitive(json, "code_format"); - const cJSON* code_arm_req = cJSON_GetObjectItemCaseSensitive(json, "code_arm_req"); - const cJSON* title = cJSON_GetObjectItemCaseSensitive(json, "mui"); - if (json_cmp_string(code_format, "number") and (json_cmp_string(key, "disarm") or json_cmp_string(code_arm_req, "1"))) { + if (page == "alarm") { + const std::string code_format = json["code_format"]; + const std::string code_arm_req = json["code_arm_req"]; + const std::string title = json["mui"]; + if (code_format == "number" and (key == "disarm" or code_arm_req == "1")) { goto_page->execute("keyb_num"); disp1->set_component_value("keyb_num.page_id", get_page_id("alarm")); //Calling from Alarm page - disp1->set_component_text("keyb_num.domain", json_get_text(page)); - disp1->set_component_text("keyb_num.key", json_get_text(key)); - disp1->set_component_text("keyb_num.value", json_get_text(value)); + disp1->set_component_text("keyb_num.domain", page.c_str()); + disp1->set_component_text("keyb_num.key", key.c_str()); + disp1->set_component_text("keyb_num.value", value.c_str()); disp1->set_component_text("keyb_num.entity", detailed_entity->state.c_str()); - disp1->set_component_text("keyb_num.title", json_get_text(title)); - } else service_call_alarm_control_panel->execute(detailed_entity->state.c_str(), json_get_text(key), json_get_text(code_format), ""); - } else if (json_cmp_string(page, "climate")) { - change_climate_state->execute((embedded != NULL and cJSON_IsNumber(embedded) and embedded->valueint == 1), json_get_text(key), json_get_text(value)); - } else if (json_cmp_string(page, "cover")) { - if (json_cmp_string(key, "position")) ha_call_service->execute("cover.set_cover_position", json_get_text(key), json_get_text(value), detailed_entity->state.c_str()); - else ha_call_service->execute((std::string("cover.") + json_get_text(key)), "", "", detailed_entity->state.c_str()); - } else if (json_cmp_string(page, "fan")) { - if (json_cmp_string(key, "stop") or json_cmp_string(value, "0") == 0) ha_call_service->execute("fan.turn_off", "", "", detailed_entity->state.c_str()); - else ha_call_service->execute("fan.turn_on", json_get_text(key), json_get_text(value), detailed_entity->state.c_str()); - } else if (json_cmp_string(page, "keyb_num")) { - const cJSON* base_domain = cJSON_GetObjectItemCaseSensitive(json, "base_domain"); - if (json_cmp_string(base_domain, "alarm")) { - const cJSON* code_format = cJSON_GetObjectItemCaseSensitive(json, "code_format"); - const cJSON* pin = cJSON_GetObjectItemCaseSensitive(json, "pin"); - service_call_alarm_control_panel->execute(detailed_entity->state.c_str(), json_get_text(key), json_get_text(code_format), json_get_text(pin)); + disp1->set_component_text("keyb_num.title", title.c_str()); + } else service_call_alarm_control_panel->execute(detailed_entity->state.c_str(), key.c_str(), code_format.c_str(), ""); + } else if (page == "climate") { + const uint8_t embedded = json["embedded"]; + change_climate_state->execute(embedded == 1, key.c_str(), value.c_str()); + } else if (page == "cover") { + if (key == "position") ha_call_service->execute("cover.set_cover_position", key.c_str(), value.c_str(), detailed_entity->state.c_str()); + else ha_call_service->execute(("cover." + key).c_str(), "", "", detailed_entity->state.c_str()); + } else if (page == "fan") { + if (key == "stop" or value == "0") ha_call_service->execute("fan.turn_off", "", "", detailed_entity->state.c_str()); + else ha_call_service->execute("fan.turn_on", key.c_str(), value.c_str(), detailed_entity->state.c_str()); + } else if (page == "keyb_num") { + const std::string base_domain = json["base_domain"]; + if (base_domain == "alarm") { + const std::string code_format = json["code_format"]; + const std::string pin = json["pin"]; + service_call_alarm_control_panel->execute(detailed_entity->state.c_str(), key.c_str(), code_format.c_str(), pin.c_str()); } - goto_page->execute(json_get_text(base_domain, "home")); - } else if (json_cmp_string(page, "light")) { - if ((json_cmp_string(key, "brightness_pct") or json_cmp_string(key, "color_temp")) and cJSON_IsNumber(value)) { - ha_call_service->execute("light.turn_on", json_get_text(key), std::to_string(value->valueint), detailed_entity->state.c_str()); - } else if (json_cmp_string(component, "rgb_color") and cJSON_IsArray(value)) { - int* rgb_color = json_extract_rgb_array(value); - if (rgb_color) { + goto_page->execute(base_domain.empty() ? "home" : base_domain.c_str()); + } else if (page == "light") { + if (key == "brightness_pct" or key == "color_temp") { + ha_call_service->execute("light.turn_on", key.c_str(), value.c_str(), detailed_entity->state.c_str()); + } else if (component == "rgb_color") { + JsonArray rgb_color = json["value"]; + if (rgb_color.size() == 3) { ha_event.fire_homeassistant_event("esphome.nspanel_ha_blueprint", { {"device_name", device_name->state.c_str()}, {"type", "service_call"}, {"service", "light.turn_on"}, {"key", "rgb_color"}, - {"red",std::to_string(rgb_color[0])}, - {"green",std::to_string(rgb_color[1])}, - {"blue",std::to_string(rgb_color[2])}, + {"red",std::to_string(rgb_color[0].as())}, + {"green",std::to_string(rgb_color[1].as())}, + {"blue",std::to_string(rgb_color[2].as())}, {"entity", detailed_entity->state.c_str()} }); - free(rgb_color); } } - } else if (json_cmp_string(page, "media_player")) { - if (json_cmp_string(key, "volume_mute")) - ha_call_service->execute("media_player.volume_mute", "is_volume_muted", json_get_text(value), detailed_entity->state.c_str()); - else if (json_cmp_string(key, "volume_set")) - ha_call_service->execute("media_player.volume_set", "volume_level", json_percentage_to_float_string(value).c_str(), detailed_entity->state.c_str()); - else if ((key != NULL and key->valuestring != NULL and key->valuestring[0] != '\0')) - ha_call_service->execute((std::string("media_player.") + json_get_text(key)), "", "", detailed_entity->state.c_str()); + } else if (page == "media_player") { + if (key == "volume_mute") + ha_call_service->execute("media_player.volume_mute", "is_volume_muted", value.c_str(), detailed_entity->state.c_str()); + else if (key == "volume_set") + ha_call_service->execute("media_player.volume_set", "volume_level", to_string(stof(value) / 100), detailed_entity->state.c_str()); + else if (!key.empty()) + ha_call_service->execute((std::string("media_player.") + key.c_str()), "", "", detailed_entity->state.c_str()); } - cJSON_Delete(json); } ##### Versioning #####