mirror of
https://github.com/esphome/esphome.git
synced 2025-08-06 10:27:49 +00:00
Merge branch 'api_voice' into integration
This commit is contained in:
commit
13ac6df1dd
@ -1176,66 +1176,53 @@ void APIConnection::bluetooth_scanner_set_mode(const BluetoothScannerSetModeRequ
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_VOICE_ASSISTANT
|
#ifdef USE_VOICE_ASSISTANT
|
||||||
|
bool APIConnection::check_voice_assistant_api_connection() const {
|
||||||
|
return voice_assistant::global_voice_assistant != nullptr &&
|
||||||
|
voice_assistant::global_voice_assistant->get_api_connection() == this;
|
||||||
|
}
|
||||||
|
|
||||||
void APIConnection::subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) {
|
void APIConnection::subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (voice_assistant::global_voice_assistant != nullptr) {
|
||||||
voice_assistant::global_voice_assistant->client_subscription(this, msg.subscribe);
|
voice_assistant::global_voice_assistant->client_subscription(this, msg.subscribe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void APIConnection::on_voice_assistant_response(const VoiceAssistantResponse &msg) {
|
void APIConnection::on_voice_assistant_response(const VoiceAssistantResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (!this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
return;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (msg.error) {
|
if (msg.error) {
|
||||||
voice_assistant::global_voice_assistant->failed_to_start();
|
voice_assistant::global_voice_assistant->failed_to_start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg.port == 0) {
|
if (msg.port == 0) {
|
||||||
// Use API Audio
|
// Use API Audio
|
||||||
voice_assistant::global_voice_assistant->start_streaming();
|
voice_assistant::global_voice_assistant->start_streaming();
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_storage storage;
|
struct sockaddr_storage storage;
|
||||||
socklen_t len = sizeof(storage);
|
socklen_t len = sizeof(storage);
|
||||||
this->helper_->getpeername((struct sockaddr *) &storage, &len);
|
this->helper_->getpeername((struct sockaddr *) &storage, &len);
|
||||||
voice_assistant::global_voice_assistant->start_streaming(&storage, msg.port);
|
voice_assistant::global_voice_assistant->start_streaming(&storage, msg.port);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void APIConnection::on_voice_assistant_event_response(const VoiceAssistantEventResponse &msg) {
|
void APIConnection::on_voice_assistant_event_response(const VoiceAssistantEventResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_event(msg);
|
voice_assistant::global_voice_assistant->on_event(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void APIConnection::on_voice_assistant_audio(const VoiceAssistantAudio &msg) {
|
void APIConnection::on_voice_assistant_audio(const VoiceAssistantAudio &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_audio(msg);
|
voice_assistant::global_voice_assistant->on_audio(msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void APIConnection::on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) {
|
void APIConnection::on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_timer_event(msg);
|
voice_assistant::global_voice_assistant->on_timer_event(msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) {
|
void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_announce(msg);
|
voice_assistant::global_voice_assistant->on_announce(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1243,35 +1230,29 @@ void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnno
|
|||||||
VoiceAssistantConfigurationResponse APIConnection::voice_assistant_get_configuration(
|
VoiceAssistantConfigurationResponse APIConnection::voice_assistant_get_configuration(
|
||||||
const VoiceAssistantConfigurationRequest &msg) {
|
const VoiceAssistantConfigurationRequest &msg) {
|
||||||
VoiceAssistantConfigurationResponse resp;
|
VoiceAssistantConfigurationResponse resp;
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (!this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
return resp;
|
||||||
return resp;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto &config = voice_assistant::global_voice_assistant->get_configuration();
|
|
||||||
for (auto &wake_word : config.available_wake_words) {
|
|
||||||
VoiceAssistantWakeWord resp_wake_word;
|
|
||||||
resp_wake_word.id = wake_word.id;
|
|
||||||
resp_wake_word.wake_word = wake_word.wake_word;
|
|
||||||
for (const auto &lang : wake_word.trained_languages) {
|
|
||||||
resp_wake_word.trained_languages.push_back(lang);
|
|
||||||
}
|
|
||||||
resp.available_wake_words.push_back(std::move(resp_wake_word));
|
|
||||||
}
|
|
||||||
for (auto &wake_word_id : config.active_wake_words) {
|
|
||||||
resp.active_wake_words.push_back(wake_word_id);
|
|
||||||
}
|
|
||||||
resp.max_active_wake_words = config.max_active_wake_words;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto &config = voice_assistant::global_voice_assistant->get_configuration();
|
||||||
|
for (auto &wake_word : config.available_wake_words) {
|
||||||
|
VoiceAssistantWakeWord resp_wake_word;
|
||||||
|
resp_wake_word.id = wake_word.id;
|
||||||
|
resp_wake_word.wake_word = wake_word.wake_word;
|
||||||
|
for (const auto &lang : wake_word.trained_languages) {
|
||||||
|
resp_wake_word.trained_languages.push_back(lang);
|
||||||
|
}
|
||||||
|
resp.available_wake_words.push_back(std::move(resp_wake_word));
|
||||||
|
}
|
||||||
|
for (auto &wake_word_id : config.active_wake_words) {
|
||||||
|
resp.active_wake_words.push_back(wake_word_id);
|
||||||
|
}
|
||||||
|
resp.max_active_wake_words = config.max_active_wake_words;
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void APIConnection::voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) {
|
void APIConnection::voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_set_configuration(msg.active_wake_words);
|
voice_assistant::global_voice_assistant->on_set_configuration(msg.active_wake_words);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,6 +301,11 @@ class APIConnection : public APIServerConnection {
|
|||||||
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
||||||
uint32_t remaining_size, bool is_single);
|
uint32_t remaining_size, bool is_single);
|
||||||
|
|
||||||
|
#ifdef USE_VOICE_ASSISTANT
|
||||||
|
// Helper to check voice assistant validity and connection ownership
|
||||||
|
bool check_voice_assistant_api_connection() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Helper method to process multiple entities from an iterator in a batch
|
// Helper method to process multiple entities from an iterator in a batch
|
||||||
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
||||||
size_t initial_size = this->deferred_batch_.size();
|
size_t initial_size = this->deferred_batch_.size();
|
||||||
|
@ -11,6 +11,7 @@ CONF_AUTO_WAKE_ON_TOUCH = "auto_wake_on_touch"
|
|||||||
CONF_BACKGROUND_PRESSED_COLOR = "background_pressed_color"
|
CONF_BACKGROUND_PRESSED_COLOR = "background_pressed_color"
|
||||||
CONF_COMMAND_SPACING = "command_spacing"
|
CONF_COMMAND_SPACING = "command_spacing"
|
||||||
CONF_COMPONENT_NAME = "component_name"
|
CONF_COMPONENT_NAME = "component_name"
|
||||||
|
CONF_DUMP_DEVICE_INFO = "dump_device_info"
|
||||||
CONF_EXIT_REPARSE_ON_START = "exit_reparse_on_start"
|
CONF_EXIT_REPARSE_ON_START = "exit_reparse_on_start"
|
||||||
CONF_FONT_ID = "font_id"
|
CONF_FONT_ID = "font_id"
|
||||||
CONF_FOREGROUND_PRESSED_COLOR = "foreground_pressed_color"
|
CONF_FOREGROUND_PRESSED_COLOR = "foreground_pressed_color"
|
||||||
|
@ -15,6 +15,7 @@ from . import Nextion, nextion_ns, nextion_ref
|
|||||||
from .base_component import (
|
from .base_component import (
|
||||||
CONF_AUTO_WAKE_ON_TOUCH,
|
CONF_AUTO_WAKE_ON_TOUCH,
|
||||||
CONF_COMMAND_SPACING,
|
CONF_COMMAND_SPACING,
|
||||||
|
CONF_DUMP_DEVICE_INFO,
|
||||||
CONF_EXIT_REPARSE_ON_START,
|
CONF_EXIT_REPARSE_ON_START,
|
||||||
CONF_MAX_COMMANDS_PER_LOOP,
|
CONF_MAX_COMMANDS_PER_LOOP,
|
||||||
CONF_MAX_QUEUE_SIZE,
|
CONF_MAX_QUEUE_SIZE,
|
||||||
@ -57,6 +58,7 @@ CONFIG_SCHEMA = (
|
|||||||
cv.positive_time_period_milliseconds,
|
cv.positive_time_period_milliseconds,
|
||||||
cv.Range(max=TimePeriod(milliseconds=255)),
|
cv.Range(max=TimePeriod(milliseconds=255)),
|
||||||
),
|
),
|
||||||
|
cv.Optional(CONF_DUMP_DEVICE_INFO, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_EXIT_REPARSE_ON_START, default=False): cv.boolean,
|
cv.Optional(CONF_EXIT_REPARSE_ON_START, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_MAX_COMMANDS_PER_LOOP): cv.uint16_t,
|
cv.Optional(CONF_MAX_COMMANDS_PER_LOOP): cv.uint16_t,
|
||||||
cv.Optional(CONF_MAX_QUEUE_SIZE): cv.positive_int,
|
cv.Optional(CONF_MAX_QUEUE_SIZE): cv.positive_int,
|
||||||
@ -95,7 +97,9 @@ CONFIG_SCHEMA = (
|
|||||||
cv.Optional(CONF_SKIP_CONNECTION_HANDSHAKE, default=False): cv.boolean,
|
cv.Optional(CONF_SKIP_CONNECTION_HANDSHAKE, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_START_UP_PAGE): cv.uint8_t,
|
cv.Optional(CONF_START_UP_PAGE): cv.uint8_t,
|
||||||
cv.Optional(CONF_TFT_URL): cv.url,
|
cv.Optional(CONF_TFT_URL): cv.url,
|
||||||
cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.int_range(min=3, max=65535),
|
cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.Any(
|
||||||
|
0, cv.int_range(min=3, max=65535)
|
||||||
|
),
|
||||||
cv.Optional(CONF_WAKE_UP_PAGE): cv.uint8_t,
|
cv.Optional(CONF_WAKE_UP_PAGE): cv.uint8_t,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -172,9 +176,14 @@ async def to_code(config):
|
|||||||
|
|
||||||
cg.add(var.set_auto_wake_on_touch(config[CONF_AUTO_WAKE_ON_TOUCH]))
|
cg.add(var.set_auto_wake_on_touch(config[CONF_AUTO_WAKE_ON_TOUCH]))
|
||||||
|
|
||||||
cg.add(var.set_exit_reparse_on_start(config[CONF_EXIT_REPARSE_ON_START]))
|
if config[CONF_DUMP_DEVICE_INFO]:
|
||||||
|
cg.add_define("USE_NEXTION_CONFIG_DUMP_DEVICE_INFO")
|
||||||
|
|
||||||
cg.add(var.set_skip_connection_handshake(config[CONF_SKIP_CONNECTION_HANDSHAKE]))
|
if config[CONF_EXIT_REPARSE_ON_START]:
|
||||||
|
cg.add_define("USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START")
|
||||||
|
|
||||||
|
if config[CONF_SKIP_CONNECTION_HANDSHAKE]:
|
||||||
|
cg.add_define("USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE")
|
||||||
|
|
||||||
if max_commands_per_loop := config.get(CONF_MAX_COMMANDS_PER_LOOP):
|
if max_commands_per_loop := config.get(CONF_MAX_COMMANDS_PER_LOOP):
|
||||||
cg.add_define("USE_NEXTION_MAX_COMMANDS_PER_LOOP")
|
cg.add_define("USE_NEXTION_MAX_COMMANDS_PER_LOOP")
|
||||||
|
@ -13,14 +13,11 @@ void Nextion::setup() {
|
|||||||
this->is_setup_ = false;
|
this->is_setup_ = false;
|
||||||
this->connection_state_.ignore_is_setup_ = true;
|
this->connection_state_.ignore_is_setup_ = true;
|
||||||
|
|
||||||
// Wake up the nextion
|
// Wake up the nextion and ensure clean communication state
|
||||||
this->send_command_("bkcmd=0");
|
this->send_command_("sleep=0"); // Exit sleep mode if sleeping
|
||||||
this->send_command_("sleep=0");
|
this->send_command_("bkcmd=0"); // Disable return data during init sequence
|
||||||
|
|
||||||
this->send_command_("bkcmd=0");
|
// Reset device for clean state - critical for reliable communication
|
||||||
this->send_command_("sleep=0");
|
|
||||||
|
|
||||||
// Reboot it
|
|
||||||
this->send_command_("rest");
|
this->send_command_("rest");
|
||||||
|
|
||||||
this->connection_state_.ignore_is_setup_ = false;
|
this->connection_state_.ignore_is_setup_ = false;
|
||||||
@ -51,24 +48,19 @@ bool Nextion::check_connect_() {
|
|||||||
if (this->connection_state_.is_connected_)
|
if (this->connection_state_.is_connected_)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Check if the handshake should be skipped for the Nextion connection
|
#ifdef USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
if (this->skip_connection_handshake_) {
|
ESP_LOGW(TAG, "Connected (no handshake)"); // Log the connection status without handshake
|
||||||
// Log the connection status without handshake
|
this->is_connected_ = true; // Set the connection status to true
|
||||||
ESP_LOGW(TAG, "Connected (no handshake)");
|
return true; // Return true indicating the connection is set
|
||||||
// Set the connection status to true
|
#else // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
this->connection_state_.is_connected_ = true;
|
|
||||||
// Return true indicating the connection is set
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->comok_sent_ == 0) {
|
if (this->comok_sent_ == 0) {
|
||||||
this->reset_(false);
|
this->reset_(false);
|
||||||
|
|
||||||
this->connection_state_.ignore_is_setup_ = true;
|
this->connection_state_.ignore_is_setup_ = true;
|
||||||
this->send_command_("boguscommand=0"); // bogus command. needed sometimes after updating
|
this->send_command_("boguscommand=0"); // bogus command. needed sometimes after updating
|
||||||
if (this->exit_reparse_on_start_) {
|
#ifdef USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
|
||||||
this->send_command_("DRAKJHSUYDGBNCJHGJKSHBDN");
|
this->send_command_("DRAKJHSUYDGBNCJHGJKSHBDN");
|
||||||
}
|
#endif // USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
|
||||||
this->send_command_("connect");
|
this->send_command_("connect");
|
||||||
|
|
||||||
this->comok_sent_ = App.get_loop_component_start_time();
|
this->comok_sent_ = App.get_loop_component_start_time();
|
||||||
@ -94,7 +86,7 @@ bool Nextion::check_connect_() {
|
|||||||
for (size_t i = 0; i < response.length(); i++) {
|
for (size_t i = 0; i < response.length(); i++) {
|
||||||
ESP_LOGN(TAG, "resp: %s %d %d %c", response.c_str(), i, response[i], response[i]);
|
ESP_LOGN(TAG, "resp: %s %d %d %c", response.c_str(), i, response[i], response[i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // NEXTION_PROTOCOL_LOG
|
||||||
|
|
||||||
ESP_LOGW(TAG, "Not connected");
|
ESP_LOGW(TAG, "Not connected");
|
||||||
comok_sent_ = 0;
|
comok_sent_ = 0;
|
||||||
@ -118,11 +110,19 @@ bool Nextion::check_connect_() {
|
|||||||
this->is_detected_ = (connect_info.size() == 7);
|
this->is_detected_ = (connect_info.size() == 7);
|
||||||
if (this->is_detected_) {
|
if (this->is_detected_) {
|
||||||
ESP_LOGN(TAG, "Connect info: %zu", connect_info.size());
|
ESP_LOGN(TAG, "Connect info: %zu", connect_info.size());
|
||||||
|
#ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
this->device_model_ = connect_info[2];
|
this->device_model_ = connect_info[2];
|
||||||
this->firmware_version_ = connect_info[3];
|
this->firmware_version_ = connect_info[3];
|
||||||
this->serial_number_ = connect_info[5];
|
this->serial_number_ = connect_info[5];
|
||||||
this->flash_size_ = connect_info[6];
|
this->flash_size_ = connect_info[6];
|
||||||
|
#else // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
ESP_LOGI(TAG,
|
||||||
|
" Device Model: %s\n"
|
||||||
|
" FW Version: %s\n"
|
||||||
|
" Serial Number: %s\n"
|
||||||
|
" Flash Size: %s\n",
|
||||||
|
connect_info[2].c_str(), connect_info[3].c_str(), connect_info[5].c_str(), connect_info[6].c_str());
|
||||||
|
#endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGE(TAG, "Bad connect value: '%s'", response.c_str());
|
ESP_LOGE(TAG, "Bad connect value: '%s'", response.c_str());
|
||||||
}
|
}
|
||||||
@ -130,6 +130,7 @@ bool Nextion::check_connect_() {
|
|||||||
this->connection_state_.ignore_is_setup_ = false;
|
this->connection_state_.ignore_is_setup_ = false;
|
||||||
this->dump_config();
|
this->dump_config();
|
||||||
return true;
|
return true;
|
||||||
|
#endif // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nextion::reset_(bool reset_nextion) {
|
void Nextion::reset_(bool reset_nextion) {
|
||||||
@ -144,29 +145,33 @@ void Nextion::reset_(bool reset_nextion) {
|
|||||||
|
|
||||||
void Nextion::dump_config() {
|
void Nextion::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "Nextion:");
|
ESP_LOGCONFIG(TAG, "Nextion:");
|
||||||
if (this->skip_connection_handshake_) {
|
|
||||||
ESP_LOGCONFIG(TAG, " Skip handshake: %s", YESNO(this->skip_connection_handshake_));
|
#ifdef USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
} else {
|
ESP_LOGCONFIG(TAG, " Skip handshake: YES");
|
||||||
ESP_LOGCONFIG(TAG,
|
#else // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
" Device Model: %s\n"
|
|
||||||
" FW Version: %s\n"
|
|
||||||
" Serial Number: %s\n"
|
|
||||||
" Flash Size: %s",
|
|
||||||
this->device_model_.c_str(), this->firmware_version_.c_str(), this->serial_number_.c_str(),
|
|
||||||
this->flash_size_.c_str());
|
|
||||||
}
|
|
||||||
ESP_LOGCONFIG(TAG,
|
ESP_LOGCONFIG(TAG,
|
||||||
|
#ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
" Device Model: %s\n"
|
||||||
|
" FW Version: %s\n"
|
||||||
|
" Serial Number: %s\n"
|
||||||
|
" Flash Size: %s\n"
|
||||||
|
#endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
#ifdef USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
|
||||||
|
" Exit reparse: YES\n"
|
||||||
|
#endif // USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
|
||||||
" Wake On Touch: %s\n"
|
" Wake On Touch: %s\n"
|
||||||
" Exit reparse: %s",
|
" Touch Timeout: %" PRIu16,
|
||||||
YESNO(this->connection_state_.auto_wake_on_touch_), YESNO(this->exit_reparse_on_start_));
|
#ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
this->device_model_.c_str(), this->firmware_version_.c_str(), this->serial_number_.c_str(),
|
||||||
|
this->flash_size_.c_str(),
|
||||||
|
#endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
YESNO(this->connection_state_.auto_wake_on_touch_), this->touch_sleep_timeout_);
|
||||||
|
#endif // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
|
||||||
|
|
||||||
#ifdef USE_NEXTION_MAX_COMMANDS_PER_LOOP
|
#ifdef USE_NEXTION_MAX_COMMANDS_PER_LOOP
|
||||||
ESP_LOGCONFIG(TAG, " Max commands per loop: %u", this->max_commands_per_loop_);
|
ESP_LOGCONFIG(TAG, " Max commands per loop: %u", this->max_commands_per_loop_);
|
||||||
#endif // USE_NEXTION_MAX_COMMANDS_PER_LOOP
|
#endif // USE_NEXTION_MAX_COMMANDS_PER_LOOP
|
||||||
|
|
||||||
if (this->touch_sleep_timeout_ != 0) {
|
|
||||||
ESP_LOGCONFIG(TAG, " Touch Timeout: %" PRIu16, this->touch_sleep_timeout_);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->wake_up_page_ != 255) {
|
if (this->wake_up_page_ != 255) {
|
||||||
ESP_LOGCONFIG(TAG, " Wake Up Page: %u", this->wake_up_page_);
|
ESP_LOGCONFIG(TAG, " Wake Up Page: %u", this->wake_up_page_);
|
||||||
}
|
}
|
||||||
@ -314,6 +319,10 @@ void Nextion::loop() {
|
|||||||
this->set_wake_up_page(this->wake_up_page_);
|
this->set_wake_up_page(this->wake_up_page_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->touch_sleep_timeout_ != 0) {
|
||||||
|
this->set_touch_sleep_timeout(this->touch_sleep_timeout_);
|
||||||
|
}
|
||||||
|
|
||||||
this->connection_state_.ignore_is_setup_ = false;
|
this->connection_state_.ignore_is_setup_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -932,21 +932,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
*/
|
*/
|
||||||
void set_backlight_brightness(float brightness);
|
void set_backlight_brightness(float brightness);
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets whether the Nextion display should skip the connection handshake process.
|
|
||||||
* @param skip_handshake True or false. When skip_connection_handshake is true,
|
|
||||||
* the connection will be established without performing the handshake.
|
|
||||||
* This can be useful when using Nextion Simulator.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* ```cpp
|
|
||||||
* it.set_skip_connection_handshake(true);
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* When set to true, the display will be marked as connected without performing a handshake.
|
|
||||||
*/
|
|
||||||
void set_skip_connection_handshake(bool skip_handshake) { this->skip_connection_handshake_ = skip_handshake; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets Nextion mode between sleep and awake
|
* Sets Nextion mode between sleep and awake
|
||||||
* @param True or false. Sleep=true to enter sleep mode or sleep=false to exit sleep mode.
|
* @param True or false. Sleep=true to enter sleep mode or sleep=false to exit sleep mode.
|
||||||
@ -1179,18 +1164,39 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
void update_components_by_prefix(const std::string &prefix);
|
void update_components_by_prefix(const std::string &prefix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the touch sleep timeout of the display.
|
* Set the touch sleep timeout of the display using the `thsp` command.
|
||||||
* @param timeout Timeout in seconds.
|
*
|
||||||
|
* Sets internal No-touch-then-sleep timer to specified value in seconds.
|
||||||
|
* Nextion will auto-enter sleep mode if and when this timer expires.
|
||||||
|
*
|
||||||
|
* @param touch_sleep_timeout Timeout in seconds.
|
||||||
|
* Range: 3 to 65535 seconds (minimum 3 seconds, maximum ~18 hours 12 minutes 15 seconds)
|
||||||
|
* Use 0 to disable touch sleep timeout.
|
||||||
|
*
|
||||||
|
* @note Once `thsp` is set, it will persist until reboot or reset. The Nextion device
|
||||||
|
* needs to exit sleep mode to issue `thsp=0` to disable sleep on no touch.
|
||||||
|
*
|
||||||
|
* @note The display will only wake up by a restart or by setting up `thup` (auto wake on touch).
|
||||||
|
* See set_auto_wake_on_touch() to configure wake behavior.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* ```cpp
|
* ```cpp
|
||||||
|
* // Set 30 second touch timeout
|
||||||
* it.set_touch_sleep_timeout(30);
|
* it.set_touch_sleep_timeout(30);
|
||||||
|
*
|
||||||
|
* // Set maximum timeout (~18 hours)
|
||||||
|
* it.set_touch_sleep_timeout(65535);
|
||||||
|
*
|
||||||
|
* // Disable touch sleep timeout
|
||||||
|
* it.set_touch_sleep_timeout(0);
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* After 30 seconds the display will go to sleep. Note: the display will only wakeup by a restart or by setting up
|
* Related Nextion instruction: `thsp=<value>`
|
||||||
* `thup`.
|
*
|
||||||
|
* @see set_auto_wake_on_touch() Configure automatic wake on touch
|
||||||
|
* @see sleep() Manually control sleep state
|
||||||
*/
|
*/
|
||||||
void set_touch_sleep_timeout(uint16_t touch_sleep_timeout);
|
void set_touch_sleep_timeout(uint16_t touch_sleep_timeout = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets which page Nextion loads when exiting sleep mode. Note this can be set even when Nextion is in sleep mode.
|
* Sets which page Nextion loads when exiting sleep mode. Note this can be set even when Nextion is in sleep mode.
|
||||||
@ -1236,20 +1242,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
*/
|
*/
|
||||||
void set_auto_wake_on_touch(bool auto_wake_on_touch);
|
void set_auto_wake_on_touch(bool auto_wake_on_touch);
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets if Nextion should exit the active reparse mode before the "connect" command is sent
|
|
||||||
* @param exit_reparse_on_start True or false. When exit_reparse_on_start is true, the exit reparse command
|
|
||||||
* will be sent before requesting the connection from Nextion.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* ```cpp
|
|
||||||
* it.set_exit_reparse_on_start(true);
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* The display will be requested to leave active reparse mode before setup.
|
|
||||||
*/
|
|
||||||
void set_exit_reparse_on_start(bool exit_reparse_on_start) { this->exit_reparse_on_start_ = exit_reparse_on_start; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieves the number of commands pending in the Nextion command queue.
|
* @brief Retrieves the number of commands pending in the Nextion command queue.
|
||||||
*
|
*
|
||||||
@ -1292,7 +1284,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
* the Nextion display. A connection is considered established when:
|
* the Nextion display. A connection is considered established when:
|
||||||
*
|
*
|
||||||
* - The initial handshake with the display is completed successfully, or
|
* - The initial handshake with the display is completed successfully, or
|
||||||
* - The handshake is skipped via skip_connection_handshake_ flag
|
* - The handshake is skipped via USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE flag
|
||||||
*
|
*
|
||||||
* The connection status is particularly useful when:
|
* The connection status is particularly useful when:
|
||||||
* - Troubleshooting communication issues
|
* - Troubleshooting communication issues
|
||||||
@ -1358,8 +1350,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
#ifdef USE_NEXTION_CONF_START_UP_PAGE
|
#ifdef USE_NEXTION_CONF_START_UP_PAGE
|
||||||
uint8_t start_up_page_ = 255;
|
uint8_t start_up_page_ = 255;
|
||||||
#endif // USE_NEXTION_CONF_START_UP_PAGE
|
#endif // USE_NEXTION_CONF_START_UP_PAGE
|
||||||
bool exit_reparse_on_start_ = false;
|
bool auto_wake_on_touch_ = true;
|
||||||
bool skip_connection_handshake_ = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manually send a raw command to the display and don't wait for an acknowledgement packet.
|
* Manually send a raw command to the display and don't wait for an acknowledgement packet.
|
||||||
@ -1466,10 +1457,12 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
|
|||||||
optional<nextion_writer_t> writer_;
|
optional<nextion_writer_t> writer_;
|
||||||
optional<float> brightness_;
|
optional<float> brightness_;
|
||||||
|
|
||||||
|
#ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
std::string device_model_;
|
std::string device_model_;
|
||||||
std::string firmware_version_;
|
std::string firmware_version_;
|
||||||
std::string serial_number_;
|
std::string serial_number_;
|
||||||
std::string flash_size_;
|
std::string flash_size_;
|
||||||
|
#endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
|
||||||
|
|
||||||
void remove_front_no_sensors_();
|
void remove_front_no_sensors_();
|
||||||
|
|
||||||
|
@ -15,14 +15,15 @@ void Nextion::set_wake_up_page(uint8_t wake_up_page) {
|
|||||||
this->add_no_result_to_queue_with_set_internal_("wake_up_page", "wup", wake_up_page, true);
|
this->add_no_result_to_queue_with_set_internal_("wake_up_page", "wup", wake_up_page, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nextion::set_touch_sleep_timeout(uint16_t touch_sleep_timeout) {
|
void Nextion::set_touch_sleep_timeout(const uint16_t touch_sleep_timeout) {
|
||||||
if (touch_sleep_timeout < 3) {
|
// Validate range: Nextion thsp command requires min 3, max 65535 seconds (0 disables)
|
||||||
ESP_LOGD(TAG, "Sleep timeout out of bounds (3-65535)");
|
if (touch_sleep_timeout != 0 && touch_sleep_timeout < 3) {
|
||||||
return;
|
this->touch_sleep_timeout_ = 3; // Auto-correct to minimum valid value
|
||||||
|
} else {
|
||||||
|
this->touch_sleep_timeout_ = touch_sleep_timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->touch_sleep_timeout_ = touch_sleep_timeout;
|
this->add_no_result_to_queue_with_set_internal_("touch_sleep_timeout", "thsp", this->touch_sleep_timeout_, true);
|
||||||
this->add_no_result_to_queue_with_set_internal_("touch_sleep_timeout", "thsp", touch_sleep_timeout, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nextion::sleep(bool sleep) {
|
void Nextion::sleep(bool sleep) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user