diff --git a/src/bme280_drv.c b/src/bme280_drv.c index 3e16623..1ce77b0 100644 --- a/src/bme280_drv.c +++ b/src/bme280_drv.c @@ -10,8 +10,8 @@ static struct mgos_bme280 *s_bme280; static struct mgos_bme280_data s_bme280_data; static void bme280_prometheus_metrics(struct mg_connection *nc, void *user_data) { - bool bme280; + struct mgos_bme280_stats stats; if (!s_bme280) return; bme280=mgos_bme280_is_bme280(s_bme280); @@ -30,16 +30,38 @@ static void bme280_prometheus_metrics(struct mg_connection *nc, void *user_data) "{sensor=\"0\",type=\"BM%s280\"} %f", bme280?"E":"P", s_bme280_data.humid); } + if (mgos_bme280_getStats(s_bme280, &stats)) { + mgos_prometheus_metrics_printf(nc, COUNTER, + "sensor_read_total", "Total reads from sensor", + "{sensor=\"0\",type=\"BM%s280\"} %u", bme280?"E":"P", stats.read); + mgos_prometheus_metrics_printf(nc, COUNTER, + "sensor_read_success_total", "Total successful reads from sensor", + "{sensor=\"0\",type=\"BM%s280\"} %u", bme280?"E":"P", stats.read_success); + mgos_prometheus_metrics_printf(nc, COUNTER, + "sensor_read_success_cached_total", "Total successful cached reads from sensor", + "{sensor=\"0\",type=\"BM%s280\"} %u", bme280?"E":"P", stats.read_success_cached); + uint32_t errors = stats.read - stats.read_success - stats.read_success_cached; + mgos_prometheus_metrics_printf(nc, COUNTER, + "sensor_read_error_total", "Total unsuccessful reads from sensor", + "{sensor=\"0\",type=\"BM%s280\"} %u", bme280?"E":"P", errors); + mgos_prometheus_metrics_printf(nc, COUNTER, + "sensor_read_success_usecs_total", "Total microseconds spent in reads from sensor", + "{sensor=\"0\",type=\"BM%s280\"} %f", bme280?"E":"P", stats.read_success_usecs); + } + + (void) user_data; } static void bme280_timer_cb(void *user_data) { - double start; + struct mgos_bme280_stats stats_before, stats_after; uint32_t usecs=0; - start=mgos_uptime(); + mgos_bme280_getStats(s_bme280, &stats_before); mgos_bme280_read(s_bme280, &s_bme280_data); - usecs=1000000*(mgos_uptime()-start); + mgos_bme280_getStats(s_bme280, &stats_after); + + usecs=stats_after.read_success_usecs - stats_before.read_success_usecs; if (mgos_bme280_is_bme280(s_bme280)) { LOG(LL_INFO, ("BME280 sensor=0 humidity=%.2f%% temperature=%.2fC pressure=%.1fHPa usecs=%u", s_bme280_data.humid, s_bme280_data.temp, s_bme280_data.press, usecs));