mirror of
https://github.com/esphome/esphome.git
synced 2026-05-31 17:06:40 +08:00
[internal_temperature] Add nRF52 Zephyr support (#15297)
This commit is contained in:
@@ -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
|
||||||
Reference in New Issue
Block a user