[internal_temperature] Add nRF52 Zephyr support (#15297)

This commit is contained in:
Ardumine
2026-03-30 22:50:11 +01:00
committed by GitHub
parent f25fa71235
commit c5eb0eb984
3 changed files with 55 additions and 1 deletions
@@ -22,11 +22,18 @@ extern "C" {
uint32_t temp_single_get_current_temperature(uint32_t *temp_value); uint32_t temp_single_get_current_temperature(uint32_t *temp_value);
} }
#endif // USE_BK72XX #endif // USE_BK72XX
#if defined(USE_ZEPHYR) && defined(USE_NRF52)
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#endif // USE_ZEPHYR && USE_NRF52
namespace esphome { namespace esphome {
namespace internal_temperature { namespace internal_temperature {
static const char *const TAG = "internal_temperature"; static const char *const TAG = "internal_temperature";
#if defined(USE_ZEPHYR) && defined(USE_NRF52)
static const struct device *const DIE_TEMPERATURE_SENSOR = DEVICE_DT_GET_ONE(nordic_nrf_temp);
#endif // USE_ZEPHYR && USE_NRF52
#ifdef USE_ESP32 #ifdef USE_ESP32
#if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \ #if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \
defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \ defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \
@@ -36,6 +43,37 @@ static temperature_sensor_handle_t tsensNew = NULL;
#endif // USE_ESP32 #endif // USE_ESP32
void InternalTemperatureSensor::update() { void InternalTemperatureSensor::update() {
#if defined(USE_ZEPHYR) && defined(USE_NRF52)
struct sensor_value value;
int result = sensor_sample_fetch(DIE_TEMPERATURE_SENSOR);
if (result != 0) {
ESP_LOGE(TAG, "Failed to fetch nRF52 die temperature sample (%d)", result);
if (!this->has_state()) {
this->publish_state(NAN);
}
return;
}
result = sensor_channel_get(DIE_TEMPERATURE_SENSOR, SENSOR_CHAN_DIE_TEMP, &value);
if (result != 0) {
ESP_LOGE(TAG, "Failed to get nRF52 die temperature (%d)", result);
if (!this->has_state()) {
this->publish_state(NAN);
}
return;
}
const float temperature = value.val1 + (value.val2 / 1000000.0f);
if (std::isfinite(temperature)) {
this->publish_state(temperature);
} else {
ESP_LOGD(TAG, "Ignoring invalid nRF52 temperature (value=%.1f)", temperature);
if (!this->has_state()) {
this->publish_state(NAN);
}
}
#else
float temperature = NAN; float temperature = NAN;
bool success = false; bool success = false;
#ifdef USE_ESP32 #ifdef USE_ESP32
@@ -79,9 +117,17 @@ void InternalTemperatureSensor::update() {
this->publish_state(NAN); this->publish_state(NAN);
} }
} }
#endif // USE_ZEPHYR && USE_NRF52
} }
void InternalTemperatureSensor::setup() { void InternalTemperatureSensor::setup() {
#if defined(USE_ZEPHYR) && defined(USE_NRF52)
if (!device_is_ready(DIE_TEMPERATURE_SENSOR)) {
ESP_LOGE(TAG, "nRF52 die temperature sensor device %s not ready", DIE_TEMPERATURE_SENSOR->name);
this->mark_failed();
return;
}
#endif // USE_ZEPHYR && USE_NRF52
#ifdef USE_ESP32 #ifdef USE_ESP32
#if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \ #if defined(USE_ESP32_VARIANT_ESP32C2) || defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C5) || \
defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \ defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || defined(USE_ESP32_VARIANT_ESP32H2) || \
@@ -1,15 +1,18 @@
import esphome.codegen as cg import esphome.codegen as cg
from esphome.components import sensor from esphome.components import sensor
from esphome.components.zephyr import zephyr_add_prj_conf
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import ( from esphome.const import (
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
ENTITY_CATEGORY_DIAGNOSTIC, ENTITY_CATEGORY_DIAGNOSTIC,
PLATFORM_BK72XX, PLATFORM_BK72XX,
PLATFORM_ESP32, PLATFORM_ESP32,
PLATFORM_NRF52,
PLATFORM_RP2040, PLATFORM_RP2040,
STATE_CLASS_MEASUREMENT, STATE_CLASS_MEASUREMENT,
UNIT_CELSIUS, UNIT_CELSIUS,
) )
from esphome.core import CORE
internal_temperature_ns = cg.esphome_ns.namespace("internal_temperature") internal_temperature_ns = cg.esphome_ns.namespace("internal_temperature")
InternalTemperatureSensor = internal_temperature_ns.class_( InternalTemperatureSensor = internal_temperature_ns.class_(
@@ -25,10 +28,14 @@ CONFIG_SCHEMA = cv.All(
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
).extend(cv.polling_component_schema("60s")), ).extend(cv.polling_component_schema("60s")),
cv.only_on([PLATFORM_ESP32, PLATFORM_RP2040, PLATFORM_BK72XX]), cv.only_on([PLATFORM_ESP32, PLATFORM_RP2040, PLATFORM_BK72XX, PLATFORM_NRF52]),
) )
async def to_code(config): async def to_code(config):
var = await sensor.new_sensor(config) var = await sensor.new_sensor(config)
await cg.register_component(var, config) await cg.register_component(var, config)
if CORE.using_zephyr and CORE.is_nrf52:
zephyr_add_prj_conf("SENSOR", True)
zephyr_add_prj_conf("TEMP_NRF5", True)
@@ -0,0 +1 @@
<<: !include common.yaml