13 #include <esp_heap_caps.h> 14 #include <esp_system.h> 16 #include <esp_chip_info.h> 17 #if defined(USE_ESP32_VARIANT_ESP32) 18 #include <esp32/rom/rtc.h> 19 #elif defined(USE_ESP32_VARIANT_ESP32C3) 20 #include <esp32c3/rom/rtc.h> 21 #elif defined(USE_ESP32_VARIANT_ESP32C6) 22 #include <esp32c6/rom/rtc.h> 23 #elif defined(USE_ESP32_VARIANT_ESP32S2) 24 #include <esp32s2/rom/rtc.h> 25 #elif defined(USE_ESP32_VARIANT_ESP32S3) 26 #include <esp32s3/rom/rtc.h> 34 #elif defined(USE_ESP32) || defined(USE_ESP8266) 42 static const char *
const TAG =
"debug";
44 static uint32_t get_free_heap() {
45 #if defined(USE_ESP8266) 46 return ESP.getFreeHeap();
47 #elif defined(USE_ESP32) 48 return heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
49 #elif defined(USE_RP2040) 50 return rp2040.getFreeHeap();
51 #elif defined(USE_LIBRETINY) 52 return lt_heap_get_free();
53 #elif defined(USE_HOST) 59 #ifndef ESPHOME_LOG_HAS_DEBUG 63 std::string device_info;
64 std::string reset_reason;
65 device_info.reserve(256);
67 ESP_LOGCONFIG(TAG,
"Debug component:");
68 #ifdef USE_TEXT_SENSOR 70 #endif // USE_TEXT_SENSOR 72 LOG_SENSOR(
" ",
"Free space on heap", this->
free_sensor_);
73 LOG_SENSOR(
" ",
"Largest free heap block", this->
block_sensor_);
74 #if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2) 76 #endif // defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2) 79 ESP_LOGD(TAG,
"ESPHome version %s", ESPHOME_VERSION);
80 device_info += ESPHOME_VERSION;
83 ESP_LOGD(TAG,
"Free Heap Size: %" PRIu32
" bytes", this->
free_heap_);
85 #if defined(USE_ARDUINO) && (defined(USE_ESP32) || defined(USE_ESP8266)) 86 const char *flash_mode;
87 switch (ESP.getFlashChipMode()) {
102 flash_mode =
"FAST_READ";
105 flash_mode =
"SLOW_READ";
109 flash_mode =
"UNKNOWN";
111 ESP_LOGD(TAG,
"Flash Chip: Size=%ukB Speed=%uMHz Mode=%s",
112 ESP.getFlashChipSize() / 1024,
113 ESP.getFlashChipSpeed() / 1000000, flash_mode);
114 device_info +=
"|Flash: " +
to_string(ESP.getFlashChipSize() / 1024) +
115 "kB Speed:" +
to_string(ESP.getFlashChipSpeed() / 1000000) +
"MHz Mode:";
116 device_info += flash_mode;
117 #endif // USE_ARDUINO && (USE_ESP32 || USE_ESP8266) 120 esp_chip_info_t info;
121 esp_chip_info(&info);
123 #if defined(USE_ESP32_VARIANT_ESP32) 125 #elif defined(USE_ESP32_VARIANT_ESP32C3) 127 #elif defined(USE_ESP32_VARIANT_ESP32C6) 129 #elif defined(USE_ESP32_VARIANT_ESP32S2) 131 #elif defined(USE_ESP32_VARIANT_ESP32S3) 133 #elif defined(USE_ESP32_VARIANT_ESP32H2) 138 std::string features;
139 if (info.features & CHIP_FEATURE_EMB_FLASH) {
140 features +=
"EMB_FLASH,";
141 info.features &= ~CHIP_FEATURE_EMB_FLASH;
143 if (info.features & CHIP_FEATURE_WIFI_BGN) {
144 features +=
"WIFI_BGN,";
145 info.features &= ~CHIP_FEATURE_WIFI_BGN;
147 if (info.features & CHIP_FEATURE_BLE) {
149 info.features &= ~CHIP_FEATURE_BLE;
151 if (info.features & CHIP_FEATURE_BT) {
153 info.features &= ~CHIP_FEATURE_BT;
155 if (info.features & CHIP_FEATURE_EMB_PSRAM) {
156 features +=
"EMB_PSRAM,";
157 info.features &= ~CHIP_FEATURE_EMB_PSRAM;
160 features +=
"Other:" +
format_hex(info.features);
161 ESP_LOGD(TAG,
"Chip: Model=%s, Features=%s Cores=%u, Revision=%u", model, features.c_str(), info.cores,
163 device_info +=
"|Chip: ";
164 device_info += model;
165 device_info +=
" Features:";
166 device_info += features;
167 device_info +=
" Cores:" +
to_string(info.cores);
168 device_info +=
" Revision:" +
to_string(info.revision);
170 ESP_LOGD(TAG,
"ESP-IDF Version: %s", esp_get_idf_version());
171 device_info +=
"|ESP-IDF: ";
172 device_info += esp_get_idf_version();
175 ESP_LOGD(TAG,
"EFuse MAC: %s", mac.c_str());
176 device_info +=
"|EFuse MAC: ";
179 switch (rtc_get_reset_reason(0)) {
181 reset_reason =
"Power On Reset";
183 #if defined(USE_ESP32_VARIANT_ESP32) 185 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 186 case RTC_SW_SYS_RESET:
188 reset_reason =
"Software Reset Digital Core";
190 #if defined(USE_ESP32_VARIANT_ESP32) 192 reset_reason =
"Watch Dog Reset Digital Core";
195 case DEEPSLEEP_RESET:
196 reset_reason =
"Deep Sleep Reset Digital Core";
198 #if defined(USE_ESP32_VARIANT_ESP32) 200 reset_reason =
"SLC Module Reset Digital Core";
203 case TG0WDT_SYS_RESET:
204 reset_reason =
"Timer Group 0 Watch Dog Reset Digital Core";
206 case TG1WDT_SYS_RESET:
207 reset_reason =
"Timer Group 1 Watch Dog Reset Digital Core";
209 case RTCWDT_SYS_RESET:
210 reset_reason =
"RTC Watch Dog Reset Digital Core";
212 #if !defined(USE_ESP32_VARIANT_ESP32C6) 213 case INTRUSION_RESET:
214 reset_reason =
"Intrusion Reset CPU";
217 #if defined(USE_ESP32_VARIANT_ESP32) 218 case TGWDT_CPU_RESET:
219 reset_reason =
"Timer Group Reset CPU";
221 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 222 case TG0WDT_CPU_RESET:
223 reset_reason =
"Timer Group 0 Reset CPU";
226 #if defined(USE_ESP32_VARIANT_ESP32) 228 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 229 case RTC_SW_CPU_RESET:
231 reset_reason =
"Software Reset CPU";
233 case RTCWDT_CPU_RESET:
234 reset_reason =
"RTC Watch Dog Reset CPU";
236 #if defined(USE_ESP32_VARIANT_ESP32) 238 reset_reason =
"External CPU Reset";
241 case RTCWDT_BROWN_OUT_RESET:
242 reset_reason =
"Voltage Unstable Reset";
244 case RTCWDT_RTC_RESET:
245 reset_reason =
"RTC Watch Dog Reset Digital Core And RTC Module";
247 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 248 case TG1WDT_CPU_RESET:
249 reset_reason =
"Timer Group 1 Reset CPU";
251 case SUPER_WDT_RESET:
252 reset_reason =
"Super Watchdog Reset Digital Core And RTC Module";
254 case GLITCH_RTC_RESET:
255 reset_reason =
"Glitch Reset Digital Core And RTC Module";
258 reset_reason =
"eFuse Reset Digital Core";
261 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3) 262 case USB_UART_CHIP_RESET:
263 reset_reason =
"USB UART Reset Digital Core";
265 case USB_JTAG_CHIP_RESET:
266 reset_reason =
"USB JTAG Reset Digital Core";
268 case POWER_GLITCH_RESET:
269 reset_reason =
"Power Glitch Reset Digital Core And RTC Module";
273 reset_reason =
"Unknown Reset Reason";
275 ESP_LOGD(TAG,
"Reset Reason: %s", reset_reason.c_str());
276 device_info +=
"|Reset: ";
277 device_info += reset_reason;
279 const char *wakeup_reason;
280 switch (rtc_get_wakeup_cause()) {
282 wakeup_reason =
"No Sleep";
284 case EXT_EVENT0_TRIG:
285 wakeup_reason =
"External Event 0";
287 case EXT_EVENT1_TRIG:
288 wakeup_reason =
"External Event 1";
291 wakeup_reason =
"GPIO";
294 wakeup_reason =
"Wakeup Timer";
297 wakeup_reason =
"SDIO";
300 wakeup_reason =
"MAC";
303 wakeup_reason =
"UART0";
306 wakeup_reason =
"UART1";
309 wakeup_reason =
"Touch";
312 wakeup_reason =
"SAR";
315 wakeup_reason =
"BT";
318 wakeup_reason =
"Unknown";
320 ESP_LOGD(TAG,
"Wakeup Reason: %s", wakeup_reason);
321 device_info +=
"|Wakeup: ";
322 device_info += wakeup_reason;
325 #if defined(USE_ESP8266) && !defined(CLANG_TIDY) 326 ESP_LOGD(TAG,
"Chip ID: 0x%08X", ESP.getChipId());
327 ESP_LOGD(TAG,
"SDK Version: %s", ESP.getSdkVersion());
328 ESP_LOGD(TAG,
"Core Version: %s", ESP.getCoreVersion().c_str());
329 ESP_LOGD(TAG,
"Boot Version=%u Mode=%u", ESP.getBootVersion(), ESP.getBootMode());
330 ESP_LOGD(TAG,
"CPU Frequency: %u", ESP.getCpuFreqMHz());
331 ESP_LOGD(TAG,
"Flash Chip ID=0x%08X", ESP.getFlashChipId());
332 ESP_LOGD(TAG,
"Reset Reason: %s", ESP.getResetReason().c_str());
333 ESP_LOGD(TAG,
"Reset Info: %s", ESP.getResetInfo().c_str());
335 device_info +=
"|Chip: 0x" +
format_hex(ESP.getChipId());
336 device_info +=
"|SDK: ";
337 device_info += ESP.getSdkVersion();
338 device_info +=
"|Core: ";
339 device_info += ESP.getCoreVersion().c_str();
340 device_info +=
"|Boot: ";
341 device_info +=
to_string(ESP.getBootVersion());
342 device_info +=
"|Mode: " +
to_string(ESP.getBootMode());
343 device_info +=
"|CPU: " +
to_string(ESP.getCpuFreqMHz());
344 device_info +=
"|Flash: 0x" +
format_hex(ESP.getFlashChipId());
345 device_info +=
"|Reset: ";
346 device_info += ESP.getResetReason().c_str();
348 device_info += ESP.getResetInfo().c_str();
350 reset_reason = ESP.getResetReason().c_str();
354 ESP_LOGD(TAG,
"CPU Frequency: %u", rp2040.f_cpu());
355 device_info +=
"CPU Frequency: " +
to_string(rp2040.f_cpu());
359 ESP_LOGD(TAG,
"LibreTiny Version: %s", lt_get_version());
360 ESP_LOGD(TAG,
"Chip: %s (%04x) @ %u MHz", lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz());
361 ESP_LOGD(TAG,
"Chip ID: 0x%06X", lt_cpu_get_mac_id());
362 ESP_LOGD(TAG,
"Board: %s", lt_get_board_code());
363 ESP_LOGD(TAG,
"Flash: %u KiB / RAM: %u KiB", lt_flash_get_size() / 1024, lt_ram_get_size() / 1024);
364 ESP_LOGD(TAG,
"Reset Reason: %s", lt_get_reboot_reason_name(lt_get_reboot_reason()));
366 device_info +=
"|Version: ";
367 device_info += LT_BANNER_STR + 10;
368 device_info +=
"|Reset Reason: ";
369 device_info += lt_get_reboot_reason_name(lt_get_reboot_reason());
370 device_info +=
"|Chip Name: ";
371 device_info += lt_cpu_get_model_name();
372 device_info +=
"|Chip ID: 0x" +
format_hex(lt_cpu_get_mac_id());
373 device_info +=
"|Flash: " +
to_string(lt_flash_get_size() / 1024) +
" KiB";
374 device_info +=
"|RAM: " +
to_string(lt_ram_get_size() / 1024) +
" KiB";
376 reset_reason = lt_get_reboot_reason_name(lt_get_reboot_reason());
377 #endif // USE_LIBRETINY 379 #ifdef USE_TEXT_SENSOR 381 if (device_info.length() > 255)
382 device_info.resize(255);
388 #endif // USE_TEXT_SENSOR 393 uint32_t new_free_heap = get_free_heap();
396 ESP_LOGD(TAG,
"Free Heap Size: %" PRIu32
" bytes", this->
free_heap_);
406 this->last_loop_timetag_ = now;
418 #if defined(USE_ESP8266) 421 #elif defined(USE_ESP32) 423 #elif defined(USE_LIBRETINY) 428 #if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2) std::string format_hex(const uint8_t *data, size_t length)
Format the byte array data of length len in lowercased hex.
sensor::Sensor * psram_sensor_
void status_momentary_warning(const std::string &name, uint32_t length=5000)
text_sensor::TextSensor * device_info_
const float LATE
For components that should be initialized at the very end of the setup process.
void publish_state(const std::string &state)
sensor::Sensor * loop_time_sensor_
float get_setup_priority() const override
uint32_t IRAM_ATTR HOT millis()
sensor::Sensor * fragmentation_sensor_
void dump_config() override
void publish_state(float state)
Publish a new state to the front-end.
text_sensor::TextSensor * reset_reason_
uint32_t last_loop_timetag_
std::string to_string(int value)
sensor::Sensor * free_sensor_
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
std::string get_mac_address_pretty()
Get the device MAC address as a string, in colon-separated uppercase hex notation.
sensor::Sensor * block_sensor_