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