From 52eb9c9f82cab862e7fa47248d794a12f0ab4d74 Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Wed, 12 Nov 2025 17:32:05 +0900 Subject: [PATCH 1/7] Add BME680 and SHTC3 support to meshtasticd and RAK4631 --- arch/nrf52/nrf52.ini | 2 + arch/portduino/portduino.ini | 2 + platformio.ini | 6 +-- .../Telemetry/EnvironmentTelemetry.cpp | 6 ++- src/modules/Telemetry/Sensor/BME680Generic.h | 9 +++++ src/modules/Telemetry/Sensor/BME680Sensor.cpp | 40 ++++++++++++++++++- src/modules/Telemetry/Sensor/BME680Sensor.h | 25 +++++++++++- variants/nrf52840/rak4631/platformio.ini | 1 + 8 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/BME680Generic.h diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini index 36effe0175..98e7321c62 100644 --- a/arch/nrf52/nrf52.ini +++ b/arch/nrf52/nrf52.ini @@ -30,6 +30,8 @@ lib_deps= ${radiolib_base.lib_deps} # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto rweather/Crypto@0.4.0 + # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library + boschsensortec/BME68x Sensor Library@1.3.40408 lib_ignore = BluetoothOTA diff --git a/arch/portduino/portduino.ini b/arch/portduino/portduino.ini index bce06f9076..bc4cfae6c1 100644 --- a/arch/portduino/portduino.ini +++ b/arch/portduino/portduino.ini @@ -33,6 +33,8 @@ lib_deps = adafruit/Adafruit seesaw Library@1.7.9 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip + # renovate: datasource=custom.pio depName=adafruit/Adafruit BME680 Library packageName=adafruit/library/Adafruit BME680 + adafruit/Adafruit BME680 Library@^2.0.5 build_flags = ${arduino_base.build_flags} diff --git a/platformio.ini b/platformio.ini index f9e2dd8987..1780861581 100644 --- a/platformio.ini +++ b/platformio.ini @@ -160,6 +160,8 @@ lib_deps = emotibit/EmotiBit MLX90632@1.0.8 # renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library adafruit/Adafruit MLX90614 Library@2.1.5 + # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library + adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=github-tags depName=INA3221 packageName=sgtwilko/INA3221 https://github.com/sgtwilko/INA3221#bb03d7e9bfcc74fc798838a54f4f99738f29fc6a # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass @@ -192,8 +194,6 @@ lib_deps = adafruit/Adafruit BMP3XX Library@2.1.6 # renovate: datasource=custom.pio depName=Adafruit MAX1704X packageName=adafruit/library/Adafruit MAX1704X adafruit/Adafruit MAX1704X@1.0.3 - # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library - adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=custom.pio depName=Adafruit LPS2X packageName=adafruit/library/Adafruit LPS2X adafruit/Adafruit LPS2X@2.0.6 # renovate: datasource=custom.pio depName=Adafruit SHT31 packageName=adafruit/library/Adafruit SHT31 Library @@ -208,8 +208,6 @@ lib_deps = ClosedCube OPT3001@1.1.2 # renovate: datasource=custom.pio depName=Bosch BSEC2 packageName=boschsensortec/library/bsec2 boschsensortec/bsec2@1.10.2610 - # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library - boschsensortec/BME68x Sensor Library@1.3.40408 # renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip # renovate: datasource=custom.pio depName=Sensirion Core packageName=sensirion/library/Sensirion Core diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 29e8150928..6a2dcfe470 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -53,7 +53,9 @@ extern void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const c #include "Sensor/LTR390UVSensor.h" #endif -#if __has_include() +#include "Sensor/BME680Generic.h" + +#if __has_include(BME680_HEADER) #include "Sensor/BME680Sensor.h" #endif @@ -214,7 +216,7 @@ void EnvironmentTelemetryModule::i2cScanFinished(ScanI2C *i2cScanner) #if __has_include() addSensor(i2cScanner, ScanI2C::DeviceType::LTR390UV); #endif -#if __has_include() +#if __has_include(BME680_HEADER) addSensor(i2cScanner, ScanI2C::DeviceType::BME_680); #endif #if __has_include() diff --git a/src/modules/Telemetry/Sensor/BME680Generic.h b/src/modules/Telemetry/Sensor/BME680Generic.h new file mode 100644 index 0000000000..dcd6c55f61 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BME680Generic.h @@ -0,0 +1,9 @@ +#include "configuration.h" + +#ifndef BME680_HEADER +#if defined(ARCH_PORTDUINO) +#define BME680_HEADER +#else +#define BME680_HEADER +#endif +#endif diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index 95f3dc5f02..d9dc65b306 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -1,6 +1,8 @@ #include "configuration.h" -#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include() +#include "BME680Generic.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(BME680_HEADER) #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "BME680Sensor.h" @@ -10,6 +12,7 @@ BME680Sensor::BME680Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BME680, "BME680") {} +#if !defined(ARCH_PORTDUINO) int32_t BME680Sensor::runOnce() { if (!bme680.run()) { @@ -17,10 +20,13 @@ int32_t BME680Sensor::runOnce() } return 35; } +#endif // !defined(ARCH_PORTDUINO) bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { status = 0; + +#if !defined(ARCH_PORTDUINO) if (!bme680.begin(dev->address.address, *bus)) checkStatus("begin"); @@ -42,12 +48,25 @@ bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) if (status == 0) LOG_DEBUG("BME680Sensor::runOnce: bme680.status %d", bme680.status); +#else + bme680 = makeBME680(bus); + + if (!bme680->begin(dev->address.address)) { + LOG_ERROR("Init sensor: %s failed at begin()", sensorName); + return status; + } + + status = 1; + +#endif // !defined(ARCH_PORTDUINO) + initI2CSensor(); return status; } bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) { +#if !defined(ARCH_PORTDUINO) if (bme680.getData(BSEC_OUTPUT_RAW_PRESSURE).signal == 0) return false; @@ -65,9 +84,27 @@ bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) // Check if we need to save state to filesystem (every STATE_SAVE_PERIOD ms) measurement->variant.environment_metrics.iaq = bme680.getData(BSEC_OUTPUT_IAQ).signal; updateState(); +#else + if (!bme680->performReading()) { + LOG_ERROR("BME680Sensor::getMetrics: performReading failed"); + return false; + } + + measurement->variant.environment_metrics.has_temperature = true; + measurement->variant.environment_metrics.has_relative_humidity = true; + measurement->variant.environment_metrics.has_barometric_pressure = true; + measurement->variant.environment_metrics.has_gas_resistance = true; + + measurement->variant.environment_metrics.temperature = bme680->readTemperature(); + measurement->variant.environment_metrics.relative_humidity = bme680->readHumidity(); + measurement->variant.environment_metrics.barometric_pressure = bme680->readPressure() / 100.0F; + measurement->variant.environment_metrics.gas_resistance = bme680->readGas() / 1000.0; + +#endif return true; } +#if !defined(ARCH_PORTDUINO) void BME680Sensor::loadState() { #ifdef FSCom @@ -144,5 +181,6 @@ void BME680Sensor::checkStatus(const char *functionName) else if (bme680.sensor.status > BME68X_OK) LOG_WARN("%s BME68X code: %d", functionName, bme680.sensor.status); } +#endif // !defined(ARCH_PORTDUINO) #endif diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.h b/src/modules/Telemetry/Sensor/BME680Sensor.h index f4ead95f78..ec4770b49f 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.h +++ b/src/modules/Telemetry/Sensor/BME680Sensor.h @@ -1,23 +1,43 @@ #include "configuration.h" -#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include() +#include "BME680Generic.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(BME680_HEADER) #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "TelemetrySensor.h" + +#if defined(ARCH_PORTDUINO) +#include +#include +#else // defined(ARCH_PORTDUINO) +#include #include +#endif // defined(ARCH_PORTDUINO) #define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // That's 6 hours worth of millis() +#if !defined(ARCH_PORTDUINO) const uint8_t bsec_config[] = { #include "config/bme680/bme680_iaq_33v_3s_4d/bsec_iaq.txt" }; +#endif // !defined(ARCH_PORTDUINO) class BME680Sensor : public TelemetrySensor { private: +#if defined(ARCH_PORTDUINO) + using BME680Ptr = std::unique_ptr; + + static BME680Ptr makeBME680(TwoWire *bus) { return std::make_unique(bus); } + + BME680Ptr bme680; +#else Bsec2 bme680; +#endif // defined(ARCH_PORTDUINO) protected: +#if !defined(ARCH_PORTDUINO) const char *bsecConfigFileName = "/prefs/bsec.dat"; uint8_t bsecState[BSEC_MAX_STATE_BLOB_SIZE] = {0}; uint8_t accuracy = 0; @@ -34,10 +54,13 @@ class BME680Sensor : public TelemetrySensor void loadState(); void updateState(); void checkStatus(const char *functionName); +#endif // !defined(ARCH_PORTDUINO) public: BME680Sensor(); +#if !defined(ARCH_PORTDUINO) virtual int32_t runOnce() override; +#endif // !defined(ARCH_PORTDUINO) virtual bool getMetrics(meshtastic_Telemetry *measurement) override; virtual bool initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) override; }; diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 2059665295..65abbbf1c8 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -5,6 +5,7 @@ board = wiscore_rak4631 board_level = pr board_check = true build_flags = ${nrf52840_base.build_flags} + -g -I variants/nrf52840/rak4631 -D RAK_4631 -DEINK_DISPLAY_MODEL=GxEPD2_213_BN From d88640a13490e3ab1044cb22e24227455c7f6bdf Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Fri, 14 Nov 2025 16:41:05 +0900 Subject: [PATCH 2/7] Modify limited to Portduino and RAK4631 only --- arch/nrf52/nrf52.ini | 2 -- platformio.ini | 4 +-- src/modules/Telemetry/Sensor/BME680Generic.h | 14 +++++---- src/modules/Telemetry/Sensor/BME680Sensor.cpp | 16 +++++----- src/modules/Telemetry/Sensor/BME680Sensor.h | 31 +++++++++---------- src/mqtt/MQTT.cpp | 5 ++- variants/nrf52840/rak4631/platformio.ini | 2 ++ 7 files changed, 39 insertions(+), 35 deletions(-) diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini index 98e7321c62..36effe0175 100644 --- a/arch/nrf52/nrf52.ini +++ b/arch/nrf52/nrf52.ini @@ -30,8 +30,6 @@ lib_deps= ${radiolib_base.lib_deps} # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto rweather/Crypto@0.4.0 - # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library - boschsensortec/BME68x Sensor Library@1.3.40408 lib_ignore = BluetoothOTA diff --git a/platformio.ini b/platformio.ini index 1780861581..88322f5783 100644 --- a/platformio.ini +++ b/platformio.ini @@ -136,6 +136,8 @@ lib_deps = adafruit/Adafruit BMP085 Library@1.2.4 # renovate: datasource=custom.pio depName=Adafruit BME280 packageName=adafruit/library/Adafruit BME280 Library adafruit/Adafruit BME280 Library@2.3.0 + # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library + adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=custom.pio depName=Adafruit DPS310 packageName=adafruit/library/Adafruit DPS310 adafruit/Adafruit DPS310@1.1.5 # renovate: datasource=custom.pio depName=Adafruit MCP9808 packageName=adafruit/library/Adafruit MCP9808 Library @@ -160,8 +162,6 @@ lib_deps = emotibit/EmotiBit MLX90632@1.0.8 # renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library adafruit/Adafruit MLX90614 Library@2.1.5 - # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library - adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=github-tags depName=INA3221 packageName=sgtwilko/INA3221 https://github.com/sgtwilko/INA3221#bb03d7e9bfcc74fc798838a54f4f99738f29fc6a # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass diff --git a/src/modules/Telemetry/Sensor/BME680Generic.h b/src/modules/Telemetry/Sensor/BME680Generic.h index dcd6c55f61..f7a37884da 100644 --- a/src/modules/Telemetry/Sensor/BME680Generic.h +++ b/src/modules/Telemetry/Sensor/BME680Generic.h @@ -1,9 +1,11 @@ #include "configuration.h" -#ifndef BME680_HEADER -#if defined(ARCH_PORTDUINO) -#define BME680_HEADER -#else +#if !defined(BME680_BSEC2_SUPPORTED) +#if defined(RAK_4631) +#define BME680_BSEC2_SUPPORTED 1 #define BME680_HEADER -#endif -#endif +#else +#define BME680_BSEC2_SUPPORTED 0 +#define BME680_HEADER +#endif // defined(RAK_4631) +#endif // !defined(BME680_BSEC2_SUPPORTED) diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index d9dc65b306..d3955d4cf5 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -12,7 +12,7 @@ BME680Sensor::BME680Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BME680, "BME680") {} -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 int32_t BME680Sensor::runOnce() { if (!bme680.run()) { @@ -20,13 +20,13 @@ int32_t BME680Sensor::runOnce() } return 35; } -#endif // !defined(ARCH_PORTDUINO) +#endif // defined(BME680_BSEC2_SUPPORTED) bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { status = 0; -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 if (!bme680.begin(dev->address.address, *bus)) checkStatus("begin"); @@ -58,7 +58,7 @@ bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) status = 1; -#endif // !defined(ARCH_PORTDUINO) +#endif // BME680_BSEC2_SUPPORTED initI2CSensor(); return status; @@ -66,7 +66,7 @@ bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) { -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 if (bme680.getData(BSEC_OUTPUT_RAW_PRESSURE).signal == 0) return false; @@ -100,11 +100,11 @@ bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) measurement->variant.environment_metrics.barometric_pressure = bme680->readPressure() / 100.0F; measurement->variant.environment_metrics.gas_resistance = bme680->readGas() / 1000.0; -#endif +#endif // BME680_BSEC2_SUPPORTED return true; } -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 void BME680Sensor::loadState() { #ifdef FSCom @@ -181,6 +181,6 @@ void BME680Sensor::checkStatus(const char *functionName) else if (bme680.sensor.status > BME68X_OK) LOG_WARN("%s BME68X code: %d", functionName, bme680.sensor.status); } -#endif // !defined(ARCH_PORTDUINO) +#endif // BME680_BSEC2_SUPPORTED #endif diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.h b/src/modules/Telemetry/Sensor/BME680Sensor.h index ec4770b49f..560bdefc4e 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.h +++ b/src/modules/Telemetry/Sensor/BME680Sensor.h @@ -7,37 +7,36 @@ #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "TelemetrySensor.h" -#if defined(ARCH_PORTDUINO) -#include -#include -#else // defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 #include #include -#endif // defined(ARCH_PORTDUINO) +#else +#include +#include +#endif // BME680_BSEC2_SUPPORTED #define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // That's 6 hours worth of millis() -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 const uint8_t bsec_config[] = { #include "config/bme680/bme680_iaq_33v_3s_4d/bsec_iaq.txt" }; -#endif // !defined(ARCH_PORTDUINO) - +#endif // BME680_BSEC2_SUPPORTED class BME680Sensor : public TelemetrySensor { private: -#if defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 + Bsec2 bme680; +#else using BME680Ptr = std::unique_ptr; static BME680Ptr makeBME680(TwoWire *bus) { return std::make_unique(bus); } BME680Ptr bme680; -#else - Bsec2 bme680; -#endif // defined(ARCH_PORTDUINO) +#endif // BME680_BSEC2_SUPPORTED protected: -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 const char *bsecConfigFileName = "/prefs/bsec.dat"; uint8_t bsecState[BSEC_MAX_STATE_BLOB_SIZE] = {0}; uint8_t accuracy = 0; @@ -54,13 +53,13 @@ class BME680Sensor : public TelemetrySensor void loadState(); void updateState(); void checkStatus(const char *functionName); -#endif // !defined(ARCH_PORTDUINO) +#endif // BME680_BSEC2_SUPPORTED public: BME680Sensor(); -#if !defined(ARCH_PORTDUINO) +#if BME680_BSEC2_SUPPORTED == 1 virtual int32_t runOnce() override; -#endif // !defined(ARCH_PORTDUINO) +#endif // BME680_BSEC2_SUPPORTED virtual bool getMetrics(meshtastic_Telemetry *measurement) override; virtual bool initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) override; }; diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index f9f1140396..10eb01e211 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -487,8 +487,11 @@ bool MQTT::publish(const char *topic, const uint8_t *payload, size_t length, boo { if (moduleConfig.mqtt.proxy_to_client_enabled) { meshtastic_MqttClientProxyMessage *msg = mqttClientProxyMessagePool.allocZeroed(); + size_t topic_len = strlen(topic); msg->which_payload_variant = meshtastic_MqttClientProxyMessage_data_tag; - strlcpy(msg->topic, topic, sizeof(msg->topic)); + if (strncpy(msg->topic, topic, topic_len) == nullptr) { + msg->topic[sizeof(msg->topic) - 1] = 0; + } if (length > sizeof(msg->payload_variant.data.bytes)) length = sizeof(msg->payload_variant.data.bytes); msg->payload_variant.data.size = length; diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 65abbbf1c8..0593cac49f 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -24,6 +24,8 @@ lib_deps = beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip + # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library + boschsensortec/BME68x Sensor Library@1.3.40408 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds From 09303110ffe601c4eb42283e321655bff4f27b4b Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Fri, 14 Nov 2025 17:04:17 +0900 Subject: [PATCH 3/7] Back bsec2 to environmental_extra --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index 88322f5783..ae631466d1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -194,6 +194,8 @@ lib_deps = adafruit/Adafruit BMP3XX Library@2.1.6 # renovate: datasource=custom.pio depName=Adafruit MAX1704X packageName=adafruit/library/Adafruit MAX1704X adafruit/Adafruit MAX1704X@1.0.3 + # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library + adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=custom.pio depName=Adafruit LPS2X packageName=adafruit/library/Adafruit LPS2X adafruit/Adafruit LPS2X@2.0.6 # renovate: datasource=custom.pio depName=Adafruit SHT31 packageName=adafruit/library/Adafruit SHT31 Library From 60366f3aff50f8ceaec5b3e887ce33c23e2269f0 Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Fri, 14 Nov 2025 17:57:33 +0900 Subject: [PATCH 4/7] Fix bosch library dependencies --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index ae631466d1..9ba34e38d1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -210,6 +210,8 @@ lib_deps = ClosedCube OPT3001@1.1.2 # renovate: datasource=custom.pio depName=Bosch BSEC2 packageName=boschsensortec/library/bsec2 boschsensortec/bsec2@1.10.2610 + # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library + boschsensortec/BME68x Sensor Library@1.3.40408 # renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip # renovate: datasource=custom.pio depName=Sensirion Core packageName=sensirion/library/Sensirion Core From 7b6235f4d70b8dd41d949ac8aeb2bbbc97cf6530 Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Mon, 17 Nov 2025 21:19:49 +0900 Subject: [PATCH 5/7] Fix for esp32 CI --- platformio.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 9ba34e38d1..f9e2dd8987 100644 --- a/platformio.ini +++ b/platformio.ini @@ -136,8 +136,6 @@ lib_deps = adafruit/Adafruit BMP085 Library@1.2.4 # renovate: datasource=custom.pio depName=Adafruit BME280 packageName=adafruit/library/Adafruit BME280 Library adafruit/Adafruit BME280 Library@2.3.0 - # renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library - adafruit/Adafruit SHTC3 Library@1.0.2 # renovate: datasource=custom.pio depName=Adafruit DPS310 packageName=adafruit/library/Adafruit DPS310 adafruit/Adafruit DPS310@1.1.5 # renovate: datasource=custom.pio depName=Adafruit MCP9808 packageName=adafruit/library/Adafruit MCP9808 Library From 1ac74cefc44ce0e1e586acc2667a85ec09bf50d2 Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Mon, 17 Nov 2025 21:20:07 +0900 Subject: [PATCH 6/7] Fix for esp32 CI --- src/configuration.h | 12 ++++++++++ .../Telemetry/EnvironmentTelemetry.cpp | 6 ++--- src/modules/Telemetry/Sensor/BME680Generic.h | 11 --------- src/modules/Telemetry/Sensor/BME680Sensor.cpp | 20 +++++++--------- src/modules/Telemetry/Sensor/BME680Sensor.h | 24 +++++++++---------- 5 files changed, 34 insertions(+), 39 deletions(-) delete mode 100644 src/modules/Telemetry/Sensor/BME680Generic.h diff --git a/src/configuration.h b/src/configuration.h index 8ec3b2211d..d58fcef587 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -410,6 +410,18 @@ along with this program. If not, see . #endif #endif +// BME680 BSEC2 support detection +#if !defined(MESHTASTIC_BME680_BSEC2_SUPPORTED) +#if defined(RAK_4631) || defined(TBEAM_V10) + +#define MESHTASTIC_BME680_BSEC2_SUPPORTED 1 +#define MESHTASTIC_BME680_HEADER +#else +#define MESHTASTIC_BME680_BSEC2_SUPPORTED 0 +#define MESHTASTIC_BME680_HEADER +#endif // defined(RAK_4631) +#endif // !defined(MESHTASTIC_BME680_BSEC2_SUPPORTED) + // ----------------------------------------------------------------------------- // Global switches to turn off features for a minimized build // ----------------------------------------------------------------------------- diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 6a2dcfe470..6c6b0a7c22 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -53,9 +53,7 @@ extern void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const c #include "Sensor/LTR390UVSensor.h" #endif -#include "Sensor/BME680Generic.h" - -#if __has_include(BME680_HEADER) +#if __has_include(MESHTASTIC_BME680_HEADER) #include "Sensor/BME680Sensor.h" #endif @@ -216,7 +214,7 @@ void EnvironmentTelemetryModule::i2cScanFinished(ScanI2C *i2cScanner) #if __has_include() addSensor(i2cScanner, ScanI2C::DeviceType::LTR390UV); #endif -#if __has_include(BME680_HEADER) +#if __has_include(MESHTASTIC_BME680_HEADER) addSensor(i2cScanner, ScanI2C::DeviceType::BME_680); #endif #if __has_include() diff --git a/src/modules/Telemetry/Sensor/BME680Generic.h b/src/modules/Telemetry/Sensor/BME680Generic.h deleted file mode 100644 index f7a37884da..0000000000 --- a/src/modules/Telemetry/Sensor/BME680Generic.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "configuration.h" - -#if !defined(BME680_BSEC2_SUPPORTED) -#if defined(RAK_4631) -#define BME680_BSEC2_SUPPORTED 1 -#define BME680_HEADER -#else -#define BME680_BSEC2_SUPPORTED 0 -#define BME680_HEADER -#endif // defined(RAK_4631) -#endif // !defined(BME680_BSEC2_SUPPORTED) diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index d3955d4cf5..22330ca751 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -1,8 +1,6 @@ #include "configuration.h" -#include "BME680Generic.h" - -#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(BME680_HEADER) +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(MESHTASTIC_BME680_HEADER) #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "BME680Sensor.h" @@ -12,7 +10,7 @@ BME680Sensor::BME680Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BME680, "BME680") {} -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 int32_t BME680Sensor::runOnce() { if (!bme680.run()) { @@ -20,13 +18,13 @@ int32_t BME680Sensor::runOnce() } return 35; } -#endif // defined(BME680_BSEC2_SUPPORTED) +#endif // defined(MESHTASTIC_BME680_BSEC2_SUPPORTED) bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { status = 0; -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 if (!bme680.begin(dev->address.address, *bus)) checkStatus("begin"); @@ -58,7 +56,7 @@ bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) status = 1; -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED initI2CSensor(); return status; @@ -66,7 +64,7 @@ bool BME680Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) { -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 if (bme680.getData(BSEC_OUTPUT_RAW_PRESSURE).signal == 0) return false; @@ -100,11 +98,11 @@ bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) measurement->variant.environment_metrics.barometric_pressure = bme680->readPressure() / 100.0F; measurement->variant.environment_metrics.gas_resistance = bme680->readGas() / 1000.0; -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED return true; } -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 void BME680Sensor::loadState() { #ifdef FSCom @@ -181,6 +179,6 @@ void BME680Sensor::checkStatus(const char *functionName) else if (bme680.sensor.status > BME68X_OK) LOG_WARN("%s BME68X code: %d", functionName, bme680.sensor.status); } -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED #endif diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.h b/src/modules/Telemetry/Sensor/BME680Sensor.h index 560bdefc4e..9bef56e1ee 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.h +++ b/src/modules/Telemetry/Sensor/BME680Sensor.h @@ -1,31 +1,29 @@ #include "configuration.h" -#include "BME680Generic.h" - -#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(BME680_HEADER) +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(MESHTASTIC_BME680_HEADER) #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "TelemetrySensor.h" -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 #include #include #else #include #include -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED #define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // That's 6 hours worth of millis() -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 const uint8_t bsec_config[] = { #include "config/bme680/bme680_iaq_33v_3s_4d/bsec_iaq.txt" }; -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED class BME680Sensor : public TelemetrySensor { private: -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 Bsec2 bme680; #else using BME680Ptr = std::unique_ptr; @@ -33,10 +31,10 @@ class BME680Sensor : public TelemetrySensor static BME680Ptr makeBME680(TwoWire *bus) { return std::make_unique(bus); } BME680Ptr bme680; -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED protected: -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 const char *bsecConfigFileName = "/prefs/bsec.dat"; uint8_t bsecState[BSEC_MAX_STATE_BLOB_SIZE] = {0}; uint8_t accuracy = 0; @@ -53,13 +51,13 @@ class BME680Sensor : public TelemetrySensor void loadState(); void updateState(); void checkStatus(const char *functionName); -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED public: BME680Sensor(); -#if BME680_BSEC2_SUPPORTED == 1 +#if MESHTASTIC_BME680_BSEC2_SUPPORTED == 1 virtual int32_t runOnce() override; -#endif // BME680_BSEC2_SUPPORTED +#endif // MESHTASTIC_BME680_BSEC2_SUPPORTED virtual bool getMetrics(meshtastic_Telemetry *measurement) override; virtual bool initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) override; }; From 95ec869d6787a60f8c9bbe9b7e868f22c6eca015 Mon Sep 17 00:00:00 2001 From: JaeHwan Jin Date: Mon, 24 Nov 2025 10:46:28 +0900 Subject: [PATCH 7/7] chore: trigger CI