Upload TFT improvements for Lovelace UI

Solve #1331
This commit is contained in:
Edward Firmo
2023-12-21 21:41:53 +01:00
parent 38489aa117
commit 4f645903b2
2 changed files with 384 additions and 206 deletions

View File

@@ -197,6 +197,7 @@ script:
- lambda: |-
static const char *const TAG = "script.upload_tft";
ESP_LOGD(TAG, "Starting...");
char update_msg[128];
auto delay_seconds_ = [](int seconds) {
ESP_LOGD(TAG, "Wait %i seconds", seconds);
@@ -210,23 +211,25 @@ script:
}
};
auto send_nextion_command = [](const std::string &command) -> bool
{
static const char *const TAG = "script.upload_tft.send_nextion_command";
ESP_LOGD(TAG, "Sending: %s", command.c_str());
id(tf_uart).write_str(command.c_str());
const uint8_t to_send[3] = {0xFF, 0xFF, 0xFF};
id(tf_uart).write_array(to_send, sizeof(to_send));
return true;
};
uint32_t supported_baud_rates[] = {2400, 4800, 9600, 19200, 31250, 38400, 57600, 115200, 230400, 250000, 256000, 512000, 921600};
auto disable_boot_timers_ = [send_nextion_command]() {
ESP_LOGD(TAG, "Disabling timers on boot page");
send_nextion_command("timer.en=0");
send_nextion_command("tm_esphome.en=0");
send_nextion_command("tm_pageid.en=0");
send_nextion_command("wakeup_timer.en=0");
send_nextion_command("dim=1");
auto is_baud_rate_supported = [supported_baud_rates](uint32_t baud_rate_requested) -> bool {
size_t size = sizeof(supported_baud_rates) / sizeof(supported_baud_rates[0]);
for (size_t i = 0; i < size; ++i) {
if (supported_baud_rates[i] == baud_rate_requested) {
return true;
}
}
return false; // Return false if not found
};
auto send_nextion_command = [](const std::string &command) -> bool {
static const char *const TAG = "script.upload_tft.send_nextion_command";
ESP_LOGD(TAG, "Sending: %s", command.c_str());
id(tf_uart).write_str(command.c_str());
const uint8_t to_send[3] = {0xFF, 0xFF, 0xFF};
id(tf_uart).write_array(to_send, sizeof(to_send));
return true;
};
std::string framework = "Unknown";
@@ -236,28 +239,6 @@ script:
framework = "ESP-IDF";
#endif
disable_boot_timers_();
if (disp1->is_setup()) {
disp1->set_backlight_brightness(1);
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
disp1->set_component_text_printf("confirm.body", "Preparing...");
disp1->goto_page("confirm");
disp1->hide_component("bt_close");
disp1->hide_component("bt_accept");
disp1->hide_component("bt_clear");
disp1->hide_component("bt_close");
delay_seconds_(1);
display_wrapped_text->execute("confirm.body", "Informing the blueprint that panel is unavailable...", 18);
disp1->hide_component("bt_close");
}
nextion_init->publish_state(false);
if (disp1->is_setup()) {
delay_seconds_(1);
display_wrapped_text->execute("confirm.body", "Stopping scripts...", 18);
}
stop_all->execute();
if (disp1->is_setup()) delay_seconds_(1);
std::vector<uint8_t> buffer_;
bool is_updating_ = false;
@@ -278,6 +259,20 @@ script:
uart->setup();
};
auto disable_boot_timers_ = [send_nextion_command]() {
ESP_LOGD(TAG, "Disabling timers on boot page");
send_nextion_command("timer.en=0");
send_nextion_command("tm_esphome.en=0");
send_nextion_command("tm_pageid.en=0");
send_nextion_command("wakeup_timer.en=0");
// Set Lovelace UI - Just in case
send_nextion_command("tmSleep.en=0");
send_nextion_command("tMsg1.txt=""Upload TFT""");
send_nextion_command("tMsg2.txt=""""");
send_nextion_command("tMsg3.txt=""""");
send_nextion_command("dim=1");
};
auto recv_ret_string_ = [](std::string &response, uint32_t timeout, bool recv_flag) -> uint16_t
{
static const char *const TAG = "script.upload_tft.recv_ret_string_";
@@ -480,10 +475,12 @@ script:
return upload_end_(false);
}
if (!disp1->is_setup()) {
if (not display_mode->state > 0) {
ESP_LOGD(TAG, "Setting Nextion protocol reparse mode to passive");
exit_reparse->execute();
disable_boot_timers_();
delay_seconds_(5);
disable_boot_timers_();
}
is_updating_ = true;
@@ -746,10 +743,12 @@ script:
return upload_end_(false);
}
if (!disp1->is_setup()) {
if (not display_mode->state > 0) {
ESP_LOGD(TAG, "Setting Nextion protocol reparse mode to passive");
exit_reparse->execute();
disable_boot_timers_();
delay_seconds_(5);
disable_boot_timers_();
}
is_updating_ = true;
@@ -864,17 +863,30 @@ script:
};
#endif
uint32_t supported_baud_rates[] = {2400, 4800, 9600, 19200, 31250, 38400, 57600, 115200, 230400, 250000, 256000, 512000, 921600};
auto is_baud_rate_supported = [supported_baud_rates](uint32_t baud_rate_requested) -> bool {
size_t size = sizeof(supported_baud_rates) / sizeof(supported_baud_rates[0]);
for (size_t i = 0; i < size; ++i) {
if (supported_baud_rates[i] == baud_rate_requested) {
return true;
}
}
return false; // Return false if not found
};
// The upload process starts here
disable_boot_timers_();
nextion_init->publish_state(false);
if (display_mode->state > 0) {
disp1->set_backlight_brightness(1);
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
disp1->set_component_text_printf("confirm.body", "Preparing...");
disp1->goto_page("confirm");
disp1->hide_component("bt_close");
disp1->hide_component("bt_accept");
disp1->hide_component("bt_clear");
disp1->hide_component("bt_close");
delay_seconds_(1);
display_wrapped_text->execute("confirm.body", "Informing the blueprint that panel is unavailable...", 18);
disp1->hide_component("bt_close");
delay_seconds_(1);
display_wrapped_text->execute("confirm.body", "Stopping scripts...", 18);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Preparing to upload TFT file...~65535~10000~3~~~", framework.c_str());
lovelace_custom_command->execute(update_msg);
}
stop_all->execute();
if (display_mode->state > 0) delay_seconds_(1);
uint32_t original_baud_rate_ = tf_uart->get_baud_rate();
if (!is_baud_rate_supported(original_baud_rate_)) original_baud_rate_ = 115200;
@@ -886,35 +898,56 @@ script:
ESP_LOGD(TAG, "Target upload baud rate: %d", target_upload_baud_rate_);
ESP_LOGD(TAG, "Current baud rate: %d", tf_uart->get_baud_rate());
char update_msg[128];
sprintf(update_msg, "Try #1 at %d bps", target_upload_baud_rate_);
ESP_LOGD(TAG, update_msg);
if (disp1->is_setup()) {
if (display_mode->state > 0) {
display_wrapped_text->execute("confirm.body", update_msg, 18);
delay_seconds_(1);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Try #1 at %d bps~65535~10000~3~~~", framework.c_str(), target_upload_baud_rate_);
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(1);
if (upload_tft_(url, target_upload_baud_rate_)) id(restart_nspanel).press();
ESP_LOGW(TAG, "Try #1 failed");
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #1 failed", 18);
if (display_mode->state > 0) display_wrapped_text->execute("confirm.body", "Try #1 failed", 18);
delay_seconds_(5);
disable_boot_timers_();
sprintf(update_msg, "Try #2 at %d bps", target_upload_baud_rate_);
ESP_LOGD(TAG, update_msg);
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", update_msg, 18);
if (display_mode->state > 0) {
display_wrapped_text->execute("confirm.body", update_msg, 18);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Try #2 at %d bps~65535~10000~3~~~", framework.c_str(), target_upload_baud_rate_);
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(1);
if (upload_tft_(url, target_upload_baud_rate_)) id(restart_nspanel).press();
ESP_LOGW(TAG, "Try #2 failed");
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Try #2 failed", 18);
if (display_mode->state > 0) display_wrapped_text->execute("confirm.body", "Try #2 failed", 18);
delay_seconds_(5);
disable_boot_timers_();
sprintf(update_msg, "Try #3 at %d bps", original_baud_rate_);
ESP_LOGD(TAG, update_msg);
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", update_msg, 18);
if (display_mode->state > 0) {
display_wrapped_text->execute("confirm.body", update_msg, 18);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Try #3 at %d bps~65535~10000~3~~~", framework.c_str(), original_baud_rate_);
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(1);
if (upload_tft_(url, original_baud_rate_)) id(restart_nspanel).press();
ESP_LOGW(TAG, "Try #3 failed");
if (disp1->is_setup()) {
if (display_mode->state > 0) {
display_wrapped_text->execute("confirm.body", "Try #3 failed. Restarting display.", 18);
delay_seconds_(3);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Power cycle display~65535~10000~3~~~", framework.c_str(), original_baud_rate_);
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(3);
ESP_LOGD(TAG, "Turn off Nextion");
id(screen_power).turn_off();
delay_seconds_(2);
@@ -931,7 +964,7 @@ script:
disable_boot_timers_();
sprintf(update_msg, "Try #4 at %d bps", original_baud_rate_);
ESP_LOGD(TAG, update_msg);
if (disp1->is_setup()) {
if (display_mode->state > 0) {
disp1->set_backlight_brightness(1);
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
display_wrapped_text->execute("confirm.body", update_msg, 18);
@@ -940,19 +973,23 @@ script:
disp1->hide_component("bt_accept");
disp1->hide_component("bt_clear");
disp1->hide_component("bt_close");
delay_seconds_(1);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~Try #4 at %d bps~65535~10000~3~~~", framework.c_str(), original_baud_rate_);
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(1);
if (upload_tft_(url, original_baud_rate_)) id(restart_nspanel).press();
ESP_LOGW(TAG, "Try #4 failed");
disable_boot_timers_();
if (disp1->is_setup()) {
if (display_mode->state > 0) {
display_wrapped_text->execute("confirm.body", "Try #4 failed.", 18);
delay_seconds_(3);
}
disable_boot_timers_();
sprintf(update_msg, "Try #5 at %d bps", 115200);
ESP_LOGD(TAG, update_msg);
if (disp1->is_setup()) {
if (display_mode->state > 0) {
disp1->set_backlight_brightness(1);
disp1->set_component_text_printf("confirm.title", "Upload TFT\\r%s", framework.c_str());
display_wrapped_text->execute("confirm.body", update_msg, 18);
@@ -961,15 +998,19 @@ script:
disp1->hide_component("bt_accept");
disp1->hide_component("bt_clear");
disp1->hide_component("bt_close");
delay_seconds_(1);
} else {
lovelace_custom_command->execute("pageType~popupNotify");
sprintf(update_msg, "entityUpdateDetail~~Upload TFT - %s~65535~~0~~0~TFT upload failed.~65535~10000~3~~~", framework.c_str());
lovelace_custom_command->execute(update_msg);
}
delay_seconds_(1);
if (upload_tft_(url, 115200)) id(restart_nspanel).press();
ESP_LOGE(TAG, "TFT upload failed");
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "TFT upload failed", 18);
if (disp1->is_setup()) delay_seconds_(2);
if (display_mode->state > 0) display_wrapped_text->execute("confirm.body", "TFT upload failed", 18);
if (display_mode->state > 0) delay_seconds_(2);
ESP_LOGD(TAG, "Turn off Nextion");
if (disp1->is_setup()) display_wrapped_text->execute("confirm.body", "Restarting...", 18);
if (disp1->is_setup()) delay_seconds_(2);
if (display_mode->state > 0) display_wrapped_text->execute("confirm.body", "Restarting...", 18);
if (display_mode->state > 0) delay_seconds_(2);
id(screen_power).turn_off();
delay_seconds_(2);
ESP_LOGD(TAG, "Turn on Nextion");

View File

@@ -11,6 +11,12 @@ substitutions:
temp_units: "°C"
#############################
##### External components #####
external_components:
- source: github://pr#5979 # Remove this when that PR is released (Hopefully v2024.1.0)
components:
- nextion
##### ESPHOME CONFIGURATION #####
esphome:
name: ${device_name}
@@ -29,13 +35,17 @@ esphome:
- wait_until:
condition:
- lambda: !lambda return disp1->is_detected();
timeout: 45s
timeout: 10s
- lambda: |-
if (!disp1->is_setup()) exit_reparse->execute();
if (!disp1->is_setup()) {
lovelace_custom_command->execute("pageType~popupNotify");
lovelace_custom_command->execute("entityUpdateDetail~~Unsupported TFT file~65535~~0~~0~Please upload a\r\ncompatible TFT file.~65535~10000~3~~~");
exit_reparse->execute();
}
- wait_until:
condition:
- lambda: !lambda return disp1->is_setup();
timeout: 20s
timeout: 10s
- lambda: |-
static const char *const TAG = "on_boot";
@@ -70,6 +80,8 @@ esphome:
static const char *const TAG = "on_boot";
nextion_status->execute();
if (not disp1->is_setup()) {
lovelace_custom_command->execute("pageType~popupNotify");
lovelace_custom_command->execute("entityUpdateDetail~~Unsupported TFT file~65535~~0~~0~Please upload a\r\ncompatible TFT file.~65535~10000~3~~~");
ESP_LOGE(TAG, "No response from Nextion display");
}
ESP_LOGD(TAG, "Finished");
@@ -353,7 +365,7 @@ api:
disp1->goto_page("notification");
disp1->set_component_text_printf("notification.notifi_label", "%s", label.c_str());
display_wrapped_text->execute("notification.notifi_text01", message.c_str(), id(display_mode) == 2 ? 23 : 32);
display_wrapped_text->execute("notification.notifi_text01", message.c_str(), display_mode->state == 2 ? 23 : 32);
notification_label->publish_state(label.c_str());
notification_text->publish_state(message.c_str());
@@ -567,8 +579,8 @@ api:
- lambda: |-
if (not reboot.empty()) disp1->set_component_text_printf("settings.lbl_reboot", " %s", reboot.c_str());
disp1->set_component_text_printf("settings.lbl_brightness", " %s", brightness.c_str());
display_wrapped_text->execute("settings.lbl_bright", bright.c_str(), id(display_mode) == 2 ? 25 : 10);
display_wrapped_text->execute("settings.lbl_dim", dim.c_str(), id(display_mode) == 2 ? 25 : 10);
display_wrapped_text->execute("settings.lbl_bright", bright.c_str(), display_mode->state == 2 ? 25 : 10);
display_wrapped_text->execute("settings.lbl_dim", dim.c_str(), display_mode->state == 2 ? 25 : 10);
#### Service to populate the media player page #####
- service: media_player
@@ -590,8 +602,8 @@ api:
{
detailed_entity->publish_state(entity);
disp1->set_component_text_printf("page_label", "%s", friendly_name.c_str());
display_wrapped_text->execute("track", media_title.c_str(), id(display_mode) == 2 ? 16 : 27);
display_wrapped_text->execute("artist", media_artist.c_str(), id(display_mode) == 2 ? 26 : 40);
display_wrapped_text->execute("track", media_title.c_str(), display_mode->state == 2 ? 16 : 27);
display_wrapped_text->execute("artist", media_artist.c_str(), display_mode->state == 2 ? 26 : 40);
// on/off button
if (supported_features & 128 and state == "off") //TURN_ON
@@ -693,14 +705,17 @@ display:
uart_id: tf_uart
start_up_page: 8
on_setup:
- script.execute: boot_sequence
- script.execute: setup_sequence
on_page:
lambda: |-
static const char *const TAG = "display.disp1.on_page";
ESP_LOGD(TAG, "Nextion page changed");
ESP_LOGD(TAG, "New page: %s (%i)" , id(page_names)[x].c_str(), x);
current_page->publish_state(id(page_names)[x].c_str());
page_changed->execute(id(page_names)[x].c_str());
page_id->update();
if (current_page->state != id(page_names)[x].c_str()) {
current_page->publish_state(id(page_names)[x].c_str());
page_changed->execute(id(page_names)[x].c_str());
}
on_touch:
lambda: |-
static const char *const TAG = "display.disp1.on_touch";
@@ -714,7 +729,7 @@ display:
globals:
##### Is boot sequence completed? #####
- id: boot_sequence_completed
- id: setup_sequence_completed
type: bool
restore_value: false
initial_value: 'false'
@@ -747,18 +762,6 @@ globals:
restore_value: true
initial_value: 'false'
##### Display mode (1 = EU, 2 = US, 3 = US Landscape)
- id: display_mode
type: uint
restore_value: true
initial_value: '0'
##### Charset (1 = International (original), 2 = CJK languages)
- id: display_charset
type: uint
restore_value: true
initial_value: '0'
##### Is embedded thermostat set as main climate entity? #####
- id: is_embedded_thermostat
type: bool
@@ -860,10 +863,6 @@ globals:
type: std::string
restore_value: false
initial_value: ''
- id: version_tft
type: std::string
restore_value: false
initial_value: ''
- id: page_names
type: std::vector<std::string>
@@ -950,7 +949,7 @@ binary_sensor:
- delay: 2s
- lambda: disp1->soft_reset();
- delay: 2s
- script.execute: boot_sequence
- script.execute: setup_sequence
##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY #####
- name: ${device_name} Right Button
@@ -1266,6 +1265,39 @@ sensor:
- lambda: |-
timer_reset_all->execute("settings");
- id: page_id
name: ${device_name} Page Id
platform: nextion
variable_name: dp
precision: 0
internal: true
entity_category: diagnostic
on_value:
then:
- lambda: |-
if (current_page->state != id(page_names)[x].c_str()) {
current_page->publish_state(id(page_names)[x].c_str());
page_changed->execute(id(page_names)[x].c_str());
}
##### Display mode (1 = EU, 2 = US, 3 = US Landscape)
- id: display_mode
name: ${device_name} Display mode
platform: nextion
variable_name: display_mode
precision: 0
internal: true
entity_category: diagnostic
##### Charset (1 = International (original), 2 = CJK languages)
- id: display_charset
name: ${device_name} Display charset
platform: nextion
variable_name: charset
precision: 0
internal: true
entity_category: diagnostic
##### START - SWITCH CONFIGURATION #####
switch:
@@ -1337,7 +1369,7 @@ switch:
- lambda: !lambda return disp1->is_setup();
timeout: 20s
- lambda: |-
if (id(boot_sequence_completed)) {
if (id(setup_sequence_completed)) {
nextion_init->publish_state(true);
disp1->goto_page(wakeup_page_name->state.c_str());
}
@@ -1500,33 +1532,11 @@ text_sensor:
else if (page == "blank") page_blank->execute();
else if (page == "boot")
{
// Detect display mode
if (doc.containsKey("display_mode"))
{
std::string display_mode_str = doc["display_mode"];
ESP_LOGV(TAG, "display_mode: %s", display_mode_str.c_str());
float display_mode_float = stof(display_mode_str);
if (display_mode_float > 0) id(display_mode) = int(display_mode_float);
}
// Detect display charset
if (doc.containsKey("charset"))
{
std::string charset_str = doc["charset"];
ESP_LOGV(TAG, "charset: %s", charset_str.c_str());
float charset_float = stof(charset_str);
if (charset_float > 0) id(display_charset) = int(charset_float);
}
// Contruct page boot
page_boot->execute();
// Detect TFT version
if (doc.containsKey("version"))
{
std::string version_tmp = doc["version"];
id(version_tft) = version_tmp;
}
version_tft->update();
check_versions->execute();
// Detect timeout
@@ -1580,6 +1590,24 @@ text_sensor:
else if (not key.empty()) ha_call_service->execute((std::string("media_player.") + key.c_str()), "", "", entity.c_str());
}
- id: version_tft
name: ${device_name} TFT version
platform: nextion
component_name: boot.tft_version
entity_category: diagnostic
internal: true
on_value:
- lambda: |-
static const char *const TAG = "text_sensor.version_tft";
ESP_LOGD(TAG, "TFT version: %s", version_tft->state.c_str());
if (current_page->state == "boot") {
disp1->send_command_printf("tm_esphome.en=0");
disp1->send_command_printf("tm_pageid.en=0");
page_boot->execute();
timer_reset_all->execute("boot");
}
check_versions->execute();
### Scripts ######
script:
- id: addon_climate_service_call
@@ -1589,84 +1617,6 @@ script:
value: string
then: # Reserved for Add-on Climate
- id: boot_sequence
mode: restart
then:
- lambda: |-
static const char *const TAG = "script.boot_sequence";
ESP_LOGD(TAG, "Starting boot sequence");
ESP_LOGD(TAG, "Wait for TFT version");
- wait_until:
- lambda: !lambda return !id(version_tft).empty();
- lambda: |-
static const char *const TAG = "script.boot_sequence";
ESP_LOGD(TAG, "TFT version: %s", id(version_tft).c_str());
if (current_page->state == "boot") {
disp1->send_command_printf("tm_esphome.en=0");
disp1->send_command_printf("tm_pageid.en=0");
page_boot->execute();
}
timer_reset_all->execute("boot");
- lambda: |-
static const char *const TAG = "script.boot_sequence";
ESP_LOGD(TAG, "Wait for API");
- wait_until:
api.connected
- lambda: |-
static const char *const TAG = "script.boot_sequence";
if (current_page->state == "boot") {
ESP_LOGD(TAG, "Publish IP address");
disp1->set_component_text_printf("boot.ip_addr", "%s", network::get_ip_address().str().c_str());
set_brightness->execute(100);
}
ESP_LOGD(TAG, "Report to Home Assistant");
auto ha_event = new esphome::api::CustomAPIDevice();
ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
{
{"type", "boot"},
{"step", "start"}
});
if (!id(boot_sequence_completed)) delay(1000);
// Set dimming values
display_brightness->publish_state(id(display_brightness_global));
display_dim_brightness->publish_state(id(display_dim_brightness_global));
disp1->send_command_printf("brightness=%i", id(display_brightness_global));
disp1->send_command_printf("settings.brightslider.val=%i", id(display_brightness_global));
disp1->send_command_printf("brightness_dim=%i", id(display_dim_brightness_global));
disp1->send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global));
disp1->send_command_printf("brightness_sleep=%i", int(display_sleep_brightness->state));
set_brightness->execute(id(display_brightness_global));
ESP_LOGD(TAG, "Report to Home Assistant");
nextion_init->publish_state(true);
//auto ha_event = new esphome::api::CustomAPIDevice();
ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
{
{"type", "boot"},
{"step", "nextion_init"}
});
// Chips icon size
ESP_LOGV(TAG, "Chips size");
for (int i = 1; i <= 10; ++i) {
disp1->send_command_printf("home.icon_top_%02d.font=%i", i, id(home_chip_font_size));
}
disp1->send_command_printf("home.wifi_icon.font=%i", id(home_chip_font_size));
disp1->set_component_text_printf("home.icon_top_01", "%s", id(home_relay1_icon).c_str());
disp1->set_component_text_printf("home.icon_top_02", "%s", id(home_relay2_icon).c_str());
timer_reset_all->execute("boot");
notification_clear->execute();
id(boot_sequence_completed) = true;
- wait_until:
condition:
- not:
- text_sensor.state: # Is boot page visible?
id: current_page
state: 'boot'
timeout: 15s
- lambda: |-
static const char *const TAG = "script.boot_sequence";
if (current_page->state == "boot") disp1->goto_page(wakeup_page_name->state.c_str());
ESP_LOGD(TAG, "Boot sequence finished!");
- id: check_versions
mode: restart
then:
@@ -1683,7 +1633,7 @@ script:
return (major1 == major2) && (minor1 == minor2);
};
return (compareVersions("${version}", id(version_tft).c_str()) and compareVersions("${version}", id(version_blueprint).c_str()));
return (compareVersions("${version}", version_tft->state.c_str()) and compareVersions("${version}", id(version_blueprint).c_str()));
timeout: 60s
- lambda: |-
static const char *const TAG = "script.check_versions";
@@ -1698,8 +1648,8 @@ script:
return (major1 == major2) && (minor1 == minor2);
};
ESP_LOGD(TAG, "ESPHome version: ${version}");
ESP_LOGD(TAG, "TFT version: %s", id(version_tft).c_str());
if (not compareVersions("${version}", id(version_tft).c_str())) ESP_LOGE(TAG, "TFT version mismatch!");
ESP_LOGD(TAG, "TFT version: %s", version_tft->state.c_str());
if (not compareVersions("${version}", version_tft->state.c_str())) ESP_LOGE(TAG, "TFT version mismatch!");
ESP_LOGD(TAG, "Blueprint version: %s", id(version_blueprint).c_str());
if (not compareVersions("${version}", id(version_blueprint).c_str())) ESP_LOGE(TAG, "Blueprint version mismatch!");
@@ -1716,7 +1666,7 @@ script:
ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
{
{"type", "version"},
{"tft", id(version_tft).c_str()},
{"tft", version_tft->state.c_str()},
{"esphome", "${version}"},
{"blueprint", id(version_blueprint).c_str()},
{"framework", framework.c_str()},
@@ -1796,6 +1746,12 @@ script:
- uart.write:
id: tf_uart
data: [0xFF, 0xFF, 0xFF]
- uart.write:
id: tf_uart
data: "connect"
- uart.write:
id: tf_uart
data: [0xFF, 0xFF, 0xFF]
- id: global_settings
mode: restart
@@ -1927,6 +1883,40 @@ script:
}
ESP_LOGV(TAG, "Finished");
- id: lovelace_custom_command
mode: queued
parameters:
command: string
then:
- lambda: |-
static const char *const TAG = "script.lovelace_custom_command";
ESP_LOGV(TAG, "Sending command: %s", command.c_str());
auto crc16 = [](const uint8_t *data, uint16_t len) -> uint16_t {
uint16_t crc = 0xFFFF;
while (len--) {
crc ^= *data++;
for (uint8_t i = 0; i < 8; i++) {
if ((crc & 0x01) != 0) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
};
std::vector<uint8_t> data = {0x55, 0xBB};
data.push_back(command.length() & 0xFF);
data.push_back((command.length() >> 8) & 0xFF);
data.insert(data.end(), command.begin(), command.end());
auto crc = crc16(data.data(), data.size());
data.push_back(crc & 0xFF);
data.push_back((crc >> 8) & 0xFF);
tf_uart->write_array(data.data(), data.size());
- id: nextion_status
mode: restart
then:
@@ -2198,7 +2188,7 @@ script:
static const char *const TAG = "script.page_notification";
ESP_LOGV(TAG, "Updating notification page");
disp1->set_component_text_printf("notification.notifi_label", "%s", notification_label->state.c_str());
display_wrapped_text->execute("notification.notifi_text01", notification_text->state.c_str(), id(display_mode) == 2 ? 23 : 32);
display_wrapped_text->execute("notification.notifi_text01", notification_text->state.c_str(), display_mode->state == 2 ? 23 : 32);
- id: page_qrcode
mode: restart
@@ -2497,6 +2487,152 @@ script:
};
disp1->send_command_printf("%s=%i", variable.c_str(), pageIndex(page.c_str()));
- id: setup_sequence
mode: restart
then:
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Starting Nextion setup sequence");
ESP_LOGD(TAG, "Fetching page id");
page_id->update();
- wait_until:
condition:
- lambda: !lambda return (page_id->state > 0);
timeout: 5s
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Fetching charset");
display_charset->update();
- wait_until:
condition:
- lambda: !lambda return (display_charset->state > 0);
timeout: 5s
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Fetching display mode");
display_mode->update();
- wait_until:
condition:
- lambda: !lambda return (display_mode->state > 0);
timeout: 5s
- if:
condition:
- lambda: !lambda return (display_mode->state > 0);
then: # Project's TFT detected
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Goto page Boot");
disp1->goto_page("boot");
ESP_LOGD(TAG, "Fetching TFT version");
version_tft->update();
- wait_until:
condition:
- lambda: !lambda return (not version_tft->state.empty());
timeout: 5s
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Wait for Wi-Fi");
- wait_until:
condition:
- lambda: !lambda return (wifi_component->is_connected());
timeout: 10s
- if:
condition:
- lambda: !lambda return (wifi_component->is_connected());
then: # Wi-Fi connected
- lambda: |-
static const char *const TAG = "script.setup_sequence";
if (current_page->state == "boot") {
ESP_LOGD(TAG, "Publish IP address on screen");
disp1->set_component_text_printf("boot.ip_addr", "%s", network::get_ip_address().str().c_str());
set_brightness->execute(100);
}
ESP_LOGD(TAG, "Wait for API");
- wait_until:
condition:
- lambda: !lambda return (api_server->is_connected());
timeout: 10s
- if:
condition:
- lambda: !lambda return (api_server->is_connected());
then: # API connected
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Publish IP address on screen");
ESP_LOGD(TAG, "Report setup to Home Assistant");
auto ha_event = new esphome::api::CustomAPIDevice();
ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
{
{"type", "boot"},
{"step", "start"}
});
else: # API not connected
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGE(TAG, "API not available");
else: # Wi-Fi not connected
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGE(TAG, "Wi-Fi not available");
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGE(TAG, "Wi-Fi not available");
- wait_until:
condition:
- lambda: !lambda return id(setup_sequence_completed);
timeout: 1s
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Set dimming values");
display_brightness->publish_state(id(display_brightness_global));
display_dim_brightness->publish_state(id(display_dim_brightness_global));
set_brightness->execute(id(display_brightness_global));
ESP_LOGD(TAG, "Set page Settings");
disp1->send_command_printf("brightness=%i", id(display_brightness_global));
disp1->send_command_printf("settings.brightslider.val=%i", id(display_brightness_global));
disp1->send_command_printf("brightness_dim=%i", id(display_dim_brightness_global));
disp1->send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global));
disp1->send_command_printf("brightness_sleep=%i", int(display_sleep_brightness->state));
ESP_LOGD(TAG, "Report to Home Assistant");
nextion_init->publish_state(true);
if (api_server->is_connected()) {
auto ha_event = new esphome::api::CustomAPIDevice();
ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
{
{"type", "boot"},
{"step", "nextion_init"}
});
}
// Chips icon size
ESP_LOGV(TAG, "Adjusting icon's sizes");
for (int i = 1; i <= 10; ++i) {
disp1->send_command_printf("home.icon_top_%02d.font=%i", i, id(home_chip_font_size));
}
disp1->send_command_printf("home.wifi_icon.font=%i", id(home_chip_font_size));
ESP_LOGV(TAG, "Restoring relay's icons");
disp1->set_component_text_printf("home.icon_top_01", "%s", id(home_relay1_icon).c_str());
disp1->set_component_text_printf("home.icon_top_02", "%s", id(home_relay2_icon).c_str());
timer_reset_all->execute("boot");
notification_clear->execute();
id(setup_sequence_completed) = true;
ESP_LOGD(TAG, "Wait for leaving boot page");
- wait_until:
condition:
- not:
- text_sensor.state: # Is boot page visible?
id: current_page
state: boot
timeout: 10s
- lambda: |-
if (current_page->state == "boot") disp1->goto_page(wakeup_page_name->state.c_str());
else: # Unknown TFT
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGE(TAG, "A non-compatible TFT is installed");
- lambda: |-
static const char *const TAG = "script.setup_sequence";
ESP_LOGD(TAG, "Nextion setup sequence finished!");
- id: stop_all
mode: restart
then:
@@ -2504,7 +2640,6 @@ script:
static const char *const TAG = "script.stop_all";
ESP_LOGD(TAG, "Stopping scripts...");
addon_climate_service_call->stop();
boot_sequence->stop();
check_versions->stop();
display_embedded_temp->stop();
display_wrapped_text->stop();
@@ -2512,6 +2647,7 @@ script:
global_settings->stop();
ha_button->stop();
ha_call_service->stop();
lovelace_custom_command->stop();
nextion_status->stop();
notification_clear->stop();
open_entity_settings_page->stop();
@@ -2556,6 +2692,7 @@ script:
set_climate->stop();
set_component_color->stop();
set_page_id->stop();
setup_sequence->stop();
timer_dim->stop();
timer_page->stop();
timer_reset_all->stop();