ESP32 / ESP8266 & BME280 / SHT2x sensor with InfluxDB support
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

influx.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*
  2. * influx.cpp
  3. *
  4. * ESP8266 / ESP32 Environmental Sensor
  5. *
  6. * ----------------------------------------------------------------------------
  7. * "THE BEER-WARE LICENSE" (Revision 42):
  8. * <xythobuz@xythobuz.de> wrote this file. As long as you retain this notice
  9. * you can do whatever you want with this stuff. If we meet some day, and you
  10. * think this stuff is worth it, you can buy me a beer in return. Thomas Buck
  11. * ----------------------------------------------------------------------------
  12. */
  13. #include <Arduino.h>
  14. #include "config.h"
  15. #include "DebugLog.h"
  16. #include "sensors.h"
  17. #include "relais.h"
  18. #include "moisture.h"
  19. #include "influx.h"
  20. #ifdef ENABLE_INFLUXDB_LOGGING
  21. #if defined(ARDUINO_ARCH_ESP8266)
  22. #include <ESP8266WiFi.h>
  23. #include <ESP8266WebServer.h>
  24. #include <ESP8266mDNS.h>
  25. #elif defined(ARDUINO_ARCH_ESP32)
  26. #include <WiFi.h>
  27. #include <WebServer.h>
  28. #include <ESPmDNS.h>
  29. #elif defined(ARDUINO_ARCH_AVR)
  30. #include <UnoWiFiDevEdSerial1.h>
  31. #include <WiFiLink.h>
  32. #endif
  33. #ifdef USE_INFLUXDB_LIB
  34. #include <InfluxDb.h>
  35. #else
  36. #include "SimpleInflux.h"
  37. #endif
  38. static Influxdb influx(INFLUXDB_HOST, INFLUXDB_PORT);
  39. static int error_count = 0;
  40. static unsigned long last_db_write_time = 0;
  41. void initInflux() {
  42. influx.setDb(INFLUXDB_DATABASE);
  43. }
  44. void runInflux() {
  45. unsigned long time = millis();
  46. if ((time - last_db_write_time) >= DB_WRITE_INTERVAL) {
  47. last_db_write_time = time;
  48. writeDatabase();
  49. }
  50. #ifdef INFLUX_MAX_ERRORS_RESET
  51. if (error_count >= INFLUX_MAX_ERRORS_RESET) {
  52. #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
  53. debug.println(F("Resetting due to too many Influx errors"));
  54. ESP.restart();
  55. #else
  56. // TODO implement watchdog reset for AVR
  57. #endif
  58. }
  59. #endif // INFLUX_MAX_ERRORS_RESET
  60. }
  61. static boolean writeMeasurement(InfluxData &measurement) {
  62. boolean success = influx.write(measurement);
  63. if (!success) {
  64. error_count++;
  65. for (int i = 0; i < 10; i++) {
  66. digitalWrite(BUILTIN_LED_PIN, LOW); // LED on
  67. delay(LED_ERROR_BLINK_INTERVAL);
  68. digitalWrite(BUILTIN_LED_PIN, HIGH); // LED off
  69. delay(LED_ERROR_BLINK_INTERVAL);
  70. }
  71. }
  72. return success;
  73. }
  74. static void addTagsGeneric(InfluxData &measurement) {
  75. measurement.addTag("location", SENSOR_LOCATION);
  76. measurement.addTag("location-id", SENSOR_ID);
  77. #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
  78. measurement.addTag("device", WiFi.macAddress().c_str());
  79. #endif
  80. }
  81. static void addTagsSensor(InfluxData &measurement, String sensor, String placement) {
  82. addTagsGeneric(measurement);
  83. measurement.addTag("sensor", sensor);
  84. measurement.addTag("placement", placement);
  85. }
  86. #ifdef FEATURE_RELAIS
  87. static void addTagsRelais(InfluxData &measurement, String id, String name) {
  88. addTagsGeneric(measurement);
  89. measurement.addTag("id", id);
  90. measurement.addTag("name", name);
  91. }
  92. #endif
  93. void writeDatabase() {
  94. #ifdef ENABLE_BME280
  95. if (found_bme1) {
  96. InfluxData measurement("environment");
  97. addTagsSensor(measurement, F("bme280"), F("1"));
  98. measurement.addValue("temperature", bme1_temp());
  99. measurement.addValue("pressure", bme1_pressure());
  100. measurement.addValue("humidity", bme1_humid());
  101. debug.println(F("Writing bme1"));
  102. writeMeasurement(measurement);
  103. debug.println(F("Done!"));
  104. }
  105. if (found_bme2) {
  106. InfluxData measurement("environment");
  107. addTagsSensor(measurement, F("bme280"), F("2"));
  108. measurement.addValue("temperature", bme2_temp());
  109. measurement.addValue("pressure", bme2_pressure());
  110. measurement.addValue("humidity", bme2_humid());
  111. debug.println(F("Writing bme2"));
  112. writeMeasurement(measurement);
  113. debug.println(F("Done!"));
  114. }
  115. #endif // ENABLE_BME280
  116. if (found_sht) {
  117. InfluxData measurement("environment");
  118. addTagsSensor(measurement, F("sht21"), F("1"));
  119. measurement.addValue("temperature", sht_temp());
  120. measurement.addValue("humidity", sht_humid());
  121. debug.println(F("Writing sht"));
  122. writeMeasurement(measurement);
  123. debug.println(F("Done!"));
  124. }
  125. #ifdef ENABLE_CCS811
  126. if (found_ccs1) {
  127. InfluxData measurement("environment");
  128. addTagsSensor(measurement, F("ccs811"), F("1"));
  129. String err(ccs1_error_code);
  130. measurement.addTag("error", err);
  131. measurement.addValue("eco2", ccs1_eco2());
  132. measurement.addValue("tvoc", ccs1_tvoc());
  133. debug.println(F("Writing ccs1"));
  134. writeMeasurement(measurement);
  135. debug.println(F("Done!"));
  136. }
  137. if (found_ccs2) {
  138. InfluxData measurement("environment");
  139. addTagsSensor(measurement, F("ccs811"), F("2"));
  140. String err(ccs2_error_code);
  141. measurement.addTag("error", err);
  142. measurement.addValue("eco2", ccs2_eco2());
  143. measurement.addValue("tvoc", ccs2_tvoc());
  144. debug.println(F("Writing ccs2"));
  145. writeMeasurement(measurement);
  146. debug.println(F("Done!"));
  147. }
  148. #endif // ENABLE_CCS811
  149. #ifdef FEATURE_MOISTURE
  150. for (int i = 0; i < moisture_count(); i++) {
  151. int moisture = moisture_read(i);
  152. if (moisture < moisture_max()) {
  153. String sensor(i + 1, DEC);
  154. InfluxData measurement("moisture");
  155. addTagsSensor(measurement, sensor, sensor);
  156. measurement.addValue("value", moisture);
  157. measurement.addValue("maximum", moisture_max());
  158. debug.print(F("Writing moisture "));
  159. debug.println(i);
  160. writeMeasurement(measurement);
  161. debug.println(F("Done!"));
  162. }
  163. }
  164. #endif // FEATURE_MOISTURE
  165. #ifdef FEATURE_RELAIS
  166. for (int i = 0; i < relais_count(); i++) {
  167. InfluxData measurement("relais");
  168. addTagsRelais(measurement, String(i), relais_name(i));
  169. measurement.addValue("state", relais_get(i));
  170. debug.print(F("Writing relais "));
  171. debug.println(i);
  172. writeMeasurement(measurement);
  173. debug.println(F("Done!"));
  174. }
  175. #endif // FEATURE_RELAIS
  176. }
  177. #else
  178. void initInflux() { }
  179. void runInflux() { }
  180. void writeDatabase() { }
  181. #endif // ENABLE_INFLUXDB_LOGGING