ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
improv_serial_component.h
Go to the documentation of this file.
1#pragma once
2
8#ifdef USE_WIFI
9#include <improv.h>
10#include <vector>
11
12#ifdef USE_ESP32
13#include <driver/uart.h>
14#ifdef USE_LOGGER_USB_SERIAL_JTAG
15#include <driver/usb_serial_jtag.h>
16#include <hal/usb_serial_jtag_ll.h>
17#endif
18#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
19#include <esp_private/usb_console.h>
20#endif
21#elif defined(USE_ARDUINO)
22#include <HardwareSerial.h>
23#endif
24
25namespace esphome::improv_serial {
26
27// TX buffer layout constants
28static constexpr uint8_t TX_HEADER_SIZE = 6; // Bytes 0-5 = "IMPROV"
29static constexpr uint8_t TX_VERSION_IDX = 6;
30static constexpr uint8_t TX_TYPE_IDX = 7;
31static constexpr uint8_t TX_LENGTH_IDX = 8;
32static constexpr uint8_t TX_DATA_IDX = 9; // For state/error messages only
33static constexpr uint8_t TX_CHECKSUM_IDX = 10;
34static constexpr uint8_t TX_NEWLINE_IDX = 11;
35static constexpr uint8_t TX_BUFFER_SIZE = 12;
36
43
44static const uint16_t IMPROV_SERIAL_TIMEOUT = 100;
45static const uint8_t IMPROV_SERIAL_VERSION = 1;
46
48 public:
49 void setup() override;
50 void loop() override;
51 void dump_config() override;
52
53 float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
54
55 protected:
56 bool parse_improv_serial_byte_(uint8_t byte);
57 bool parse_improv_payload_(improv::ImprovCommand &command);
58
59 void set_state_(improv::State state);
60 void set_error_(improv::Error error);
61 void send_response_(std::vector<uint8_t> &response);
63
64 std::vector<uint8_t> build_rpc_settings_response_(improv::Command command);
65 std::vector<uint8_t> build_version_info_();
66
67 optional<uint8_t> read_byte_();
68 void write_data_(const uint8_t *data = nullptr, size_t size = 0);
69
70 uint8_t tx_header_[TX_BUFFER_SIZE] = {
71 'I', // 0: Header
72 'M', // 1: Header
73 'P', // 2: Header
74 'R', // 3: Header
75 'O', // 4: Header
76 'V', // 5: Header
77 IMPROV_SERIAL_VERSION, // 6: Version
78 0, // 7: ImprovSerialType
79 0, // 8: Length
80 0, // 9...X: Data (here, one byte reserved for state/error)
81 0, // X + 10: Checksum
82 '\n',
83 };
84
85#ifdef USE_ESP32
86 uart_port_t uart_num_;
87#elif defined(USE_ARDUINO)
88 Stream *hw_serial_{nullptr};
89#endif
90
91 std::vector<uint8_t> rx_buffer_;
94 improv::State state_{improv::STATE_AUTHORIZED};
95};
96
97extern ImprovSerialComponent
98 *global_improv_serial_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
99
100} // namespace esphome::improv_serial
101
102#endif
std::vector< uint8_t > build_rpc_settings_response_(improv::Command command)
void write_data_(const uint8_t *data=nullptr, size_t size=0)
void send_response_(std::vector< uint8_t > &response)
bool parse_improv_payload_(improv::ImprovCommand &command)
bool state
Definition fan.h:2
ImprovSerialComponent * global_improv_serial_component
constexpr float AFTER_WIFI
For components that should be initialized after WiFi is connected.
Definition component.h:53
uint16_t size
Definition helpers.cpp:25
static void uint32_t