ESPHome 2026.1.5
Loading...
Searching...
No Matches
debug_component.h
Go to the documentation of this file.
1#pragma once
2
7#include <span>
8#include <cstdarg>
9#include <cstdio>
10#include <algorithm>
11#ifdef USE_ESP8266
12#include <pgmspace.h>
13#endif
14
15#ifdef USE_SENSOR
17#endif
18#ifdef USE_TEXT_SENSOR
20#endif
21
22namespace esphome {
23namespace debug {
24
25static constexpr size_t DEVICE_INFO_BUFFER_SIZE = 256;
26static constexpr size_t RESET_REASON_BUFFER_SIZE = 128;
27
28#ifdef USE_ESP8266
29// ESP8266: Use vsnprintf_P to keep format strings in flash (PROGMEM)
30// Format strings must be wrapped with PSTR() macro
31inline size_t buf_append_p(char *buf, size_t size, size_t pos, PGM_P fmt, ...) {
32 if (pos >= size) {
33 return size;
34 }
35 va_list args;
36 va_start(args, fmt);
37 int written = vsnprintf_P(buf + pos, size - pos, fmt, args);
38 va_end(args);
39 if (written < 0) {
40 return pos; // encoding error
41 }
42 return std::min(pos + static_cast<size_t>(written), size);
43}
44#define buf_append(buf, size, pos, fmt, ...) buf_append_p(buf, size, pos, PSTR(fmt), ##__VA_ARGS__)
45#else
47__attribute__((format(printf, 4, 5))) inline size_t buf_append(char *buf, size_t size, size_t pos, const char *fmt,
48 ...) {
49 if (pos >= size) {
50 return size;
51 }
52 va_list args;
53 va_start(args, fmt);
54 int written = vsnprintf(buf + pos, size - pos, fmt, args);
55 va_end(args);
56 if (written < 0) {
57 return pos; // encoding error
58 }
59 return std::min(pos + static_cast<size_t>(written), size);
60}
61#endif
62
64 public:
65 void loop() override;
66 void update() override;
67 float get_setup_priority() const override;
68 void dump_config() override;
69
70#ifdef USE_TEXT_SENSOR
71 void set_device_info_sensor(text_sensor::TextSensor *device_info) { device_info_ = device_info; }
72 void set_reset_reason_sensor(text_sensor::TextSensor *reset_reason) { reset_reason_ = reset_reason; }
73#endif // USE_TEXT_SENSOR
74#ifdef USE_SENSOR
75 void set_free_sensor(sensor::Sensor *free_sensor) { free_sensor_ = free_sensor; }
76 void set_block_sensor(sensor::Sensor *block_sensor) { block_sensor_ = block_sensor; }
77#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
78 void set_fragmentation_sensor(sensor::Sensor *fragmentation_sensor) { fragmentation_sensor_ = fragmentation_sensor; }
79#endif
80 void set_loop_time_sensor(sensor::Sensor *loop_time_sensor) { loop_time_sensor_ = loop_time_sensor; }
81#ifdef USE_ESP32
82 void set_psram_sensor(sensor::Sensor *psram_sensor) { this->psram_sensor_ = psram_sensor; }
83#endif // USE_ESP32
84 void set_cpu_frequency_sensor(sensor::Sensor *cpu_frequency_sensor) {
85 this->cpu_frequency_sensor_ = cpu_frequency_sensor;
86 }
87#endif // USE_SENSOR
88#ifdef USE_ESP32
89 void on_shutdown() override;
90#endif // USE_ESP32
91 protected:
92 uint32_t free_heap_{};
93
94#ifdef USE_SENSOR
95 uint32_t last_loop_timetag_{0};
96 uint32_t max_loop_time_{0};
97
100#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
102#endif
104#ifdef USE_ESP32
106#endif // USE_ESP32
108#endif // USE_SENSOR
109
110#if defined(USE_ESP32) || defined(USE_ZEPHYR)
121 void log_partition_info_();
122#endif
123
124#ifdef USE_TEXT_SENSOR
127#endif // USE_TEXT_SENSOR
128
129 const char *get_reset_reason_(std::span<char, RESET_REASON_BUFFER_SIZE> buffer);
130 const char *get_wakeup_cause_(std::span<char, RESET_REASON_BUFFER_SIZE> buffer);
131 uint32_t get_free_heap_();
132 size_t get_device_info_(std::span<char, DEVICE_INFO_BUFFER_SIZE> buffer, size_t pos);
133 void update_platform_();
134};
135
136} // namespace debug
137} // namespace esphome
This class simplifies creating components that periodically check a state.
Definition component.h:525
void set_block_sensor(sensor::Sensor *block_sensor)
void set_cpu_frequency_sensor(sensor::Sensor *cpu_frequency_sensor)
float get_setup_priority() const override
void set_free_sensor(sensor::Sensor *free_sensor)
void log_partition_info_()
Logs information about the device's partition table.
size_t get_device_info_(std::span< char, DEVICE_INFO_BUFFER_SIZE > buffer, size_t pos)
void set_loop_time_sensor(sensor::Sensor *loop_time_sensor)
const char * get_wakeup_cause_(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
const char * get_reset_reason_(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
text_sensor::TextSensor * reset_reason_
void set_psram_sensor(sensor::Sensor *psram_sensor)
void set_fragmentation_sensor(sensor::Sensor *fragmentation_sensor)
void set_device_info_sensor(text_sensor::TextSensor *device_info)
text_sensor::TextSensor * device_info_
void set_reset_reason_sensor(text_sensor::TextSensor *reset_reason)
Base-class for all sensors.
Definition sensor.h:42
struct @65::@66 __attribute__
size_t size_t const char * fmt
size_t size_t const char va_start(args, fmt)
size_t size_t pos
size_t buf_append_p(char *buf, size_t size, size_t pos, PGM_P fmt,...)
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7