ESPHome 2025.9.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_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#include "driver/temperature_sensor.h"
14#endif // USE_ESP32_VARIANT
15#endif // USE_ESP32
16#ifdef USE_RP2040
17#include "Arduino.h"
18#endif // USE_RP2040
19#ifdef USE_BK72XX
20extern "C" {
21uint32_t temp_single_get_current_temperature(uint32_t *temp_value);
22}
23#endif // USE_BK72XX
24
25namespace esphome {
26namespace internal_temperature {
27
28static const char *const TAG = "internal_temperature";
29#ifdef USE_ESP32
30#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S2) || \
31 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32C2) || \
32 defined(USE_ESP32_VARIANT_ESP32P4)
33static temperature_sensor_handle_t tsensNew = NULL;
34#endif // USE_ESP32_VARIANT
35#endif // USE_ESP32
36
38 float temperature = NAN;
39 bool success = false;
40#ifdef USE_ESP32
41#if defined(USE_ESP32_VARIANT_ESP32)
42 uint8_t raw = temprature_sens_read();
43 ESP_LOGV(TAG, "Raw temperature value: %d", raw);
44 temperature = (raw - 32) / 1.8f;
45 success = (raw != 128);
46#elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || \
47 defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || \
48 defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32P4)
49 esp_err_t result = temperature_sensor_get_celsius(tsensNew, &temperature);
50 success = (result == ESP_OK);
51 if (!success) {
52 ESP_LOGE(TAG, "Reading failed (%d)", result);
53 }
54#endif // USE_ESP32_VARIANT
55#endif // USE_ESP32
56#ifdef USE_RP2040
57 temperature = analogReadTemp();
58 success = (temperature != 0.0f);
59#endif // USE_RP2040
60#ifdef USE_BK72XX
61 uint32_t raw, result;
63 success = (result == 0);
64#if defined(USE_LIBRETINY_VARIANT_BK7231N)
65 temperature = raw * -0.38f + 156.0f;
66#elif defined(USE_LIBRETINY_VARIANT_BK7231T)
67 temperature = raw * 0.04f;
68#else // USE_LIBRETINY_VARIANT
69 temperature = raw * 0.128f;
70#endif // USE_LIBRETINY_VARIANT
71#endif // USE_BK72XX
72 if (success && std::isfinite(temperature)) {
73 this->publish_state(temperature);
74 } else {
75 ESP_LOGD(TAG, "Ignoring invalid temperature (success=%d, value=%.1f)", success, temperature);
76 if (!this->has_state()) {
77 this->publish_state(NAN);
78 }
79 }
80}
81
83#ifdef USE_ESP32
84#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S2) || \
85 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32C2) || \
86 defined(USE_ESP32_VARIANT_ESP32P4)
87 temperature_sensor_config_t tsens_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
88
89 esp_err_t result = temperature_sensor_install(&tsens_config, &tsensNew);
90 if (result != ESP_OK) {
91 ESP_LOGE(TAG, "Install failed (%d)", result);
92 this->mark_failed();
93 return;
94 }
95
96 result = temperature_sensor_enable(tsensNew);
97 if (result != ESP_OK) {
98 ESP_LOGE(TAG, "Enabling failed (%d)", result);
99 this->mark_failed();
100 return;
101 }
102#endif // USE_ESP32_VARIANT
103#endif // USE_ESP32
104}
105
106void InternalTemperatureSensor::dump_config() { LOG_SENSOR("", "Internal Temperature Sensor", this); }
107
108} // namespace internal_temperature
109} // namespace esphome
uint8_t raw[35]
Definition bl0939.h:0
virtual void mark_failed()
Mark this component as failed.
bool has_state() const
Definition entity_base.h:78
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:45
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