diff --git a/RestServer/calculate.c b/RestServer/calculate.c new file mode 100644 index 0000000..24e1d11 --- /dev/null +++ b/RestServer/calculate.c @@ -0,0 +1,80 @@ +#include +#include +#include /* link against math lib */ +#include "calculate.h" + +#define R 8314.3 //J/(kmol*K) (universelle Gaskonstante) +#define mw 18.016 //kg/kmol (Molekulargewicht des Wasserdampfes) + +/* +Bezeichnungen: +r = relative Luftfeuchte +T = Temperatur in °C +TK = Temperatur in Kelvin (TK = T + 273.15) +TD = Taupunkttemperatur in °C +DD = Dampfdruck in hPa +SDD = Sättigungsdampfdruck in hPa + +Parameter: +a = 7.5, b = 237.3 für T >= 0 +a = 7.6, b = 240.7 für T < 0 über Wasser (Taupunkt) +a = 9.5, b = 265.5 für T < 0 über Eis (Frostpunkt) + +R* = 8314.3 J/(kmol*K) (universelle Gaskonstante) +mw = 18.016 kg/kmol (Molekulargewicht des Wasserdampfes) +AF = absolute Feuchte in g Wasserdampf pro m3 Luft + +Formeln: + + SDD(T) = 6.1078 * 10^((a*T)/(b+T)) + DD(r,T) = r/100 * SDD(T) + r(T,TD) = 100 * SDD(TD) / SDD(T) + TD(r,T) = b*v/(a-v) mit v(r,T) = log10(DD(r,T)/6.1078) + AF(r,TK) = 10^5 * mw/R* * DD(r,T)/TK; AF(TD,TK) = 10^5 * mw/R* * SDD(TD)/TK +*/ + +static float sdd(float temperature) { + //select constant based on input temperature + float a = 7.5, b = 237.3; + if (temperature >= 0) { + a = 7.6; + b = 240.7; + } + return 6.1078 * pow(10, (a * temperature) / (b + temperature)); +} + +static float dd(float relativeHumidity, float temperature) { + return relativeHumidity / 100 * sdd(temperature); +} + +/* CURRENTLY UNUSED + +static float r(float temperature, float dewTemperature) { + // This is optional. Necessary with dew point measurements. + return 100 * sdd(dewTemperature) / sdd(temperature); +} + +static float v(float relativeHumidity, float temperature) { + log10(dd(relativeHumidity, temperature)/6.1078); +} + +static float td(float relativeHumidity, float temperature) { + //select constant based on input temperature + float a = 7.5, b = 237.3; + if (temperature >= 0) { + a = 7.6; + b = 240.7; + } + return b * v(relativeHumidity, temperature) / (a - v(relativeHumidity, temperature)); +} +*/ +static float af(float relativeHumidity, float temperature) { + float tk = temperature + 273.15; + return pow(10, 5) * mw/R * dd(relativeHumidity, temperature) / tk; +} + +float absoluteHumidityFloat(float temperature, float humidity) { + return af(humidity, temperature); +} + + diff --git a/RestServer/calculate.h b/RestServer/calculate.h new file mode 100644 index 0000000..03e320e --- /dev/null +++ b/RestServer/calculate.h @@ -0,0 +1,6 @@ +#ifndef calculate_H +#define calculate_H + +float absoluteHumidityFloat(float temperature, float humidity); + +#endif diff --git a/RestServer/main.c b/RestServer/main.c index f237741..768977a 100644 --- a/RestServer/main.c +++ b/RestServer/main.c @@ -1,13 +1,13 @@ #include #include #include - - - #include #include #include +#include "sendmysql.h" +#include "calculate.h" + #define U_DISABLE_CURL #define U_DISABLE_WEBSOCKET #include @@ -76,19 +76,18 @@ char * read_file(const char * filename) { } } -int callback_all_test_foo (const struct _u_request * request, struct _u_response * response, void * user_data) { - //char * url_params = print_map(request->map_url); - //char * response_body = msprintf("parameters from the url are \n%s\n\n", - //url_params); +int callback_absTempHum(const struct _u_request *request, struct _u_response *response, void *user_data) { + int i; float temphum[2]; const char **keys; keys = u_map_enum_keys(request->map_url); for (i = 0; i < 2; i++) { - temphum[i] = atoi(u_map_get(request->map_url, keys[i])); + temphum[i] = atof(u_map_get(request->map_url, keys[i])); } - char *response_body = msprintf("Temp: %f, Hum: %f",temphum[0], temphum[1]); + char *response_body = msprintf("Temp: %f, Hum: %f, absHum: %f",temphum[0], temphum[1], absoluteHumidityFloat(temphum[0], temphum[1])); + insertData(1, temphum[0], temphum[1], 0); ulfius_set_string_body_response(response, 200, response_body); //o_free(url_params); @@ -99,7 +98,6 @@ int callback_all_test_foo (const struct _u_request * request, struct _u_response int main(void) { - struct _u_instance instance; // Initialize instance with the port number @@ -108,11 +106,9 @@ int main(void) { return(1); } - instance.max_post_body_size = 1024; - // Endpoint list declaration ulfius_add_endpoint_by_val(&instance, "GET", "/welcome", NULL, 0, &callback_welcome, NULL); - ulfius_add_endpoint_by_val(&instance, "GET", PREFIX, "/:temp/:hum", 0, &callback_all_test_foo, NULL); + ulfius_add_endpoint_by_val(&instance, "GET", PREFIX, "/:temp/:hum", 0, &callback_absTempHum, NULL); // Start the framework if (ulfius_start_framework(&instance) == U_OK) { diff --git a/RestServer/makefile b/RestServer/makefile index ca1e327..0d89b0a 100644 --- a/RestServer/makefile +++ b/RestServer/makefile @@ -7,7 +7,7 @@ CFLAGS = -Wall -g -D_GNU_SOURCE -D_REENTRANT -DVERSION=\"$(VERSION)\" `mysql_co #LDFLAGS = -lm -lpthread `gtk-config --cflags` `gtk-config --libs` -lgthread LDFLAGS = `mysql_config --libs` -lm -lulfius -lyder -lorcania -OBJ = main.o +OBJ = main.o calculate.o sendmysql.o dht22: $(OBJ) $(CC) $(CFLAGS) -o humidityserver $(OBJ) $(LDFLAGS) diff --git a/RestServer/sendmysql.c b/RestServer/sendmysql.c new file mode 100644 index 0000000..2f1f098 --- /dev/null +++ b/RestServer/sendmysql.c @@ -0,0 +1,106 @@ + /* Simple C program that connects to MySQL Database server*/ +#include +//#define _GNU_SOURCE +#include +#include +#include "calculate.h" +#include "sendmysql.h" + +void insertData(int node_id, float temperature, float humidity, int isoutside) { + int pin = 0; + MYSQL *conn; + //MYSQL_RES *res; + //MYSQL_ROW row; + + char *server = "localhost"; + char *user = "dhtuser"; + char *password = "raspberry"; /* set me first */ + char *database = "dhtstats"; + + conn = mysql_init(NULL); + + /* Connect to database */ + if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + char *pquerystring = NULL; + + if (-1 == asprintf(&pquerystring, + "INSERT INTO stats (node_id, pin, humidity, temperature, isoutside, gm3) VALUES (%i, %i, %f, %f, %i, %f)", node_id, pin, humidity, temperature, isoutside, absoluteHumidityFloat(temperature, humidity))) { + perror("asprintf() failed"); + } else { + if (mysql_query(conn, pquerystring)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + free(pquerystring); + exit(1); + } + } + + free(pquerystring); + pquerystring = NULL; + + /* close connection */ + //mysql_free_result(res); + mysql_close(conn); +} + + + + + + +void insertDataAverages(float temperature, float humidity, float gm3, int isoutside) { + MYSQL *conn; + //MYSQL_RES *res; + //MYSQL_ROW row; + + char *server = "localhost"; + char *user = "dhtuser"; + char *password = "raspberry"; /* set me first */ + char *database = "dhtstats"; + + conn = mysql_init(NULL); + + /* Connect to database */ + if (!mysql_real_connect(conn, server, + user, password, database, 0, NULL, 0)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + /* + // send SQL query + if (mysql_query(conn, "show tables")) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + res = mysql_use_result(conn); + + // output table name + printf("MySQL Tables in mysql database:\n"); + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s \n", row[0]); + */ + + char *pquerystring = NULL; + if (-1 == asprintf(&pquerystring, + "INSERT INTO average_stats (humidity, temperature, gm3, isoutside) VALUES (%f, %f, %f, %i)", humidity, temperature, absoluteHumidityFloat(temperature, humidity), isoutside)) { + perror("asprintf() failed"); + } else { + if (mysql_query(conn, pquerystring)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + free(pquerystring); + exit(1); + } + } + + free(pquerystring); + pquerystring = NULL; + + /* close connection */ + //mysql_free_result(res); + mysql_close(conn); +} diff --git a/RestServer/sendmysql.h b/RestServer/sendmysql.h new file mode 100644 index 0000000..5393489 --- /dev/null +++ b/RestServer/sendmysql.h @@ -0,0 +1,3 @@ + +void insertData(int node_id, float temperature, float humidity, int isoutside); +void insertDataAverages(float temperature, float humidity, float gm3, int isoutside);