diff --git a/main/peripherals/sensors/bme280.cpp b/main/peripherals/sensors/bme280.cpp
index d27e4a4f5b66cd988a0db804df7bf3387271d3aa..b3722227d50bc52de8a620936e6e167672ac09b7 100644
--- a/main/peripherals/sensors/bme280.cpp
+++ b/main/peripherals/sensors/bme280.cpp
@@ -8,21 +8,47 @@ typedef struct {
     qthing::bme280_measure_callback_t callback;
 } bme280_config_t;
 
-static bme280_config_t cfg;
+static std::vector<bme280_config_t> cfgs;
 
 #include "esp_log.h"
 static void measured(void *ignored) {
+    std::string topic;
+
     while (true) {
+        vTaskDelay(1000 / portTICK_PERIOD_MS);
 
-        bme280_reading_data data = cfg.bme280.readSensorData();
+        for (std::vector<bme280_config_t>::iterator it = cfgs.begin(); it != cfgs.end(); ++it) {
+            bme280_config_t cfg = *it;
 
-        ESP_LOGE("BME280", "Temperature: %.2f°C, Humidity: %.2f%%, Pressure: %.2fPa\n",
-                (double) data.temperature,
-                (double) data.humidity,
-                (double) data.pressure
-        );
+            bme280_reading_data _data = cfg.bme280.readSensorData();
+            qthing::bme280_data_t data = {_data.temperature, _data.humidity, _data.pressure};
 
-        vTaskDelay(1000 / portTICK_PERIOD_MS);
+            if (is_mqtt_connected()) {
+                char tmp[16];
+
+                sprintf(tmp, "%0.2f", data.temperature);
+                topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/temperature");
+                publish_message(topic, tmp);
+
+                sprintf(tmp, "%0.2f", data.humidity);
+                topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/humidity");
+                publish_message(topic, tmp);
+
+                sprintf(tmp, "%0.2f", data.pressure);
+                topic = std::string(DEVICE_NAMESPACE) + cfg.topic + std::string("/pressure");
+                publish_message(topic, tmp);
+            }
+
+            if (cfg.callback != NULL) {
+                cfg.callback(data);
+            }
+
+            ESP_LOGI((std::string("BME280[") + cfg.topic + std::string("]")).c_str(), "T: %.2f°C  RH: %.2f%%  P: %.2fPa",
+                data.temperature,
+                data.humidity,
+                data.pressure
+            );
+        }
     }
 }
 
@@ -33,15 +59,21 @@ namespace qthing {
         bme280.setDebug(false);
         bme280.init(sda, scl);
 
-        cfg = {
+        bme280_config_t cfg = {
             topic,
             bme280,
             callback
         };
 
+        cfgs.push_back(cfg);
+
         if (!measured_started) {
             measured_started = true;
             xTaskCreate(measured, "bme280_measured", 10000, NULL, 1, NULL);
         }
     }
+    
+    void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, uint8_t address) {
+        add_bme280(sda, scl, topic, NULL, address);
+    }
 }
diff --git a/main/peripherals/sensors/bme280.h b/main/peripherals/sensors/bme280.h
index 6f2e0a937a40bcff0c29690726d0eec168d4785a..6d9265f5a5561346308cd6c87a9a4ba32e304e2a 100644
--- a/main/peripherals/sensors/bme280.h
+++ b/main/peripherals/sensors/bme280.h
@@ -1,6 +1,9 @@
 # pragma once
 
 #include <qthing.h>
+#include "mqtt_common.h"
+
+#include <vector>
 #include <string>
 
 #include "freertos/FreeRTOS.h"
diff --git a/main/qthing.h b/main/qthing.h
index a4e3b86baeec3fd9de5dd1db439e6d042371a5e0..ed07bc82ddc9cdb9f22bbc5f24cdcb1806d4d875 100644
--- a/main/qthing.h
+++ b/main/qthing.h
@@ -105,7 +105,7 @@ namespace qthing {
 
     typedef std::function<void(bme280_data_t)> bme280_measure_callback_t;
 
-    void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, qthing::bme280_measure_callback_t callback, uint8_t address = 0x76);
+    void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, qthing::bme280_measure_callback_t callback = NULL, uint8_t address = 0x76);
 }
 
 // utility