Factor out DHT
It's now its own library (in git@git.ipng.nl:pim/prometheus-sensors)
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | |||||||
| build/ | build/ | ||||||
| deps/ | deps/ | ||||||
|  | libs/prometheus-sensors | ||||||
|   | |||||||
| @@ -29,6 +29,4 @@ bool channel_get(int idx); | |||||||
| int channel_get_total(); | int channel_get_total(); | ||||||
| void channel_handler(int gpio, void *arg); | void channel_handler(int gpio, void *arg); | ||||||
|  |  | ||||||
| void dht_init(); |  | ||||||
|  |  | ||||||
| #endif // __MAIN_H | #endif // __MAIN_H | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								mos.yml
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								mos.yml
									
									
									
									
									
								
							| @@ -42,7 +42,7 @@ config_schema: | |||||||
|   - ["app.hostname", "sonoff-sv"] |   - ["app.hostname", "sonoff-sv"] | ||||||
|   - ["app.config", "s", {title: "Application specific config file"}] |   - ["app.config", "s", {title: "Application specific config file"}] | ||||||
|   - ["app.config", "sonoff-basic.json"] |   - ["app.config", "sonoff-basic.json"] | ||||||
|   - ["app.dht_gpio", "s", "5,4,14", {title: "Comma Separated list of GPIO pins to enable DHT22/AM2302 sensors on"}] |   - ["sensors.dht_gpio", "s", "5,4,14", {title: "Comma Separated list of GPIO pins to enable DHT22/AM2302 sensors on"}] | ||||||
|   - ["prometheus.pushgateway", "chbtl01.paphosting.net:9091"] |   - ["prometheus.pushgateway", "chbtl01.paphosting.net:9091"] | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -58,8 +58,7 @@ libs: | |||||||
|   - origin: https://github.com/mongoose-os-libs/rpc-service-fs |   - origin: https://github.com/mongoose-os-libs/rpc-service-fs | ||||||
|   - origin: https://github.com/mongoose-os-libs/rpc-mqtt |   - origin: https://github.com/mongoose-os-libs/rpc-mqtt | ||||||
|   - origin: https://github.com/mongoose-os-libs/mqtt |   - origin: https://github.com/mongoose-os-libs/mqtt | ||||||
|   - origin: https://github.com/mongoose-os-libs/dht |   - origin: libs/prometheus-sensors | ||||||
|   - origin: https://github.com/mongoose-os-libs/prometheus-metrics |  | ||||||
|   - origin: libs/rpc-service-ota |   - origin: libs/rpc-service-ota | ||||||
|  |  | ||||||
| # Used by the mos tool to catch mos binaries incompatible with this file format | # Used by the mos tool to catch mos binaries incompatible with this file format | ||||||
|   | |||||||
							
								
								
									
										89
									
								
								src/dht.c
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								src/dht.c
									
									
									
									
									
								
							| @@ -1,89 +0,0 @@ | |||||||
| #include "mgos.h" |  | ||||||
|  |  | ||||||
| #ifdef MGOS_HAVE_DHT |  | ||||||
| #include "main.h" |  | ||||||
| #include "mgos_dht.h" |  | ||||||
| #include "mgos_config.h" |  | ||||||
| #include "mgos_prometheus_metrics.h" |  | ||||||
| #include "mqtt.h" |  | ||||||
|  |  | ||||||
| #define MAX_DHT 8 |  | ||||||
|  |  | ||||||
| static struct mgos_dht *s_dht[MAX_DHT]; |  | ||||||
| static int s_num_dht = 0; |  | ||||||
|  |  | ||||||
| static void print_chunk(struct mg_connection *nc, char *name, char *fmt, ...) { |  | ||||||
|   char chunk[500]; |  | ||||||
|   int chunklen=0; |  | ||||||
|   va_list ap; |  | ||||||
|  |  | ||||||
|   snprintf(chunk, sizeof(chunk), "%s%s", name, fmt[0]=='{' ? "" : " "); |  | ||||||
|   va_start(ap, fmt); |  | ||||||
|   vsnprintf(chunk+strlen(chunk), sizeof(chunk)-strlen(chunk), fmt, ap); |  | ||||||
|   va_end(ap); |  | ||||||
|   strncat(chunk, "\n", sizeof(chunk)); |  | ||||||
|   chunklen=strlen(chunk); |  | ||||||
|   LOG(LL_DEBUG, ("Chunk '%s' with length %d", chunk, chunklen)); |  | ||||||
|   mg_printf(nc, "%X\r\n%s\r\n", chunklen, chunk); |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void dht_prometheus_metrics(struct mg_connection *nc, void *user_data) { |  | ||||||
|   int i; |  | ||||||
|  |  | ||||||
|   // BUG -- repeated HELP and TYPE makes Prometheus parser bork :( |  | ||||||
|   mgos_prometheus_metrics_printf(nc, GAUGE, |  | ||||||
|     "temperature", "Temperature in celcius", |  | ||||||
|     "{sensor=\"0\",type=\"DHT\"} %f", mgos_dht_get_temp(s_dht[0])); |  | ||||||
|   mgos_prometheus_metrics_printf(nc, GAUGE, |  | ||||||
|     "humidity", "Relative humidity percentage", |  | ||||||
|     "{sensor=\"0\",type=\"DHT\"} %f", mgos_dht_get_humidity(s_dht[0])); |  | ||||||
|  |  | ||||||
|   for (i=1; i<s_num_dht; i++) { |  | ||||||
|     print_chunk(nc, "temperature", "{sensor=\"%d\",type=\"DHT\"} %f", i, mgos_dht_get_temp(s_dht[i])); |  | ||||||
|     print_chunk(nc, "humidity", "{sensor=\"%d\",type=\"DHT\"} %f", i, mgos_dht_get_humidity(s_dht[i])); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   (void) user_data; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static bool dht_create(int pin, enum dht_type type) { |  | ||||||
|   struct mgos_dht *dht; |  | ||||||
|   if (s_num_dht == MAX_DHT) { |  | ||||||
|     LOG(LL_ERROR, ("No more sensor slots available (%d added)", MAX_DHT)); |  | ||||||
|     return false; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   dht=mgos_dht_create(pin, type); |  | ||||||
|   if (!dht) { |  | ||||||
|     LOG(LL_ERROR, ("Could not create DHT sensor on pin %d", pin)); |  | ||||||
|     return false; |  | ||||||
|   } |  | ||||||
|   s_dht[s_num_dht] = dht; |  | ||||||
|   s_num_dht++; |  | ||||||
|  |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void dht_init() { |  | ||||||
|   char *tok; |  | ||||||
|  |  | ||||||
|   memset(s_dht, 0, sizeof (struct mgos_dht *) * MAX_DHT); |  | ||||||
|   tok = strtok((char *)mgos_sys_config_get_app_dht_gpio(), ", "); |  | ||||||
|   while (tok) { |  | ||||||
|     int gpio; |  | ||||||
|     gpio = atoi(tok); |  | ||||||
|     tok=strtok(NULL, ", "); |  | ||||||
|     dht_create(gpio, AM2302); |  | ||||||
|     mgos_msleep(250); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (s_num_dht>0) |  | ||||||
|     mgos_prometheus_metrics_add_handler(dht_prometheus_metrics, NULL); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #else |  | ||||||
| void dht_init() { |  | ||||||
|   LOG(LL_INFO, ("DHT disabled, include library in mos.yml to enable")); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| @@ -4,16 +4,9 @@ | |||||||
| #include "mqtt.h" | #include "mqtt.h" | ||||||
| #include "rpc.h" | #include "rpc.h" | ||||||
|  |  | ||||||
| static void timer_cb(void *user_data) { |  | ||||||
|   mgos_prometheus_metrics_push("lightswitch", mgos_sys_config_get_device_id()); |  | ||||||
|   (void) user_data; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum mgos_app_init_result mgos_app_init(void) { | enum mgos_app_init_result mgos_app_init(void) { | ||||||
|   channel_init(mgos_sys_config_get_app_config()); |   channel_init(mgos_sys_config_get_app_config()); | ||||||
|   mqtt_init(); |   mqtt_init(); | ||||||
|   rpc_init(); |   rpc_init(); | ||||||
|   dht_init(); |  | ||||||
|   mgos_set_timer(5000, true, timer_cb, NULL); |  | ||||||
|   return MGOS_APP_INIT_SUCCESS; |   return MGOS_APP_INIT_SUCCESS; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user