ESPHome 2026.8.1
Loading...
Searching...
No Matches
tuya.h
Go to the documentation of this file.
1#pragma once
2
3#include <cinttypes>
4#include <vector>
5
10
11#ifdef USE_TIME
13#include "esphome/core/time.h"
14#endif
15
16namespace esphome::tuya {
17
18enum class TuyaDatapointType : uint8_t {
19 RAW = 0x00, // variable length
20 BOOLEAN = 0x01, // 1 byte (0/1)
21 INTEGER = 0x02, // 4 byte
22 STRING = 0x03, // variable length
23 ENUM = 0x04, // 1 byte
24 BITMASK = 0x05, // 1/2/4 bytes
25};
26
28 uint8_t id;
30 size_t len;
31 union {
35 uint8_t value_enum;
37 };
38 std::string value_string;
39 std::vector<uint8_t> value_raw;
40};
41
43 uint8_t datapoint_id;
44 std::function<void(TuyaDatapoint)> on_datapoint;
45};
46
47enum class TuyaCommandType : uint8_t {
48 HEARTBEAT = 0x00,
49 PRODUCT_QUERY = 0x01,
50 CONF_QUERY = 0x02,
51 WIFI_STATE = 0x03,
52 WIFI_RESET = 0x04,
53 WIFI_SELECT = 0x05,
54 DATAPOINT_DELIVER = 0x06,
56 DATAPOINT_QUERY = 0x08,
57 GMT_TIME_QUERY = 0x0C,
58 WIFI_TEST = 0x0E,
59 LOCAL_TIME_QUERY = 0x1C,
62 WIFI_RSSI = 0x24,
63 VACUUM_MAP_UPLOAD = 0x28,
64 GET_NETWORK_STATUS = 0x2B,
65 EXTENDED_SERVICES = 0x34,
66};
67
68enum class TuyaExtendedServicesCommandType : uint8_t {
69 RESET_NOTIFICATION = 0x04,
70 MODULE_RESET = 0x05,
71 UPDATE_IN_PROGRESS = 0x0A,
72};
73
74enum class TuyaInitState : uint8_t {
75 INIT_HEARTBEAT = 0x00,
81};
82
85 std::vector<uint8_t> payload;
86};
87
88class Tuya final : public Component, public uart::UARTDevice {
89 public:
90 float get_setup_priority() const override { return setup_priority::LATE; }
91 void setup() override;
92 void loop() override;
93 void dump_config() override;
94 void register_listener(uint8_t datapoint_id, const std::function<void(TuyaDatapoint)> &func);
95 void set_raw_datapoint_value(uint8_t datapoint_id, const std::vector<uint8_t> &value);
96 void set_boolean_datapoint_value(uint8_t datapoint_id, bool value);
97 void set_integer_datapoint_value(uint8_t datapoint_id, uint32_t value);
98 void set_status_pin(InternalGPIOPin *status_pin) { this->status_pin_ = status_pin; }
99 void set_string_datapoint_value(uint8_t datapoint_id, const std::string &value);
100 void set_enum_datapoint_value(uint8_t datapoint_id, uint8_t value);
101 void set_bitmask_datapoint_value(uint8_t datapoint_id, uint32_t value, uint8_t length);
102 void force_set_raw_datapoint_value(uint8_t datapoint_id, const std::vector<uint8_t> &value);
103 void force_set_boolean_datapoint_value(uint8_t datapoint_id, bool value);
104 void force_set_integer_datapoint_value(uint8_t datapoint_id, uint32_t value);
105 void force_set_string_datapoint_value(uint8_t datapoint_id, const std::string &value);
106 void force_set_enum_datapoint_value(uint8_t datapoint_id, uint8_t value);
107 void force_set_bitmask_datapoint_value(uint8_t datapoint_id, uint32_t value, uint8_t length);
109#ifdef USE_TIME
110 void set_time_id(time::RealTimeClock *time_id) { this->time_id_ = time_id; }
111#endif
112 void add_ignore_mcu_update_on_datapoints(uint8_t ignore_mcu_update_on_datapoints) {
113 this->ignore_mcu_update_on_datapoints_.push_back(ignore_mcu_update_on_datapoints);
114 }
115 template<typename F> void add_on_initialized_callback(F &&callback) {
116 this->initialized_callback_.add(std::forward<F>(callback));
117 }
118
119 protected:
120 void handle_char_(uint8_t c);
121 void handle_datapoints_(const uint8_t *buffer, size_t len);
122 optional<TuyaDatapoint> get_datapoint_(uint8_t datapoint_id);
123 bool validate_message_();
124
125 void handle_command_(uint8_t command, uint8_t version, const uint8_t *buffer, size_t len);
126 void send_raw_command_(TuyaCommand command);
128 void send_command_(const TuyaCommand &command);
130 void set_numeric_datapoint_value_(uint8_t datapoint_id, TuyaDatapointType datapoint_type, uint32_t value,
131 uint8_t length, bool forced);
132 void set_string_datapoint_value_(uint8_t datapoint_id, const std::string &value, bool forced);
133 void set_raw_datapoint_value_(uint8_t datapoint_id, const std::vector<uint8_t> &value, bool forced);
134 void send_datapoint_command_(uint8_t datapoint_id, TuyaDatapointType datapoint_type, std::vector<uint8_t> data);
135 void set_status_pin_();
136 void send_wifi_status_();
137 uint8_t get_wifi_status_code_();
138 uint8_t get_wifi_rssi_();
139
140#ifdef USE_TIME
141 void send_local_time_();
142 void send_gmt_time_();
146#endif
148 bool init_failed_{false};
150 uint8_t protocol_version_ = -1;
156 std::string product_;
157 std::vector<TuyaDatapointListener> listeners_;
158 std::vector<TuyaDatapoint> datapoints_;
159 std::vector<uint8_t> rx_message_;
160 std::vector<uint8_t> ignore_mcu_update_on_datapoints_{};
161 std::vector<TuyaCommand> command_queue_;
162 optional<TuyaCommandType> expected_response_{};
163 uint8_t wifi_status_ = -1;
165};
166
167} // namespace esphome::tuya
The RealTimeClock class exposes common timekeeping functions via the device's local real-time clock.
void send_datapoint_command_(uint8_t datapoint_id, TuyaDatapointType datapoint_type, std::vector< uint8_t > data)
Definition tuya.cpp:773
void set_status_pin(InternalGPIOPin *status_pin)
Definition tuya.h:98
void add_ignore_mcu_update_on_datapoints(uint8_t ignore_mcu_update_on_datapoints)
Definition tuya.h:112
void set_time_id(time::RealTimeClock *time_id)
Definition tuya.h:110
void set_string_datapoint_value(uint8_t datapoint_id, const std::string &value)
Definition tuya.cpp:661
optional< TuyaDatapoint > get_datapoint_(uint8_t datapoint_id)
Definition tuya.cpp:697
void send_empty_command_(TuyaCommandType command)
Definition tuya.cpp:552
void setup() override
Definition tuya.cpp:25
uint8_t get_wifi_rssi_()
Definition tuya.cpp:582
uint8_t get_wifi_status_code_()
Definition tuya.cpp:561
void dump_config() override
Definition tuya.cpp:50
time::RealTimeClock * time_id_
Definition tuya.h:143
CallbackManager< void()> initialized_callback_
Definition tuya.h:164
void set_boolean_datapoint_value(uint8_t datapoint_id, bool value)
Definition tuya.cpp:653
TuyaInitState init_state_
Definition tuya.h:147
float get_setup_priority() const override
Definition tuya.h:90
int status_pin_reported_
Definition tuya.h:152
void set_raw_datapoint_value_(uint8_t datapoint_id, const std::vector< uint8_t > &value, bool forced)
Definition tuya.cpp:738
bool validate_message_()
Definition tuya.cpp:89
InternalGPIOPin * status_pin_
Definition tuya.h:151
void force_set_raw_datapoint_value(uint8_t datapoint_id, const std::vector< uint8_t > &value)
Definition tuya.cpp:673
uint8_t protocol_version_
Definition tuya.h:150
void set_string_datapoint_value_(uint8_t datapoint_id, const std::string &value, bool forced)
Definition tuya.cpp:754
void force_set_integer_datapoint_value(uint8_t datapoint_id, uint32_t value)
Definition tuya.cpp:681
uint32_t last_rx_char_timestamp_
Definition tuya.h:155
void process_command_queue_()
Definition tuya.cpp:516
void send_gmt_time_()
Definition tuya.cpp:628
uint32_t last_command_timestamp_
Definition tuya.h:154
std::vector< TuyaDatapointListener > listeners_
Definition tuya.h:157
std::vector< TuyaCommand > command_queue_
Definition tuya.h:161
std::vector< TuyaDatapoint > datapoints_
Definition tuya.h:158
void send_local_time_()
Definition tuya.cpp:604
std::vector< uint8_t > ignore_mcu_update_on_datapoints_
Definition tuya.h:160
std::vector< uint8_t > rx_message_
Definition tuya.h:159
void handle_command_(uint8_t command, uint8_t version, const uint8_t *buffer, size_t len)
Definition tuya.cpp:157
void set_enum_datapoint_value(uint8_t datapoint_id, uint8_t value)
Definition tuya.cpp:665
void set_numeric_datapoint_value_(uint8_t datapoint_id, TuyaDatapointType datapoint_type, uint32_t value, uint8_t length, bool forced)
Definition tuya.cpp:705
TuyaInitState get_init_state()
Definition tuya.cpp:798
void set_status_pin_()
Definition tuya.cpp:556
void add_on_initialized_callback(F &&callback)
Definition tuya.h:115
void register_listener(uint8_t datapoint_id, const std::function< void(TuyaDatapoint)> &func)
Definition tuya.cpp:784
void handle_char_(uint8_t c)
Definition tuya.cpp:148
void force_set_bitmask_datapoint_value(uint8_t datapoint_id, uint32_t value, uint8_t length)
Definition tuya.cpp:693
void handle_datapoints_(const uint8_t *buffer, size_t len)
Definition tuya.cpp:364
std::string product_
Definition tuya.h:156
void send_wifi_status_()
Definition tuya.cpp:591
void send_command_(const TuyaCommand &command)
Definition tuya.cpp:547
void force_set_boolean_datapoint_value(uint8_t datapoint_id, bool value)
Definition tuya.cpp:677
void set_raw_datapoint_value(uint8_t datapoint_id, const std::vector< uint8_t > &value)
Definition tuya.cpp:649
optional< TuyaCommandType > expected_response_
Definition tuya.h:162
void send_raw_command_(TuyaCommand command)
Definition tuya.cpp:475
void force_set_enum_datapoint_value(uint8_t datapoint_id, uint8_t value)
Definition tuya.cpp:689
void force_set_string_datapoint_value(uint8_t datapoint_id, const std::string &value)
Definition tuya.cpp:685
bool time_sync_callback_registered_
Definition tuya.h:144
void set_bitmask_datapoint_value(uint8_t datapoint_id, uint32_t value, uint8_t length)
Definition tuya.cpp:669
int reset_pin_reported_
Definition tuya.h:153
uint8_t wifi_status_
Definition tuya.h:163
void set_integer_datapoint_value(uint8_t datapoint_id, uint32_t value)
Definition tuya.cpp:657
bool gmt_time_sync_callback_registered_
Definition tuya.h:145
void loop() override
Definition tuya.cpp:32
constexpr float LATE
For components that should be initialized at the very end of the setup process.
Definition component.h:59
TuyaExtendedServicesCommandType
Definition tuya.h:68
TuyaCommandType
Definition tuya.h:47
TuyaDatapointType
Definition tuya.h:18
const void size_t len
Definition hal.h:64
static void uint32_t
TuyaCommandType cmd
Definition tuya.h:84
std::vector< uint8_t > payload
Definition tuya.h:85
std::string value_string
Definition tuya.h:38
std::vector< uint8_t > value_raw
Definition tuya.h:39
TuyaDatapointType type
Definition tuya.h:29
std::function< void(TuyaDatapoint)> on_datapoint
Definition tuya.h:44
uint16_t length
Definition tt21100.cpp:0