ESPHome 2026.1.0-dev
Loading...
Searching...
No Matches
internal_temperature.cpp
Go to the documentation of this file.
2#include "esphome/core/log.h"
3
4#ifdef USE_ESP32
5#if defined(USE_ESP32_VARIANT_ESP32)
6// there is no official API available on the original ESP32
7extern "C" {
9}
10#elif defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || \
11 defined(USE_ESP32_VARIANT_ESP32C5) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || \
12 defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || \
13 defined(USE_ESP32_VARIANT_ESP32S3)
14#include "driver/temperature_sensor.h"
15#endif // USE_ESP32_VARIANT
16#endif // USE_ESP32
17#ifdef USE_RP2040
18#include "Arduino.h"
19#endif // USE_RP2040
20#ifdef USE_BK72XX
21extern "C" {
22uint32_t temp_single_get_current_temperature(uint32_t *temp_value);
23}
24#endif // USE_BK72XX
25
26namespace esphome {
27namespace internal_temperature {
28
29static const char *const TAG = "internal_temperature";
30#ifdef USE_ESP32
31#if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \
32 defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \
33 defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
34static temperature_sensor_handle_t tsensNew = NULL;
35#endif // USE_ESP32_VARIANT
36#endif // USE_ESP32
37
39 float temperature = NAN;
40 bool success = false;
41#ifdef USE_ESP32
42#if defined(USE_ESP32_VARIANT_ESP32)
43 uint8_t raw = temprature_sens_read();
44 ESP_LOGV(TAG, "Raw temperature value: %d", raw);
45 temperature = (raw - 32) / 1.8f;
46 success = (raw != 128);
47#elif defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || \
48 defined(USE_ESP32_VARIANT_ESP32C5) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || \
49 defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || \
50 defined(USE_ESP32_VARIANT_ESP32S3)
51 esp_err_t result = temperature_sensor_get_celsius(tsensNew, &temperature);
52 success = (result == ESP_OK);
53 if (!success) {
54 ESP_LOGE(TAG, "Reading failed (%d)", result);
55 }
56#endif // USE_ESP32_VARIANT
57#endif // USE_ESP32
58#ifdef USE_RP2040
59 temperature = analogReadTemp();
60 success = (temperature != 0.0f);
61#endif // USE_RP2040
62#ifdef USE_BK72XX
63 uint32_t raw, result;
65 success = (result == 0);
66#if defined(USE_LIBRETINY_VARIANT_BK7231N)
67 temperature = raw * -0.38f + 156.0f;
68#elif defined(USE_LIBRETINY_VARIANT_BK7231T)
69 temperature = raw * 0.04f;
70#else // USE_LIBRETINY_VARIANT
71 temperature = raw * 0.128f;
72#endif // USE_LIBRETINY_VARIANT
73#endif // USE_BK72XX
74 if (success && std::isfinite(temperature)) {
75 this->publish_state(temperature);
76 } else {
77 ESP_LOGD(TAG, "Ignoring invalid temperature (success=%d, value=%.1f)", success, temperature);
78 if (!this->has_state()) {
79 this->publish_state(NAN);
80 }
81 }
82}
83
85#ifdef USE_ESP32
86#if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \
87 defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \
88 defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
89 temperature_sensor_config_t tsens_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
90
91 esp_err_t result = temperature_sensor_install(&tsens_config, &tsensNew);
92 if (result != ESP_OK) {
93 ESP_LOGE(TAG, "Install failed (%d)", result);
94 this->mark_failed();
95 return;
96 }
97
98 result = temperature_sensor_enable(tsensNew);
99 if (result != ESP_OK) {
100 ESP_LOGE(TAG, "Enabling failed (%d)", result);
101 this->mark_failed();
102 return;
103 }
104#endif // USE_ESP32_VARIANT
105#endif // USE_ESP32
106}
107
108void InternalTemperatureSensor::dump_config() { LOG_SENSOR("", "Internal Temperature Sensor", this); }
109
110} // namespace internal_temperature
111} // namespace esphome
uint8_t raw[35]
Definition bl0939.h:0
virtual void mark_failed()
Mark this component as failed.
bool has_state() const
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:77
uint8_t temprature_sens_read()
uint32_t temp_single_get_current_temperature(uint32_t *temp_value)
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint16_t temperature
Definition sun_gtil2.cpp:12