mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-05-19 20:53:26 +02:00
356efdb92c
* Add initial support for multiple devices Re-introduce support for multiple I2C devices (it was suppressed in https://github.com/trvrnrth/esphome-bsec-bme680/commit/df37a7635f6acc3f7520f257d2645eda10b863a5). Devices are identified by their I2C address, and the BME680 can only have the 0x76 or 0x77 address, so this adds support for a maximum of two devices. * Reintegrate commitebf13a0bReintegrate commit https://github.com/esphome/esphome/commit/ebf13a0ba0a48453c2cc80bfc942d6a588859233 which was lost in my changes (I were working on old files) * wrong commit * wrong commit * Reintegrate commitebf13a0bReintegrate commit https://github.com/esphome/esphome/commit/ebf13a0ba0a48453c2cc80bfc942d6a588859233 which was lost due to me working on old files * Reintroduce newlines at end of files * Reintroduce newlines at end of files * Adhere to codebase standards Obey the "All uses of class members and member functions should be prefixed with this-> to distinguish them from global functions in code review" rule of the Codebase Standards * Fix formatting according to clang-format * Perform the BSEC library reinitialization+snapshot only when more than one device is present * Fix formatting according to clang-format * Degrade abort message in restore_state_() from warning to verbose This always happen at initial setup, so it's not a really useful message; when some real problems arise, we'll have a more useful warning from snapshot_state_() Co-authored-by: Trevor North <trevor@freedisc.co.uk> * Reduce peak stack usage to avoid bootloops on ESP8266 Achieved mainly by moving the work_buffer needed by the BSEC library to the heap, as a single global work buffer shared by all instances. ::set_config_ has been reverted to a code path similar to the original, as that reduces peak stack usage enough to be OK on ESP8266 even without moving the work_buffer to the heap. * Fix formatting according to clang-format * Add support for devices with the same i2c address Devices are now identified using their index in the BME680BSECComponent::instances member, which became a vector. This allows adding two devices with the same i2c address (which should be placed on different i2c buses). Since a BME680 can only have an address of 0x76 or 0x77, a maximum of 2 devices could be added before this commit. Now there is no theoretical limit on the number of devices which could be added. * Fix formatting according to clang-format * Fix formatting according to clang-format --------- Co-authored-by: Trevor North <trevor@freedisc.co.uk> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
import esphome.codegen as cg
|
|
import esphome.config_validation as cv
|
|
from esphome.components import i2c
|
|
from esphome.const import CONF_ID
|
|
|
|
CODEOWNERS = ["@trvrnrth"]
|
|
DEPENDENCIES = ["i2c"]
|
|
AUTO_LOAD = ["sensor", "text_sensor"]
|
|
MULTI_CONF = True
|
|
|
|
CONF_BME680_BSEC_ID = "bme680_bsec_id"
|
|
CONF_TEMPERATURE_OFFSET = "temperature_offset"
|
|
CONF_IAQ_MODE = "iaq_mode"
|
|
CONF_SAMPLE_RATE = "sample_rate"
|
|
CONF_STATE_SAVE_INTERVAL = "state_save_interval"
|
|
|
|
bme680_bsec_ns = cg.esphome_ns.namespace("bme680_bsec")
|
|
|
|
IAQMode = bme680_bsec_ns.enum("IAQMode")
|
|
IAQ_MODE_OPTIONS = {
|
|
"STATIC": IAQMode.IAQ_MODE_STATIC,
|
|
"MOBILE": IAQMode.IAQ_MODE_MOBILE,
|
|
}
|
|
|
|
SampleRate = bme680_bsec_ns.enum("SampleRate")
|
|
SAMPLE_RATE_OPTIONS = {
|
|
"LP": SampleRate.SAMPLE_RATE_LP,
|
|
"ULP": SampleRate.SAMPLE_RATE_ULP,
|
|
}
|
|
|
|
BME680BSECComponent = bme680_bsec_ns.class_(
|
|
"BME680BSECComponent", cg.Component, i2c.I2CDevice
|
|
)
|
|
|
|
CONFIG_SCHEMA = cv.Schema(
|
|
{
|
|
cv.GenerateID(): cv.declare_id(BME680BSECComponent),
|
|
cv.Optional(CONF_TEMPERATURE_OFFSET, default=0): cv.temperature,
|
|
cv.Optional(CONF_IAQ_MODE, default="STATIC"): cv.enum(
|
|
IAQ_MODE_OPTIONS, upper=True
|
|
),
|
|
cv.Optional(CONF_SAMPLE_RATE, default="LP"): cv.enum(
|
|
SAMPLE_RATE_OPTIONS, upper=True
|
|
),
|
|
cv.Optional(
|
|
CONF_STATE_SAVE_INTERVAL, default="6hours"
|
|
): cv.positive_time_period_minutes,
|
|
},
|
|
cv.only_with_arduino,
|
|
).extend(i2c.i2c_device_schema(0x76))
|
|
|
|
|
|
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)
|
|
|
|
cg.add(var.set_device_id(str(config[CONF_ID])))
|
|
cg.add(var.set_temperature_offset(config[CONF_TEMPERATURE_OFFSET]))
|
|
cg.add(var.set_iaq_mode(config[CONF_IAQ_MODE]))
|
|
cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE]))
|
|
cg.add(
|
|
var.set_state_save_interval(config[CONF_STATE_SAVE_INTERVAL].total_milliseconds)
|
|
)
|
|
|
|
# Although this component does not use SPI, the BSEC library requires the SPI library
|
|
cg.add_library("SPI", None)
|
|
|
|
cg.add_define("USE_BSEC")
|
|
cg.add_library("boschsensortec/BSEC Software Library", "1.6.1480")
|