ESPHome 2025.5.0
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_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || \
11 defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || \
12 defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32P4)
13#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
14#include "driver/temp_sensor.h"
15#else
16#include "driver/temperature_sensor.h"
17#endif // ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
18#endif // USE_ESP32_VARIANT
19#endif // USE_ESP32
20#ifdef USE_RP2040
21#include "Arduino.h"
22#endif // USE_RP2040
23#ifdef USE_BK72XX
24extern "C" {
25uint32_t temp_single_get_current_temperature(uint32_t *temp_value);
26}
27#endif // USE_BK72XX
28
29namespace esphome {
30namespace internal_temperature {
31
32static const char *const TAG = "internal_temperature";
33#ifdef USE_ESP32
34#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) && \
35 (defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S2) || \
36 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32C2) || \
37 defined(USE_ESP32_VARIANT_ESP32P4))
38static temperature_sensor_handle_t tsensNew = NULL;
39#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) && USE_ESP32_VARIANT
40#endif // USE_ESP32
41
43 float temperature = NAN;
44 bool success = false;
45#ifdef USE_ESP32
46#if defined(USE_ESP32_VARIANT_ESP32)
47 uint8_t raw = temprature_sens_read();
48 ESP_LOGV(TAG, "Raw temperature value: %d", raw);
49 temperature = (raw - 32) / 1.8f;
50 success = (raw != 128);
51#elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || \
52 defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || \
53 defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32P4)
54#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
55 temp_sensor_config_t tsens = TSENS_CONFIG_DEFAULT();
56 temp_sensor_set_config(tsens);
57 temp_sensor_start();
58#if defined(USE_ESP32_VARIANT_ESP32S3) && (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 4, 3))
59#error \
60 "ESP32-S3 internal temperature sensor requires ESP IDF V4.4.3 or higher. See https://github.com/esphome/issues/issues/4271"
61#endif
62 esp_err_t result = temp_sensor_read_celsius(&temperature);
63 temp_sensor_stop();
64 success = (result == ESP_OK);
65#else
66 esp_err_t result = temperature_sensor_get_celsius(tsensNew, &temperature);
67 success = (result == ESP_OK);
68 if (!success) {
69 ESP_LOGE(TAG, "Failed to get temperature: %d", result);
70 }
71#endif // ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
72#endif // USE_ESP32_VARIANT
73#endif // USE_ESP32
74#ifdef USE_RP2040
75 temperature = analogReadTemp();
76 success = (temperature != 0.0f);
77#endif // USE_RP2040
78#ifdef USE_BK72XX
79 uint32_t raw, result;
81 success = (result == 0);
82#if defined(USE_LIBRETINY_VARIANT_BK7231N)
83 temperature = raw * -0.38f + 156.0f;
84#elif defined(USE_LIBRETINY_VARIANT_BK7231T)
85 temperature = raw * 0.04f;
86#else // USE_LIBRETINY_VARIANT
87 temperature = raw * 0.128f;
88#endif // USE_LIBRETINY_VARIANT
89#endif // USE_BK72XX
90 if (success && std::isfinite(temperature)) {
91 this->publish_state(temperature);
92 } else {
93 ESP_LOGD(TAG, "Ignoring invalid temperature (success=%d, value=%.1f)", success, temperature);
94 if (!this->has_state()) {
95 this->publish_state(NAN);
96 }
97 }
98}
99
101#ifdef USE_ESP32
102#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) && \
103 (defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S2) || \
104 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32C2) || \
105 defined(USE_ESP32_VARIANT_ESP32P4))
106 ESP_LOGCONFIG(TAG, "Setting up temperature sensor...");
107
108 temperature_sensor_config_t tsens_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
109
110 esp_err_t result = temperature_sensor_install(&tsens_config, &tsensNew);
111 if (result != ESP_OK) {
112 ESP_LOGE(TAG, "Failed to install temperature sensor: %d", result);
113 this->mark_failed();
114 return;
115 }
116
117 result = temperature_sensor_enable(tsensNew);
118 if (result != ESP_OK) {
119 ESP_LOGE(TAG, "Failed to enable temperature sensor: %d", result);
120 this->mark_failed();
121 return;
122 }
123#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) && USE_ESP32_VARIANT
124#endif // USE_ESP32
125}
126
127void InternalTemperatureSensor::dump_config() { LOG_SENSOR("", "Internal Temperature Sensor", this); }
128
129} // namespace internal_temperature
130} // namespace esphome
uint8_t raw[35]
Definition bl0939.h:0
virtual void mark_failed()
Mark this component as failed.
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:39
bool has_state() const
Return whether this sensor has gotten a full state (that passed through all filters) yet.
Definition sensor.cpp:97
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