mirror of
https://github.com/esphome/esphome.git
synced 2024-12-29 17:47:51 +01:00
Add support for string-type Tuya datapoints (#1488)
This commit is contained in:
parent
b860a317b9
commit
ea019a057b
@ -42,6 +42,8 @@ void Tuya::dump_config() {
|
|||||||
ESP_LOGCONFIG(TAG, " Datapoint %d: switch (value: %s)", info.id, ONOFF(info.value_bool));
|
ESP_LOGCONFIG(TAG, " Datapoint %d: switch (value: %s)", info.id, ONOFF(info.value_bool));
|
||||||
else if (info.type == TuyaDatapointType::INTEGER)
|
else if (info.type == TuyaDatapointType::INTEGER)
|
||||||
ESP_LOGCONFIG(TAG, " Datapoint %d: int value (value: %d)", info.id, info.value_int);
|
ESP_LOGCONFIG(TAG, " Datapoint %d: int value (value: %d)", info.id, info.value_int);
|
||||||
|
else if (info.type == TuyaDatapointType::STRING)
|
||||||
|
ESP_LOGCONFIG(TAG, " Datapoint %d: string value (value: %s)", info.id, info.value_string.c_str());
|
||||||
else if (info.type == TuyaDatapointType::ENUM)
|
else if (info.type == TuyaDatapointType::ENUM)
|
||||||
ESP_LOGCONFIG(TAG, " Datapoint %d: enum (value: %d)", info.id, info.value_enum);
|
ESP_LOGCONFIG(TAG, " Datapoint %d: enum (value: %d)", info.id, info.value_enum);
|
||||||
else if (info.type == TuyaDatapointType::BITMASK)
|
else if (info.type == TuyaDatapointType::BITMASK)
|
||||||
@ -283,6 +285,9 @@ void Tuya::handle_datapoint_(const uint8_t *buffer, size_t len) {
|
|||||||
return;
|
return;
|
||||||
datapoint.value_uint = encode_uint32(data[0], data[1], data[2], data[3]);
|
datapoint.value_uint = encode_uint32(data[0], data[1], data[2], data[3]);
|
||||||
break;
|
break;
|
||||||
|
case TuyaDatapointType::STRING:
|
||||||
|
datapoint.value_string = std::string(reinterpret_cast<const char *>(data), data_len);
|
||||||
|
break;
|
||||||
case TuyaDatapointType::ENUM:
|
case TuyaDatapointType::ENUM:
|
||||||
if (data_len != 1)
|
if (data_len != 1)
|
||||||
return;
|
return;
|
||||||
@ -339,7 +344,13 @@ void Tuya::set_datapoint_value(TuyaDatapoint datapoint) {
|
|||||||
ESP_LOGV(TAG, "Datapoint %u set to %u", datapoint.id, datapoint.value_uint);
|
ESP_LOGV(TAG, "Datapoint %u set to %u", datapoint.id, datapoint.value_uint);
|
||||||
for (auto &other : this->datapoints_) {
|
for (auto &other : this->datapoints_) {
|
||||||
if (other.id == datapoint.id) {
|
if (other.id == datapoint.id) {
|
||||||
if (other.value_uint == datapoint.value_uint) {
|
// String value is stored outside the union; must be checked separately.
|
||||||
|
if (datapoint.type == TuyaDatapointType::STRING) {
|
||||||
|
if (other.value_string == datapoint.value_string) {
|
||||||
|
ESP_LOGV(TAG, "Not sending unchanged value");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (other.value_uint == datapoint.value_uint) {
|
||||||
ESP_LOGV(TAG, "Not sending unchanged value");
|
ESP_LOGV(TAG, "Not sending unchanged value");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -359,6 +370,11 @@ void Tuya::set_datapoint_value(TuyaDatapoint datapoint) {
|
|||||||
data.push_back(datapoint.value_uint >> 8);
|
data.push_back(datapoint.value_uint >> 8);
|
||||||
data.push_back(datapoint.value_uint >> 0);
|
data.push_back(datapoint.value_uint >> 0);
|
||||||
break;
|
break;
|
||||||
|
case TuyaDatapointType::STRING:
|
||||||
|
for (char const &c : datapoint.value_string) {
|
||||||
|
data.push_back(c);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case TuyaDatapointType::ENUM:
|
case TuyaDatapointType::ENUM:
|
||||||
data.push_back(datapoint.value_enum);
|
data.push_back(datapoint.value_enum);
|
||||||
break;
|
break;
|
||||||
|
@ -30,6 +30,7 @@ struct TuyaDatapoint {
|
|||||||
uint8_t value_enum;
|
uint8_t value_enum;
|
||||||
uint16_t value_bitmask;
|
uint16_t value_bitmask;
|
||||||
};
|
};
|
||||||
|
std::string value_string;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TuyaDatapointListener {
|
struct TuyaDatapointListener {
|
||||||
|
Loading…
Reference in New Issue
Block a user