BME680 on ESPHome using Bosch's BSEC library

Dear all,

I am trying to integrate a Bosch BME680 sensor running on the precompiled, closed source "BSEC" library as a custom sensor for ESPHome for an ESP32 for getting an IAQ reading instead of the resistance reading only. In other words, I do not want to use the ESPHome-driver for the sensor but the precompiled Bosch BSEC library wrapped in a custom ESPHome sensor component.

However, I cannot get ESPHome to compile/link the libraries correctly. What am I missing here?

Thank you very much for getting me kickstarted with with the precompiled library on ESPHome.

Best regards,

Chris

 

Configuration YAML:

esphome:
  name: multisensor_1
  platform: ESP32 
  board: nodemcu-32s
  includes: 
    - 'CE_BSEC.h'
  libraries:
    - 'BSEC Software Library'

i2c:
  sda: 21
  scl: 22
  scan: True
  id: id_i2c

sensor:
## this is the BOSCH Implementation
  - platform: custom
    lambda: |-
      auto IAQSensor = new CE_BSEC();
      App.register_component(IAQSensor);
      return { IAQSensor->TSensor, IAQSensor->PSensor, IAQSensor->HSensor, IAQSensor->AQSensor };
    sensors:
    -  name: "BME680 Temperature"
       unit_of_measurement: 'V'
       accuracy_decimals: 1
    -  name: "BME680 Pressure"
       unit_of_measurement: 'hPa'
       accuracy_decimals: 1
    -  name: "BME680 relative Humidity"
       unit_of_measurement: '%'
       accuracy_decimals: 1
    -  name: "BME680 IAQ"
       accuracy_decimals: 1

 

Custom sensor CE_BSEC.h

#include "esphome.h"
#include "bsec.h"

class CE_BSEC : public PollingComponent, public Sensor {
 public:
  // constructor
  Bsec iaqSensor;
  Sensor *TSensor = new Sensor();
  Sensor *PSensor = new Sensor();
  Sensor *HSensor = new Sensor();
  Sensor *AQSensor = new Sensor();

  CE_BSEC() : PollingComponent(60000) { }

  void setup() override {
    // This will be called by App.setup()
    iaqSensor.begin(0x77, Wire);
  }

  void update() override {
    float Temp = iaqSensor.temperature;
    TSensor->publish_state(Temp);
    
    float Press = iaqSensor.pressure;
    PSensor->publish_state(Press);
    
    float Hum = iaqSensor.humidity;
    HSensor->publish_state(Hum);
    
    float Qual = iaqSensor.iaq;
    AQSensor->publish_state(Qual);
  }
};

 

Compiling .pioenvs/multisensor_1/src/main.cpp.o
Linking .pioenvs/multisensor_1/firmware.elf
.pioenvs/multisensor_1/lib0fa/libBSEC Software Library_ID6979.a(bsec.cpp.o):(.literal._ZN4Bsec11beginCommonEv+0x4): undefined reference to `bsec_init'
.pioenvs/multisensor_1/lib0fa/libBSEC Software Library_ID6979.a(bsec.cpp.o):(.literal._ZN4Bsec11beginCommonEv+0x8): undefined reference to `bsec_get_version'
.pioenvs/multisensor_1/lib0fa/libBSEC Software Library_ID6979.a(bsec.cpp.o): In function `Bsec::beginCommon()':
/config/multisensor_1/.piolibdeps/multisensor_1/BSEC Software Library_ID6979/src/bsec.cpp:257: undefined reference to `bsec_init'
.pioenvs/multisensor_1/lib0fa/libBSEC Software Library_ID6979.a(bsec.cpp.o): In function `Bsec::getVersion()':
/config/multisensor_1/.piolibdeps/multisensor_1/BSEC Software Library_ID6979/src/bsec.cpp:257: undefined reference to `bsec_get_version'
collect2: error: ld returned 1 exit status
*** [.pioenvs/multisensor_1/firmware.elf] Error 1

 

Best reply by ChrisE

UPDATE:

Compiles successfully after adding

build_flags  = -I .piolibdeps/multisensor_1/BSEC\ Software\ Library_ID6979/src/inc -L .piolibdeps/multisensor_1/BSEC\ Software\ Library_ID6979/src/esp32 -lalgobsec 

to "platformio.ini" as suggested in another thread here.

Thank you anyways 🙂

Cheers,

Chris

View original
18 replies
Resolved