mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add support for string-type Tuya datapoints (#1488)
This commit is contained in:
		
				
					committed by
					
						 Jesse Hills
						Jesse Hills
					
				
			
			
				
	
			
			
			
						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 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user