save measurements in databse once all received

This commit is contained in:
King Kévin 2016-10-15 14:21:31 +02:00
parent 08cadd14a0
commit c5ba314c68
1 changed files with 111 additions and 16 deletions

127
main.c
View File

@ -194,7 +194,7 @@ static bool http_post_header(char* host, uint16_t port, size_t length)
fprintf(stderr,"TCP connection failed\n");
return false;
}
if (!http_send((uint8_t*)"POST /write?db=test HTTP/1.1\r\n", 0)) { // send data
if (!http_send((uint8_t*)"POST /write?db=spark_abacus HTTP/1.1\r\n", 0)) { // send data
return false;
}
if (snprintf(http_line, LENGTH(http_line), "Content-Length: %u\r\n", length)<0) { // set content length (for measurements)
@ -281,20 +281,6 @@ void main(void)
}
#endif
// send HTTP POST request
printf("making HTTP request: ");
char line[256] = {0}; // measurement line to send
if (snprintf(line, LENGTH(line), "cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000")<0) {
fprintf(stderr,"could not create line\n");
} else if (!http_post_header("192.168.42.3", 8086, strlen(line))) { // send header
fprintf(stderr,"could not sent HTTP POST header\n");
} else if (!http_send((uint8_t*)line, 0)) { // send data
fprintf(stderr,"could not send measurement\n");
} else {
http_end(); // end HTTP request (don't care about the result)
printf("OK\n");
}
// main loop
printf("command input: ready\n");
bool action = false; // if an action has been performed don't go to sleep
@ -362,7 +348,7 @@ void main(void)
printf("PZEM-004T meter %u current: %.02f A\n", pzem_meter, measurement.value.current);
break;
case SENSOR_PZEM_POWER:
printf("PZEM-004T meter %u power: %.00f W\n", pzem_meter, measurement.value.power);
printf("PZEM-004T meter %u power: %u W\n", pzem_meter, measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
printf("PZEM-004T meter %u energy: %lu Wh\n", pzem_meter, measurement.value.energy);
@ -439,6 +425,115 @@ void main(void)
printf("uptime: %02lu:%02lu:%02lu\n", ticks_time/(60*60), (ticks_time%(60*60))/60, (ticks_time%60)); // display external time
}
}
while (pzem_meter>=LENGTH(pzem_measurements) && sdm120_meter>=LENGTH(sdm120_measurements)) { // all measurements received for all meter
printf("saving measurements to database: ");
const char* pzem_strings[SENSOR_PZEM_MAX] = {
"voltage,meter=PZEM-004T,phase=%u value=%.1f\n",
"current,meter=PZEM-004T,phase=%u value=%.2f\n",
"power,meter=PZEM-004T,phase=%u value=%u\n",
"energy,meter=PZEM-004T,phase=%u value=%lu\n"
};
const char* sdm120_strings[SENSOR_SDM120_MEASUREMENT_MAX] = {
"voltage,meter=SDM120,phase=%u value=%.3f\n",
"current,meter=SDM120,phase=%u value=%.3f\n",
"power,meter=SDM120,phase=%u,type=active value=%.3f\n",
"power,meter=SDM120,phase=%u,type=apparent value=%.3f\n",
"power,meter=SDM120,phase=%u,type=reactive value=%.3f\n",
"power,meter=SDM120,phase=%u,type=factor value=%.3f\n",
"frequency,meter=SDM120,phase=%u value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=active,direction=import value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=active,direction=export value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=reactive,direction=import value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=reactive,direction=export value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=active,direction=total value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=reactive,direction=total value=%.3f\n"
};
char line[256] = {0}; // measurement line to send
size_t data_length = 0; /**< length of the data string to send */
for (pzem_meter = 0; pzem_meter<LENGTH(pzem_measurements); pzem_meter++) {
for (pzem_measurement = 0; pzem_measurement<SENSOR_PZEM_MAX; pzem_measurement++) {
struct sensor_pzem_measurement_t measurement = pzem_measurements[pzem_meter][pzem_measurement]; // get measurement
if (measurement.valid) { // only use valid measurements
switch (measurement.type) { // get the size (hope no error is occurring)
case SENSOR_PZEM_VOLTAGE:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.voltage);
break;
case SENSOR_PZEM_CURRENT:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.current);
break;
case SENSOR_PZEM_POWER:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.energy);
break;
default:
break;
}
}
}
}
for (sdm120_meter = 0; sdm120_meter<LENGTH(sdm120_measurements); sdm120_meter++) {
for (sdm120_measurement = 0; sdm120_measurement<SENSOR_SDM120_MEASUREMENT_MAX; sdm120_measurement++) {
if (sdm120_measurement<SENSOR_SDM120_ENERGY_ACTIVE_IMPORT) {
data_length += snprintf(line, LENGTH(line), sdm120_strings[sdm120_measurement], sdm120_meter, sdm120_measurements[sdm120_meter][sdm120_measurement]); // get the size (hope no error is occurring)
} else {
data_length += snprintf(line, LENGTH(line), sdm120_strings[sdm120_measurement], sdm120_meter, sdm120_measurements[sdm120_meter][sdm120_measurement]*1000.0); // get the size (hope no error is occurring)
}
}
}
// send HTTP POST request
if (!http_post_header("192.168.42.2", 8086, data_length)) { // send header
fprintf(stderr,"could not sent HTTP POST header\n");
} else {
// send PZEM-004T values
for (pzem_meter = 0; pzem_meter<LENGTH(pzem_measurements); pzem_meter++) {
for (pzem_measurement = 0; pzem_measurement<SENSOR_PZEM_MAX; pzem_measurement++) {
struct sensor_pzem_measurement_t measurement = pzem_measurements[pzem_meter][pzem_measurement]; // get measurement
if (measurement.valid) { // only use valid measurements
switch (measurement.type) { // make line (hope no error is occurring)
case SENSOR_PZEM_VOLTAGE:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.voltage);
break;
case SENSOR_PZEM_CURRENT:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.current);
break;
case SENSOR_PZEM_POWER:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.energy);
break;
default:
break;
}
http_send((uint8_t*)line, 0); // don't care about the result
}
}
}
// send SDM120 values
for (sdm120_meter = 0; sdm120_meter<LENGTH(sdm120_measurements); sdm120_meter++) {
for (sdm120_measurement = 0; sdm120_measurement<SENSOR_SDM120_MEASUREMENT_MAX; sdm120_measurement++) {
if (sdm120_measurement<SENSOR_SDM120_ENERGY_ACTIVE_IMPORT) {
if (snprintf(line, LENGTH(line), sdm120_strings[sdm120_measurement], sdm120_meter, sdm120_measurements[sdm120_meter][sdm120_measurement])>0) {
http_send((uint8_t*)line, 0); // don't care about the result
}
} else {
if (snprintf(line, LENGTH(line), sdm120_strings[sdm120_measurement], sdm120_meter, sdm120_measurements[sdm120_meter][sdm120_measurement]*1000.0)>0) {
http_send((uint8_t*)line, 0); // don't care about the result
}
}
}
}
http_end(); // end HTTP request (don't care about the result)
printf("OK\n");
}
pzem_meter = 0; // reset meter
sdm120_meter = 0; // reset meter
}
if (action) { // go to sleep if nothing had to be done, else recheck for activity
action = false;
} else {