mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 00:48:19 +01:00
Couple more updates for the Tuya component (#2065)
Co-authored-by: Chris Nussbaum <chris.nussbaum@protolabs.com>
This commit is contained in:
parent
d9f09a7523
commit
6b535b11f8
2 changed files with 37 additions and 4 deletions
|
@ -8,9 +8,10 @@ namespace tuya {
|
||||||
|
|
||||||
static const char *const TAG = "tuya";
|
static const char *const TAG = "tuya";
|
||||||
static const int COMMAND_DELAY = 50;
|
static const int COMMAND_DELAY = 50;
|
||||||
|
static const int RECEIVE_TIMEOUT = 300;
|
||||||
|
|
||||||
void Tuya::setup() {
|
void Tuya::setup() {
|
||||||
this->set_interval("heartbeat", 10000, [this] { this->send_empty_command_(TuyaCommandType::HEARTBEAT); });
|
this->set_interval("heartbeat", 15000, [this] { this->send_empty_command_(TuyaCommandType::HEARTBEAT); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tuya::loop() {
|
void Tuya::loop() {
|
||||||
|
@ -117,7 +118,13 @@ void Tuya::handle_char_(uint8_t c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buffer, size_t len) {
|
void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buffer, size_t len) {
|
||||||
switch ((TuyaCommandType) command) {
|
TuyaCommandType command_type = (TuyaCommandType) command;
|
||||||
|
|
||||||
|
if (this->expected_response_.has_value() && this->expected_response_ == command_type) {
|
||||||
|
this->expected_response_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (command_type) {
|
||||||
case TuyaCommandType::HEARTBEAT:
|
case TuyaCommandType::HEARTBEAT:
|
||||||
ESP_LOGV(TAG, "MCU Heartbeat (0x%02X)", buffer[0]);
|
ESP_LOGV(TAG, "MCU Heartbeat (0x%02X)", buffer[0]);
|
||||||
this->protocol_version_ = version;
|
this->protocol_version_ = version;
|
||||||
|
@ -316,6 +323,25 @@ void Tuya::send_raw_command_(TuyaCommand command) {
|
||||||
uint8_t version = 0;
|
uint8_t version = 0;
|
||||||
|
|
||||||
this->last_command_timestamp_ = millis();
|
this->last_command_timestamp_ = millis();
|
||||||
|
switch (command.cmd) {
|
||||||
|
case TuyaCommandType::HEARTBEAT:
|
||||||
|
this->expected_response_ = TuyaCommandType::HEARTBEAT;
|
||||||
|
break;
|
||||||
|
case TuyaCommandType::PRODUCT_QUERY:
|
||||||
|
this->expected_response_ = TuyaCommandType::PRODUCT_QUERY;
|
||||||
|
break;
|
||||||
|
case TuyaCommandType::CONF_QUERY:
|
||||||
|
this->expected_response_ = TuyaCommandType::CONF_QUERY;
|
||||||
|
break;
|
||||||
|
case TuyaCommandType::DATAPOINT_DELIVER:
|
||||||
|
this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT;
|
||||||
|
break;
|
||||||
|
case TuyaCommandType::DATAPOINT_QUERY:
|
||||||
|
this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ESP_LOGV(TAG, "Sending Tuya: CMD=0x%02X VERSION=%u DATA=[%s] INIT_STATE=%u", static_cast<uint8_t>(command.cmd),
|
ESP_LOGV(TAG, "Sending Tuya: CMD=0x%02X VERSION=%u DATA=[%s] INIT_STATE=%u", static_cast<uint8_t>(command.cmd),
|
||||||
version, hexencode(command.payload).c_str(), static_cast<uint8_t>(this->init_state_));
|
version, hexencode(command.payload).c_str(), static_cast<uint8_t>(this->init_state_));
|
||||||
|
@ -332,8 +358,14 @@ void Tuya::send_raw_command_(TuyaCommand command) {
|
||||||
|
|
||||||
void Tuya::process_command_queue_() {
|
void Tuya::process_command_queue_() {
|
||||||
uint32_t delay = millis() - this->last_command_timestamp_;
|
uint32_t delay = millis() - this->last_command_timestamp_;
|
||||||
|
|
||||||
|
if (this->expected_response_.has_value() && delay > RECEIVE_TIMEOUT) {
|
||||||
|
this->expected_response_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
// Left check of delay since last command in case theres ever a command sent by calling send_raw_command_ directly
|
// Left check of delay since last command in case theres ever a command sent by calling send_raw_command_ directly
|
||||||
if (delay > COMMAND_DELAY && !this->command_queue_.empty() && this->rx_message_.empty()) {
|
if (delay > COMMAND_DELAY && !this->command_queue_.empty() && this->rx_message_.empty() &&
|
||||||
|
!this->expected_response_.has_value()) {
|
||||||
this->send_raw_command_(command_queue_.front());
|
this->send_raw_command_(command_queue_.front());
|
||||||
this->command_queue_.erase(command_queue_.begin());
|
this->command_queue_.erase(command_queue_.begin());
|
||||||
}
|
}
|
||||||
|
@ -345,7 +377,7 @@ void Tuya::send_command_(const TuyaCommand &command) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tuya::send_empty_command_(TuyaCommandType command) {
|
void Tuya::send_empty_command_(TuyaCommandType command) {
|
||||||
send_command_(TuyaCommand{.cmd = command, .payload = std::vector<uint8_t>{0x04}});
|
send_command_(TuyaCommand{.cmd = command, .payload = std::vector<uint8_t>{}});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tuya::send_wifi_status_() {
|
void Tuya::send_wifi_status_() {
|
||||||
|
|
|
@ -113,6 +113,7 @@ class Tuya : public Component, public uart::UARTDevice {
|
||||||
std::vector<uint8_t> rx_message_;
|
std::vector<uint8_t> rx_message_;
|
||||||
std::vector<uint8_t> ignore_mcu_update_on_datapoints_{};
|
std::vector<uint8_t> ignore_mcu_update_on_datapoints_{};
|
||||||
std::vector<TuyaCommand> command_queue_;
|
std::vector<TuyaCommand> command_queue_;
|
||||||
|
optional<TuyaCommandType> expected_response_{};
|
||||||
uint8_t wifi_status_ = -1;
|
uint8_t wifi_status_ = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue