/* * html.cpp * * ESP8266 / ESP32 Environmental Sensor * * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice * you can do whatever you want with this stuff. If we meet some day, and you * think this stuff is worth it, you can buy me a beer in return. Thomas Buck * ---------------------------------------------------------------------------- */ #include #if defined(ARDUINO_ARCH_ESP8266) #include #include #include #define ESP_PLATFORM_NAME "ESP8266" #elif defined(ARDUINO_ARCH_ESP32) #include #include #include #define ESP_PLATFORM_NAME "ESP32" #elif defined(ARDUINO_ARCH_AVR) #include #include #define ESP_PLATFORM_NAME "Uno WiFi" #endif #include "config.h" #include "DebugLog.h" #include "sensors.h" #include "servers.h" #include "memory.h" #include "relais.h" #include "moisture.h" #include "html.h" #if defined(ARDUINO_ARCH_AVR) #define ARDUINO_SEND_PARTIAL_PAGE() do { \ size_t len = message.length(), off = 0; \ while (off < len) { \ if ((len - off) >= 50) { \ client.write(message.c_str() + off, 50); \ off += 50; \ } else { \ client.write(message.c_str() + off, len - off); \ off = len; \ } \ } \ message = ""; \ } while (false); #else #define ARDUINO_SEND_PARTIAL_PAGE() while (false) { } #endif #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) void handlePage(int mode, int id) { #else void handlePage(WiFiClient &client, int mode, int id) { #endif String message; message += F(""); message += F(""); message += F(""); message += F(""); message += F("" ESP_PLATFORM_NAME " " NAME_OF_FEATURE ""); message += F(""); message += F(""); message += F("

" ESP_PLATFORM_NAME " " NAME_OF_FEATURE "

"); message += F("\n

\n"); message += F("Version: "); message += ESP_ENV_VERSION; message += F("\n
\n"); message += F("Build Date: "); message += __DATE__; message += F("\n
\n"); message += F("Build Time: "); message += __TIME__; message += F("\n
\n"); message += F("Location: "); message += SENSOR_LOCATION; message += F("\n
\n"); message += F("ID: "); message += SENSOR_ID; #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) message += F("\n
\n"); message += F("MAC: "); message += WiFi.macAddress(); #endif message += F("\n

\n"); ARDUINO_SEND_PARTIAL_PAGE(); #if defined(ARDUINO_ARCH_ESP8266) message += F("

"); message += F("Reset reason: "); message += ESP.getResetReason(); message += F("
"); message += F("Free heap: "); message += String(ESP.getFreeHeap()); message += F(" ("); message += String(ESP.getHeapFragmentation()); message += F("% fragmentation)"); message += F("
"); message += F("Free sketch space: "); message += String(ESP.getFreeSketchSpace()); message += F("
"); message += F("Flash chip real size: "); message += String(ESP.getFlashChipRealSize()); if (ESP.getFlashChipSize() != ESP.getFlashChipRealSize()) { message += F("
"); message += F("WARNING: sdk chip size ("); message += (ESP.getFlashChipSize()); message += F(") does not match!"); } message += F("

"); #elif defined(ARDUINO_ARCH_ESP32) message += F("

"); message += F("Free heap: "); message += String(ESP.getFreeHeap() / 1024.0); message += F("k
"); message += F("Free sketch space: "); message += String(ESP.getFreeSketchSpace() / 1024.0); message += F("k
"); message += F("Flash chip size: "); message += String(ESP.getFlashChipSize() / 1024.0); message += F("k


"); #endif #ifdef ENABLE_BME280 message += F("\n

\n"); if (found_bme1) { message += F("BME280 Low:"); message += F("\n
\n"); message += F("Temperature: "); message += String(bme1_temp()); message += F("\n
\n"); message += F("Humidity: "); message += String(bme1_humid()); message += F("\n
\n"); message += F("Pressure: "); message += String(bme1_pressure()); message += F("\n
\n"); message += F("Offset: "); message += String(config.bme1_temp_off); message += F("\n
\n"); message += F("

"); message += F(""); message += F(""); message += F("
"); } else { message += F("BME280 (low) not connected!"); } message += F("\n


\n"); message += F("\n

\n"); if (found_bme2) { message += F("BME280 High:"); message += F("\n
\n"); message += F("Temperature: "); message += String(bme2_temp()); message += F("\n
\n"); message += F("Humidity: "); message += String(bme2_humid()); message += F("\n
\n"); message += F("Pressure: "); message += String(bme2_pressure()); message += F("\n
\n"); message += F("Offset: "); message += String(config.bme2_temp_off); message += F("\n
\n"); message += F("

"); message += F(""); message += F(""); message += F("
"); } else { message += F("BME280 (high) not connected!"); } message += F("\n


\n"); #endif // ENABLE_BME280 ARDUINO_SEND_PARTIAL_PAGE(); message += F("\n

\n"); if (found_sht) { message += F("SHT21:"); message += F("\n
\n"); message += F("Temperature: "); message += String(sht_temp()); message += F("\n
\n"); message += F("Humidity: "); message += String(sht_humid()); message += F("\n
\n"); message += F("Offset: "); message += String(config.sht_temp_off); message += F("\n
\n"); message += F("

"); message += F(""); message += F(""); message += F("
"); } else { message += F("SHT21 not connected!"); } message += F("\n


\n"); #ifdef ENABLE_CCS811 message += F("\n

\n"); if (found_ccs1) { message += F("CCS811 Low:"); message += F("\n
\n"); message += F("eCO2: "); message += String(ccs1_eco2()); message += F("ppm"); message += F("\n
\n"); message += F("TVOC: "); message += String(ccs1_tvoc()); message += F("ppb"); if (!ccs1_data_valid) { message += F("\n
\n"); message += F("Data invalid ("); message += String(ccs1_error_code); message += F(")!"); } } else { message += F("CCS811 (Low) not connected!"); } message += F("\n


\n"); message += F("\n

\n"); if (found_ccs2) { message += F("CCS811 High:"); message += F("\n
\n"); message += F("eCO2: "); message += String(ccs2_eco2()); message += F("ppm"); message += F("\n
\n"); message += F("TVOC: "); message += String(ccs2_tvoc()); message += F("ppb"); if (!ccs2_data_valid) { message += F("\n
\n"); message += F("Data invalid ("); message += String(ccs2_error_code); message += F(")!"); } } else { message += F("CCS811 (High) not connected!"); } message += F("\n


\n"); #endif // ENABLE_CCS811 ARDUINO_SEND_PARTIAL_PAGE(); #ifdef FEATURE_MOISTURE for (int i = 0; i < moisture_count(); i++) { int moisture = moisture_read(i); if (moisture < moisture_max()) { message += F("\n

\n"); message += F("Sensor "); message += String(i + 1); message += F(":\n
\n"); message += F("Moisture: "); message += String(moisture); message += F(" / "); message += String(moisture_max()); message += F("\n

\n"); } } if (moisture_count() <= 0) { message += F("\n

\n"); message += F("No moisture sensors configured!"); message += F("\n

\n"); } ARDUINO_SEND_PARTIAL_PAGE(); #endif // FEATURE_MOISTURE #ifdef FEATURE_RELAIS message += F("\n

\n"); for (int i = 0; i < relais_count(); i++) { message += String(F("Relais ")) + String(i) + String(F(" On (")) + relais_name(i) + String(F(")
\n")); message += String(F("Relais ")) + String(i) + String(F(" Off (")) + relais_name(i) + String(F(")
\n")); } message += String(F("All Relais On
\n")); message += String(F("All Relais Off
\n")); message += F("

\n"); if ((mode >= 0) && (mode <= 1)) { message += F("

"); message += F("Turned Relais "); message += (id < relais_count()) ? String(id) : String(F("1-4")); message += (mode ? String(F(" On")) : String(F(" Off"))); message += F("

\n"); } message += F("\n

\n"); for (int i = 0; i < relais_count(); i++) { message += String(F("Relais ")) + String(i) + String(F(" (")) + relais_name(i) + String(F(") = ")) + (relais_get(i) ? String(F("On")) : String(F("Off"))) + String(F("
\n")); } message += F("

\n"); ARDUINO_SEND_PARTIAL_PAGE(); #endif // FEATURE_RELAIS if (mode == 42) { message += F("

New calibration value saved!

\n"); } #if ! defined(ARDUINO_ARCH_AVR) message += F("

"); message += F("Try /update for OTA firmware updates!"); message += F("

"); message += F("Try /reset to reset ESP!"); message += F("

"); #endif message += F("

"); #ifdef ENABLE_INFLUXDB_LOGGING message += F("InfluxDB: "); message += INFLUXDB_DATABASE; message += F(" @ "); message += INFLUXDB_HOST; message += F(":"); message += String(INFLUXDB_PORT); #else message += F("InfluxDB logging not enabled!"); #endif message += F("

"); message += F("

Uptime: "); message += String(millis() / 1000); message += F(" sec.

"); #ifdef ENABLE_DEBUGLOG message += F("

Debug Log:

"); message += F("
");
    message += debug.getBuffer();
    message += F("
"); #endif // ENABLE_DEBUGLOG message += F(""); #ifdef ENABLE_WEBSOCKETS message += F(""); #endif // ENABLE_WEBSOCKETS message += F(""); #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) server.send(200, "text/html", message); #else ARDUINO_SEND_PARTIAL_PAGE(); #endif } #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) void handleReset() { String message; message += F(""); message += F(""); message += F(""); message += F(""); message += F(""); message += F("" ESP_PLATFORM_NAME " Environment Sensor"); message += F(""); message += F(""); message += F("

Resetting in 2s...

"); message += F("

Auto redirect in 10s. Please retry manually on error.

"); message += F("

Go back to start.

"); message += F(""); server.send(200, "text/html", message); delay(2000); ESP.restart(); } #endif