mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
[bmp581] Split into bmp581_base and bmp581_i2c (#12485)
Co-authored-by: Keith Burzinski <kbx81x@gmail.com>
This commit is contained in:
@@ -88,7 +88,8 @@ esphome/components/bmp3xx/* @latonita
|
|||||||
esphome/components/bmp3xx_base/* @latonita @martgras
|
esphome/components/bmp3xx_base/* @latonita @martgras
|
||||||
esphome/components/bmp3xx_i2c/* @latonita
|
esphome/components/bmp3xx_i2c/* @latonita
|
||||||
esphome/components/bmp3xx_spi/* @latonita
|
esphome/components/bmp3xx_spi/* @latonita
|
||||||
esphome/components/bmp581/* @kahrendt
|
esphome/components/bmp581_base/* @danielkent-net @kahrendt
|
||||||
|
esphome/components/bmp581_i2c/* @danielkent-net @kahrendt
|
||||||
esphome/components/bp1658cj/* @Cossid
|
esphome/components/bp1658cj/* @Cossid
|
||||||
esphome/components/bp5758d/* @Cossid
|
esphome/components/bp5758d/* @Cossid
|
||||||
esphome/components/bthome_mithermometer/* @nagyrobi
|
esphome/components/bthome_mithermometer/* @nagyrobi
|
||||||
|
|||||||
@@ -1,164 +1,5 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
import esphome.codegen as cg
|
|
||||||
from esphome.components import i2c, sensor
|
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
|
||||||
CONF_ID,
|
CONFIG_SCHEMA = cv.invalid(
|
||||||
CONF_IIR_FILTER,
|
"The bmp581 sensor component has been renamed to bmp581_i2c."
|
||||||
CONF_OVERSAMPLING,
|
|
||||||
CONF_PRESSURE,
|
|
||||||
CONF_TEMPERATURE,
|
|
||||||
DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
|
|
||||||
DEVICE_CLASS_TEMPERATURE,
|
|
||||||
STATE_CLASS_MEASUREMENT,
|
|
||||||
UNIT_CELSIUS,
|
|
||||||
UNIT_PASCAL,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
CODEOWNERS = ["@kahrendt"]
|
|
||||||
DEPENDENCIES = ["i2c"]
|
|
||||||
|
|
||||||
bmp581_ns = cg.esphome_ns.namespace("bmp581")
|
|
||||||
|
|
||||||
Oversampling = bmp581_ns.enum("Oversampling")
|
|
||||||
OVERSAMPLING_OPTIONS = {
|
|
||||||
"NONE": Oversampling.OVERSAMPLING_NONE,
|
|
||||||
"2X": Oversampling.OVERSAMPLING_X2,
|
|
||||||
"4X": Oversampling.OVERSAMPLING_X4,
|
|
||||||
"8X": Oversampling.OVERSAMPLING_X8,
|
|
||||||
"16X": Oversampling.OVERSAMPLING_X16,
|
|
||||||
"32X": Oversampling.OVERSAMPLING_X32,
|
|
||||||
"64X": Oversampling.OVERSAMPLING_X64,
|
|
||||||
"128X": Oversampling.OVERSAMPLING_X128,
|
|
||||||
}
|
|
||||||
|
|
||||||
IIRFilter = bmp581_ns.enum("IIRFilter")
|
|
||||||
IIR_FILTER_OPTIONS = {
|
|
||||||
"OFF": IIRFilter.IIR_FILTER_OFF,
|
|
||||||
"2X": IIRFilter.IIR_FILTER_2,
|
|
||||||
"4X": IIRFilter.IIR_FILTER_4,
|
|
||||||
"8X": IIRFilter.IIR_FILTER_8,
|
|
||||||
"16X": IIRFilter.IIR_FILTER_16,
|
|
||||||
"32X": IIRFilter.IIR_FILTER_32,
|
|
||||||
"64X": IIRFilter.IIR_FILTER_64,
|
|
||||||
"128X": IIRFilter.IIR_FILTER_128,
|
|
||||||
}
|
|
||||||
|
|
||||||
BMP581Component = bmp581_ns.class_(
|
|
||||||
"BMP581Component", cg.PollingComponent, i2c.I2CDevice
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def compute_measurement_conversion_time(config):
|
|
||||||
# - adds up sensor conversion time based on temperature and pressure oversampling rates given in datasheet
|
|
||||||
# - returns a rounded up time in ms
|
|
||||||
|
|
||||||
# Page 12 of datasheet
|
|
||||||
PRESSURE_OVERSAMPLING_CONVERSION_TIMES = {
|
|
||||||
"NONE": 1.0,
|
|
||||||
"2X": 1.7,
|
|
||||||
"4X": 2.9,
|
|
||||||
"8X": 5.4,
|
|
||||||
"16X": 10.4,
|
|
||||||
"32X": 20.4,
|
|
||||||
"64X": 40.4,
|
|
||||||
"128X": 80.4,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Page 12 of datasheet
|
|
||||||
TEMPERATURE_OVERSAMPLING_CONVERSION_TIMES = {
|
|
||||||
"NONE": 1.0,
|
|
||||||
"2X": 1.1,
|
|
||||||
"4X": 1.5,
|
|
||||||
"8X": 2.1,
|
|
||||||
"16X": 3.3,
|
|
||||||
"32X": 5.8,
|
|
||||||
"64X": 10.8,
|
|
||||||
"128X": 20.8,
|
|
||||||
}
|
|
||||||
|
|
||||||
pressure_conversion_time = (
|
|
||||||
0.0 # No conversion time necessary without a pressure sensor
|
|
||||||
)
|
|
||||||
if pressure_config := config.get(CONF_PRESSURE):
|
|
||||||
pressure_conversion_time = PRESSURE_OVERSAMPLING_CONVERSION_TIMES[
|
|
||||||
pressure_config.get(CONF_OVERSAMPLING)
|
|
||||||
]
|
|
||||||
|
|
||||||
temperature_conversion_time = (
|
|
||||||
1.0 # BMP581 always samples the temperature even if only reading pressure
|
|
||||||
)
|
|
||||||
if temperature_config := config.get(CONF_TEMPERATURE):
|
|
||||||
temperature_conversion_time = TEMPERATURE_OVERSAMPLING_CONVERSION_TIMES[
|
|
||||||
temperature_config.get(CONF_OVERSAMPLING)
|
|
||||||
]
|
|
||||||
|
|
||||||
# Datasheet indicates a 5% possible error in each conversion time listed
|
|
||||||
return math.ceil(1.05 * (pressure_conversion_time + temperature_conversion_time))
|
|
||||||
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = (
|
|
||||||
cv.Schema(
|
|
||||||
{
|
|
||||||
cv.GenerateID(): cv.declare_id(BMP581Component),
|
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
|
||||||
unit_of_measurement=UNIT_CELSIUS,
|
|
||||||
accuracy_decimals=1,
|
|
||||||
device_class=DEVICE_CLASS_TEMPERATURE,
|
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
|
||||||
).extend(
|
|
||||||
{
|
|
||||||
cv.Optional(CONF_OVERSAMPLING, default="NONE"): cv.enum(
|
|
||||||
OVERSAMPLING_OPTIONS, upper=True
|
|
||||||
),
|
|
||||||
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
|
||||||
IIR_FILTER_OPTIONS, upper=True
|
|
||||||
),
|
|
||||||
}
|
|
||||||
),
|
|
||||||
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
|
||||||
unit_of_measurement=UNIT_PASCAL,
|
|
||||||
accuracy_decimals=0,
|
|
||||||
device_class=DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
|
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
|
||||||
).extend(
|
|
||||||
{
|
|
||||||
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
|
||||||
OVERSAMPLING_OPTIONS, upper=True
|
|
||||||
),
|
|
||||||
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
|
||||||
IIR_FILTER_OPTIONS, upper=True
|
|
||||||
),
|
|
||||||
}
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.extend(cv.polling_component_schema("60s"))
|
|
||||||
.extend(i2c.i2c_device_schema(0x46))
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
|
||||||
await cg.register_component(var, config)
|
|
||||||
await i2c.register_i2c_device(var, config)
|
|
||||||
if temperature_config := config.get(CONF_TEMPERATURE):
|
|
||||||
sens = await sensor.new_sensor(temperature_config)
|
|
||||||
cg.add(var.set_temperature_sensor(sens))
|
|
||||||
cg.add(
|
|
||||||
var.set_temperature_oversampling_config(
|
|
||||||
temperature_config[CONF_OVERSAMPLING]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
cg.add(
|
|
||||||
var.set_temperature_iir_filter_config(temperature_config[CONF_IIR_FILTER])
|
|
||||||
)
|
|
||||||
|
|
||||||
if pressure_config := config.get(CONF_PRESSURE):
|
|
||||||
sens = await sensor.new_sensor(pressure_config)
|
|
||||||
cg.add(var.set_pressure_sensor(sens))
|
|
||||||
cg.add(var.set_pressure_oversampling_config(pressure_config[CONF_OVERSAMPLING]))
|
|
||||||
cg.add(var.set_pressure_iir_filter_config(pressure_config[CONF_IIR_FILTER]))
|
|
||||||
|
|
||||||
cg.add(var.set_conversion_time(compute_measurement_conversion_time(config)))
|
|
||||||
|
|||||||
157
esphome/components/bmp581_base/__init__.py
Normal file
157
esphome/components/bmp581_base/__init__.py
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
import esphome.codegen as cg
|
||||||
|
from esphome.components import sensor
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.const import (
|
||||||
|
CONF_ID,
|
||||||
|
CONF_IIR_FILTER,
|
||||||
|
CONF_OVERSAMPLING,
|
||||||
|
CONF_PRESSURE,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
STATE_CLASS_MEASUREMENT,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
UNIT_PASCAL,
|
||||||
|
)
|
||||||
|
|
||||||
|
CODEOWNERS = ["@kahrendt", "@danielkent-net"]
|
||||||
|
|
||||||
|
bmp581_ns = cg.esphome_ns.namespace("bmp581_base")
|
||||||
|
|
||||||
|
Oversampling = bmp581_ns.enum("Oversampling")
|
||||||
|
OVERSAMPLING_OPTIONS = {
|
||||||
|
"NONE": Oversampling.OVERSAMPLING_NONE,
|
||||||
|
"2X": Oversampling.OVERSAMPLING_X2,
|
||||||
|
"4X": Oversampling.OVERSAMPLING_X4,
|
||||||
|
"8X": Oversampling.OVERSAMPLING_X8,
|
||||||
|
"16X": Oversampling.OVERSAMPLING_X16,
|
||||||
|
"32X": Oversampling.OVERSAMPLING_X32,
|
||||||
|
"64X": Oversampling.OVERSAMPLING_X64,
|
||||||
|
"128X": Oversampling.OVERSAMPLING_X128,
|
||||||
|
}
|
||||||
|
|
||||||
|
IIRFilter = bmp581_ns.enum("IIRFilter")
|
||||||
|
IIR_FILTER_OPTIONS = {
|
||||||
|
"OFF": IIRFilter.IIR_FILTER_OFF,
|
||||||
|
"2X": IIRFilter.IIR_FILTER_2,
|
||||||
|
"4X": IIRFilter.IIR_FILTER_4,
|
||||||
|
"8X": IIRFilter.IIR_FILTER_8,
|
||||||
|
"16X": IIRFilter.IIR_FILTER_16,
|
||||||
|
"32X": IIRFilter.IIR_FILTER_32,
|
||||||
|
"64X": IIRFilter.IIR_FILTER_64,
|
||||||
|
"128X": IIRFilter.IIR_FILTER_128,
|
||||||
|
}
|
||||||
|
|
||||||
|
BMP581Component = bmp581_ns.class_("BMP581Component", cg.PollingComponent)
|
||||||
|
|
||||||
|
|
||||||
|
def compute_measurement_conversion_time(config):
|
||||||
|
# - adds up sensor conversion time based on temperature and pressure oversampling rates given in datasheet
|
||||||
|
# - returns a rounded up time in ms
|
||||||
|
|
||||||
|
# Page 12 of datasheet
|
||||||
|
PRESSURE_OVERSAMPLING_CONVERSION_TIMES = {
|
||||||
|
"NONE": 1.0,
|
||||||
|
"2X": 1.7,
|
||||||
|
"4X": 2.9,
|
||||||
|
"8X": 5.4,
|
||||||
|
"16X": 10.4,
|
||||||
|
"32X": 20.4,
|
||||||
|
"64X": 40.4,
|
||||||
|
"128X": 80.4,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Page 12 of datasheet
|
||||||
|
TEMPERATURE_OVERSAMPLING_CONVERSION_TIMES = {
|
||||||
|
"NONE": 1.0,
|
||||||
|
"2X": 1.1,
|
||||||
|
"4X": 1.5,
|
||||||
|
"8X": 2.1,
|
||||||
|
"16X": 3.3,
|
||||||
|
"32X": 5.8,
|
||||||
|
"64X": 10.8,
|
||||||
|
"128X": 20.8,
|
||||||
|
}
|
||||||
|
|
||||||
|
pressure_conversion_time = (
|
||||||
|
0.0 # No conversion time necessary without a pressure sensor
|
||||||
|
)
|
||||||
|
if pressure_config := config.get(CONF_PRESSURE):
|
||||||
|
pressure_conversion_time = PRESSURE_OVERSAMPLING_CONVERSION_TIMES[
|
||||||
|
pressure_config.get(CONF_OVERSAMPLING)
|
||||||
|
]
|
||||||
|
|
||||||
|
temperature_conversion_time = (
|
||||||
|
1.0 # BMP581 always samples the temperature even if only reading pressure
|
||||||
|
)
|
||||||
|
if temperature_config := config.get(CONF_TEMPERATURE):
|
||||||
|
temperature_conversion_time = TEMPERATURE_OVERSAMPLING_CONVERSION_TIMES[
|
||||||
|
temperature_config.get(CONF_OVERSAMPLING)
|
||||||
|
]
|
||||||
|
|
||||||
|
# Datasheet indicates a 5% possible error in each conversion time listed
|
||||||
|
return math.ceil(1.05 * (pressure_conversion_time + temperature_conversion_time))
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_SCHEMA_BASE = cv.Schema(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.declare_id(BMP581Component),
|
||||||
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
|
unit_of_measurement=UNIT_CELSIUS,
|
||||||
|
accuracy_decimals=1,
|
||||||
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
||||||
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
|
).extend(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_OVERSAMPLING, default="NONE"): cv.enum(
|
||||||
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
||||||
|
IIR_FILTER_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
||||||
|
unit_of_measurement=UNIT_PASCAL,
|
||||||
|
accuracy_decimals=0,
|
||||||
|
device_class=DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
|
||||||
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
|
).extend(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
||||||
|
IIR_FILTER_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.polling_component_schema("60s"))
|
||||||
|
|
||||||
|
|
||||||
|
async def to_code_base(config):
|
||||||
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
|
await cg.register_component(var, config)
|
||||||
|
if temperature_config := config.get(CONF_TEMPERATURE):
|
||||||
|
sens = await sensor.new_sensor(temperature_config)
|
||||||
|
cg.add(var.set_temperature_sensor(sens))
|
||||||
|
cg.add(
|
||||||
|
var.set_temperature_oversampling_config(
|
||||||
|
temperature_config[CONF_OVERSAMPLING]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
cg.add(
|
||||||
|
var.set_temperature_iir_filter_config(temperature_config[CONF_IIR_FILTER])
|
||||||
|
)
|
||||||
|
|
||||||
|
if pressure_config := config.get(CONF_PRESSURE):
|
||||||
|
sens = await sensor.new_sensor(pressure_config)
|
||||||
|
cg.add(var.set_pressure_sensor(sens))
|
||||||
|
cg.add(var.set_pressure_oversampling_config(pressure_config[CONF_OVERSAMPLING]))
|
||||||
|
cg.add(var.set_pressure_iir_filter_config(pressure_config[CONF_IIR_FILTER]))
|
||||||
|
|
||||||
|
cg.add(var.set_conversion_time(compute_measurement_conversion_time(config)))
|
||||||
|
return var
|
||||||
@@ -10,12 +10,11 @@
|
|||||||
* - All datasheet page references refer to Bosch Document Number BST-BMP581-DS004-04 (revision number 1.4)
|
* - All datasheet page references refer to Bosch Document Number BST-BMP581-DS004-04 (revision number 1.4)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "bmp581.h"
|
#include "bmp581_base.h"
|
||||||
#include "esphome/core/log.h"
|
#include "esphome/core/log.h"
|
||||||
#include "esphome/core/hal.h"
|
#include "esphome/core/hal.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome::bmp581_base {
|
||||||
namespace bmp581 {
|
|
||||||
|
|
||||||
static const char *const TAG = "bmp581";
|
static const char *const TAG = "bmp581";
|
||||||
|
|
||||||
@@ -91,7 +90,6 @@ void BMP581Component::dump_config() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I2C_DEVICE(this);
|
|
||||||
LOG_UPDATE_INTERVAL(this);
|
LOG_UPDATE_INTERVAL(this);
|
||||||
|
|
||||||
ESP_LOGCONFIG(TAG, " Measurement conversion time: %ums", this->conversion_time_);
|
ESP_LOGCONFIG(TAG, " Measurement conversion time: %ums", this->conversion_time_);
|
||||||
@@ -149,7 +147,7 @@ void BMP581Component::setup() {
|
|||||||
uint8_t chip_id;
|
uint8_t chip_id;
|
||||||
|
|
||||||
// read chip id from sensor
|
// read chip id from sensor
|
||||||
if (!this->read_byte(BMP581_CHIP_ID, &chip_id)) {
|
if (!this->bmp_read_byte(BMP581_CHIP_ID, &chip_id)) {
|
||||||
ESP_LOGE(TAG, "Read chip ID failed");
|
ESP_LOGE(TAG, "Read chip ID failed");
|
||||||
|
|
||||||
this->error_code_ = ERROR_COMMUNICATION_FAILED;
|
this->error_code_ = ERROR_COMMUNICATION_FAILED;
|
||||||
@@ -172,7 +170,7 @@ void BMP581Component::setup() {
|
|||||||
// 3) Verify sensor status (check if NVM is okay) //
|
// 3) Verify sensor status (check if NVM is okay) //
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (!this->read_byte(BMP581_STATUS, &this->status_.reg)) {
|
if (!this->bmp_read_byte(BMP581_STATUS, &this->status_.reg)) {
|
||||||
ESP_LOGE(TAG, "Failed to read status register");
|
ESP_LOGE(TAG, "Failed to read status register");
|
||||||
|
|
||||||
this->error_code_ = ERROR_COMMUNICATION_FAILED;
|
this->error_code_ = ERROR_COMMUNICATION_FAILED;
|
||||||
@@ -359,7 +357,7 @@ bool BMP581Component::check_data_readiness_() {
|
|||||||
|
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
|
|
||||||
if (!this->read_byte(BMP581_INT_STATUS, &status)) {
|
if (!this->bmp_read_byte(BMP581_INT_STATUS, &status)) {
|
||||||
ESP_LOGE(TAG, "Failed to read interrupt status register");
|
ESP_LOGE(TAG, "Failed to read interrupt status register");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -400,7 +398,7 @@ bool BMP581Component::prime_iir_filter_() {
|
|||||||
|
|
||||||
// flush the IIR filter with forced measurements (we will only flush once)
|
// flush the IIR filter with forced measurements (we will only flush once)
|
||||||
this->dsp_config_.bit.iir_flush_forced_en = true;
|
this->dsp_config_.bit.iir_flush_forced_en = true;
|
||||||
if (!this->write_byte(BMP581_DSP, this->dsp_config_.reg)) {
|
if (!this->bmp_write_byte(BMP581_DSP, this->dsp_config_.reg)) {
|
||||||
ESP_LOGE(TAG, "Failed to write IIR source register");
|
ESP_LOGE(TAG, "Failed to write IIR source register");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -430,7 +428,7 @@ bool BMP581Component::prime_iir_filter_() {
|
|||||||
|
|
||||||
// disable IIR filter flushings on future forced measurements
|
// disable IIR filter flushings on future forced measurements
|
||||||
this->dsp_config_.bit.iir_flush_forced_en = false;
|
this->dsp_config_.bit.iir_flush_forced_en = false;
|
||||||
if (!this->write_byte(BMP581_DSP, this->dsp_config_.reg)) {
|
if (!this->bmp_write_byte(BMP581_DSP, this->dsp_config_.reg)) {
|
||||||
ESP_LOGE(TAG, "Failed to write IIR source register");
|
ESP_LOGE(TAG, "Failed to write IIR source register");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -454,7 +452,7 @@ bool BMP581Component::read_temperature_(float &temperature) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t data[3];
|
uint8_t data[3];
|
||||||
if (!this->read_bytes(BMP581_MEASUREMENT_DATA, &data[0], 3)) {
|
if (!this->bmp_read_bytes(BMP581_MEASUREMENT_DATA, &data[0], 3)) {
|
||||||
ESP_LOGW(TAG, "Failed to read measurement");
|
ESP_LOGW(TAG, "Failed to read measurement");
|
||||||
this->status_set_warning();
|
this->status_set_warning();
|
||||||
|
|
||||||
@@ -483,7 +481,7 @@ bool BMP581Component::read_temperature_and_pressure_(float &temperature, float &
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t data[6];
|
uint8_t data[6];
|
||||||
if (!this->read_bytes(BMP581_MEASUREMENT_DATA, &data[0], 6)) {
|
if (!this->bmp_read_bytes(BMP581_MEASUREMENT_DATA, &data[0], 6)) {
|
||||||
ESP_LOGW(TAG, "Failed to read measurement");
|
ESP_LOGW(TAG, "Failed to read measurement");
|
||||||
this->status_set_warning();
|
this->status_set_warning();
|
||||||
|
|
||||||
@@ -507,7 +505,7 @@ bool BMP581Component::reset_() {
|
|||||||
// - returns the Power-On-Reboot interrupt status, which is asserted if successful
|
// - returns the Power-On-Reboot interrupt status, which is asserted if successful
|
||||||
|
|
||||||
// writes reset command to BMP's command register
|
// writes reset command to BMP's command register
|
||||||
if (!this->write_byte(BMP581_COMMAND, RESET_COMMAND)) {
|
if (!this->bmp_write_byte(BMP581_COMMAND, RESET_COMMAND)) {
|
||||||
ESP_LOGE(TAG, "Failed to write reset command");
|
ESP_LOGE(TAG, "Failed to write reset command");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -518,7 +516,7 @@ bool BMP581Component::reset_() {
|
|||||||
delay(3);
|
delay(3);
|
||||||
|
|
||||||
// read interrupt status register
|
// read interrupt status register
|
||||||
if (!this->read_byte(BMP581_INT_STATUS, &this->int_status_.reg)) {
|
if (!this->bmp_read_byte(BMP581_INT_STATUS, &this->int_status_.reg)) {
|
||||||
ESP_LOGE(TAG, "Failed to read interrupt status register");
|
ESP_LOGE(TAG, "Failed to read interrupt status register");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -562,7 +560,7 @@ bool BMP581Component::write_iir_settings_(IIRFilter temperature_iir, IIRFilter p
|
|||||||
// BMP581_DSP register and BMP581_DSP_IIR registers are successive
|
// BMP581_DSP register and BMP581_DSP_IIR registers are successive
|
||||||
// - allows us to write the IIR configuration with one command to both registers
|
// - allows us to write the IIR configuration with one command to both registers
|
||||||
uint8_t register_data[2] = {this->dsp_config_.reg, this->iir_config_.reg};
|
uint8_t register_data[2] = {this->dsp_config_.reg, this->iir_config_.reg};
|
||||||
return this->write_bytes(BMP581_DSP, register_data, sizeof(register_data));
|
return this->bmp_write_bytes(BMP581_DSP, register_data, sizeof(register_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BMP581Component::write_interrupt_source_settings_(bool data_ready_enable) {
|
bool BMP581Component::write_interrupt_source_settings_(bool data_ready_enable) {
|
||||||
@@ -572,7 +570,7 @@ bool BMP581Component::write_interrupt_source_settings_(bool data_ready_enable) {
|
|||||||
this->int_source_.bit.drdy_data_reg_en = data_ready_enable;
|
this->int_source_.bit.drdy_data_reg_en = data_ready_enable;
|
||||||
|
|
||||||
// write interrupt source register
|
// write interrupt source register
|
||||||
return this->write_byte(BMP581_INT_SOURCE, this->int_source_.reg);
|
return this->bmp_write_byte(BMP581_INT_SOURCE, this->int_source_.reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BMP581Component::write_oversampling_settings_(Oversampling temperature_oversampling,
|
bool BMP581Component::write_oversampling_settings_(Oversampling temperature_oversampling,
|
||||||
@@ -583,7 +581,7 @@ bool BMP581Component::write_oversampling_settings_(Oversampling temperature_over
|
|||||||
this->osr_config_.bit.osr_t = temperature_oversampling;
|
this->osr_config_.bit.osr_t = temperature_oversampling;
|
||||||
this->osr_config_.bit.osr_p = pressure_oversampling;
|
this->osr_config_.bit.osr_p = pressure_oversampling;
|
||||||
|
|
||||||
return this->write_byte(BMP581_OSR, this->osr_config_.reg);
|
return this->bmp_write_byte(BMP581_OSR, this->osr_config_.reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BMP581Component::write_power_mode_(OperationMode mode) {
|
bool BMP581Component::write_power_mode_(OperationMode mode) {
|
||||||
@@ -593,8 +591,7 @@ bool BMP581Component::write_power_mode_(OperationMode mode) {
|
|||||||
this->odr_config_.bit.pwr_mode = mode;
|
this->odr_config_.bit.pwr_mode = mode;
|
||||||
|
|
||||||
// write odr register
|
// write odr register
|
||||||
return this->write_byte(BMP581_ODR, this->odr_config_.reg);
|
return this->bmp_write_byte(BMP581_ODR, this->odr_config_.reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace bmp581
|
} // namespace esphome::bmp581_base
|
||||||
} // namespace esphome
|
|
||||||
@@ -3,11 +3,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/components/i2c/i2c.h"
|
|
||||||
#include "esphome/components/sensor/sensor.h"
|
#include "esphome/components/sensor/sensor.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome::bmp581_base {
|
||||||
namespace bmp581 {
|
|
||||||
|
|
||||||
static const uint8_t BMP581_ASIC_ID = 0x50; // BMP581's ASIC chip ID (page 51 of datasheet)
|
static const uint8_t BMP581_ASIC_ID = 0x50; // BMP581's ASIC chip ID (page 51 of datasheet)
|
||||||
static const uint8_t RESET_COMMAND = 0xB6; // Soft reset command
|
static const uint8_t RESET_COMMAND = 0xB6; // Soft reset command
|
||||||
@@ -59,7 +57,7 @@ enum IIRFilter {
|
|||||||
IIR_FILTER_128 = 0x7
|
IIR_FILTER_128 = 0x7
|
||||||
};
|
};
|
||||||
|
|
||||||
class BMP581Component : public PollingComponent, public i2c::I2CDevice {
|
class BMP581Component : public PollingComponent {
|
||||||
public:
|
public:
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
@@ -84,6 +82,11 @@ class BMP581Component : public PollingComponent, public i2c::I2CDevice {
|
|||||||
void set_conversion_time(uint8_t conversion_time) { this->conversion_time_ = conversion_time; }
|
void set_conversion_time(uint8_t conversion_time) { this->conversion_time_ = conversion_time; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual bool bmp_read_byte(uint8_t a_register, uint8_t *data) = 0;
|
||||||
|
virtual bool bmp_write_byte(uint8_t a_register, uint8_t data) = 0;
|
||||||
|
virtual bool bmp_read_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
|
||||||
|
virtual bool bmp_write_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
|
||||||
|
|
||||||
sensor::Sensor *temperature_sensor_{nullptr};
|
sensor::Sensor *temperature_sensor_{nullptr};
|
||||||
sensor::Sensor *pressure_sensor_{nullptr};
|
sensor::Sensor *pressure_sensor_{nullptr};
|
||||||
|
|
||||||
@@ -216,5 +219,4 @@ class BMP581Component : public PollingComponent, public i2c::I2CDevice {
|
|||||||
} odr_config_ = {.reg = 0};
|
} odr_config_ = {.reg = 0};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace bmp581
|
} // namespace esphome::bmp581_base
|
||||||
} // namespace esphome
|
|
||||||
0
esphome/components/bmp581_i2c/__init__.py
Normal file
0
esphome/components/bmp581_i2c/__init__.py
Normal file
12
esphome/components/bmp581_i2c/bmp581_i2c.cpp
Normal file
12
esphome/components/bmp581_i2c/bmp581_i2c.cpp
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#include "bmp581_i2c.h"
|
||||||
|
#include "esphome/core/hal.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
namespace esphome::bmp581_i2c {
|
||||||
|
|
||||||
|
void BMP581I2CComponent::dump_config() {
|
||||||
|
LOG_I2C_DEVICE(this);
|
||||||
|
BMP581Component::dump_config();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace esphome::bmp581_i2c
|
||||||
24
esphome/components/bmp581_i2c/bmp581_i2c.h
Normal file
24
esphome/components/bmp581_i2c/bmp581_i2c.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esphome/components/bmp581_base/bmp581_base.h"
|
||||||
|
#include "esphome/components/i2c/i2c.h"
|
||||||
|
|
||||||
|
namespace esphome::bmp581_i2c {
|
||||||
|
|
||||||
|
static const char *const TAG = "bmp581_i2c.sensor";
|
||||||
|
|
||||||
|
/// This class implements support for the BMP581 Temperature+Pressure i2c sensor.
|
||||||
|
class BMP581I2CComponent : public esphome::bmp581_base::BMP581Component, public i2c::I2CDevice {
|
||||||
|
public:
|
||||||
|
bool bmp_read_byte(uint8_t a_register, uint8_t *data) override { return read_byte(a_register, data); }
|
||||||
|
bool bmp_write_byte(uint8_t a_register, uint8_t data) override { return write_byte(a_register, data); }
|
||||||
|
bool bmp_read_bytes(uint8_t a_register, uint8_t *data, size_t len) override {
|
||||||
|
return read_bytes(a_register, data, len);
|
||||||
|
}
|
||||||
|
bool bmp_write_bytes(uint8_t a_register, uint8_t *data, size_t len) override {
|
||||||
|
return write_bytes(a_register, data, len);
|
||||||
|
}
|
||||||
|
void dump_config() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace esphome::bmp581_i2c
|
||||||
23
esphome/components/bmp581_i2c/sensor.py
Normal file
23
esphome/components/bmp581_i2c/sensor.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import esphome.codegen as cg
|
||||||
|
from esphome.components import i2c
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
|
||||||
|
from ..bmp581_base import CONFIG_SCHEMA_BASE, to_code_base
|
||||||
|
|
||||||
|
AUTO_LOAD = ["bmp581_base"]
|
||||||
|
CODEOWNERS = ["@kahrendt", "@danielkent-net"]
|
||||||
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
|
bmp581_ns = cg.esphome_ns.namespace("bmp581_i2c")
|
||||||
|
BMP581I2CComponent = bmp581_ns.class_(
|
||||||
|
"BMP581I2CComponent", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = CONFIG_SCHEMA_BASE.extend(
|
||||||
|
i2c.i2c_device_schema(default_address=0x46)
|
||||||
|
).extend({cv.GenerateID(): cv.declare_id(BMP581I2CComponent)})
|
||||||
|
|
||||||
|
|
||||||
|
async def to_code(config):
|
||||||
|
var = await to_code_base(config)
|
||||||
|
await i2c.register_i2c_device(var, config)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
sensor:
|
sensor:
|
||||||
- platform: bmp581
|
- platform: bmp581_i2c
|
||||||
i2c_id: i2c_bus
|
i2c_id: i2c_bus
|
||||||
temperature:
|
temperature:
|
||||||
name: BMP581 Temperature
|
name: BMP581 Temperature
|
||||||
Reference in New Issue
Block a user