Add barometer_drv.c

This commit is contained in:
Pim van Pelt
2018-04-22 17:58:41 +02:00
parent 51efc682a3
commit 7a2a8498f8
3 changed files with 111 additions and 0 deletions

View File

@ -33,6 +33,7 @@ config_schema:
- ["sensors.ccs811_i2caddr", "i", 0x5a, {title: "I2C Address for CCS811 sensor"}] - ["sensors.ccs811_i2caddr", "i", 0x5a, {title: "I2C Address for CCS811 sensor"}]
- ["sensors.ccs811_period", "i", 3, {title: "Sample period in seconds for CCS811 sensor"}] - ["sensors.ccs811_period", "i", 3, {title: "Sample period in seconds for CCS811 sensor"}]
- ["sensors.pushgateway_period", "i", 10, {title: "Period in seconds for Prometheus Pushgateway POSTs"}] - ["sensors.pushgateway_period", "i", 10, {title: "Period in seconds for Prometheus Pushgateway POSTs"}]
- ["sensors.barometer_period", "i", 3, {title: "Sample period in seconds for barometer sensors"}]
- ["prometheus.pushgateway", "prometheus.example.net:9091"] - ["prometheus.pushgateway", "prometheus.example.net:9091"]

108
src/barometer_drv.c Normal file
View File

@ -0,0 +1,108 @@
#include "mgos.h"
#ifdef MGOS_HAVE_BAROMETER
#include "mgos_barometer.h"
#include "mgos_config.h"
#include "mgos_prometheus_metrics.h"
#include "mgos_prometheus_sensors.h"
#include <math.h>
#define NUM_BARO 5
struct mgos_barometer *s_barometer[NUM_BARO];
static void barometer_prometheus_metrics(struct mg_connection *nc, void *user_data) {
struct mgos_barometer_stats stats;
float temperature=NAN, humidity=NAN, pressure=NAN;
for (int i=0; i<NUM_BARO && s_barometer[i]; i++) {
if (mgos_barometer_get_temperature(s_barometer[i], &temperature)) {
mgos_prometheus_metrics_printf(nc, GAUGE,
"temperature", "Temperature in Celcius",
"{sensor=\"%d\",type=\"BAROMETER\"} %f", i, temperature);
}
if (mgos_barometer_get_pressure(s_barometer[i], &pressure)) {
mgos_prometheus_metrics_printf(nc, GAUGE,
"pressure", "Barometer pressure in Pascals",
"{sensor=\"%d\", type=\"BAROMETER\"} %f", i, pressure);
}
/*
if (mgos_barometer_get_humidity(s_barometer[i], &humidity)) {
mgos_prometheus_metrics_printf(nc, GAUGE,
"humidity", "Relative humidity percentage",
"{sensor=\"%d\",type=\"BAROMETER\"} %f", i, humidity);
}
*/
if (mgos_barometer_get_stats(s_barometer[i], &stats)) {
mgos_prometheus_metrics_printf(nc, COUNTER,
"sensor_read_total", "Total reads from sensor",
"{sensor=\"%d\",type=\"BAROMETER\"} %u", i, stats.read);
mgos_prometheus_metrics_printf(nc, COUNTER,
"sensor_read_success_total", "Total successful reads from sensor",
"{sensor=\"%d\",type=\"BAROMETER\"} %u", i, stats.read_success);
mgos_prometheus_metrics_printf(nc, COUNTER,
"sensor_read_success_cached_total", "Total successful cached reads from sensor",
"{sensor=\"%d\",type=\"BAROMETER\"} %u", i, 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=\"%d\",type=\"BAROMETER\"} %u", i, errors);
mgos_prometheus_metrics_printf(nc, COUNTER,
"sensor_read_success_usecs_total", "Total microseconds spent in reads from sensor",
"{sensor=\"%d\",type=\"BAROMETER\"} %f", i, stats.read_success_usecs);
}
}
(void)user_data;
(void)humidity;
}
static void barometer_timer_cb(void *user_data) {
struct mgos_barometer *baro = (struct mgos_barometer *)user_data;
float temperature=NAN, humidity=NAN, pressure=NAN;
struct mgos_barometer_stats stats_before, stats_after;
uint32_t usecs = 0;
mgos_barometer_get_stats(baro, &stats_before);
mgos_barometer_get_temperature(baro, &temperature);
mgos_barometer_get_pressure(baro, &pressure);
// mgos_barometer_get_humidity(baro, &humidity);
mgos_barometer_get_stats(baro, &stats_after);
usecs = stats_after.read_success_usecs - stats_before.read_success_usecs;
LOG(LL_INFO, ("BAROMETER temperature=%.2fC humidity=%.1f%% pressure=%.0fPa usecs=%u", temperature, humidity, pressure, usecs));
(void)user_data;
}
static struct mgos_barometer *barometer_create(struct mgos_i2c *i2c, uint8_t i2caddr, enum mgos_barometer_type type) {
struct mgos_barometer *b;
b=mgos_barometer_create_i2c(i2c, i2caddr, type);
if (!b) return NULL;
mgos_barometer_set_cache_ttl(b, 1000);
mgos_set_timer(mgos_sys_config_get_sensors_barometer_period() * 1000, true, barometer_timer_cb, b);
return b;
}
void barometer_drv_init() {
int num_baro=0;
if ((s_barometer[num_baro] = barometer_create(mgos_i2c_get_global(), 0x76, BARO_BME280)))
num_baro++;
if ((s_barometer[num_baro] = barometer_create(mgos_i2c_get_global(), 0x60, BARO_MPL115)))
num_baro++;
if (num_baro>0)
mgos_prometheus_metrics_add_handler(barometer_prometheus_metrics, NULL);
}
#else
void barometer_drv_init() {
LOG(LL_ERROR, ("Barometer disabled, include library in mos.yml to enable"));
}
#endif

View File

@ -10,6 +10,7 @@ void si7021_drv_init();
void htu21df_drv_init(); void htu21df_drv_init();
void mcp9808_drv_init(); void mcp9808_drv_init();
void ccs811_drv_init(); void ccs811_drv_init();
void barometer_drv_init();
static void pushgateway_timer(void *user_data) { static void pushgateway_timer(void *user_data) {
mgos_prometheus_metrics_push(MGOS_APP, mgos_sys_config_get_device_id()); mgos_prometheus_metrics_push(MGOS_APP, mgos_sys_config_get_device_id());
@ -25,6 +26,7 @@ bool mgos_prometheus_sensors_init(void) {
htu21df_drv_init(); htu21df_drv_init();
mcp9808_drv_init(); mcp9808_drv_init();
ccs811_drv_init(); ccs811_drv_init();
barometer_drv_init();
if (mgos_sys_config_get_sensors_pushgateway_period() > 0) { if (mgos_sys_config_get_sensors_pushgateway_period() > 0) {
mgos_set_timer(mgos_sys_config_get_sensors_pushgateway_period() * 1000, true, pushgateway_timer, NULL); mgos_set_timer(mgos_sys_config_get_sensors_pushgateway_period() * 1000, true, pushgateway_timer, NULL);